<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://help.openclovis.com/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://help.openclovis.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pradeepac</id>
		<title>OpenClovis Product Documentation - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://help.openclovis.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pradeepac"/>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Special:Contributions/Pradeepac"/>
		<updated>2026-07-20T04:24:19Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.20.2</generator>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/csa104</id>
		<title>Doc:latest/evalguide/csa104</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/csa104"/>
				<updated>2010-08-30T08:36:18Z</updated>
		
		<summary type="html">&lt;p&gt;Pradeepac: /* How to Run 104 and what to observe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==csa104 Provisioning==&lt;br /&gt;
&lt;br /&gt;
===Objective===&lt;br /&gt;
&lt;br /&gt;
The objective is to demonstrate some of the features of the Clovis Object Registry (COR) and Clovis' Object Management (OM) framework.&lt;br /&gt;
&lt;br /&gt;
===What you will learn===&lt;br /&gt;
&lt;br /&gt;
*How to use the Clovis Object Registry to set configuration values in a simple SAFplus Platform application.&lt;br /&gt;
*How to manipulate COR values from the SAFplus Platform Console line interface.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&lt;br /&gt;
The code can be found within the following directory&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa104Comp&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     ClUint8T clEoClientLibs[] =&lt;br /&gt;
    {&lt;br /&gt;
        COMP_EO_CLIENTLIB_COR,      /* Lib: Common Object Repository            */&lt;br /&gt;
        COMP_EO_CLIENTLIB_CM,       /* Lib: Chassis Management                  */&lt;br /&gt;
        COMP_EO_CLIENTLIB_NAME,     /* Lib: Name Service                        */&lt;br /&gt;
        COMP_EO_CLIENTLIB_LOG,      /* Lib: Log Service                         */&lt;br /&gt;
        COMP_EO_CLIENTLIB_TRACE,    /* Lib: Trace Service                       */&lt;br /&gt;
        COMP_EO_CLIENTLIB_DIAG,     /* Lib: Diagnostics                         */&lt;br /&gt;
        COMP_EO_CLIENTLIB_TXN,      /* Lib: Transaction Management              */&lt;br /&gt;
        CL_FALSE,                   /* NA */&lt;br /&gt;
        COMP_EO_CLIENTLIB_PROV,     /* Lib: Provisioning Management             */&lt;br /&gt;
        COMP_EO_CLIENTLIB_ALARM,    /* Lib: Alarm Management                    */&lt;br /&gt;
        COMP_EO_CLIENTLIB_DEBUG,    /* Lib: Debug Service                       */&lt;br /&gt;
        COMP_EO_CLIENTLIB_GMS       /* Lib: Cluster/Group Membership Service    */&lt;br /&gt;
    };&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Here we present the Client Libraries. These are set within &amp;lt;code&amp;gt;clCompCfg.h&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompCfg.h&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_COR   CL_TRUE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_CM    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_NAME    CL_FALSE        &lt;br /&gt;
    #define COMP_EO_CLIENTLIB_LOG    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_TRACE    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_DIAG    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_TXN    CL_TRUE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_NA    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_PROV    CL_TRUE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_ALARM    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_DEBUG    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_GMS    CL_FALSE&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Within &amp;lt;code&amp;gt;clCompCfg.h&amp;lt;/code&amp;gt; we set Clovis Object Registry  (COR), the Transaction (TXN), and Provisioning (Prov) libraries to &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 ClCompAppInitialize()&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
    clCorMoIdInitialize(&amp;amp;moId);&lt;br /&gt;
    clCorMoIdAppend(&amp;amp;moId, CLASS_CHASSIS_MO, 0);&lt;br /&gt;
    clCorMoIdAppend(&amp;amp;moId, CLASS_CSA104RES_MO, 0);&lt;br /&gt;
    clCorMoIdServiceSet(&amp;amp;moId, CL_COR_SVC_ID_PROVISIONING_MANAGEMENT);&lt;br /&gt;
    rc = clCorObjectHandleGet(&amp;amp;moId, &amp;amp;objH);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed [0x%x] to get the object handle. &amp;quot;,&lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    while (!exiting)&lt;br /&gt;
    {&lt;br /&gt;
        if (running &amp;amp;&amp;amp; ha_state == CL_AMS_HA_STATE_ACTIVE)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: Hello World! (count = %d)&amp;quot;, appname, counter);&lt;br /&gt;
#ifdef CL_INST&lt;br /&gt;
            if ((rc = clDataTapSend(counter)) != CL_OK &amp;amp;&amp;amp; (rc != CL_ERR_INVALID_PARAMETER))&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed [0x%x] to send data tap data&amp;quot;,&lt;br /&gt;
                            appname, rc);&lt;br /&gt;
            }&lt;br /&gt;
#endif&lt;br /&gt;
            if ((rc = update_counter_in_cor(time(0), objH, counter)) != CL_OK)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: cor update failed. Exiting.&amp;quot;,&lt;br /&gt;
                            appname, rc);&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            /* Checkpoint new counter number */&lt;br /&gt;
            rc = checkpoint_write_counter(counter);&lt;br /&gt;
            if (rc != CL_OK)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: Checkpoint write failed. Exiting.&amp;quot;,&lt;br /&gt;
                            appname, rc);&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            counter++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        usleep((useconds_t)delta_t*1000);&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
The main loop body is as we've seen several times already. But, the sleep, rather than being &amp;lt;code&amp;gt;sleep(1)&amp;lt;/code&amp;gt; is a &amp;lt;code&amp;gt;usleep()&amp;lt;/code&amp;gt; of a variable duration.  The duration: &amp;lt;code&amp;gt;delta_t&amp;lt;/code&amp;gt; is a number in milliseconds that is settable from COR.  We'll see where it gets set later.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;string.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
    #include &amp;lt;clDebugApi.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
We  including standard header files, including &amp;lt;code&amp;gt;clDebugApi.h&amp;lt;/code&amp;gt; which allows the application to interact with the SAFplus Platform Console. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|clcsa104CompOAMPConfig.c &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #include &amp;lt;clcsa104CompOAMPConfig.h&amp;gt;&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
Within &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.c&amp;lt;/code&amp;gt; we include &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.h&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|clcsa104CompOAMPConfig.h &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #include &amp;lt;clOmApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clCorApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clProvOmApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clProvApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clAlarmOM.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clHalApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clHalObjectApi.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    typedef ClRcT (*fp) (CL_OM_PROV_CLASS*, ClHandleT,  ClProvTxnDataT*);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    CL_OM_BEGIN_CLASS(CL_OM_PROV_CLASS,  CL_OM_PROV_CSA104RES_CLASS)&lt;br /&gt;
 &lt;br /&gt;
    CL_OM_END&lt;br /&gt;
 &lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvConstructor( void *pThis, void *pUsrData,&lt;br /&gt;
                                                     ClUint32T usrDataLen );&lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvDestructor ( void *pThis , void  *pUsrData,&lt;br /&gt;
                                                     ClUint32T usrDataLen );&lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvValidate(CL_OM_PROV_CLASS* pThis, &lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
 &lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvUpdate(CL_OM_PROV_CLASS* pThis, &lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
 &lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvRollback(CL_OM_PROV_CLASS* pThis,&lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
&lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvRead(CL_OM_PROV_CLASS* pThis,&lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
&lt;br /&gt;
    void clcsa104CompCSA104RESProvObjectStart(ClCorMOIdPtrT pMoId, &lt;br /&gt;
                               ClHandleT txnHandle);&lt;br /&gt;
&lt;br /&gt;
    void clcsa104CompCSA104RESProvObjectEnd(ClCorMOIdPtrT pMoId, &lt;br /&gt;
                               ClHandleT txnHandle);&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Next in &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.h&amp;lt;/code&amp;gt; we have several header files being included. Included is &amp;lt;code&amp;gt;clOmApi.h&amp;lt;/code&amp;gt; which is the main header file for using the Object Management subsystem.  This is Clovis' support for object-oriented like programming in C.  Next &amp;lt;code&amp;gt;clCorApi.h&amp;lt;/code&amp;gt; is the main header for using the Clovis Object Registry.  &amp;lt;code&amp;gt;clProvOmApi.h&amp;lt;/code&amp;gt;  is the main header for the Clovis Provisioning OM class.  We define an Object Management  class: &amp;lt;code&amp;gt;CL_OM_PROV_CSA104RES_CLASS&amp;lt;/code&amp;gt; which inherits from another Object Management class: &amp;lt;code&amp;gt;CL_OM_PROV_CLASS&amp;lt;/code&amp;gt;.  This last class is the class whose API was imported with the &amp;lt;code&amp;gt;#include clProvOmApi.h&amp;lt;/code&amp;gt;.  The subsequent code in the above table declare functions that will be member functions of the new Object Management class: &amp;lt;code&amp;gt;CL_OM_PROV_CSA104_CLASS&amp;lt;/code&amp;gt;. Note that function header comments have been omitted for clarity.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|  clcsa104Compcsa104Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     extern ClUint32T delta_t;&lt;br /&gt;
     extern ClCharT   appname[80];&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Above we define/declare a variable that is used for provisioning. The extern is a reference to a variable defined in clCompAppMain.c.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa104CompOAMPConfig.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     ClOmClassControlBlockT pAppOmClassTbl[] =&lt;br /&gt;
     {&lt;br /&gt;
         {&lt;br /&gt;
          CSA104COMP_CSA104RES_PROV_CLASS_NAME,&lt;br /&gt;
          sizeof(CL_OM_PROV_CSA104RES_CLASS),&lt;br /&gt;
          CL_OM_PROV_CLASS_TYPE,&lt;br /&gt;
          clcsa104CompCSA104RESProvConstructor,&lt;br /&gt;
          clcsa104CompCSA104RESProvDestructor,&lt;br /&gt;
          NULL,&lt;br /&gt;
          CSA104COMP_CSA104RES_PROV_CLASS_VERSION,&lt;br /&gt;
          0,&lt;br /&gt;
          CL_MAX_OBJ,&lt;br /&gt;
          0,&lt;br /&gt;
          CSA104COMP_CSA104RES_PROV_MAX_SLOTS,&lt;br /&gt;
          CL_OM_PROV_CSA104RES_CLASS_TYPE&lt;br /&gt;
     },&lt;br /&gt;
     &lt;br /&gt;
     &lt;br /&gt;
     };&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Within &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.c&amp;lt;/code&amp;gt; we define the global &amp;lt;code&amp;gt;pAppOmClassTbl&amp;lt;/code&amp;gt; so that will know about the new class and be able to instantiate members of the class.  Line 27 specifies the name of the class.  This is optional.  Defined is the size of instances of the class, next we specify the base class, followed by the constructor and destructor for the class respectively. The &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; specifies the table of functions for the class, in this case there is no such table.  &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is the instance table pointer.  The next three lines of code.&lt;br /&gt;
&amp;lt;br&amp;gt;--&amp;gt; &amp;lt;code&amp;gt;CL_MAX_OBJ,&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;--&amp;gt; &amp;lt;code&amp;gt;0,&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;--&amp;gt; &amp;lt;code&amp;gt;CSA104COMP_CSA104RES_PROV_MAX_SLOTS,&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;specify the max number of object instances allowed, current number of object instances, and max number of object instances so far respectively.  Followed by the Class Type ID for the class.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa104Compcsa104Res.c &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     ClRcT clcsa104CompCSA104RESProvConstructor( void *pThis, void *pUsrData,&lt;br /&gt;
                                                 ClUint32T usrDataLen )&lt;br /&gt;
     {&lt;br /&gt;
         ClRcT rc = CL_OK;&lt;br /&gt;
     &lt;br /&gt;
         /* Override &amp;quot;semantic check&amp;quot; virtual method in provClass*/&lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvObjectStart = clcsa104CompCSA104RESProvObjectStart; 	 &lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvValidate = (fp)clcsa104CompCSA104RESProvValidate; 	 &lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvUpdate = (fp)clcsa104CompCSA104RESProvUpdate; 	 &lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvRollback = (fp)clcsa104CompCSA104RESProvRollback;&lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvRead = (fp)clcsa104CompCSA104RESProvRead;&lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvObjectEnd = clcsa104CompCSA104RESProvObjectEnd; &lt;br /&gt;
&lt;br /&gt;
         ...&lt;br /&gt;
&lt;br /&gt;
         return rc;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     ClRcT clcsa104CompCSA104RESProvDestructor ( void *pThis , void  *pUsrData,&lt;br /&gt;
                                                 ClUint32T usrDataLen )&lt;br /&gt;
     {&lt;br /&gt;
         ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
         ...&lt;br /&gt;
&lt;br /&gt;
         return rc;&lt;br /&gt;
     }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
The above table presents the Contructor. It initializes the function pointers defined in the Base Class.  These are the Update method, the provisioning validation method, and the provisioning rollback method.  These are declared in &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.h&amp;lt;/code&amp;gt; in the class definition.  The destructor doesn't do anything except return &amp;lt;code&amp;gt;CL_OK&amp;lt;/code&amp;gt;.  There's no destruction work to do for this class.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|   clcsa104Compcsa104Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 ClRcT clcsa104CompCSA104RESProvUpdate(CL_OM_PROV_CLASS* pThis,&lt;br /&gt;
                            ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData)&lt;br /&gt;
 {&lt;br /&gt;
     ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
     /*&lt;br /&gt;
       ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
     clprintf(CL_LOG_SEV_INFO, &amp;quot;Inside the function %s&amp;quot;, __FUNCTION__);&lt;br /&gt;
&lt;br /&gt;
     ClNameT     moIdName = {0};&lt;br /&gt;
    &lt;br /&gt;
     rc = clCorMoIdToMoIdNameGet((ClCorMOIdPtrT)pProvTxnData-&amp;gt;pMoId, &amp;amp;moIdName);&lt;br /&gt;
     if (CL_OK != rc)&lt;br /&gt;
     {&lt;br /&gt;
         clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed while getting the MOId Name from moid. rc[0x%x] &amp;quot;, appname, rc);&lt;br /&gt;
         return rc;&lt;br /&gt;
     }&lt;br /&gt;
     /*&lt;br /&gt;
       ---END_APPLICATION_CODE---&lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|   clcsa104Compcsa104Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     switch (pProvTxnData-&amp;gt;provCmd)&lt;br /&gt;
     {&lt;br /&gt;
         case CL_COR_OP_CREATE :&lt;br /&gt;
         case CL_COR_OP_CREATE_AND_SET:&lt;br /&gt;
			&lt;br /&gt;
         /*&lt;br /&gt;
          * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: Inside create request for the object [%s] &amp;quot;, appname, moIdName.value);    &lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---END_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         break;&lt;br /&gt;
         case CL_COR_OP_SET:&lt;br /&gt;
	    &lt;br /&gt;
         /*&lt;br /&gt;
          * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         if ( pProvTxnData-&amp;gt;attrId == CSA104RES_DELTA_T)&lt;br /&gt;
         {&lt;br /&gt;
             delta_t = *(ClUint32T *)pProvTxnData-&amp;gt;pProvData;&lt;br /&gt;
             clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: The delta time is now [%d] &amp;quot;, appname, delta_t);&lt;br /&gt;
         }&lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---END_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         break;&lt;br /&gt;
&lt;br /&gt;
         case  CL_COR_OP_DELETE:&lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---END_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         break;&lt;br /&gt;
         default:&lt;br /&gt;
             clprintf (CL_LOG_SEV_ERROR, &amp;quot;Prov command is not proper&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     ...&lt;br /&gt;
&lt;br /&gt;
     return rc;   &lt;br /&gt;
 }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
When the COR object associated with csa104's provisioning is updated, &amp;lt;code&amp;gt;clcsa104CompCSA104RESProvUpdate&amp;lt;/code&amp;gt; function is called. A new value is set for the &amp;lt;code&amp;gt;delta_t&amp;lt;/code&amp;gt; variable that is used to control the sleep interval in the application's main loop.&lt;br /&gt;
&lt;br /&gt;
===How to Run 104 and what to observe===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Start the application as usual with the SAFplus Platform Console.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 # cd /root/asp/bin&lt;br /&gt;
 # ./asp_console&lt;br /&gt;
&lt;br /&gt;
 cli[Test]-&amp;gt; setc 1&lt;br /&gt;
 cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Again, there are two log files to observe &amp;lt;code&amp;gt;/root/asp/var/log/csa104CompI0Log.latest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/var/log/csa104CompI1Log.latest&amp;lt;/code&amp;gt;. After running the above commands you should see the following output in these logs when using &amp;lt;code&amp;gt;tail -f&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00051 :   INFO)&lt;br /&gt;
 Component [csa104CompI0] : PID [21202]. Initializing&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00052 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00053 :   INFO)&lt;br /&gt;
    IOC Port                : 0x80&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00054 :   INFO)&lt;br /&gt;
 csa104: instantiated as component instance csa104CompI0.&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00055 :   INFO)&lt;br /&gt;
 csa104CompI0: cpmHandle = 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00056 :   INFO)&lt;br /&gt;
 csa104CompI0: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00057 :   INFO)&lt;br /&gt;
 csa104CompI0: checkpoint_initialize&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00064 :   INFO)&lt;br /&gt;
 csa104CompI0: Checkpoint service initialized (handle=0x1)&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00066 :   INFO)&lt;br /&gt;
 csa104CompI0: Checkpoint opened (handle=0x2)&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00067 :   INFO)&lt;br /&gt;
 csa104CompI0: Section created&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI1Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00049 :   INFO)&lt;br /&gt;
 Component [csa104CompI1] : PID [21209]. Initializing&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00050 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00051 :   INFO)&lt;br /&gt;
    IOC Port                : 0x81&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00052 :   INFO)&lt;br /&gt;
 csa104: instantiated as component instance csa104CompI1.&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00053 :   INFO)&lt;br /&gt;
 csa104CompI1: cpmHandle = 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00054 :   INFO)&lt;br /&gt;
 csa104CompI1: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00055 :   INFO)&lt;br /&gt;
 csa104CompI1: checkpoint_initialize&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00062 :   INFO)&lt;br /&gt;
 csa104CompI1: Checkpoint service initialized (handle=0x1)&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00064 :   INFO)&lt;br /&gt;
 csa104CompI1: Checkpoint opened (handle=0x2)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;As before, unlock the application with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsUnlock sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the active component log file you should start to see the &amp;quot;Hello World&amp;quot; lines displaying at a rate of about 1 per second.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00080 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 0)&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00085 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnStart] ****&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00087 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvObjectStart&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00089 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvValidate&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00105 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvUpdate&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00107 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvObjectEnd&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00116 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnEnd] ****&lt;br /&gt;
Mon Jul 14 19:07:28 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00123 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 1)&lt;br /&gt;
Mon Jul 14 19:07:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00124 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 2)&lt;br /&gt;
Mon Jul 14 19:07:30 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00125 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 3)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;In the SAFplus Platform Console return to the Slot 1 context by entering &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; until it prints the Slot 1 prompt: &amp;lt;code&amp;gt;cli[Test:SCNodeI0]-&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now set the context to the COR server using the following command:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc corServer_SCNodeI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then, dump the object tree:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objTreeShow&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see something like the following. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objTreeShow&lt;br /&gt;
&lt;br /&gt;
Objects (Instance Tree):&lt;br /&gt;
    \Chassis:0&lt;br /&gt;
        \PayloadNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \PayloadNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa104Res:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa105Res:0&lt;br /&gt;
            (alarm, provisioning)&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Next, dump the object with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objectShow \Chassis:0\csa104Res:0 PROV&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Showing Object&lt;br /&gt;
ClCorMOId:[Svc: 3] (/).(10001:0000).(10002:0000):&lt;br /&gt;
&lt;br /&gt;
[Class:0x10003] Object &lt;br /&gt;
{&lt;br /&gt;
[CSA104RES_COUNTER             ] [0x0002] = [431]&lt;br /&gt;
[CSA104RES_DELTA_T             ] [0x0003] = [1000]&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now, set the delta_t attribute to 10000 instead of 1000 with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; attrSet \Chassis:0\csa104Res:0 3 null 3 -1 10000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Execution Result : Passed&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
The 3 is the service ID of the object. You should see lines like the following in the logs for csa104:&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04230 :   INFO)&lt;br /&gt;
 csa104CompI0: The delta time is now [10000] &lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04232 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvObjectEnd&lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04241 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnEnd] ****&lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04248 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 510)&lt;br /&gt;
Mon Jul 14 19:16:09 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04249 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 511)&lt;br /&gt;
Mon Jul 14 19:16:09 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04254 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnStart] ****&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
indicating that the component has received the updated value of delta_t&lt;br /&gt;
&lt;br /&gt;
You should also notice that the lines in the log are now being printed with a 10 second interval between lines.&lt;br /&gt;
&lt;br /&gt;
To confirm that the value of delta_t was updated you could dump the object with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objectShow \Chassis:0\csa104Res:0 PROV&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Showing Object&lt;br /&gt;
ClCorMOId:[Svc: 3] (/).(10001:0000).(10002:0000):&lt;br /&gt;
&lt;br /&gt;
[Class:0x10003] Object &lt;br /&gt;
{&lt;br /&gt;
[CSA104RES_COUNTER             ] [0x0002] = [523]&lt;br /&gt;
[CSA104RES_DELTA_T             ] [0x0003] = [10000]&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;To end the example first change the state of csa104SGI0 to LockAssignment.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then change the state to LockInstantiation.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockInstantiation sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then close the SAFplus Platform Console session.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; end&lt;br /&gt;
cli[Test]-&amp;gt; bye&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Summary and References===&lt;br /&gt;
&lt;br /&gt;
We've seen how to:&lt;br /&gt;
*Create a simple ProvOm class.&lt;br /&gt;
*Use callbacks to the class's update method to update variables in the application at runtime.&lt;br /&gt;
*Use the SAFplus Platform Console to cause the classes update method to  be invoked.&lt;br /&gt;
&lt;br /&gt;
For further reading :&lt;br /&gt;
*Clovis SAFplus Platform User Guide: sections on COR, &lt;br /&gt;
*clProvOmApi.h&lt;br /&gt;
*clOmObjectManage.h&lt;br /&gt;
*clOmApi.h&lt;/div&gt;</summary>
		<author><name>Pradeepac</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/csa105</id>
		<title>Doc:latest/evalguide/csa105</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/csa105"/>
				<updated>2010-08-30T08:27:42Z</updated>
		
		<summary type="html">&lt;p&gt;Pradeepac: /* How to Run csa105 and What to Observe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==csa105 Software Alarm Management and Provisioning==&lt;br /&gt;
&lt;br /&gt;
===Objective===&lt;br /&gt;
&lt;br /&gt;
The goal of this sample application is to show &lt;br /&gt;
*how provisioning and alarm libraries work together to achieve a simple software alarm management&lt;br /&gt;
*how COR change notification is utilized&lt;br /&gt;
&lt;br /&gt;
===What You Will Learn===&lt;br /&gt;
&lt;br /&gt;
You will learn how the Clovis Object Manager (OM) is used to achieve interactions between the alarm and provisioning libraries.  In addition, two ways to report an alarm is introduced:  COR change notification and fault reporting.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&lt;br /&gt;
The code in csa105 is a bit different than our previous examples. csa105 contains two components instead of one. The first component (csa105Comp) is much like the other examples. It runs within a loop printing out 'Hello World' and with each iteration it increments a counter value. Once this counter value meets or exceeds a defineable threshold, the component raises an alarm. The second component (csa105AlmLstnerComp) registers itself with SAFplus Platform as an alarm subscriber or listener. Once our first component raises the alarm our second component receives notification of this and prints some information out to a log file so that we can see.&lt;br /&gt;
&lt;br /&gt;
There is also a new source file that you will see. This file is '''clcsa105CompalarmMetaStruct.c'''. This file contains definitions for the counter threshold crossing alarm. Everything in this file is generated by the IDE. We will not be customizing it.&lt;br /&gt;
&lt;br /&gt;
The code can be found within the following directories&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105Comp&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105AlmLstner&lt;br /&gt;
&lt;br /&gt;
This example is built on top of the csa104 example. We will only look at the code that has been added for this example. First we will look at the code in &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105Comp.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClUint32T counter_threshold   = 55; // the value determining the counter threshold.&lt;br /&gt;
...&lt;br /&gt;
static ClRcT raise_alarm_on_counter(ClCorMOIdT, ClNameT, ClUint32T);&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
First we define and initialize the counter threshold. This is the value our counter will be compared against to determine if an alarm should be raised.&lt;br /&gt;
&amp;lt;br&amp;gt;Next we declare the function that will be called to raise the alarm.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
clCompAppInitialize():&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
    if (counter_threshold &amp;lt;= counter)&lt;br /&gt;
    {&lt;br /&gt;
        clCorMoIdServiceSet(&amp;amp;moId, CL_COR_SVC_ID_ALARM_MANAGEMENT);&lt;br /&gt;
        if (( rc = raise_alarm_on_counter (moId, appName, counter)) != CL_OK)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Error [0x%x]: Alarm raise has failed. Exiting. &amp;quot;,&lt;br /&gt;
                        appname, rc);&lt;br /&gt;
            counter = 0;&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        counter = 0;&lt;br /&gt;
        continue;&lt;br /&gt;
    }&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The clCompAppInitialize() function is where our main loop runs that prints 'Hello World' and increments our counter. Each time through the loop we will now compare our counter value against the threshold value. If the counter is equal to or greater than this threshold we will call our raise_alarm_on_counter function. We also set the counter back to 0.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
static ClRcT&lt;br /&gt;
raise_alarm_on_counter (ClCorMOIdT moId , ClNameT compName, ClUint32T counter)&lt;br /&gt;
{&lt;br /&gt;
    ClRcT           rc = CL_OK;&lt;br /&gt;
    static ClUint32T       iterator = 0, lastCounter = 0;&lt;br /&gt;
    ClCharT str [80] = {0};&lt;br /&gt;
    ClAlarmInfoT *pAlarmInfo = {0};&lt;br /&gt;
    ClAlarmHandleT alarmHandle = {0};&lt;br /&gt;
    ClUint8T * pBuf = NULL;&lt;br /&gt;
    ClUint32T size = 0;&lt;br /&gt;
    ClAlarmUtilPayLoadListPtrT pPayloadList = NULL;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    if (lastCounter != counter)&lt;br /&gt;
    {&lt;br /&gt;
        lastCounter = counter;&lt;br /&gt;
        iterator = 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    pPayloadList = clHeapAllocate(sizeof(ClAlarmUtilPayLoadListT));&lt;br /&gt;
    if (pPayloadList == NULL)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed to allocate the memory for the alarm payload list.&amp;quot;);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;numPayLoadEnteries = 1;&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload = clHeapAllocate(sizeof(ClAlarmUtilPayLoadT));&lt;br /&gt;
    if (NULL == pPayloadList-&amp;gt;pPayload)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed while allocating payload array.&amp;quot;);&lt;br /&gt;
        clHeapFree(pPayloadList);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].numTlvs = 1;&lt;br /&gt;
    clCorMoIdClone(&amp;amp;moId, &amp;amp;pPayloadList-&amp;gt;pPayload[0].pMoId);&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].pTlv = clHeapAllocate(sizeof(ClAlarmUtilTlvT));&lt;br /&gt;
    if (NULL == pPayloadList-&amp;gt;pPayload[0].pTlv)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed while allocating the pTlv array. &amp;quot;);&lt;br /&gt;
        clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sprintf(str, &amp;quot;[%s]: The Alarm has been raised as the counter became [%d] for [%d] time&amp;quot;, &lt;br /&gt;
            appname, counter, ++iterator);&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].pTlv[0].type = CL_COR_UINT8;&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].pTlv[0].value = clHeapAllocate(strlen(str) + 1);&lt;br /&gt;
    if (NULL == pPayloadList-&amp;gt;pPayload[0].pTlv[0].value)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed while allocating the value for the attribute.&amp;quot;);&lt;br /&gt;
        clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].pTlv[0].length = strlen(str) + 1;&lt;br /&gt;
&lt;br /&gt;
    memset(pPayloadList-&amp;gt;pPayload[0].pTlv[0].value, 0, strlen(str) + 1);&lt;br /&gt;
&lt;br /&gt;
    memcpy(pPayloadList-&amp;gt;pPayload[0].pTlv[0].value, str, strlen(str));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    rc = clAlarmUtilPayloadFlatten(pPayloadList, &amp;amp;size, &amp;amp;pBuf);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]. Failed while getting the flat buffer for the payload. rc[0x%x]&amp;quot;, &lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pAlarmInfo = clHeapAllocate (sizeof(ClAlarmInfoT) + size);&lt;br /&gt;
    if (NULL == pAlarmInfo)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]: Failed to allocate the memory for alarm information. &amp;quot;, appname);&lt;br /&gt;
        clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
        clAlarmUtilPayloadBufFree(pBuf);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pAlarmInfo-&amp;gt;moId = moId;&lt;br /&gt;
    pAlarmInfo-&amp;gt;probCause = CL_ALARM_PROB_CAUSE_THRESHOLD_CROSSED; &lt;br /&gt;
    pAlarmInfo-&amp;gt;severity = CL_ALARM_SEVERITY_WARNING;&lt;br /&gt;
    memcpy (&amp;amp;pAlarmInfo-&amp;gt;compName, &amp;amp;compName, sizeof(ClNameT));&lt;br /&gt;
    pAlarmInfo-&amp;gt;alarmState = CL_ALARM_STATE_ASSERT;&lt;br /&gt;
    pAlarmInfo-&amp;gt;len = size;&lt;br /&gt;
&lt;br /&gt;
    memcpy(pAlarmInfo-&amp;gt;buff, pBuf, pAlarmInfo-&amp;gt;len);&lt;br /&gt;
&lt;br /&gt;
    clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
    clAlarmUtilPayloadBufFree(pBuf);&lt;br /&gt;
&lt;br /&gt;
    clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]: Raising the alarm as the counter threashold has reached. &amp;quot;, appname); &lt;br /&gt;
&lt;br /&gt;
    rc = clAlarmRaise (pAlarmInfo, &amp;amp;alarmHandle);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: The alarm raise has failed. &amp;quot;, appname, rc);&lt;br /&gt;
        clHeapFree(pAlarmInfo);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }  &lt;br /&gt;
&lt;br /&gt;
    pAlarmInfo-&amp;gt;alarmState = CL_ALARM_STATE_CLEAR;&lt;br /&gt;
    rc = clAlarmRaise (pAlarmInfo, &amp;amp;alarmHandle);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: The alarm clear has failed. &amp;quot;, appname, rc);&lt;br /&gt;
        clHeapFree(pAlarmInfo);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    clHeapFree(pAlarmInfo);&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The raise_alarm_on_counter function receives some information when called such as the application name and the counter value. It creates an &amp;lt;code&amp;gt;ClAlarmInfoT&amp;lt;/code&amp;gt; structure and fills it with some useful information. It then calls the &amp;lt;code&amp;gt;clAlarmRaise&amp;lt;/code&amp;gt; api twice. The first call is to raise the alarm and the second call is to clear the alarm. (Notice that the alarm state is set to &amp;lt;code&amp;gt;CL_ALARM_STATE_ASSERT&amp;lt;/code&amp;gt; for the first call and &amp;lt;code&amp;gt;CL_ALARM_STATE_CLEAR&amp;lt;/code&amp;gt; for the second call). The reason for this is that a given alarm is only raised once unless it is cleared. This is to avoid an alarm continually being sent.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa105CompOAMPConfig.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    ClOmClassControlBlockT pAppOmClassTbl[] =&lt;br /&gt;
    {&lt;br /&gt;
        {  &lt;br /&gt;
        CSA105COMP_CSA105RES_ALARM_CLASS_NAME,&lt;br /&gt;
        sizeof(CL_OM_ALARM_CSA105RES_CLASS),&lt;br /&gt;
        CL_OM_ALARM_CLASS_TYPE,&lt;br /&gt;
        clcsa105CompCSA105RESAlarmConstructor, &lt;br /&gt;
        clcsa105CompCSA105RESAlarmDestructor,&lt;br /&gt;
        NULL,&lt;br /&gt;
        CSA105COMP_CSA105RES_ALARM_CLASS_VERSION,&lt;br /&gt;
        0,&lt;br /&gt;
        CL_MAX_OBJ,&lt;br /&gt;
        0,&lt;br /&gt;
        CSA105COMP_CSA105RES_ALARM_MAX_SLOTS,&lt;br /&gt;
        CL_OM_ALARM_CSA105RES_CLASS_TYPE&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        {  &lt;br /&gt;
        CSA105COMP_CSA105RES_PROV_CLASS_NAME,&lt;br /&gt;
        sizeof(CL_OM_PROV_CSA105RES_CLASS),&lt;br /&gt;
        CL_OM_PROV_CLASS_TYPE,&lt;br /&gt;
        clcsa105CompCSA105RESProvConstructor, &lt;br /&gt;
        clcsa105CompCSA105RESProvDestructor,&lt;br /&gt;
        NULL,&lt;br /&gt;
        CSA105COMP_CSA105RES_PROV_CLASS_VERSION,&lt;br /&gt;
        0,&lt;br /&gt;
        CL_MAX_OBJ,&lt;br /&gt;
        0,&lt;br /&gt;
        CSA105COMP_CSA105RES_PROV_MAX_SLOTS,&lt;br /&gt;
        CL_OM_PROV_CSA105RES_CLASS_TYPE&lt;br /&gt;
        },&lt;br /&gt;
    };&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
This OM class table is generated by the IDE in &amp;lt;code&amp;gt;clcsa105CompOAMPConfig.c&amp;lt;/code&amp;gt;.  The definition for &amp;lt;code&amp;gt;ClOmClassControlBlockT&amp;lt;/code&amp;gt; can be found in:&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/SAFplus/components/om/include/clOmApi.h &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa105Compcsa105Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClRcT clcsa105CompCSA105RESProvUpdate(CL_OM_PROV_CLASS* pThis, ClHandleT txnHandle,&lt;br /&gt;
                                      ClProvTxnDataT* pProvTxnData)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
    switch (pProvTxnData-&amp;gt;provCmd)&lt;br /&gt;
    {&lt;br /&gt;
        case CL_COR_OP_CREATE :&lt;br /&gt;
        case CL_COR_OP_CREATE_AND_SET:&lt;br /&gt;
			&lt;br /&gt;
        /*&lt;br /&gt;
         * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
         &lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Inside create request for the object [%s] &amp;quot;, appname, moIdName.value);    &lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---END_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
        case CL_COR_OP_SET:&lt;br /&gt;
	    &lt;br /&gt;
        /*&lt;br /&gt;
         * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
         &lt;br /&gt;
        switch (pProvTxnData-&amp;gt;attrId)&lt;br /&gt;
        {&lt;br /&gt;
            case CSA105RES_DELTA_T:&lt;br /&gt;
                delta_t = *(ClUint32T *)pProvTxnData-&amp;gt;pProvData;&lt;br /&gt;
                clprintf(CL_LOG_SEV_NOTICE,&amp;quot;%s: The delta time is now [%d] &amp;quot;, appname, delta_t);&lt;br /&gt;
                break;&lt;br /&gt;
            case CSA105RES_COUNTER_THRESH:&lt;br /&gt;
                counter_threshold = *(ClUint32T *)pProvTxnData-&amp;gt;pProvData;&lt;br /&gt;
                clprintf(CL_LOG_SEV_NOTICE,&amp;quot;%s: The counter threshold is now [%d] &amp;quot;, appname, counter_threshold);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---END_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
&lt;br /&gt;
        case  CL_COR_OP_DELETE:&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---END_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
        default:&lt;br /&gt;
            clprintf (CL_LOG_SEV_ERROR, &amp;quot;Prov command is not proper&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
This base provisioning class method is generated by The IDE but requires application-specific logic to be filled in.  &amp;lt;code&amp;gt;clcsa105CompCSA105RESProvUpdate()&amp;lt;/code&amp;gt; is called to update an object's attribute. This has changed from our csa104 example as you can now change the counter threshold as well as the delta time.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa105Compcsa105Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClRcT clcsa105CompCSA105RESAlarmConstructor( void *pThis, void *pUsrData, ClUint32T usrDataLen )&lt;br /&gt;
{&lt;br /&gt;
    ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ClRcT clcsa105CompCSA105RESAlarmDestructor ( void *pThis , void  *pUsrData, ClUint32T usrDataLen )&lt;br /&gt;
{&lt;br /&gt;
    ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
There are two new functions that have been added as well. These are a constructor and destructor for the alarm. The definition for &amp;lt;code&amp;gt;clcsa105CompCSA105RESAlarmConstructor&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;clcsa105CompCSA105RESAlarmDestructor&amp;lt;/code&amp;gt; can be found in the file &amp;lt;code&amp;gt;clcsa105CompOAMPConfig.h&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now lets look at the code in &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105AlmLstner.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
....&lt;br /&gt;
ClRcT &lt;br /&gt;
alarm_event_subscribe_callback(const ClAlarmHandleInfoT* pAlarmInfo);&lt;br /&gt;
...&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Near the top of the module we declare the function that will be used to subscribe to alarm events.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClRcT&lt;br /&gt;
clCompAppAMFCSISet(&lt;br /&gt;
    ClInvocationT       invocation,&lt;br /&gt;
    const ClNameT       *compName,&lt;br /&gt;
    ClAmsHAStateT       haState,&lt;br /&gt;
    ClAmsCSIDescriptorT csiDescriptor)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    switch ( haState )&lt;br /&gt;
    {&lt;br /&gt;
        case CL_AMS_HA_STATE_ACTIVE:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to take the active HA state &lt;br /&gt;
             * for the CSI.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            // ...&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            clCpmResponse(cpmHandle, invocation, CL_OK);&lt;br /&gt;
            &lt;br /&gt;
            rc = clAlarmEventSubscribe(&amp;amp;alarm_event_subscribe_callback);&lt;br /&gt;
            if (CL_OK != rc)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed while subscribing for the alarm events. rc[0x%x]&amp;quot;,&lt;br /&gt;
                                                        appname, rc);&lt;br /&gt;
                return rc;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        case CL_AMS_HA_STATE_STANDBY:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to take the standby HA state &lt;br /&gt;
             * for this CSI.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            // ...&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            clCpmResponse(cpmHandle, invocation, CL_OK);&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        case CL_AMS_HA_STATE_QUIESCED:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to quiesce the CSI currently&lt;br /&gt;
             * assigned the active or quiescing HA state. The application &lt;br /&gt;
             * must stop work associated with the CSI immediately.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            // ...&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            clCpmResponse(cpmHandle, invocation, CL_OK);&lt;br /&gt;
&lt;br /&gt;
            rc = clAlarmEventUnsubscribe();&lt;br /&gt;
            if (CL_OK != rc)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed while un-subscribing for the alarm evnets. rc[0x%x] &amp;quot;,  &lt;br /&gt;
                                                                appname, rc);&lt;br /&gt;
                return rc;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        case CL_AMS_HA_STATE_QUIESCING:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to quiesce the CSI currently&lt;br /&gt;
             * assigned the active HA state. The application must stop work&lt;br /&gt;
             * associated with the CSI gracefully and not accept any new&lt;br /&gt;
             * workloads while the work is being terminated.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            // ...&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            clCpmCSIQuiescingComplete(cpmHandle, invocation, CL_OK);&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        default:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * Should never happen. Ignore.&lt;br /&gt;
             */&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;clCompAppAMFCSISet&amp;lt;/code&amp;gt; function is called when the state of the CSI is set. Here we call the &amp;lt;code&amp;gt;clAlarmEventSubscribe&amp;lt;/code&amp;gt; api (passing it a handle to our callback function) when the CSI becomes active. When the CSI becomes innactive we call the &amp;lt;code&amp;gt;clAlarmEventUnsubscribe&amp;lt;/code&amp;gt; api.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClRcT &lt;br /&gt;
alarm_event_subscribe_callback(const ClAlarmHandleInfoT* pAlarmInfo)&lt;br /&gt;
{&lt;br /&gt;
    ClRcT   rc = CL_OK;&lt;br /&gt;
    ClNameT moIdName = {0};&lt;br /&gt;
    ClCorMOIdT  moId = pAlarmInfo-&amp;gt;alarmInfo.moId;&lt;br /&gt;
    ClAlarmUtilPayLoadListPtrT pPayloadList = NULL;&lt;br /&gt;
&lt;br /&gt;
    rc = clCorMoIdToMoIdNameGet(&amp;amp;moId, &amp;amp;moIdName);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]:Failed while getting the moId from MOId Name. rc[0x%x] &amp;quot;, &lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    rc = clAlarmUtilPayLoadExtract((ClUint8T *)pAlarmInfo-&amp;gt;alarmInfo.buff, &lt;br /&gt;
            pAlarmInfo-&amp;gt;alarmInfo.len, &amp;amp;pPayloadList);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]: Failed while extracting the payload information. rc[0x%x] &amp;quot;, &lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;______________________________________________________&amp;quot;);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;The alarm is [%s] &amp;quot;, pAlarmInfo-&amp;gt;alarmInfo.alarmState ?&amp;quot;RAISED&amp;quot;:&amp;quot;CLEARED&amp;quot;);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;The alarm Raised on the resource [%s]  &amp;quot;, moIdName.value);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;Component which has raised the alarm  is [%s] &amp;quot;, pAlarmInfo-&amp;gt;alarmInfo.compName.value);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;Probable cause of the alarm is [%d] &amp;quot;, pAlarmInfo-&amp;gt;alarmInfo.probCause);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;Severity of the alarm is [%d] &amp;quot;, pAlarmInfo-&amp;gt;alarmInfo.severity);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;The payload information : [%s] &amp;quot;, (char*)pPayloadList-&amp;gt;pPayload[0].pTlv[0].value);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;______________________________________________________&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Finally we the callback function. Since this component has registered itself as an alarm listener when it becomes active, this function will be called when the alarm is raised. The function simply prints out a message displaying some of the data that was loaded into the &amp;lt;code&amp;gt;ClAlarmHandleInfoT&amp;lt;/code&amp;gt; structure when the alarm was raised.&lt;br /&gt;
&lt;br /&gt;
===How to Run csa105 and What to Observe===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Start the application as usual with the SAFplus Platform Console. Since our example has two components we will put them both into a lock assignment state.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 # cd /root/asp/bin&lt;br /&gt;
 # ./asp_console&lt;br /&gt;
&lt;br /&gt;
 cli[Test]-&amp;gt; setc 1&lt;br /&gt;
 cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa105SGI0&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa105AlmLstnerSGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example actually creates three log files...&amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI1Log.latest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/root/asp/var/log/csa105AlmLstnerCompLog.latest&amp;lt;/code&amp;gt;. The only ones that we are interested in are &amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/var/log/csa105AlmLstnerCompLog.latest&amp;lt;/code&amp;gt;. Open up two separate command windows. We will view each of the logs in a separate window. In one window type the command &amp;lt;code&amp;gt;tail -f /root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt;. In the other type the command &amp;lt;code&amp;gt;tail -f /root/asp/var/log/csa105AlmLstnerCompLog.latest&amp;lt;/code&amp;gt;. You should see the following output. (The csa105AlmLstnerComp.log file will not have any output yet.)&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa105CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00135 :   INFO)&lt;br /&gt;
 Component [csa105CompI0] : PID [22201]. Initializing&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00136 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00137 :   INFO)&lt;br /&gt;
    IOC Port                : 0x81&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00138 :   INFO)&lt;br /&gt;
 csa105: instantiated as component instance csa105CompI0.&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00139 :   INFO)&lt;br /&gt;
 csa105CompI0: cpmHandle = 0x1&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00140 :   INFO)&lt;br /&gt;
 csa105CompI0: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00141 :   INFO)&lt;br /&gt;
 csa105CompI0: checkpoint_initialize&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00148 :   INFO)&lt;br /&gt;
 csa105CompI0: Checkpoint service initialized (handle=0x1)&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00150 :   INFO)&lt;br /&gt;
 csa105CompI0: Checkpoint opened (handle=0x2)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now unlock the '''csa105AlmLstnerSGI0''' service group.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsUnlock sg csa105AlmLstnerSGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Next unlock the '''csa105SGI0''' service group.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsUnlock sg csa105SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see the following output in the &amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt; log file.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa105CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00286 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 0)&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00291 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnStart] ****&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00293 :   INFO)&lt;br /&gt;
 Inside the function clcsa105CompCSA105RESProvObjectStart&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00295 :   INFO)&lt;br /&gt;
 Inside the function clcsa105CompCSA105RESProvValidate&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00311 :   INFO)&lt;br /&gt;
 Inside the function clcsa105CompCSA105RESProvUpdate&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00313 :   INFO)&lt;br /&gt;
 Inside the function clcsa105CompCSA105RESProvObjectEnd&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00322 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnEnd] ****&lt;br /&gt;
Mon Jul 14 20:21:19 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00329 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 1)&lt;br /&gt;
Mon Jul 14 20:21:20 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00330 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 2)&lt;br /&gt;
Mon Jul 14 20:21:21 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00331 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 3)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
You will notice that the '''csa105CompI0''' component has begun printing out the 'Hello World'. You can also see that the counter value is incrementing.&lt;br /&gt;
&lt;br /&gt;
Keep watching the counter value as it increments. Remember that we set up an initial counter threshold of 65. Once the counter value reaches 65 you will see the following in the &amp;lt;code&amp;gt;/root/asp/var/log/csa105AlmLstnerCompLog.latest&amp;lt;/code&amp;gt; log file.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/cscsa105AlmLstnerCompLog.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
__________________________________________________________________________________&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00109 :   INFO)&lt;br /&gt;
 The alarm is [RAISED]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00110 :   INFO)&lt;br /&gt;
 The alarm Raised on the resource [\Chassis:0\csa105Res:0]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00111 :   INFO)&lt;br /&gt;
 Component which has raised the alarm  is [csa105CompI1]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00112 :   INFO)&lt;br /&gt;
 Probable cause of the alarm is [16]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00113 :   INFO)&lt;br /&gt;
 Severity of the alarm is [4]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00114 :   INFO)&lt;br /&gt;
 The payload information : [[csa105CompI0]: The Alarm has been raised as the counter &lt;br /&gt;
became [65] for [1] time]&lt;br /&gt;
__________________________________________________________________________________&lt;br /&gt;
__________________________________________________________________________________&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00134 :   INFO)&lt;br /&gt;
 The alarm is [CLEARED]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00135 :   INFO)&lt;br /&gt;
 The alarm Raised on the resource [\Chassis:0\csa105Res:0]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00136 :   INFO)&lt;br /&gt;
 Component which has raised the alarm  is [csa105CompI1]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00137 :   INFO)&lt;br /&gt;
 Probable cause of the alarm is [16]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00138 :   INFO)&lt;br /&gt;
 Severity of the alarm is [4]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00139 :   INFO)&lt;br /&gt;
 The payload information : [[csa105CompI0]: The Alarm has been raised as the counter&lt;br /&gt;
became [65] for [1] time]&lt;br /&gt;
&lt;br /&gt;
__________________________________________________________________________________&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
As you can see our callback function in the module &amp;lt;code&amp;gt;&amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105AlmLstner/clCompAppMain.c&amp;lt;/code&amp;gt; was called twice. Once when the alarm was raised and once when it was cleared. Looking at the &amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt; log file you can see that the alarm was raised and cleared from this component and then the counter value was reset.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa105CompI0Log.l&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 20:22:22 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00812 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 64)&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00813 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 65)&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00814 :   INFO)&lt;br /&gt;
 [csa105CompI0]: Raising the alarm as the counter threashold has reached.&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00843 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 0)&lt;br /&gt;
Mon Jul 14 20:22:24 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00844 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 1)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This behavior will continue each time the counter value reaches 65.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now lets change the threshold value. We do this through the SAFplus Platform Console. In the SAFplus Platform Console return to the SCNodeI0  context by entering &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; until it prints the SCNodeI0 prompt: &amp;lt;code&amp;gt;cli[Test:SCNodeI0]-&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now set the context to the COR server using the following command:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc corServer_SCNodeI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then, dump the object tree:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objTreeShow&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see something like the following.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objtreeshow&lt;br /&gt;
&lt;br /&gt;
Objects (Instance Tree):&lt;br /&gt;
    \Chassis:0&lt;br /&gt;
        \PayloadNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \PayloadNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa104Res:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa105Res:0&lt;br /&gt;
            (alarm, provisioning)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Next, dump object with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objectShow \Chassis:0\csa105Res:0 PROV&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Showing Object&lt;br /&gt;
ClCorMOId:[Svc: 3] (/).(10001:0000).(10004:0000):&lt;br /&gt;
&lt;br /&gt;
[Class:0x10005] Object &lt;br /&gt;
{&lt;br /&gt;
[CSA105RES_COUNTER             ] [0x0004] = [41]&lt;br /&gt;
[CSA105RES_COUNTER_THRESH      ] [0x0005] = [65]&lt;br /&gt;
[CSA105RES_DELTA_T             ] [0x0006] = [1000]&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now, set the counter_thresh attribute to 20 instead of 65 with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; attrSet \Chassis:0\csa105Res:0 3 null 5 -1 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Execution Result : Passed&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
The 3 is the service ID of the object.&lt;br /&gt;
Now you will notice that the alarm is raised every time the counter value reaches 20.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;To end this example first get back to the CPM context.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now shut things down in the usual fashion. Remember that this example has two components to shut down.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa105SGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa105AlmLstnerSGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockInstantiation sg csa105SGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockInstantiation sg csa105AlmLstnerSGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; end&lt;br /&gt;
cli[Test]-&amp;gt; bye&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Summary and References===&lt;br /&gt;
&lt;br /&gt;
This application is built upon the csa104 application and presents :&lt;br /&gt;
*how provisioning and alarm libraries work together to achieve a simple software alarm management&lt;br /&gt;
*how COR change notification is utilized&lt;/div&gt;</summary>
		<author><name>Pradeepac</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/csa105</id>
		<title>Doc:latest/evalguide/csa105</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/csa105"/>
				<updated>2010-08-30T08:25:54Z</updated>
		
		<summary type="html">&lt;p&gt;Pradeepac: /* How to Run csa105 and What to Observe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==csa105 Software Alarm Management and Provisioning==&lt;br /&gt;
&lt;br /&gt;
===Objective===&lt;br /&gt;
&lt;br /&gt;
The goal of this sample application is to show &lt;br /&gt;
*how provisioning and alarm libraries work together to achieve a simple software alarm management&lt;br /&gt;
*how COR change notification is utilized&lt;br /&gt;
&lt;br /&gt;
===What You Will Learn===&lt;br /&gt;
&lt;br /&gt;
You will learn how the Clovis Object Manager (OM) is used to achieve interactions between the alarm and provisioning libraries.  In addition, two ways to report an alarm is introduced:  COR change notification and fault reporting.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&lt;br /&gt;
The code in csa105 is a bit different than our previous examples. csa105 contains two components instead of one. The first component (csa105Comp) is much like the other examples. It runs within a loop printing out 'Hello World' and with each iteration it increments a counter value. Once this counter value meets or exceeds a defineable threshold, the component raises an alarm. The second component (csa105AlmLstnerComp) registers itself with SAFplus Platform as an alarm subscriber or listener. Once our first component raises the alarm our second component receives notification of this and prints some information out to a log file so that we can see.&lt;br /&gt;
&lt;br /&gt;
There is also a new source file that you will see. This file is '''clcsa105CompalarmMetaStruct.c'''. This file contains definitions for the counter threshold crossing alarm. Everything in this file is generated by the IDE. We will not be customizing it.&lt;br /&gt;
&lt;br /&gt;
The code can be found within the following directories&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105Comp&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105AlmLstner&lt;br /&gt;
&lt;br /&gt;
This example is built on top of the csa104 example. We will only look at the code that has been added for this example. First we will look at the code in &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105Comp.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClUint32T counter_threshold   = 55; // the value determining the counter threshold.&lt;br /&gt;
...&lt;br /&gt;
static ClRcT raise_alarm_on_counter(ClCorMOIdT, ClNameT, ClUint32T);&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
First we define and initialize the counter threshold. This is the value our counter will be compared against to determine if an alarm should be raised.&lt;br /&gt;
&amp;lt;br&amp;gt;Next we declare the function that will be called to raise the alarm.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
clCompAppInitialize():&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
    if (counter_threshold &amp;lt;= counter)&lt;br /&gt;
    {&lt;br /&gt;
        clCorMoIdServiceSet(&amp;amp;moId, CL_COR_SVC_ID_ALARM_MANAGEMENT);&lt;br /&gt;
        if (( rc = raise_alarm_on_counter (moId, appName, counter)) != CL_OK)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Error [0x%x]: Alarm raise has failed. Exiting. &amp;quot;,&lt;br /&gt;
                        appname, rc);&lt;br /&gt;
            counter = 0;&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        counter = 0;&lt;br /&gt;
        continue;&lt;br /&gt;
    }&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The clCompAppInitialize() function is where our main loop runs that prints 'Hello World' and increments our counter. Each time through the loop we will now compare our counter value against the threshold value. If the counter is equal to or greater than this threshold we will call our raise_alarm_on_counter function. We also set the counter back to 0.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
static ClRcT&lt;br /&gt;
raise_alarm_on_counter (ClCorMOIdT moId , ClNameT compName, ClUint32T counter)&lt;br /&gt;
{&lt;br /&gt;
    ClRcT           rc = CL_OK;&lt;br /&gt;
    static ClUint32T       iterator = 0, lastCounter = 0;&lt;br /&gt;
    ClCharT str [80] = {0};&lt;br /&gt;
    ClAlarmInfoT *pAlarmInfo = {0};&lt;br /&gt;
    ClAlarmHandleT alarmHandle = {0};&lt;br /&gt;
    ClUint8T * pBuf = NULL;&lt;br /&gt;
    ClUint32T size = 0;&lt;br /&gt;
    ClAlarmUtilPayLoadListPtrT pPayloadList = NULL;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    if (lastCounter != counter)&lt;br /&gt;
    {&lt;br /&gt;
        lastCounter = counter;&lt;br /&gt;
        iterator = 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    pPayloadList = clHeapAllocate(sizeof(ClAlarmUtilPayLoadListT));&lt;br /&gt;
    if (pPayloadList == NULL)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed to allocate the memory for the alarm payload list.&amp;quot;);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;numPayLoadEnteries = 1;&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload = clHeapAllocate(sizeof(ClAlarmUtilPayLoadT));&lt;br /&gt;
    if (NULL == pPayloadList-&amp;gt;pPayload)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed while allocating payload array.&amp;quot;);&lt;br /&gt;
        clHeapFree(pPayloadList);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].numTlvs = 1;&lt;br /&gt;
    clCorMoIdClone(&amp;amp;moId, &amp;amp;pPayloadList-&amp;gt;pPayload[0].pMoId);&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].pTlv = clHeapAllocate(sizeof(ClAlarmUtilTlvT));&lt;br /&gt;
    if (NULL == pPayloadList-&amp;gt;pPayload[0].pTlv)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed while allocating the pTlv array. &amp;quot;);&lt;br /&gt;
        clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sprintf(str, &amp;quot;[%s]: The Alarm has been raised as the counter became [%d] for [%d] time&amp;quot;, &lt;br /&gt;
            appname, counter, ++iterator);&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].pTlv[0].type = CL_COR_UINT8;&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].pTlv[0].value = clHeapAllocate(strlen(str) + 1);&lt;br /&gt;
    if (NULL == pPayloadList-&amp;gt;pPayload[0].pTlv[0].value)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed while allocating the value for the attribute.&amp;quot;);&lt;br /&gt;
        clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].pTlv[0].length = strlen(str) + 1;&lt;br /&gt;
&lt;br /&gt;
    memset(pPayloadList-&amp;gt;pPayload[0].pTlv[0].value, 0, strlen(str) + 1);&lt;br /&gt;
&lt;br /&gt;
    memcpy(pPayloadList-&amp;gt;pPayload[0].pTlv[0].value, str, strlen(str));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    rc = clAlarmUtilPayloadFlatten(pPayloadList, &amp;amp;size, &amp;amp;pBuf);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]. Failed while getting the flat buffer for the payload. rc[0x%x]&amp;quot;, &lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pAlarmInfo = clHeapAllocate (sizeof(ClAlarmInfoT) + size);&lt;br /&gt;
    if (NULL == pAlarmInfo)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]: Failed to allocate the memory for alarm information. &amp;quot;, appname);&lt;br /&gt;
        clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
        clAlarmUtilPayloadBufFree(pBuf);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pAlarmInfo-&amp;gt;moId = moId;&lt;br /&gt;
    pAlarmInfo-&amp;gt;probCause = CL_ALARM_PROB_CAUSE_THRESHOLD_CROSSED; &lt;br /&gt;
    pAlarmInfo-&amp;gt;severity = CL_ALARM_SEVERITY_WARNING;&lt;br /&gt;
    memcpy (&amp;amp;pAlarmInfo-&amp;gt;compName, &amp;amp;compName, sizeof(ClNameT));&lt;br /&gt;
    pAlarmInfo-&amp;gt;alarmState = CL_ALARM_STATE_ASSERT;&lt;br /&gt;
    pAlarmInfo-&amp;gt;len = size;&lt;br /&gt;
&lt;br /&gt;
    memcpy(pAlarmInfo-&amp;gt;buff, pBuf, pAlarmInfo-&amp;gt;len);&lt;br /&gt;
&lt;br /&gt;
    clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
    clAlarmUtilPayloadBufFree(pBuf);&lt;br /&gt;
&lt;br /&gt;
    clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]: Raising the alarm as the counter threashold has reached. &amp;quot;, appname); &lt;br /&gt;
&lt;br /&gt;
    rc = clAlarmRaise (pAlarmInfo, &amp;amp;alarmHandle);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: The alarm raise has failed. &amp;quot;, appname, rc);&lt;br /&gt;
        clHeapFree(pAlarmInfo);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }  &lt;br /&gt;
&lt;br /&gt;
    pAlarmInfo-&amp;gt;alarmState = CL_ALARM_STATE_CLEAR;&lt;br /&gt;
    rc = clAlarmRaise (pAlarmInfo, &amp;amp;alarmHandle);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: The alarm clear has failed. &amp;quot;, appname, rc);&lt;br /&gt;
        clHeapFree(pAlarmInfo);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    clHeapFree(pAlarmInfo);&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The raise_alarm_on_counter function receives some information when called such as the application name and the counter value. It creates an &amp;lt;code&amp;gt;ClAlarmInfoT&amp;lt;/code&amp;gt; structure and fills it with some useful information. It then calls the &amp;lt;code&amp;gt;clAlarmRaise&amp;lt;/code&amp;gt; api twice. The first call is to raise the alarm and the second call is to clear the alarm. (Notice that the alarm state is set to &amp;lt;code&amp;gt;CL_ALARM_STATE_ASSERT&amp;lt;/code&amp;gt; for the first call and &amp;lt;code&amp;gt;CL_ALARM_STATE_CLEAR&amp;lt;/code&amp;gt; for the second call). The reason for this is that a given alarm is only raised once unless it is cleared. This is to avoid an alarm continually being sent.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa105CompOAMPConfig.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    ClOmClassControlBlockT pAppOmClassTbl[] =&lt;br /&gt;
    {&lt;br /&gt;
        {  &lt;br /&gt;
        CSA105COMP_CSA105RES_ALARM_CLASS_NAME,&lt;br /&gt;
        sizeof(CL_OM_ALARM_CSA105RES_CLASS),&lt;br /&gt;
        CL_OM_ALARM_CLASS_TYPE,&lt;br /&gt;
        clcsa105CompCSA105RESAlarmConstructor, &lt;br /&gt;
        clcsa105CompCSA105RESAlarmDestructor,&lt;br /&gt;
        NULL,&lt;br /&gt;
        CSA105COMP_CSA105RES_ALARM_CLASS_VERSION,&lt;br /&gt;
        0,&lt;br /&gt;
        CL_MAX_OBJ,&lt;br /&gt;
        0,&lt;br /&gt;
        CSA105COMP_CSA105RES_ALARM_MAX_SLOTS,&lt;br /&gt;
        CL_OM_ALARM_CSA105RES_CLASS_TYPE&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        {  &lt;br /&gt;
        CSA105COMP_CSA105RES_PROV_CLASS_NAME,&lt;br /&gt;
        sizeof(CL_OM_PROV_CSA105RES_CLASS),&lt;br /&gt;
        CL_OM_PROV_CLASS_TYPE,&lt;br /&gt;
        clcsa105CompCSA105RESProvConstructor, &lt;br /&gt;
        clcsa105CompCSA105RESProvDestructor,&lt;br /&gt;
        NULL,&lt;br /&gt;
        CSA105COMP_CSA105RES_PROV_CLASS_VERSION,&lt;br /&gt;
        0,&lt;br /&gt;
        CL_MAX_OBJ,&lt;br /&gt;
        0,&lt;br /&gt;
        CSA105COMP_CSA105RES_PROV_MAX_SLOTS,&lt;br /&gt;
        CL_OM_PROV_CSA105RES_CLASS_TYPE&lt;br /&gt;
        },&lt;br /&gt;
    };&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
This OM class table is generated by the IDE in &amp;lt;code&amp;gt;clcsa105CompOAMPConfig.c&amp;lt;/code&amp;gt;.  The definition for &amp;lt;code&amp;gt;ClOmClassControlBlockT&amp;lt;/code&amp;gt; can be found in:&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/SAFplus/components/om/include/clOmApi.h &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa105Compcsa105Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClRcT clcsa105CompCSA105RESProvUpdate(CL_OM_PROV_CLASS* pThis, ClHandleT txnHandle,&lt;br /&gt;
                                      ClProvTxnDataT* pProvTxnData)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
    switch (pProvTxnData-&amp;gt;provCmd)&lt;br /&gt;
    {&lt;br /&gt;
        case CL_COR_OP_CREATE :&lt;br /&gt;
        case CL_COR_OP_CREATE_AND_SET:&lt;br /&gt;
			&lt;br /&gt;
        /*&lt;br /&gt;
         * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
         &lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Inside create request for the object [%s] &amp;quot;, appname, moIdName.value);    &lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---END_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
        case CL_COR_OP_SET:&lt;br /&gt;
	    &lt;br /&gt;
        /*&lt;br /&gt;
         * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
         &lt;br /&gt;
        switch (pProvTxnData-&amp;gt;attrId)&lt;br /&gt;
        {&lt;br /&gt;
            case CSA105RES_DELTA_T:&lt;br /&gt;
                delta_t = *(ClUint32T *)pProvTxnData-&amp;gt;pProvData;&lt;br /&gt;
                clprintf(CL_LOG_SEV_NOTICE,&amp;quot;%s: The delta time is now [%d] &amp;quot;, appname, delta_t);&lt;br /&gt;
                break;&lt;br /&gt;
            case CSA105RES_COUNTER_THRESH:&lt;br /&gt;
                counter_threshold = *(ClUint32T *)pProvTxnData-&amp;gt;pProvData;&lt;br /&gt;
                clprintf(CL_LOG_SEV_NOTICE,&amp;quot;%s: The counter threshold is now [%d] &amp;quot;, appname, counter_threshold);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---END_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
&lt;br /&gt;
        case  CL_COR_OP_DELETE:&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---END_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
        default:&lt;br /&gt;
            clprintf (CL_LOG_SEV_ERROR, &amp;quot;Prov command is not proper&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
This base provisioning class method is generated by The IDE but requires application-specific logic to be filled in.  &amp;lt;code&amp;gt;clcsa105CompCSA105RESProvUpdate()&amp;lt;/code&amp;gt; is called to update an object's attribute. This has changed from our csa104 example as you can now change the counter threshold as well as the delta time.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa105Compcsa105Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClRcT clcsa105CompCSA105RESAlarmConstructor( void *pThis, void *pUsrData, ClUint32T usrDataLen )&lt;br /&gt;
{&lt;br /&gt;
    ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ClRcT clcsa105CompCSA105RESAlarmDestructor ( void *pThis , void  *pUsrData, ClUint32T usrDataLen )&lt;br /&gt;
{&lt;br /&gt;
    ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
There are two new functions that have been added as well. These are a constructor and destructor for the alarm. The definition for &amp;lt;code&amp;gt;clcsa105CompCSA105RESAlarmConstructor&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;clcsa105CompCSA105RESAlarmDestructor&amp;lt;/code&amp;gt; can be found in the file &amp;lt;code&amp;gt;clcsa105CompOAMPConfig.h&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now lets look at the code in &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105AlmLstner.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
....&lt;br /&gt;
ClRcT &lt;br /&gt;
alarm_event_subscribe_callback(const ClAlarmHandleInfoT* pAlarmInfo);&lt;br /&gt;
...&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Near the top of the module we declare the function that will be used to subscribe to alarm events.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClRcT&lt;br /&gt;
clCompAppAMFCSISet(&lt;br /&gt;
    ClInvocationT       invocation,&lt;br /&gt;
    const ClNameT       *compName,&lt;br /&gt;
    ClAmsHAStateT       haState,&lt;br /&gt;
    ClAmsCSIDescriptorT csiDescriptor)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    switch ( haState )&lt;br /&gt;
    {&lt;br /&gt;
        case CL_AMS_HA_STATE_ACTIVE:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to take the active HA state &lt;br /&gt;
             * for the CSI.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            // ...&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            clCpmResponse(cpmHandle, invocation, CL_OK);&lt;br /&gt;
            &lt;br /&gt;
            rc = clAlarmEventSubscribe(&amp;amp;alarm_event_subscribe_callback);&lt;br /&gt;
            if (CL_OK != rc)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed while subscribing for the alarm events. rc[0x%x]&amp;quot;,&lt;br /&gt;
                                                        appname, rc);&lt;br /&gt;
                return rc;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        case CL_AMS_HA_STATE_STANDBY:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to take the standby HA state &lt;br /&gt;
             * for this CSI.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            // ...&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            clCpmResponse(cpmHandle, invocation, CL_OK);&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        case CL_AMS_HA_STATE_QUIESCED:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to quiesce the CSI currently&lt;br /&gt;
             * assigned the active or quiescing HA state. The application &lt;br /&gt;
             * must stop work associated with the CSI immediately.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            // ...&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            clCpmResponse(cpmHandle, invocation, CL_OK);&lt;br /&gt;
&lt;br /&gt;
            rc = clAlarmEventUnsubscribe();&lt;br /&gt;
            if (CL_OK != rc)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed while un-subscribing for the alarm evnets. rc[0x%x] &amp;quot;,  &lt;br /&gt;
                                                                appname, rc);&lt;br /&gt;
                return rc;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        case CL_AMS_HA_STATE_QUIESCING:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to quiesce the CSI currently&lt;br /&gt;
             * assigned the active HA state. The application must stop work&lt;br /&gt;
             * associated with the CSI gracefully and not accept any new&lt;br /&gt;
             * workloads while the work is being terminated.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            // ...&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            clCpmCSIQuiescingComplete(cpmHandle, invocation, CL_OK);&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        default:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * Should never happen. Ignore.&lt;br /&gt;
             */&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;clCompAppAMFCSISet&amp;lt;/code&amp;gt; function is called when the state of the CSI is set. Here we call the &amp;lt;code&amp;gt;clAlarmEventSubscribe&amp;lt;/code&amp;gt; api (passing it a handle to our callback function) when the CSI becomes active. When the CSI becomes innactive we call the &amp;lt;code&amp;gt;clAlarmEventUnsubscribe&amp;lt;/code&amp;gt; api.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClRcT &lt;br /&gt;
alarm_event_subscribe_callback(const ClAlarmHandleInfoT* pAlarmInfo)&lt;br /&gt;
{&lt;br /&gt;
    ClRcT   rc = CL_OK;&lt;br /&gt;
    ClNameT moIdName = {0};&lt;br /&gt;
    ClCorMOIdT  moId = pAlarmInfo-&amp;gt;alarmInfo.moId;&lt;br /&gt;
    ClAlarmUtilPayLoadListPtrT pPayloadList = NULL;&lt;br /&gt;
&lt;br /&gt;
    rc = clCorMoIdToMoIdNameGet(&amp;amp;moId, &amp;amp;moIdName);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]:Failed while getting the moId from MOId Name. rc[0x%x] &amp;quot;, &lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    rc = clAlarmUtilPayLoadExtract((ClUint8T *)pAlarmInfo-&amp;gt;alarmInfo.buff, &lt;br /&gt;
            pAlarmInfo-&amp;gt;alarmInfo.len, &amp;amp;pPayloadList);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]: Failed while extracting the payload information. rc[0x%x] &amp;quot;, &lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;______________________________________________________&amp;quot;);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;The alarm is [%s] &amp;quot;, pAlarmInfo-&amp;gt;alarmInfo.alarmState ?&amp;quot;RAISED&amp;quot;:&amp;quot;CLEARED&amp;quot;);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;The alarm Raised on the resource [%s]  &amp;quot;, moIdName.value);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;Component which has raised the alarm  is [%s] &amp;quot;, pAlarmInfo-&amp;gt;alarmInfo.compName.value);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;Probable cause of the alarm is [%d] &amp;quot;, pAlarmInfo-&amp;gt;alarmInfo.probCause);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;Severity of the alarm is [%d] &amp;quot;, pAlarmInfo-&amp;gt;alarmInfo.severity);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;The payload information : [%s] &amp;quot;, (char*)pPayloadList-&amp;gt;pPayload[0].pTlv[0].value);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;______________________________________________________&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Finally we the callback function. Since this component has registered itself as an alarm listener when it becomes active, this function will be called when the alarm is raised. The function simply prints out a message displaying some of the data that was loaded into the &amp;lt;code&amp;gt;ClAlarmHandleInfoT&amp;lt;/code&amp;gt; structure when the alarm was raised.&lt;br /&gt;
&lt;br /&gt;
===How to Run csa105 and What to Observe===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Start the application as usual with the SAFplus Platform Console. Since our example has two components we will put them both into a lock assignment state.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 # cd /root/asp/bin&lt;br /&gt;
 # ./asp_console&lt;br /&gt;
&lt;br /&gt;
 cli[Test]-&amp;gt; setc 1&lt;br /&gt;
 cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa105SGI0&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa105AlmLstnerSGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example actually creates three log files...&amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI1Log.latest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/root/asp/var/log/csa105AlmLstnerCompLog.latest&amp;lt;/code&amp;gt;. The only ones that we are interested in are &amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/var/log/csa105AlmLstnerCompLog.latest&amp;lt;/code&amp;gt;. Open up two separate command windows. We will view each of the logs in a separate window. In one window type the command &amp;lt;code&amp;gt;tail -f /root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt;. In the other type the command &amp;lt;code&amp;gt;tail -f /root/asp/var/log/csa105AlmLstnerCompLog.latest&amp;lt;/code&amp;gt;. You should see the following output. (The csa105AlmLstnerComp.log file will not have any output yet.)&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa105CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00135 :   INFO)&lt;br /&gt;
 Component [csa105CompI0] : PID [22201]. Initializing&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00136 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00137 :   INFO)&lt;br /&gt;
    IOC Port                : 0x81&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00138 :   INFO)&lt;br /&gt;
 csa105: instantiated as component instance csa105CompI0.&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00139 :   INFO)&lt;br /&gt;
 csa105CompI0: cpmHandle = 0x1&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00140 :   INFO)&lt;br /&gt;
 csa105CompI0: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00141 :   INFO)&lt;br /&gt;
 csa105CompI0: checkpoint_initialize&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00148 :   INFO)&lt;br /&gt;
 csa105CompI0: Checkpoint service initialized (handle=0x1)&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00150 :   INFO)&lt;br /&gt;
 csa105CompI0: Checkpoint opened (handle=0x2)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now unlock the '''csa105AlmLstnerSGI0''' service group.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsUnlock sg csa105AlmLstnerSGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Next unlock the '''csa105SGI0''' service group.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsUnlock sg csa105SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see the following output in the &amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt; log file.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa105CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00286 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 0)&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00291 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnStart] ****&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00293 :   INFO)&lt;br /&gt;
 Inside the function clcsa105CompCSA105RESProvObjectStart&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00295 :   INFO)&lt;br /&gt;
 Inside the function clcsa105CompCSA105RESProvValidate&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00311 :   INFO)&lt;br /&gt;
 Inside the function clcsa105CompCSA105RESProvUpdate&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00313 :   INFO)&lt;br /&gt;
 Inside the function clcsa105CompCSA105RESProvObjectEnd&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00322 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnEnd] ****&lt;br /&gt;
Mon Jul 14 20:21:19 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00329 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 1)&lt;br /&gt;
Mon Jul 14 20:21:20 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00330 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 2)&lt;br /&gt;
Mon Jul 14 20:21:21 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00331 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 3)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
You will notice that the '''csa105CompI0''' component has begun printing out the 'Hello World'. You can also see that the counter value is incrementing.&lt;br /&gt;
&lt;br /&gt;
Keep watching the counter value as it increments. Remember that we set up an initial counter threshold of 65. Once the counter value reaches 65 you will see the following in the &amp;lt;code&amp;gt;/root/asp/var/log/csa105AlmLstnerCompLog.latest&amp;lt;/code&amp;gt; log file.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/cscsa105AlmLstnerCompLog.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
__________________________________________________________________________________&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00109 :   INFO)&lt;br /&gt;
 The alarm is [RAISED]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00110 :   INFO)&lt;br /&gt;
 The alarm Raised on the resource [\Chassis:0\csa105Res:0]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00111 :   INFO)&lt;br /&gt;
 Component which has raised the alarm  is [csa105CompI1]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00112 :   INFO)&lt;br /&gt;
 Probable cause of the alarm is [16]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00113 :   INFO)&lt;br /&gt;
 Severity of the alarm is [4]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00114 :   INFO)&lt;br /&gt;
 The payload information : [[csa105CompI0]: The Alarm has been raised as the counter &lt;br /&gt;
became [65] for [1] time]&lt;br /&gt;
__________________________________________________________________________________&lt;br /&gt;
__________________________________________________________________________________&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00134 :   INFO)&lt;br /&gt;
 The alarm is [CLEARED]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00135 :   INFO)&lt;br /&gt;
 The alarm Raised on the resource [\Chassis:0\csa105Res:0]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00136 :   INFO)&lt;br /&gt;
 Component which has raised the alarm  is [csa105CompI1]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00137 :   INFO)&lt;br /&gt;
 Probable cause of the alarm is [16]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00138 :   INFO)&lt;br /&gt;
 Severity of the alarm is [4]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00139 :   INFO)&lt;br /&gt;
 The payload information : [[csa105CompI0]: The Alarm has been raised as the counter&lt;br /&gt;
became [65] for [1] time]&lt;br /&gt;
&lt;br /&gt;
__________________________________________________________________________________&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
As you can see our callback function in the module &amp;lt;code&amp;gt;&amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105AlmLstner/clCompAppMain.c&amp;lt;/code&amp;gt; was called twice. Once when the alarm was raised and once when it was cleared. Looking at the &amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt; log file you can see that the alarm was raised and cleared from this component and then the counter value was reset.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa105CompI0Log.l&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 20:22:22 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00812 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 64)&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00813 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 65)&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00814 :   INFO)&lt;br /&gt;
 [csa105CompI0]: Raising the alarm as the counter threashold has reached.&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00843 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 0)&lt;br /&gt;
Mon Jul 14 20:22:24 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00844 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 1)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This behavior will continue each time the counter value reaches 65.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now lets change the threshold value. We do this through the SAFplus Platform Console. In the SAFplus Platform Console return to the SCNodeI0  context by entering &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; until it prints the SCNodeI0 prompt: &amp;lt;code&amp;gt;cli[Test:SCNodeI0]-&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now set the context to the COR server using the following command:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc corServer_SCNodeI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then, dump the object tree:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objTreeShow&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see something like the following.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objtreeshow&lt;br /&gt;
&lt;br /&gt;
Objects (Instance Tree):&lt;br /&gt;
    \Chassis:0&lt;br /&gt;
        \PayloadNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \PayloadNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa104Res:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa105Res:0&lt;br /&gt;
            (alarm, provisioning)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Next, dump object with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objectShow \Chassis:0\csa105Res:0 PROV&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Showing Object&lt;br /&gt;
ClCorMOId:[Svc: 3] (/).(10001:0000).(10004:0000):&lt;br /&gt;
&lt;br /&gt;
[Class:0x10005] Object &lt;br /&gt;
{&lt;br /&gt;
[CSA105RES_COUNTER             ] [0x0004] = [41]&lt;br /&gt;
[CSA105RES_COUNTER_THRESH      ] [0x0005] = [65]&lt;br /&gt;
[CSA105RES_DELTA_T             ] [0x0006] = [1000]&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now, set the counter_thresh attribute to 20 instead of 65 with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; attrSet \Chassis:0\csa105Res:0 3 null 5 -1 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Execution Result : Passed&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Where 3 is the service ID of the object.&lt;br /&gt;
Now you will notice that the alarm is raised every time the counter value reaches 20.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;To end this example first get back to the CPM context.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now shut things down in the usual fashion. Remember that this example has two components to shut down.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa105SGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa105AlmLstnerSGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockInstantiation sg csa105SGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockInstantiation sg csa105AlmLstnerSGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; end&lt;br /&gt;
cli[Test]-&amp;gt; bye&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Summary and References===&lt;br /&gt;
&lt;br /&gt;
This application is built upon the csa104 application and presents :&lt;br /&gt;
*how provisioning and alarm libraries work together to achieve a simple software alarm management&lt;br /&gt;
*how COR change notification is utilized&lt;/div&gt;</summary>
		<author><name>Pradeepac</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/app_ide</id>
		<title>Doc:latest/evalguide/app ide</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/app_ide"/>
				<updated>2010-08-29T06:00:04Z</updated>
		
		<summary type="html">&lt;p&gt;Pradeepac: /* Generating Source Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Appendix A: OpenClovis IDE==&lt;br /&gt;
&lt;br /&gt;
OpenClovis IDE is an Integrated Development Environment designed to simplify and accelerate the development of software with the OpenClovis SDK. It  provides a simple and powerful mechanism with easy drag-and-drop features, to create Resources and Components, define attributes and relationships between them. The OpenClovis IDE graphical interface enables you to capture the Information Models through UML notifications and save them as XML files.&lt;br /&gt;
&lt;br /&gt;
This Appendix is only a brief introduction to the IDE and only provides basic information on how to&lt;br /&gt;
*start the OpenClovis IDE&lt;br /&gt;
*view the model which was used to build the the skeleton code for csa101 to csa113&lt;br /&gt;
*generate code based upon the model.&lt;br /&gt;
&lt;br /&gt;
Further information concerning the IDE and creating a model can be found within the ''OpenClovis IDE User Guide'' and ''OpenClovis Sample Application Tutorial''.&lt;br /&gt;
&lt;br /&gt;
As previously mentioned, this appendix assumes you have followed the instructions found in the document ''OpenClovis Installation Guide,'' and installed the SDK. After installing the SDK, we need to create a project area. You may have already created a project area  either by the command &amp;lt;code&amp;gt;cl-create-project-area&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;cl-eval-wizard&amp;lt;/code&amp;gt;. Again to prevent the repetition of data we suggest looking at section [[Doc:Evalguide/build#Evaluation Wizard - Single Node Setup|Evaluation Wizard - Single Node Setup]] and [[Doc:Evalguide/build#Manually Building the Target Images|Manually Building the Target Images]].&lt;br /&gt;
&lt;br /&gt;
===Scope===&lt;br /&gt;
&lt;br /&gt;
This appendix covers instructions to start the OpenClovis IDE and introduce you to the evaluation model that forms the foundation of the Evaluation System. You will be able to see how the values set for Clovis Sample Applications, affect the source code generated and behavior.&lt;br /&gt;
&lt;br /&gt;
Instructions are provided to generate source code. Once the code is generated you have the opportunity to see how we enhanced the generated source code to create the Clovis Sample Applications which were run in Chapter [[Doc:Evalguide/csa#Sample Applications|Sample Applications]].&lt;br /&gt;
&lt;br /&gt;
Although the generated code provides a framework for the Sample Applications without any functionality, instructions are provided on how to configure, build and start SAFplus Platform.&lt;br /&gt;
&lt;br /&gt;
===Starting the IDE===&lt;br /&gt;
&lt;br /&gt;
If you chose to create symbolic links during installation, from the command line enter &amp;lt;code&amp;gt;cl-ide&amp;lt;/code&amp;gt; to launch OpenClovis IDE. Otherwise, from the command line you can either: &lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Add the installation directory to the shell's search path. For example with a bash shell,&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;export PATH=$PATH:$install_dir/sdk-5.0/bin&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
or&lt;br /&gt;
&amp;lt;li&amp;gt;Execute the command&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;install_dir&amp;gt;/sdk-5.0/bin/cl-ide&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The splash screen for OpenClovis IDE is displayed followed by the Workspace Launcher, as presented in Figure [[#eval_IDEWorkspaceLauncher|OpenClovis IDE Workspace Launcher]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;eval_IDEWorkspaceLauncher&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:eval_IDEWorkspaceLauncher.png|frame|center|'''OpenClovis IDE Workspace Launcher''']]&lt;br /&gt;
&lt;br /&gt;
Within the '''Workspace''' field the default location of the workspace of IDE is placed. This is the location where information concerning the IDE and models created is saved. This can be altered by pressing the '''Browse''' button. Select the workspace directory and click OK to launch OpenClovis IDE as illustrated in the Figure &lt;br /&gt;
[[#eval_IDEWelcomeScreen|OpenClovis IDE Welcome Screen]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;eval_IDEWelcomeScreen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:eval_IDEWelcomeScreen.png|frame|center|'''OpenClovis IDE Welcome Screen''']]&lt;br /&gt;
&lt;br /&gt;
===Importing the Evaluation Model===&lt;br /&gt;
&lt;br /&gt;
First, we need to import the model. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;eval_ImportEvalModel&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:eval_ImportEvalModel.png|frame|center|'''Importing Evaluation Model into Eclipse Workspace''']]&lt;br /&gt;
&lt;br /&gt;
The Clovis Works model is now presented within the Clovis Workspace View. To, view the Resource Editor, right click on '''eval''' -&amp;gt; select '''Clovis''' -&amp;gt; select '''Resource Editor.''' For the Component Editor right click on '''eval'''-&amp;gt; select '''Clovis''' -&amp;gt; select '''Component Editor.''' The Resource and Component Editor views will now be presented.  See Figures below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;eval_IDEComponentView&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:eval_IDEComponentView.png|frame|center|'''Component View''']]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;eval_IDEResourceView&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:eval_IDEResourceView.png|frame|center|'''Resource View''']]&lt;br /&gt;
&lt;br /&gt;
This is the Evaluation Model used as the foundation of our Evaluation System. From here you have the opportunity to explore the model in its entirety. To understand how to navigate the IDE please refer to the OpenClovis IDE User Guide.&lt;br /&gt;
&lt;br /&gt;
===Generating Source Code===&lt;br /&gt;
&lt;br /&gt;
To generate source code a number of steps are required. Firstly the location of SAFplus Platform and Python needs to be correct. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;eval_IDEASPPython&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:eval_IDEASPPython.png|frame|center|'''Set SAFplus Platform and Python Location''']]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;'''SAFplus Platform Location''': &lt;br /&gt;
&amp;lt;br&amp;gt;This usually appears by default. This is the location where the SAFplus Platform source code is installed. The default location is usually &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;&amp;lt;install_dir&amp;gt;/sdk-5.0/src/SAFplus Platform&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;'''Python Location''': &lt;br /&gt;
&amp;lt;br&amp;gt;Again the location of Python 2.4.2 should appear by default. If this is not the case python can be located within &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;&amp;lt;installation-directory&amp;gt;buildtools/local/bin&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;The default &amp;lt;code&amp;gt;&amp;lt;installation-directory&amp;gt;&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;/opt/clovis&amp;lt;/code&amp;gt; for root installation and &amp;lt;code&amp;gt;$HOME/clovis&amp;lt;/code&amp;gt; for non root users. This is determined during the installation of the SDK.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once we are certain the locations of SAFplus Platform and Python 2.4.1 are correct we can now generate the code.&lt;br /&gt;
#Within the '''Clovis Workspace View''' highlight '''eval;''' and right click to present a menu.&lt;br /&gt;
#Within the menu select '''Generate Source.'''&lt;br /&gt;
#A '''Project Validation''' pop up window is displayed with the message: &amp;lt;br&amp;gt;'''''eval model has errors/warnings. Do you want to continue?''''' &amp;lt;br&amp;gt;Press '''OK'''&lt;br /&gt;
&lt;br /&gt;
Once '''OK''' is pressed the XML and source code is generated and placed within &lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval&lt;br /&gt;
&lt;br /&gt;
You will now be able to view this generated source code within&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval/src&lt;br /&gt;
&lt;br /&gt;
You have the opportunity to compare how we built upon the generated code to further develop the Clovis Sample Application found within Chapter [[Doc:Evalguide#Sample Applications|Sample Applications]].&lt;br /&gt;
&lt;br /&gt;
===Configuring &amp;amp; Building Generated Code, and Starting SAFplus Platform===&lt;br /&gt;
&lt;br /&gt;
Once the code for the eval model is generated, the first choice you will have to make is decide which hardware setup to run the generated code. This information can be found within is discussed in full within Chapter [[Doc:Evalguide/setup#Runtime Hardware Setup|Runtime Hardware Setup]]. &lt;br /&gt;
&lt;br /&gt;
The next logical step is to configure and build this code. There are two methods of doing this, the first via the OpenClovis IDE, as covered within the ''OpenClovis Sample Application Tutorial''. &lt;br /&gt;
&lt;br /&gt;
The second method, as discussed earlier, is via the command line. As you already have this document open we suggest looking again at Chapter [[Doc:Evalguide/build#Building the Evaluation System and Deploying Runtime Images|Building the Evaluation System and Deploying Runtime Images]]: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Doc:Evalguide/build#Modifying the Clovis Sample Applications|Modifying the Clovis Sample Applications]]&lt;br /&gt;
&amp;lt;br&amp;gt;Provides instructions on modifying the generated code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;[[Doc:Evalguide/build#Building SAFplus Platform and the Evaluation System|Building SAFplus Platform and the Evaluation System]]&lt;br /&gt;
&amp;lt;br&amp;gt;Provides details on how to configure and build SAFplus Platform and the generated model. One small difference here is that when we run &amp;lt;code&amp;gt;&amp;lt;install_dir&amp;gt;/sdk-5.0/src/SAFplus/configure -with-model-name&amp;lt;/code&amp;gt; it should be run with the generated eval model. E.g.:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ &amp;lt;install_dir&amp;gt;/sdk-5.0/src/SAFplus/configure \&lt;br /&gt;
  --with-asp-build --with-model-name=eval&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;[[Doc:Evalguide/build#Configuration file - target.conf|Configuration file - target.conf]]&lt;br /&gt;
&amp;lt;br&amp;gt;The Hardware Setup choice you made will be required here in setting up the target.conf file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;[[Doc:Evalguide/build#Building Single/Distributed Target Image(s)|Building Single/Distributed Target Image(s)]]&lt;br /&gt;
&amp;lt;br&amp;gt;Lists commands required to build the target images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;[[Doc:Evalguide/build#Content of Target Images|Content of Target Images]]&lt;br /&gt;
&amp;lt;br&amp;gt;Provides details of the content of the target images for both the singe and distributed setups.&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;li&amp;gt;[[Doc:Evalguide/build#Runtime Software Installation|Runtime Software Installation]]&lt;br /&gt;
&amp;lt;br&amp;gt;Once the  images have been created this section provides information on how these can be copied to the target.&lt;br /&gt;
&lt;br /&gt;
Once the images are copied to their targets we now have to start/stop SAFplus Platform. This is discussed within Section [[Doc:Evalguide/csa#Starting and Stopping SAFplus|Starting and Stopping SAFplus]].&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running the Sample Applications===&lt;br /&gt;
&lt;br /&gt;
The sample applications can be run via the SAFplus Platform Console, however, as the code is simply generated from the IDE nothing will happen.&lt;br /&gt;
&lt;br /&gt;
===Summary and Next Steps===&lt;br /&gt;
&lt;br /&gt;
This appendix provided you with specific steps to open the OpenClovis IDE, import and open the Evaluation Model and generate the source code.&lt;/div&gt;</summary>
		<author><name>Pradeepac</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/app_ide</id>
		<title>Doc:latest/evalguide/app ide</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/app_ide"/>
				<updated>2010-08-29T05:58:37Z</updated>
		
		<summary type="html">&lt;p&gt;Pradeepac: /* Configuring &amp;amp; Building Generated Code, and Starting SAFplus Platform */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Appendix A: OpenClovis IDE==&lt;br /&gt;
&lt;br /&gt;
OpenClovis IDE is an Integrated Development Environment designed to simplify and accelerate the development of software with the OpenClovis SDK. It  provides a simple and powerful mechanism with easy drag-and-drop features, to create Resources and Components, define attributes and relationships between them. The OpenClovis IDE graphical interface enables you to capture the Information Models through UML notifications and save them as XML files.&lt;br /&gt;
&lt;br /&gt;
This Appendix is only a brief introduction to the IDE and only provides basic information on how to&lt;br /&gt;
*start the OpenClovis IDE&lt;br /&gt;
*view the model which was used to build the the skeleton code for csa101 to csa113&lt;br /&gt;
*generate code based upon the model.&lt;br /&gt;
&lt;br /&gt;
Further information concerning the IDE and creating a model can be found within the ''OpenClovis IDE User Guide'' and ''OpenClovis Sample Application Tutorial''.&lt;br /&gt;
&lt;br /&gt;
As previously mentioned, this appendix assumes you have followed the instructions found in the document ''OpenClovis Installation Guide,'' and installed the SDK. After installing the SDK, we need to create a project area. You may have already created a project area  either by the command &amp;lt;code&amp;gt;cl-create-project-area&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;cl-eval-wizard&amp;lt;/code&amp;gt;. Again to prevent the repetition of data we suggest looking at section [[Doc:Evalguide/build#Evaluation Wizard - Single Node Setup|Evaluation Wizard - Single Node Setup]] and [[Doc:Evalguide/build#Manually Building the Target Images|Manually Building the Target Images]].&lt;br /&gt;
&lt;br /&gt;
===Scope===&lt;br /&gt;
&lt;br /&gt;
This appendix covers instructions to start the OpenClovis IDE and introduce you to the evaluation model that forms the foundation of the Evaluation System. You will be able to see how the values set for Clovis Sample Applications, affect the source code generated and behavior.&lt;br /&gt;
&lt;br /&gt;
Instructions are provided to generate source code. Once the code is generated you have the opportunity to see how we enhanced the generated source code to create the Clovis Sample Applications which were run in Chapter [[Doc:Evalguide/csa#Sample Applications|Sample Applications]].&lt;br /&gt;
&lt;br /&gt;
Although the generated code provides a framework for the Sample Applications without any functionality, instructions are provided on how to configure, build and start SAFplus Platform.&lt;br /&gt;
&lt;br /&gt;
===Starting the IDE===&lt;br /&gt;
&lt;br /&gt;
If you chose to create symbolic links during installation, from the command line enter &amp;lt;code&amp;gt;cl-ide&amp;lt;/code&amp;gt; to launch OpenClovis IDE. Otherwise, from the command line you can either: &lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Add the installation directory to the shell's search path. For example with a bash shell,&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;export PATH=$PATH:$install_dir/sdk-5.0/bin&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
or&lt;br /&gt;
&amp;lt;li&amp;gt;Execute the command&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;install_dir&amp;gt;/sdk-5.0/bin/cl-ide&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The splash screen for OpenClovis IDE is displayed followed by the Workspace Launcher, as presented in Figure [[#eval_IDEWorkspaceLauncher|OpenClovis IDE Workspace Launcher]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;eval_IDEWorkspaceLauncher&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:eval_IDEWorkspaceLauncher.png|frame|center|'''OpenClovis IDE Workspace Launcher''']]&lt;br /&gt;
&lt;br /&gt;
Within the '''Workspace''' field the default location of the workspace of IDE is placed. This is the location where information concerning the IDE and models created is saved. This can be altered by pressing the '''Browse''' button. Select the workspace directory and click OK to launch OpenClovis IDE as illustrated in the Figure &lt;br /&gt;
[[#eval_IDEWelcomeScreen|OpenClovis IDE Welcome Screen]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;eval_IDEWelcomeScreen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:eval_IDEWelcomeScreen.png|frame|center|'''OpenClovis IDE Welcome Screen''']]&lt;br /&gt;
&lt;br /&gt;
===Importing the Evaluation Model===&lt;br /&gt;
&lt;br /&gt;
First, we need to import the model. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;eval_ImportEvalModel&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:eval_ImportEvalModel.png|frame|center|'''Importing Evaluation Model into Eclipse Workspace''']]&lt;br /&gt;
&lt;br /&gt;
The Clovis Works model is now presented within the Clovis Workspace View. To, view the Resource Editor, right click on '''eval''' -&amp;gt; select '''Clovis''' -&amp;gt; select '''Resource Editor.''' For the Component Editor right click on '''eval'''-&amp;gt; select '''Clovis''' -&amp;gt; select '''Component Editor.''' The Resource and Component Editor views will now be presented.  See Figures below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;eval_IDEComponentView&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:eval_IDEComponentView.png|frame|center|'''Component View''']]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;eval_IDEResourceView&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:eval_IDEResourceView.png|frame|center|'''Resource View''']]&lt;br /&gt;
&lt;br /&gt;
This is the Evaluation Model used as the foundation of our Evaluation System. From here you have the opportunity to explore the model in its entirety. To understand how to navigate the IDE please refer to the OpenClovis IDE User Guide.&lt;br /&gt;
&lt;br /&gt;
===Generating Source Code===&lt;br /&gt;
&lt;br /&gt;
To generate source code a number of steps are required. Firstly the location of SAFplus Platform and Python needs to be correct. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;eval_IDEASPPython&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:eval_IDEASPPython.png|frame|center|'''Set SAFplus Platform and Python Location''']]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;'''SAFplus Platform Location''': &lt;br /&gt;
&amp;lt;br&amp;gt;This usually appears by default. This is the location where the SAFplus Platform source code is installed. The default location is usually &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;&amp;lt;install_dir&amp;gt;/sdk-3.0/src/SAFplus Platform&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;'''Python Location''': &lt;br /&gt;
&amp;lt;br&amp;gt;Again the location of Python 2.4.2 should appear by default. If this is not the case python can be located within &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;&amp;lt;installation-directory&amp;gt;buildtools/local/bin&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;The default &amp;lt;code&amp;gt;&amp;lt;installation-directory&amp;gt;&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;/opt/clovis&amp;lt;/code&amp;gt; for root installation and &amp;lt;code&amp;gt;$HOME/clovis&amp;lt;/code&amp;gt; for non root users. This is determined during the installation of the SDK.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once we are certain the locations of SAFplus Platform and Python 2.4.1 are correct we can now generate the code.&lt;br /&gt;
#Within the '''Clovis Workspace View''' highlight '''eval;''' and right click to present a menu.&lt;br /&gt;
#Within the menu select '''Generate Source.'''&lt;br /&gt;
#A '''Project Validation''' pop up window is displayed with the message: &amp;lt;br&amp;gt;'''''eval model has errors/warnings. Do you want to continue?''''' &amp;lt;br&amp;gt;Press '''OK'''&lt;br /&gt;
&lt;br /&gt;
Once '''OK''' is pressed the XML and source code is generated and placed within &lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval&lt;br /&gt;
&lt;br /&gt;
You will now be able to view this generated source code within&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval/src&lt;br /&gt;
&lt;br /&gt;
You have the opportunity to compare how we built upon the generated code to further develop the Clovis Sample Application found within Chapter [[Doc:Evalguide#Sample Applications|Sample Applications]].&lt;br /&gt;
&lt;br /&gt;
===Configuring &amp;amp; Building Generated Code, and Starting SAFplus Platform===&lt;br /&gt;
&lt;br /&gt;
Once the code for the eval model is generated, the first choice you will have to make is decide which hardware setup to run the generated code. This information can be found within is discussed in full within Chapter [[Doc:Evalguide/setup#Runtime Hardware Setup|Runtime Hardware Setup]]. &lt;br /&gt;
&lt;br /&gt;
The next logical step is to configure and build this code. There are two methods of doing this, the first via the OpenClovis IDE, as covered within the ''OpenClovis Sample Application Tutorial''. &lt;br /&gt;
&lt;br /&gt;
The second method, as discussed earlier, is via the command line. As you already have this document open we suggest looking again at Chapter [[Doc:Evalguide/build#Building the Evaluation System and Deploying Runtime Images|Building the Evaluation System and Deploying Runtime Images]]: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Doc:Evalguide/build#Modifying the Clovis Sample Applications|Modifying the Clovis Sample Applications]]&lt;br /&gt;
&amp;lt;br&amp;gt;Provides instructions on modifying the generated code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;[[Doc:Evalguide/build#Building SAFplus Platform and the Evaluation System|Building SAFplus Platform and the Evaluation System]]&lt;br /&gt;
&amp;lt;br&amp;gt;Provides details on how to configure and build SAFplus Platform and the generated model. One small difference here is that when we run &amp;lt;code&amp;gt;&amp;lt;install_dir&amp;gt;/sdk-5.0/src/SAFplus/configure -with-model-name&amp;lt;/code&amp;gt; it should be run with the generated eval model. E.g.:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ &amp;lt;install_dir&amp;gt;/sdk-5.0/src/SAFplus/configure \&lt;br /&gt;
  --with-asp-build --with-model-name=eval&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;[[Doc:Evalguide/build#Configuration file - target.conf|Configuration file - target.conf]]&lt;br /&gt;
&amp;lt;br&amp;gt;The Hardware Setup choice you made will be required here in setting up the target.conf file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;[[Doc:Evalguide/build#Building Single/Distributed Target Image(s)|Building Single/Distributed Target Image(s)]]&lt;br /&gt;
&amp;lt;br&amp;gt;Lists commands required to build the target images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;[[Doc:Evalguide/build#Content of Target Images|Content of Target Images]]&lt;br /&gt;
&amp;lt;br&amp;gt;Provides details of the content of the target images for both the singe and distributed setups.&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;li&amp;gt;[[Doc:Evalguide/build#Runtime Software Installation|Runtime Software Installation]]&lt;br /&gt;
&amp;lt;br&amp;gt;Once the  images have been created this section provides information on how these can be copied to the target.&lt;br /&gt;
&lt;br /&gt;
Once the images are copied to their targets we now have to start/stop SAFplus Platform. This is discussed within Section [[Doc:Evalguide/csa#Starting and Stopping SAFplus|Starting and Stopping SAFplus]].&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running the Sample Applications===&lt;br /&gt;
&lt;br /&gt;
The sample applications can be run via the SAFplus Platform Console, however, as the code is simply generated from the IDE nothing will happen.&lt;br /&gt;
&lt;br /&gt;
===Summary and Next Steps===&lt;br /&gt;
&lt;br /&gt;
This appendix provided you with specific steps to open the OpenClovis IDE, import and open the Evaluation Model and generate the source code.&lt;/div&gt;</summary>
		<author><name>Pradeepac</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/app_ide</id>
		<title>Doc:latest/evalguide/app ide</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/app_ide"/>
				<updated>2010-08-29T05:58:03Z</updated>
		
		<summary type="html">&lt;p&gt;Pradeepac: /* Configuring &amp;amp; Building Generated Code, and Starting SAFplus Platform */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Appendix A: OpenClovis IDE==&lt;br /&gt;
&lt;br /&gt;
OpenClovis IDE is an Integrated Development Environment designed to simplify and accelerate the development of software with the OpenClovis SDK. It  provides a simple and powerful mechanism with easy drag-and-drop features, to create Resources and Components, define attributes and relationships between them. The OpenClovis IDE graphical interface enables you to capture the Information Models through UML notifications and save them as XML files.&lt;br /&gt;
&lt;br /&gt;
This Appendix is only a brief introduction to the IDE and only provides basic information on how to&lt;br /&gt;
*start the OpenClovis IDE&lt;br /&gt;
*view the model which was used to build the the skeleton code for csa101 to csa113&lt;br /&gt;
*generate code based upon the model.&lt;br /&gt;
&lt;br /&gt;
Further information concerning the IDE and creating a model can be found within the ''OpenClovis IDE User Guide'' and ''OpenClovis Sample Application Tutorial''.&lt;br /&gt;
&lt;br /&gt;
As previously mentioned, this appendix assumes you have followed the instructions found in the document ''OpenClovis Installation Guide,'' and installed the SDK. After installing the SDK, we need to create a project area. You may have already created a project area  either by the command &amp;lt;code&amp;gt;cl-create-project-area&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;cl-eval-wizard&amp;lt;/code&amp;gt;. Again to prevent the repetition of data we suggest looking at section [[Doc:Evalguide/build#Evaluation Wizard - Single Node Setup|Evaluation Wizard - Single Node Setup]] and [[Doc:Evalguide/build#Manually Building the Target Images|Manually Building the Target Images]].&lt;br /&gt;
&lt;br /&gt;
===Scope===&lt;br /&gt;
&lt;br /&gt;
This appendix covers instructions to start the OpenClovis IDE and introduce you to the evaluation model that forms the foundation of the Evaluation System. You will be able to see how the values set for Clovis Sample Applications, affect the source code generated and behavior.&lt;br /&gt;
&lt;br /&gt;
Instructions are provided to generate source code. Once the code is generated you have the opportunity to see how we enhanced the generated source code to create the Clovis Sample Applications which were run in Chapter [[Doc:Evalguide/csa#Sample Applications|Sample Applications]].&lt;br /&gt;
&lt;br /&gt;
Although the generated code provides a framework for the Sample Applications without any functionality, instructions are provided on how to configure, build and start SAFplus Platform.&lt;br /&gt;
&lt;br /&gt;
===Starting the IDE===&lt;br /&gt;
&lt;br /&gt;
If you chose to create symbolic links during installation, from the command line enter &amp;lt;code&amp;gt;cl-ide&amp;lt;/code&amp;gt; to launch OpenClovis IDE. Otherwise, from the command line you can either: &lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Add the installation directory to the shell's search path. For example with a bash shell,&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;export PATH=$PATH:$install_dir/sdk-5.0/bin&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
or&lt;br /&gt;
&amp;lt;li&amp;gt;Execute the command&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;install_dir&amp;gt;/sdk-5.0/bin/cl-ide&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The splash screen for OpenClovis IDE is displayed followed by the Workspace Launcher, as presented in Figure [[#eval_IDEWorkspaceLauncher|OpenClovis IDE Workspace Launcher]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;eval_IDEWorkspaceLauncher&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:eval_IDEWorkspaceLauncher.png|frame|center|'''OpenClovis IDE Workspace Launcher''']]&lt;br /&gt;
&lt;br /&gt;
Within the '''Workspace''' field the default location of the workspace of IDE is placed. This is the location where information concerning the IDE and models created is saved. This can be altered by pressing the '''Browse''' button. Select the workspace directory and click OK to launch OpenClovis IDE as illustrated in the Figure &lt;br /&gt;
[[#eval_IDEWelcomeScreen|OpenClovis IDE Welcome Screen]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;eval_IDEWelcomeScreen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:eval_IDEWelcomeScreen.png|frame|center|'''OpenClovis IDE Welcome Screen''']]&lt;br /&gt;
&lt;br /&gt;
===Importing the Evaluation Model===&lt;br /&gt;
&lt;br /&gt;
First, we need to import the model. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;eval_ImportEvalModel&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:eval_ImportEvalModel.png|frame|center|'''Importing Evaluation Model into Eclipse Workspace''']]&lt;br /&gt;
&lt;br /&gt;
The Clovis Works model is now presented within the Clovis Workspace View. To, view the Resource Editor, right click on '''eval''' -&amp;gt; select '''Clovis''' -&amp;gt; select '''Resource Editor.''' For the Component Editor right click on '''eval'''-&amp;gt; select '''Clovis''' -&amp;gt; select '''Component Editor.''' The Resource and Component Editor views will now be presented.  See Figures below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;eval_IDEComponentView&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:eval_IDEComponentView.png|frame|center|'''Component View''']]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;eval_IDEResourceView&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:eval_IDEResourceView.png|frame|center|'''Resource View''']]&lt;br /&gt;
&lt;br /&gt;
This is the Evaluation Model used as the foundation of our Evaluation System. From here you have the opportunity to explore the model in its entirety. To understand how to navigate the IDE please refer to the OpenClovis IDE User Guide.&lt;br /&gt;
&lt;br /&gt;
===Generating Source Code===&lt;br /&gt;
&lt;br /&gt;
To generate source code a number of steps are required. Firstly the location of SAFplus Platform and Python needs to be correct. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;eval_IDEASPPython&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:eval_IDEASPPython.png|frame|center|'''Set SAFplus Platform and Python Location''']]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;'''SAFplus Platform Location''': &lt;br /&gt;
&amp;lt;br&amp;gt;This usually appears by default. This is the location where the SAFplus Platform source code is installed. The default location is usually &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;&amp;lt;install_dir&amp;gt;/sdk-3.0/src/SAFplus Platform&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;'''Python Location''': &lt;br /&gt;
&amp;lt;br&amp;gt;Again the location of Python 2.4.2 should appear by default. If this is not the case python can be located within &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;&amp;lt;installation-directory&amp;gt;buildtools/local/bin&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;The default &amp;lt;code&amp;gt;&amp;lt;installation-directory&amp;gt;&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;/opt/clovis&amp;lt;/code&amp;gt; for root installation and &amp;lt;code&amp;gt;$HOME/clovis&amp;lt;/code&amp;gt; for non root users. This is determined during the installation of the SDK.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once we are certain the locations of SAFplus Platform and Python 2.4.1 are correct we can now generate the code.&lt;br /&gt;
#Within the '''Clovis Workspace View''' highlight '''eval;''' and right click to present a menu.&lt;br /&gt;
#Within the menu select '''Generate Source.'''&lt;br /&gt;
#A '''Project Validation''' pop up window is displayed with the message: &amp;lt;br&amp;gt;'''''eval model has errors/warnings. Do you want to continue?''''' &amp;lt;br&amp;gt;Press '''OK'''&lt;br /&gt;
&lt;br /&gt;
Once '''OK''' is pressed the XML and source code is generated and placed within &lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval&lt;br /&gt;
&lt;br /&gt;
You will now be able to view this generated source code within&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval/src&lt;br /&gt;
&lt;br /&gt;
You have the opportunity to compare how we built upon the generated code to further develop the Clovis Sample Application found within Chapter [[Doc:Evalguide#Sample Applications|Sample Applications]].&lt;br /&gt;
&lt;br /&gt;
===Configuring &amp;amp; Building Generated Code, and Starting SAFplus Platform===&lt;br /&gt;
&lt;br /&gt;
Once the code for the eval model is generated, the first choice you will have to make is decide which hardware setup to run the generated code. This information can be found within is discussed in full within Chapter [[Doc:Evalguide/setup#Runtime Hardware Setup|Runtime Hardware Setup]]. &lt;br /&gt;
&lt;br /&gt;
The next logical step is to configure and build this code. There are two methods of doing this, the first via the OpenClovis IDE, as covered within the ''OpenClovis Sample Application Tutorial''. &lt;br /&gt;
&lt;br /&gt;
The second method, as discussed earlier, is via the command line. As you already have this document open we suggest looking again at Chapter [[Doc:Evalguide/build#Building the Evaluation System and Deploying Runtime Images|Building the Evaluation System and Deploying Runtime Images]]: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Doc:Evalguide/build#Modifying the Clovis Sample Applications|Modifying the Clovis Sample Applications]]&lt;br /&gt;
&amp;lt;br&amp;gt;Provides instructions on modifying the generated code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;[[Doc:Evalguide/build#Building SAFplus Platform and the Evaluation System|Building SAFplus Platform and the Evaluation System]]&lt;br /&gt;
&amp;lt;br&amp;gt;Provides details on how to configure and build SAFplus Platform and the generated model. One small difference here is that when we run &amp;lt;code&amp;gt;&amp;lt;install_dir&amp;gt;/sdk-3.0/src/SAFplus/configure -with-model-name&amp;lt;/code&amp;gt; it should be run with the generated eval model. E.g.:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ &amp;lt;install_dir&amp;gt;/sdk-5.0/src/SAFplus/configure \&lt;br /&gt;
  --with-asp-build --with-model-name=eval&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;[[Doc:Evalguide/build#Configuration file - target.conf|Configuration file - target.conf]]&lt;br /&gt;
&amp;lt;br&amp;gt;The Hardware Setup choice you made will be required here in setting up the target.conf file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;[[Doc:Evalguide/build#Building Single/Distributed Target Image(s)|Building Single/Distributed Target Image(s)]]&lt;br /&gt;
&amp;lt;br&amp;gt;Lists commands required to build the target images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;[[Doc:Evalguide/build#Content of Target Images|Content of Target Images]]&lt;br /&gt;
&amp;lt;br&amp;gt;Provides details of the content of the target images for both the singe and distributed setups.&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;li&amp;gt;[[Doc:Evalguide/build#Runtime Software Installation|Runtime Software Installation]]&lt;br /&gt;
&amp;lt;br&amp;gt;Once the  images have been created this section provides information on how these can be copied to the target.&lt;br /&gt;
&lt;br /&gt;
Once the images are copied to their targets we now have to start/stop SAFplus Platform. This is discussed within Section [[Doc:Evalguide/csa#Starting and Stopping SAFplus|Starting and Stopping SAFplus]].&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running the Sample Applications===&lt;br /&gt;
&lt;br /&gt;
The sample applications can be run via the SAFplus Platform Console, however, as the code is simply generated from the IDE nothing will happen.&lt;br /&gt;
&lt;br /&gt;
===Summary and Next Steps===&lt;br /&gt;
&lt;br /&gt;
This appendix provided you with specific steps to open the OpenClovis IDE, import and open the Evaluation Model and generate the source code.&lt;/div&gt;</summary>
		<author><name>Pradeepac</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/app_ide</id>
		<title>Doc:latest/evalguide/app ide</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/app_ide"/>
				<updated>2010-08-29T05:57:21Z</updated>
		
		<summary type="html">&lt;p&gt;Pradeepac: /* Starting the IDE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Appendix A: OpenClovis IDE==&lt;br /&gt;
&lt;br /&gt;
OpenClovis IDE is an Integrated Development Environment designed to simplify and accelerate the development of software with the OpenClovis SDK. It  provides a simple and powerful mechanism with easy drag-and-drop features, to create Resources and Components, define attributes and relationships between them. The OpenClovis IDE graphical interface enables you to capture the Information Models through UML notifications and save them as XML files.&lt;br /&gt;
&lt;br /&gt;
This Appendix is only a brief introduction to the IDE and only provides basic information on how to&lt;br /&gt;
*start the OpenClovis IDE&lt;br /&gt;
*view the model which was used to build the the skeleton code for csa101 to csa113&lt;br /&gt;
*generate code based upon the model.&lt;br /&gt;
&lt;br /&gt;
Further information concerning the IDE and creating a model can be found within the ''OpenClovis IDE User Guide'' and ''OpenClovis Sample Application Tutorial''.&lt;br /&gt;
&lt;br /&gt;
As previously mentioned, this appendix assumes you have followed the instructions found in the document ''OpenClovis Installation Guide,'' and installed the SDK. After installing the SDK, we need to create a project area. You may have already created a project area  either by the command &amp;lt;code&amp;gt;cl-create-project-area&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;cl-eval-wizard&amp;lt;/code&amp;gt;. Again to prevent the repetition of data we suggest looking at section [[Doc:Evalguide/build#Evaluation Wizard - Single Node Setup|Evaluation Wizard - Single Node Setup]] and [[Doc:Evalguide/build#Manually Building the Target Images|Manually Building the Target Images]].&lt;br /&gt;
&lt;br /&gt;
===Scope===&lt;br /&gt;
&lt;br /&gt;
This appendix covers instructions to start the OpenClovis IDE and introduce you to the evaluation model that forms the foundation of the Evaluation System. You will be able to see how the values set for Clovis Sample Applications, affect the source code generated and behavior.&lt;br /&gt;
&lt;br /&gt;
Instructions are provided to generate source code. Once the code is generated you have the opportunity to see how we enhanced the generated source code to create the Clovis Sample Applications which were run in Chapter [[Doc:Evalguide/csa#Sample Applications|Sample Applications]].&lt;br /&gt;
&lt;br /&gt;
Although the generated code provides a framework for the Sample Applications without any functionality, instructions are provided on how to configure, build and start SAFplus Platform.&lt;br /&gt;
&lt;br /&gt;
===Starting the IDE===&lt;br /&gt;
&lt;br /&gt;
If you chose to create symbolic links during installation, from the command line enter &amp;lt;code&amp;gt;cl-ide&amp;lt;/code&amp;gt; to launch OpenClovis IDE. Otherwise, from the command line you can either: &lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Add the installation directory to the shell's search path. For example with a bash shell,&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;export PATH=$PATH:$install_dir/sdk-5.0/bin&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
or&lt;br /&gt;
&amp;lt;li&amp;gt;Execute the command&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;install_dir&amp;gt;/sdk-5.0/bin/cl-ide&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The splash screen for OpenClovis IDE is displayed followed by the Workspace Launcher, as presented in Figure [[#eval_IDEWorkspaceLauncher|OpenClovis IDE Workspace Launcher]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;eval_IDEWorkspaceLauncher&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:eval_IDEWorkspaceLauncher.png|frame|center|'''OpenClovis IDE Workspace Launcher''']]&lt;br /&gt;
&lt;br /&gt;
Within the '''Workspace''' field the default location of the workspace of IDE is placed. This is the location where information concerning the IDE and models created is saved. This can be altered by pressing the '''Browse''' button. Select the workspace directory and click OK to launch OpenClovis IDE as illustrated in the Figure &lt;br /&gt;
[[#eval_IDEWelcomeScreen|OpenClovis IDE Welcome Screen]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;eval_IDEWelcomeScreen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:eval_IDEWelcomeScreen.png|frame|center|'''OpenClovis IDE Welcome Screen''']]&lt;br /&gt;
&lt;br /&gt;
===Importing the Evaluation Model===&lt;br /&gt;
&lt;br /&gt;
First, we need to import the model. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;eval_ImportEvalModel&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:eval_ImportEvalModel.png|frame|center|'''Importing Evaluation Model into Eclipse Workspace''']]&lt;br /&gt;
&lt;br /&gt;
The Clovis Works model is now presented within the Clovis Workspace View. To, view the Resource Editor, right click on '''eval''' -&amp;gt; select '''Clovis''' -&amp;gt; select '''Resource Editor.''' For the Component Editor right click on '''eval'''-&amp;gt; select '''Clovis''' -&amp;gt; select '''Component Editor.''' The Resource and Component Editor views will now be presented.  See Figures below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;eval_IDEComponentView&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:eval_IDEComponentView.png|frame|center|'''Component View''']]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;eval_IDEResourceView&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:eval_IDEResourceView.png|frame|center|'''Resource View''']]&lt;br /&gt;
&lt;br /&gt;
This is the Evaluation Model used as the foundation of our Evaluation System. From here you have the opportunity to explore the model in its entirety. To understand how to navigate the IDE please refer to the OpenClovis IDE User Guide.&lt;br /&gt;
&lt;br /&gt;
===Generating Source Code===&lt;br /&gt;
&lt;br /&gt;
To generate source code a number of steps are required. Firstly the location of SAFplus Platform and Python needs to be correct. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;eval_IDEASPPython&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:eval_IDEASPPython.png|frame|center|'''Set SAFplus Platform and Python Location''']]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;'''SAFplus Platform Location''': &lt;br /&gt;
&amp;lt;br&amp;gt;This usually appears by default. This is the location where the SAFplus Platform source code is installed. The default location is usually &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;&amp;lt;install_dir&amp;gt;/sdk-3.0/src/SAFplus Platform&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;'''Python Location''': &lt;br /&gt;
&amp;lt;br&amp;gt;Again the location of Python 2.4.2 should appear by default. If this is not the case python can be located within &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;&amp;lt;installation-directory&amp;gt;buildtools/local/bin&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;The default &amp;lt;code&amp;gt;&amp;lt;installation-directory&amp;gt;&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;/opt/clovis&amp;lt;/code&amp;gt; for root installation and &amp;lt;code&amp;gt;$HOME/clovis&amp;lt;/code&amp;gt; for non root users. This is determined during the installation of the SDK.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once we are certain the locations of SAFplus Platform and Python 2.4.1 are correct we can now generate the code.&lt;br /&gt;
#Within the '''Clovis Workspace View''' highlight '''eval;''' and right click to present a menu.&lt;br /&gt;
#Within the menu select '''Generate Source.'''&lt;br /&gt;
#A '''Project Validation''' pop up window is displayed with the message: &amp;lt;br&amp;gt;'''''eval model has errors/warnings. Do you want to continue?''''' &amp;lt;br&amp;gt;Press '''OK'''&lt;br /&gt;
&lt;br /&gt;
Once '''OK''' is pressed the XML and source code is generated and placed within &lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval&lt;br /&gt;
&lt;br /&gt;
You will now be able to view this generated source code within&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval/src&lt;br /&gt;
&lt;br /&gt;
You have the opportunity to compare how we built upon the generated code to further develop the Clovis Sample Application found within Chapter [[Doc:Evalguide#Sample Applications|Sample Applications]].&lt;br /&gt;
&lt;br /&gt;
===Configuring &amp;amp; Building Generated Code, and Starting SAFplus Platform===&lt;br /&gt;
&lt;br /&gt;
Once the code for the eval model is generated, the first choice you will have to make is decide which hardware setup to run the generated code. This information can be found within is discussed in full within Chapter [[Doc:Evalguide/setup#Runtime Hardware Setup|Runtime Hardware Setup]]. &lt;br /&gt;
&lt;br /&gt;
The next logical step is to configure and build this code. There are two methods of doing this, the first via the OpenClovis IDE, as covered within the ''OpenClovis Sample Application Tutorial''. &lt;br /&gt;
&lt;br /&gt;
The second method, as discussed earlier, is via the command line. As you already have this document open we suggest looking again at Chapter [[Doc:Evalguide/build#Building the Evaluation System and Deploying Runtime Images|Building the Evaluation System and Deploying Runtime Images]]: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Doc:Evalguide/build#Modifying the Clovis Sample Applications|Modifying the Clovis Sample Applications]]&lt;br /&gt;
&amp;lt;br&amp;gt;Provides instructions on modifying the generated code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;[[Doc:Evalguide/build#Building SAFplus Platform and the Evaluation System|Building SAFplus Platform and the Evaluation System]]&lt;br /&gt;
&amp;lt;br&amp;gt;Provides details on how to configure and build SAFplus Platform and the generated model. One small difference here is that when we run &amp;lt;code&amp;gt;&amp;lt;install_dir&amp;gt;/sdk-3.0/src/SAFplus/configure -with-model-name&amp;lt;/code&amp;gt; it should be run with the generated eval model. E.g.:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ &amp;lt;install_dir&amp;gt;/sdk-3.0/src/SAFplus/configure \&lt;br /&gt;
  --with-asp-build --with-model-name=eval&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;[[Doc:Evalguide/build#Configuration file - target.conf|Configuration file - target.conf]]&lt;br /&gt;
&amp;lt;br&amp;gt;The Hardware Setup choice you made will be required here in setting up the target.conf file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;[[Doc:Evalguide/build#Building Single/Distributed Target Image(s)|Building Single/Distributed Target Image(s)]]&lt;br /&gt;
&amp;lt;br&amp;gt;Lists commands required to build the target images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;[[Doc:Evalguide/build#Content of Target Images|Content of Target Images]]&lt;br /&gt;
&amp;lt;br&amp;gt;Provides details of the content of the target images for both the singe and distributed setups.&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;li&amp;gt;[[Doc:Evalguide/build#Runtime Software Installation|Runtime Software Installation]]&lt;br /&gt;
&amp;lt;br&amp;gt;Once the  images have been created this section provides information on how these can be copied to the target.&lt;br /&gt;
&lt;br /&gt;
Once the images are copied to their targets we now have to start/stop SAFplus Platform. This is discussed within Section [[Doc:Evalguide/csa#Starting and Stopping SAFplus|Starting and Stopping SAFplus]].&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Running the Sample Applications===&lt;br /&gt;
&lt;br /&gt;
The sample applications can be run via the SAFplus Platform Console, however, as the code is simply generated from the IDE nothing will happen.&lt;br /&gt;
&lt;br /&gt;
===Summary and Next Steps===&lt;br /&gt;
&lt;br /&gt;
This appendix provided you with specific steps to open the OpenClovis IDE, import and open the Evaluation Model and generate the source code.&lt;/div&gt;</summary>
		<author><name>Pradeepac</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/dhaDemo</id>
		<title>Doc:latest/evalguide/dhaDemo</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/dhaDemo"/>
				<updated>2010-08-29T05:54:40Z</updated>
		
		<summary type="html">&lt;p&gt;Pradeepac: /* Building the dynamic HA model (dynamicHaDemo) and deploying runtime images */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Dynamic HA Evaluation Guide==&lt;br /&gt;
&lt;br /&gt;
===Objective===&lt;br /&gt;
&lt;br /&gt;
This sample application demonstrates dynamic HA (High Availability) functionality. The application has two components : dhaDemo and dummyComp  &lt;br /&gt;
*dhaDemo creates/deletes the AMF entities (SG, SI, CSI, SU, Component, etc) dynamically. &lt;br /&gt;
*dummyComp is a sample SAF component whose binary(executable) will be used while launching the dynamically created component.&lt;br /&gt;
&lt;br /&gt;
===What you will learn===&lt;br /&gt;
&lt;br /&gt;
*How to create a 2N model dynamically by creating/deleting various AMF entities using Clovis AMF management APIs related to Dynamic HA.&lt;br /&gt;
&lt;br /&gt;
===Building the dynamic HA model (dynamicHaDemo) and deploying runtime images===&lt;br /&gt;
&lt;br /&gt;
The Clovis dynamic HA Application is located in : &amp;lt;b&amp;gt;&amp;lt;install_dir&amp;gt;/sdk-5.0/src/examples/dynamicHaDemo&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You need to build the model and deploy the runtime images for following nodes : SysCtrlI0, WorkerI0, WorkerI1 &lt;br /&gt;
&lt;br /&gt;
It can be done in very similar manner to evaluation system model (eval). For more information about building and deploying a model, please refer to the following section of evalguide:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;Building the Evaluation System and Deploying Runtime Images&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&lt;br /&gt;
The application code can be found within the following directory &lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/dynamicHaDemo/src/app/dhaDemo&lt;br /&gt;
&lt;br /&gt;
This sample component is implemented in a single C module (clCompAppMain.c).&lt;br /&gt;
&lt;br /&gt;
====Start/Stop the application====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;clCompAppAMFCSISet()&amp;lt;/code&amp;gt; function is called to set the component's HA state, and the following block of code assigns this requested state to the component, while verbosely detailing this process:&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    switch ( haState )&lt;br /&gt;
    {&lt;br /&gt;
        case SA_AMF_HA_ACTIVE:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to take the active HA state &lt;br /&gt;
             * for the CSI.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
            clprintf(CL_LOG_SEV_NOTICE, &amp;quot;Starting dynamic HA demo.&amp;quot;);&lt;br /&gt;
            clprintf(CL_LOG_SEV_NOTICE, &amp;quot;It will create 2N SG : %sSG&amp;quot;, BASE_NAME);&lt;br /&gt;
            rc = clDhaDemoStart();&lt;br /&gt;
            if(rc != CL_OK)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_CRITICAL, &amp;quot;Failed to start dynamic HA demo.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---End_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            saAmfResponse(amfHandle, invocation, SA_AIS_OK);&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* clDhaDemoStart() will start the workload in a separate thread to create the AMF entities (SG, SI, CSI, SU, Components, etc) when the HA state of dhaDemo becomes ACTIVE. In this case dhaDemo will be assigned active state when you unlock the SG 'dhaDemoSG'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        case SA_AMF_HA_QUIESCED:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to quiesce the CSI currently&lt;br /&gt;
             * assigned the active or quiescing HA state. The application &lt;br /&gt;
             * must stop work associated with the CSI immediately.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            rc = clDhaDemoStop();&lt;br /&gt;
            if(rc != CL_OK)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_CRITICAL, &amp;quot;Failed to stop dynamic HA demo.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            saAmfResponse(amfHandle, invocation, SA_AIS_OK);&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* clDhaDemoStop() will start the workload in a separate thread to delete the AMF entities (SG, SI, CSI, SU, Components, etc) only if they are already created, when the HA state of dhaDemo becomes QUIESCED or QUIESCING. In this case dhaDemo will be get QUIESCED state when you lock the unlocked SG 'dhaDemoSG'&lt;br /&gt;
&lt;br /&gt;
====Create/Delete the AMF entities====&lt;br /&gt;
&lt;br /&gt;
* clDhaDemoCreate() contains the code to create various AMF entities dynamically.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    rc = clAmsMgmtInitialize(&amp;amp;mgmtHandle, NULL, &amp;amp;version);&lt;br /&gt;
    if(rc != CL_OK)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR, &amp;quot;AmsMgmt initialize returned [%#x]&amp;quot;, rc);&lt;br /&gt;
        return NULL;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    clDhaExmpExec((&amp;quot;Running MGMT CCB initialize&amp;quot;),&lt;br /&gt;
                  (rc = clAmsMgmtCCBInitialize(mgmtHandle, &amp;amp;ccbHandle)) == CL_OK,&lt;br /&gt;
                  (&amp;quot;MGMT CCB initialize returned [%#x]&amp;quot;, rc),&lt;br /&gt;
                  goto out1);&lt;br /&gt;
&lt;br /&gt;
    /*                                                                                                                                                               &lt;br /&gt;
     * Create the entities only if they are not created already                                                                                                      &lt;br /&gt;
     */&lt;br /&gt;
    entity.type = CL_AMS_ENTITY_TYPE_SG;&lt;br /&gt;
    snprintf(entity.name.value, sizeof(entity.name.value), &amp;quot;%sSG&amp;quot;, pBaseName);&lt;br /&gt;
    entity.name.length = strlen(entity.name.value)+1;&lt;br /&gt;
&lt;br /&gt;
    rc = clAmsMgmtEntityGetConfig(mgmtHandle,&lt;br /&gt;
                                  &amp;amp;entity,&lt;br /&gt;
                                  &amp;amp;pEntityConfig);&lt;br /&gt;
&lt;br /&gt;
    clHeapFree(pEntityConfig);&lt;br /&gt;
&lt;br /&gt;
    if(rc == CL_OK)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_INFO, &amp;quot;Not creating SG[%sSG], it already exist&amp;quot;, pBaseName);&lt;br /&gt;
		goto out2;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* SG doesn't exist, create SG and other entities dynamically*/&lt;br /&gt;
&lt;br /&gt;
    /*First create the service hierarchies*/&lt;br /&gt;
&lt;br /&gt;
    clprintf(CL_LOG_SEV_NOTICE,&lt;br /&gt;
             &amp;quot;Creating 2N SG [%sSG] and other entities(si, csi, su, comp, etc)&amp;quot;,&lt;br /&gt;
             pBaseName);&lt;br /&gt;
&lt;br /&gt;
    /* Create SG*/&lt;br /&gt;
    entity.type = CL_AMS_ENTITY_TYPE_SG;&lt;br /&gt;
    snprintf(entity.name.value, sizeof(entity.name.value),&lt;br /&gt;
             &amp;quot;%sSG&amp;quot;, pBaseName);&lt;br /&gt;
    entity.name.length = strlen(entity.name.value)+1;&lt;br /&gt;
&lt;br /&gt;
    clDhaExmpExec((&amp;quot;Creating SG [%s]&amp;quot;,&lt;br /&gt;
                   entity.name.value),&lt;br /&gt;
                  (rc = clAmsMgmtCCBEntityCreate(ccbHandle,&lt;br /&gt;
                                                 &amp;amp;entity)) == CL_OK,&lt;br /&gt;
                  (&amp;quot;SG create returned [%#x]&amp;quot;, rc),&lt;br /&gt;
                  goto out2);&lt;br /&gt;
&lt;br /&gt;
    /* Create SI*/&lt;br /&gt;
    entity.type = CL_AMS_ENTITY_TYPE_SI;&lt;br /&gt;
    snprintf(entity.name.value, sizeof(entity.name.value),&lt;br /&gt;
             &amp;quot;%sSI&amp;quot;, pBaseName);&lt;br /&gt;
    entity.name.length = strlen(entity.name.value)+1;&lt;br /&gt;
    clDhaExmpExec( (&amp;quot;Create SI [%s]&amp;quot;, entity.name.value),&lt;br /&gt;
                   (rc = clAmsMgmtCCBEntityCreate(ccbHandle, &amp;amp;entity)) == CL_OK,&lt;br /&gt;
                   (&amp;quot;SI create returned [%#x]&amp;quot;, rc),&lt;br /&gt;
                   goto out2);&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
    ...&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
    /* CCB Commit*/&lt;br /&gt;
    clDhaExmpExec((&amp;quot;CCB Commit Create&amp;quot;),&lt;br /&gt;
                  (rc = clAmsMgmtCCBCommit(ccbHandle)) == CL_OK,&lt;br /&gt;
                  (&amp;quot;CCB commit returned [%#x]&amp;quot;, rc),&lt;br /&gt;
                  goto out2);&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* clDhaDemoDelete() contains the code to delete the created AMF entities dynamically.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    rc = clAmsMgmtInitialize(&amp;amp;mgmtHandle, NULL, &amp;amp;version);&lt;br /&gt;
    if(rc != CL_OK)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR, &amp;quot;AmsMgmt initialize returned [%#x]&amp;quot;, rc);&lt;br /&gt;
		return NULL;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    clDhaExmpExec((&amp;quot;Running MGMT CCB initialize&amp;quot;),&lt;br /&gt;
                  (rc = clAmsMgmtCCBInitialize(mgmtHandle, &amp;amp;ccbHandle)) == CL_OK,&lt;br /&gt;
                  (&amp;quot;MGMT CCB initialize returned [%#x]&amp;quot;, rc),&lt;br /&gt;
                  goto out1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /*                                                                                                                                                               &lt;br /&gt;
     * Delete the entities only if they exist                                                                                                                        &lt;br /&gt;
     */&lt;br /&gt;
    entity.type = CL_AMS_ENTITY_TYPE_SG;&lt;br /&gt;
    snprintf(entity.name.value, sizeof(entity.name.value), &amp;quot;%sSG&amp;quot;, pBaseName);&lt;br /&gt;
    entity.name.length = strlen(entity.name.value)+1;&lt;br /&gt;
&lt;br /&gt;
    rc = clAmsMgmtEntityGetConfig(mgmtHandle,&lt;br /&gt;
                                  &amp;amp;entity,&lt;br /&gt;
                                  &amp;amp;pEntityConfig);&lt;br /&gt;
    clHeapFree(pEntityConfig);&lt;br /&gt;
    if(rc != CL_OK)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_INFO, &amp;quot;Not deleting SG[%sSG],  SG config get returned [%#x]&amp;quot;, pBaseName, rc);&lt;br /&gt;
        goto out2;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* SG exist, Delete SG and other entities dynamically*/&lt;br /&gt;
&lt;br /&gt;
    clprintf(CL_LOG_SEV_NOTICE,&lt;br /&gt;
             &amp;quot;Deleting SG [%sSG] and other entities(si, csi, su, comp, etc)&amp;quot;,&lt;br /&gt;
             pBaseName);&lt;br /&gt;
&lt;br /&gt;
    /*First move entities to lock instantiated mode*/&lt;br /&gt;
    clDhaExmpExec((&amp;quot;LockI AMS entities&amp;quot;),&lt;br /&gt;
                  (rc = clAmsMgmtTestLockI(mgmtHandle, ccbHandle, pBaseName)) == CL_OK,&lt;br /&gt;
                  (&amp;quot;Unlock AMS entities returned [%#x]&amp;quot;, rc),&lt;br /&gt;
                  goto out2);&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
    /* Delete SI*/&lt;br /&gt;
    entity.type = CL_AMS_ENTITY_TYPE_SI;&lt;br /&gt;
    snprintf(entity.name.value, sizeof(entity.name.value),&lt;br /&gt;
             &amp;quot;%sSI&amp;quot;, pBaseName);&lt;br /&gt;
    entity.name.length = strlen(entity.name.value)+1;&lt;br /&gt;
    clDhaExmpExec( (&amp;quot;Delete SI [%s]&amp;quot;, entity.name.value),&lt;br /&gt;
                   (rc = clAmsMgmtCCBEntityDelete(ccbHandle, &amp;amp;entity)) == CL_OK,&lt;br /&gt;
                   (&amp;quot;SI delete returned [%#x]&amp;quot;, rc),&lt;br /&gt;
                   goto out2);&lt;br /&gt;
&lt;br /&gt;
    /* Delete SG*/&lt;br /&gt;
    entity.type = CL_AMS_ENTITY_TYPE_SG;&lt;br /&gt;
    snprintf(entity.name.value, sizeof(entity.name.value),&lt;br /&gt;
             &amp;quot;%sSG&amp;quot;, pBaseName);&lt;br /&gt;
    entity.name.length = strlen(entity.name.value)+1;&lt;br /&gt;
    clDhaExmpExec((&amp;quot;Deleting SG [%s]&amp;quot;,&lt;br /&gt;
                   entity.name.value),&lt;br /&gt;
                  (rc = clAmsMgmtCCBEntityDelete(ccbHandle,&lt;br /&gt;
                                                 &amp;amp;entity)) == CL_OK,&lt;br /&gt;
                  (&amp;quot;SG delete returned [%#x]&amp;quot;, rc),&lt;br /&gt;
                  goto out2);&lt;br /&gt;
&lt;br /&gt;
    /* CCB Commit*/&lt;br /&gt;
    clDhaExmpExec((&amp;quot;CCB Commit Delete&amp;quot;),&lt;br /&gt;
                  (rc = clAmsMgmtCCBCommit(ccbHandle)) == CL_OK,&lt;br /&gt;
                  (&amp;quot;CCB commit returned [%#x]&amp;quot;, rc),&lt;br /&gt;
                  goto out2);&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Usage of AMF management APIs for Dynamic HA====&lt;br /&gt;
&lt;br /&gt;
The detailed documentation of AMF management APIs can be found in &amp;quot;OpenClovis API Reference Guide&amp;quot;. Please refer &amp;quot;Availability Management Service&amp;quot; section under the High Availability.&lt;br /&gt;
&lt;br /&gt;
===How to Run dhaDemo application and What to Observe===&lt;br /&gt;
&lt;br /&gt;
We will use the SAFplus Platform Console to manipulate the administrative state of the dhaDemoSG service group.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Start the SAFplus Platform on all deployed nodes&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 # cd /root/asp/&lt;br /&gt;
 # ./etc/init.d/asp start&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Start the SAFplus Platform Console&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 # cd /root/asp/bin&lt;br /&gt;
 # ./asp_console&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then put the dhaDemoSG service group into lock assignment state using the following commands.&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 # cli[Test]-&amp;gt; setc master&lt;br /&gt;
 # cli[Test:SysCtrlI0]-&amp;gt; setc cpm&lt;br /&gt;
 # cli[Test:SysCtrlI0:CPM]-&amp;gt;  amsLockAssignment sg dhaDemoSG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The logs for dhaDemo application will be logged into file &amp;lt;code&amp;gt;/root/asp/var/log/app.0&amp;lt;/code&amp;gt; on node &amp;lt;b&amp;gt;WorkerI0&amp;lt;/b&amp;gt;. Viewing these application logs using the &amp;lt;code&amp;gt;tail -f&amp;lt;/code&amp;gt;, you should see the following :&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/app.0&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wed Sep  3 16:03:02 2008   (WorkerI0.21785 : dhaDemo_EO.---.---.00031 :   INFO) Component [dhaDemo] : PID [21785]. Initializing&lt;br /&gt;
&lt;br /&gt;
Wed Sep  3 16:03:02 2008   (WorkerI0.21785 : dhaDemo_EO.---.---.00032 :   INFO)    IOC Address             : 0x3&lt;br /&gt;
&lt;br /&gt;
Wed Sep  3 16:03:02 2008   (WorkerI0.21785 : dhaDemo_EO.---.---.00033 :   INFO)    IOC Port                : 0x80&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;To create the AMF entities dynamically, unlock the dhaDemoSG service group using the following SAFplus Platform Console command.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 # cli[Test:SysCtrlI0:CPM]-&amp;gt;  amsUnlock sg dhaDemoSG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
and in the  &amp;lt;code&amp;gt;/root/asp/var/log/app.0&amp;lt;/code&amp;gt; file (on node &amp;lt;b&amp;gt;WorkerI0&amp;lt;/b&amp;gt;) , we should see:&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/app.0&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.---.---.00036 :   INFO) Component [dhaDemo] : PID [21785]. CSI Set Received&lt;br /&gt;
&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.---.---.00037 :   INFO) CSI Flags : [Add One]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.---.---.00038 :   INFO) CSI Name : [dhaDemoCSI]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.---.---.00039 :   INFO) Name value pairs :&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.---.---.00040 :   INFO) HA state : [Active]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.---.---.00041 :   INFO) Active Descriptor :&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.---.---.00042 :   INFO) Transition Descriptor : [1]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.---.---.00043 :   INFO) Active Component : [dhaDemo]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.---.---.00044 : NOTICE) Starting dynamic HA demo.&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.---.---.00045 : NOTICE) It will create 2N SG : dynamicTwoNSG&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00046 :   INFO) Running MGMT initialize&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00047 :   INFO) Running MGMT CCB initialize&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.---.---.00048 : NOTICE) Creating 2N SG [dynamicTwoNSG] and other entities(si, csi, su, comp, etc)&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00049 :   INFO) Creating SG [dynamicTwoNSG]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00050 :   INFO) Create SI [dynamicTwoNSI]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00051 :   INFO) Create CSI [dynamicTwoNCSI]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00052 :   INFO) Create SU [dynamicTwoNSU0]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00053 :   INFO) Create SU [dynamicTwoNSU1]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00054 :   INFO) Create COMP [dynamicComp0]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00055 :   INFO) Create COMP [dynamicComp1]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00056 :   INFO) CCB Commit Create&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00057 :   INFO) Fill SG config&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00058 :   INFO) SG config get [dynamicTwoNSG]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00059 :   INFO) SG set SI [dynamicTwoNSI]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00060 :   INFO) SG set SU [dynamicTwoNSU0]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00061 :   INFO) SG set SU [dynamicTwoNSU1]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00062 :   INFO) SG set commit&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00063 :   INFO) Fill SI config&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00064 :   INFO) SI config get [dynamicTwoNSI]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00065 :   INFO) SI config set [dynamicTwoNSI]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00066 :   INFO) SI set CSI [dynamicTwoNCSI]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00067 :   INFO) SI set commit&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00068 :   INFO) Fill CSI config&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00069 :   INFO) CSI config get [dynamicTwoNCSI]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00070 :   INFO) CSI type set [dynamicTwoNCSIType]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00071 :   INFO) CSI set nvplist&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00072 :   INFO) CSI ccb commit&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00073 :   INFO) Fill SU config&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00074 :   INFO) SU config get [dynamicTwoNSU0]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00075 :   INFO) SU config set [dynamicTwoNSU0]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00076 :   INFO) SU config set [dynamicTwoNSU1]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00077 :   INFO) SU [dynamicTwoNSU0] add comp [dynamicComp0]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00078 :   INFO) SU [dynamicTwoNSU1] add comp [dynamicComp1]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00079 :   INFO) SU set commit&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00080 :   INFO) Fill NODE config&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00081 :   INFO) NODE config get [WorkerI1]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00082 :   INFO) Node set SU [dynamicTwoNSU1]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00083 :   INFO) NODE config get [WorkerI0]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00084 :   INFO) Node set SU [dynamicTwoNSU0]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00085 :   INFO) Node set commit&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00086 :   INFO) Fill COMP config&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00087 :   INFO) COMP config get [dynamicComp0]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00088 :   INFO) Comp config set [dynamicComp0]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00089 :   INFO) Comp config set [dynamicComp1]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00090 :   INFO) Comp set commit&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00091 :   INFO) Unlock AMS entities&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00092 :   INFO) LockA [dynamicTwoNSU0]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00093 :   INFO) Unlock [dynamicTwoNSU0]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00094 :   INFO) LockA [dynamicTwoNSU1]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00095 :   INFO) Unlock [dynamicTwoNSU1]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00096 :   INFO) Unlock SI [dynamicTwoNSI]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00097 :   INFO) LockA SG [dynamicTwoNSG]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00098 :   INFO) Unlock SG [dynamicTwoNSG]&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00099 :   INFO) Running CCB finalize&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.DHA.DMO.00100 :   INFO) Running MGMT finalize&lt;br /&gt;
Wed Sep  3 16:07:33 2008   (WorkerI0.21785 : dhaDemo_EO.---.---.00101 : NOTICE) Successfully created 2N SG [dynamicTwoNSG] and its entities(si, csi, su, comp, etc) dynamically&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
*The dynamically created components 'dynamicComp0' and 'dynamicComp1' will come up as active/standby. Which can be verified through the logs present at nodes WorkerI0 and WorkerI1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/root/asp/var/log/app.0&amp;lt;/code&amp;gt; file (on node &amp;lt;b&amp;gt;WorkerI0&amp;lt;/b&amp;gt;) , we should see the dynamically created component getting assigned ACTIVE state:&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/app.0&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wed Sep  3 16:07:43 2008   (WorkerI0.22187 : dummyComp_EO.---.---.00031 :   INFO) Component [dynamicComp0] : PID [22187]. Initializing&lt;br /&gt;
&lt;br /&gt;
Wed Sep  3 16:07:43 2008   (WorkerI0.22187 : dummyComp_EO.---.---.00032 :   INFO)    IOC Address             : 0x3&lt;br /&gt;
&lt;br /&gt;
Wed Sep  3 16:07:43 2008   (WorkerI0.22187 : dummyComp_EO.---.---.00033 :   INFO)    IOC Port                : 0x81&lt;br /&gt;
&lt;br /&gt;
Wed Sep  3 16:07:43 2008   (WorkerI0.22187 : dummyComp_EO.---.---.00036 :   INFO) Component [dynamicComp0] : PID [22187]. CSI Set Received&lt;br /&gt;
&lt;br /&gt;
Wed Sep  3 16:07:43 2008   (WorkerI0.22187 : dummyComp_EO.---.---.00037 :   INFO) CSI Flags : [Add One]&lt;br /&gt;
Wed Sep  3 16:07:43 2008   (WorkerI0.22187 : dummyComp_EO.---.---.00038 :   INFO) CSI Name : [dynamicTwoNCSI]&lt;br /&gt;
Wed Sep  3 16:07:43 2008   (WorkerI0.22187 : dummyComp_EO.---.---.00039 :   INFO) Name value pairs :&lt;br /&gt;
Wed Sep  3 16:07:43 2008   (WorkerI0.22187 : dummyComp_EO.---.---.00040 :   INFO) Name : [model]&lt;br /&gt;
Wed Sep  3 16:07:43 2008   (WorkerI0.22187 : dummyComp_EO.---.---.00041 :   INFO) Value : [twoN]&lt;br /&gt;
Wed Sep  3 16:07:43 2008   (WorkerI0.22187 : dummyComp_EO.---.---.00042 :   INFO) HA state : [Active]&lt;br /&gt;
Wed Sep  3 16:07:43 2008   (WorkerI0.22187 : dummyComp_EO.---.---.00043 :   INFO) Active Descriptor :&lt;br /&gt;
Wed Sep  3 16:07:43 2008   (WorkerI0.22187 : dummyComp_EO.---.---.00044 :   INFO) Transition Descriptor : [1]&lt;br /&gt;
Wed Sep  3 16:07:43 2008   (WorkerI0.22187 : dummyComp_EO.---.---.00045 :   INFO) Active Component : [dynamicComp0]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/root/asp/var/log/app.0&amp;lt;/code&amp;gt; file (on node &amp;lt;b&amp;gt;WorkerI1&amp;lt;/b&amp;gt;) , we should see the dynamically created component getting assigned STANDBY state:&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/app.0&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wed Sep  3 16:07:43 2008   (WorkerI1.23159 : dummyComp_EO.---.---.00031 :   INFO) Component [dynamicComp1] : PID [14623]. Initializing&lt;br /&gt;
&lt;br /&gt;
Wed Sep  3 16:07:43 2008   (WorkerI1.23159 : dummyComp_EO.---.---.00032 :   INFO)    IOC Address             : 0x4&lt;br /&gt;
&lt;br /&gt;
Wed Sep  3 16:07:43 2008   (WorkerI1.23159 : dummyComp_EO.---.---.00033 :   INFO)    IOC Port                : 0x80&lt;br /&gt;
&lt;br /&gt;
Wed Sep  3 16:07:43 2008   (WorkerI1.23159 : dummyComp_EO.---.---.00036 :   INFO) Component [dynamicComp1] : PID [14623]. CSI Set Received&lt;br /&gt;
&lt;br /&gt;
Wed Sep  3 16:07:43 2008   (WorkerI1.23159 : dummyComp_EO.---.---.00037 :   INFO) CSI Flags : [Add One]&lt;br /&gt;
Wed Sep  3 16:07:43 2008   (WorkerI1.23159 : dummyComp_EO.---.---.00038 :   INFO) CSI Name : [dynamicTwoNCSI]&lt;br /&gt;
Wed Sep  3 16:07:43 2008   (WorkerI1.23159 : dummyComp_EO.---.---.00039 :   INFO) Name value pairs :&lt;br /&gt;
Wed Sep  3 16:07:43 2008   (WorkerI1.23159 : dummyComp_EO.---.---.00040 :   INFO) Name : [model]&lt;br /&gt;
Wed Sep  3 16:07:43 2008   (WorkerI1.23159 : dummyComp_EO.---.---.00041 :   INFO) Value : [twoN]&lt;br /&gt;
Wed Sep  3 16:07:43 2008   (WorkerI1.23159 : dummyComp_EO.---.---.00042 :   INFO) HA state : [Standby]&lt;br /&gt;
Wed Sep  3 16:07:43 2008   (WorkerI1.23159 : dummyComp_EO.---.---.00043 :   INFO) Standby Descriptor :&lt;br /&gt;
Wed Sep  3 16:07:43 2008   (WorkerI1.23159 : dummyComp_EO.---.---.00044 :   INFO) Standby Rank : [1]&lt;br /&gt;
Wed Sep  3 16:07:43 2008   (WorkerI1.23159 : dummyComp_EO.---.---.00045 :   INFO) Active Component : [dynamicComp0]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Note.png]]Note : The dynamically created component might come up as ACTIVE on WorkerI1 and STANDBY on WorkerI0 or vice versa (depending on the order in which they are launched).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;To delete the AMF entities dynamically, lock the dhaDemoSG service group using the following SAFplus Platform Console command.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 # cli[Test:SysCtrlI0:CPM]-&amp;gt;  amsLockAssignment sg dhaDemoSG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
and in the  &amp;lt;code&amp;gt;/root/asp/var/log/app.0&amp;lt;/code&amp;gt; (on node WorkerI0) file, we should see:&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/app.0&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wed Sep  3 16:34:27 2008   (WorkerI0.17193 : dhaDemo_EO.---.---.00102 :   INFO) Component [dhaDemo] : PID [17193]. CSI Set Received&lt;br /&gt;
&lt;br /&gt;
Wed Sep  3 16:34:27 2008   (WorkerI0.17193 : dhaDemo_EO.---.---.00103 :   INFO) CSI Flags : [Target One]     &lt;br /&gt;
Wed Sep  3 16:34:27 2008   (WorkerI0.17193 : dhaDemo_EO.---.---.00104 :   INFO) CSI Name : [dhaDemoCSI]&lt;br /&gt;
Wed Sep  3 16:34:27 2008   (WorkerI0.17193 : dhaDemo_EO.---.---.00105 :   INFO) HA state : [Quiesced]&lt;br /&gt;
Wed Sep  3 16:34:27 2008   (WorkerI0.17193 : dhaDemo_EO.DHA.DMO.00106 :   INFO) Running MGMT initialize&lt;br /&gt;
Wed Sep  3 16:34:27 2008   (WorkerI0.17193 : dhaDemo_EO.---.---.00109 :   INFO) Component [dhaDemo] : PID [17193]. CSI Remove Received&lt;br /&gt;
&lt;br /&gt;
Wed Sep  3 16:34:27 2008   (WorkerI0.17193 : dhaDemo_EO.---.---.00110 :   INFO)    CSI                     : dhaDemoCSI&lt;br /&gt;
&lt;br /&gt;
Wed Sep  3 16:34:27 2008   (WorkerI0.17193 : dhaDemo_EO.---.---.00111 :   INFO)    CSI Flags               : 0x2&lt;br /&gt;
&lt;br /&gt;
Wed Sep  3 16:34:27 2008   (WorkerI0.17193 : dhaDemo_EO.DHA.DMO.00112 :   INFO) Running MGMT CCB initialize&lt;br /&gt;
Wed Sep  3 16:34:27 2008   (WorkerI0.17193 : dhaDemo_EO.---.---.00113 : NOTICE) Deleting SG [dynamicTwoNSG] and other entities(si, csi, su, comp, etc)&lt;br /&gt;
Wed Sep  3 16:34:27 2008   (WorkerI0.17193 : dhaDemo_EO.DHA.DMO.00114 :   INFO) LockI AMS entities &lt;br /&gt;
Wed Sep  3 16:34:27 2008   (WorkerI0.17193 : dhaDemo_EO.DHA.DMO.00115 :   INFO) LockA [dynamicTwoNSU0]&lt;br /&gt;
Wed Sep  3 16:34:27 2008   (WorkerI0.17193 : dhaDemo_EO.DHA.DMO.00116 :   INFO) LockI [dynamicTwoNSU0]&lt;br /&gt;
Wed Sep  3 16:34:27 2008   (WorkerI0.17217 : dummyComp_EO.---.---.00046 :   INFO) Component [dynamicComp0] : PID [17217]. CSI Set Received&lt;br /&gt;
&lt;br /&gt;
Wed Sep  3 16:34:27 2008   (WorkerI0.17217 : dummyComp_EO.---.---.00047 :   INFO) CSI Flags : [Target One]&lt;br /&gt;
Wed Sep  3 16:34:27 2008   (WorkerI0.17217 : dummyComp_EO.---.---.00048 :   INFO) CSI Name : [dynamicTwoNCSI]&lt;br /&gt;
Wed Sep  3 16:34:27 2008   (WorkerI0.17217 : dummyComp_EO.---.---.00049 :   INFO) HA state : [Quiesced]&lt;br /&gt;
Wed Sep  3 16:34:27 2008   (WorkerI0.17217 : dummyComp_EO.---.---.00052 :   INFO) Component [dynamicComp0] : PID [17217]. CSI Remove Received&lt;br /&gt;
&lt;br /&gt;
Wed Sep  3 16:34:27 2008   (WorkerI0.17217 : dummyComp_EO.---.---.00053 :   INFO)    CSI                     : dynamicTwoNCSI&lt;br /&gt;
&lt;br /&gt;
Wed Sep  3 16:34:27 2008   (WorkerI0.17217 : dummyComp_EO.---.---.00054 :   INFO)    CSI Flags               : 0x2&lt;br /&gt;
&lt;br /&gt;
Wed Sep  3 16:34:29 2008   (WorkerI0.17193 : dhaDemo_EO.DHA.DMO.00117 :   INFO) LockA [dynamicTwoNSU1]&lt;br /&gt;
Wed Sep  3 16:34:29 2008   (WorkerI0.17193 : dhaDemo_EO.DHA.DMO.00118 :   INFO) LockI [dynamicTwoNSU1]&lt;br /&gt;
Wed Sep  3 16:34:31 2008   (WorkerI0.17193 : dhaDemo_EO.DHA.DMO.00119 :   INFO) LockA SI [dynamicTwoNSI]&lt;br /&gt;
Wed Sep  3 16:34:31 2008   (WorkerI0.17193 : dhaDemo_EO.DHA.DMO.00120 :   INFO) LockA SG [dynamicTwoNSG]&lt;br /&gt;
Wed Sep  3 16:34:31 2008   (WorkerI0.17193 : dhaDemo_EO.DHA.DMO.00121 :   INFO) LockI SG [dynamicTwoNSG]&lt;br /&gt;
Wed Sep  3 16:34:31 2008   (WorkerI0.17193 : dhaDemo_EO.DHA.DMO.00122 :   INFO) Delete COMP [dynamicComp0]&lt;br /&gt;
Wed Sep  3 16:34:31 2008   (WorkerI0.17193 : dhaDemo_EO.DHA.DMO.00123 :   INFO) Delete COMP [dynamicComp1]&lt;br /&gt;
Wed Sep  3 16:34:31 2008   (WorkerI0.17193 : dhaDemo_EO.DHA.DMO.00124 :   INFO) Delete SU [dynamicTwoNSU0]&lt;br /&gt;
Wed Sep  3 16:34:31 2008   (WorkerI0.17193 : dhaDemo_EO.DHA.DMO.00125 :   INFO) Delete SU [dynamicTwoNSU1]&lt;br /&gt;
Wed Sep  3 16:34:31 2008   (WorkerI0.17193 : dhaDemo_EO.DHA.DMO.00126 :   INFO) Delete CSI [dynamicTwoNCSI]&lt;br /&gt;
Wed Sep  3 16:34:31 2008   (WorkerI0.17193 : dhaDemo_EO.DHA.DMO.00127 :   INFO) Delete SI [dynamicTwoNSI]&lt;br /&gt;
Wed Sep  3 16:34:31 2008   (WorkerI0.17193 : dhaDemo_EO.DHA.DMO.00128 :   INFO) Deleting SG [dynamicTwoNSG]&lt;br /&gt;
Wed Sep  3 16:34:31 2008   (WorkerI0.17193 : dhaDemo_EO.DHA.DMO.00129 :   INFO) CCB Commit Delete&lt;br /&gt;
Wed Sep  3 16:34:31 2008   (WorkerI0.17193 : dhaDemo_EO.DHA.DMO.00130 :   INFO) Running CCB finalize&lt;br /&gt;
Wed Sep  3 16:34:31 2008   (WorkerI0.17193 : dhaDemo_EO.DHA.DMO.00131 :   INFO) Running MGMT finalize&lt;br /&gt;
Wed Sep  3 16:34:31 2008   (WorkerI0.17193 : dhaDemo_EO.---.---.00132 : NOTICE) Successfully deleted dynamically created SG [dynamicTwoNSG] and other entities(si, csi, su, comp, etc)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These can be watched in a separate terminal window using &amp;lt;code&amp;gt;tail -f &amp;lt;file_name&amp;gt; &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;You can continue to observe this create/delete of AMF entities dynamically by unlocking/locking the SG dhaDemoSG.&lt;br /&gt;
&lt;br /&gt;
*To unlock the dhaDemoSG using the SAFplus Platform Console (this will create the AMF entities dynamically):&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# cli[Test:SysCtrlI0:CPM]-&amp;gt; amsUnlock sg dhaDemoSG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*To lock the dhaDemoSG using the SAFplus Platform Console (this will delete the AMF entities dynamically):&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# cli[Test:SysCtrlI0:CPM]-&amp;gt; amsLockAssignment sg dhaDemoSG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*To stop the demo and exit, following CLI commands may be used:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# cli[Test:SysCtrlI0:CPM]-&amp;gt; amsLockAssignment sg dhaDemoSG&lt;br /&gt;
# cli[Test:SysCtrlI0:CPM]-&amp;gt; amsLockInstantiation sg dhaDemoSG&lt;br /&gt;
# cli[Test:SysCtrlI0:CPM]-&amp;gt; bye&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Summary===&lt;br /&gt;
&lt;br /&gt;
This Sample Application has covered basic dynamic HA functionality, with creation/deletion of AMF entities (SG, SI, CSI, SU, Component, etc) using Clovis AMF management APIs.&lt;/div&gt;</summary>
		<author><name>Pradeepac</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/csa104</id>
		<title>Doc:latest/evalguide/csa104</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/csa104"/>
				<updated>2010-08-29T03:54:23Z</updated>
		
		<summary type="html">&lt;p&gt;Pradeepac: /* How to Run 104 and what to observe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==csa104 Provisioning==&lt;br /&gt;
&lt;br /&gt;
===Objective===&lt;br /&gt;
&lt;br /&gt;
The objective is to demonstrate some of the features of the Clovis Object Registry (COR) and Clovis' Object Management (OM) framework.&lt;br /&gt;
&lt;br /&gt;
===What you will learn===&lt;br /&gt;
&lt;br /&gt;
*How to use the Clovis Object Registry to set configuration values in a simple SAFplus Platform application.&lt;br /&gt;
*How to manipulate COR values from the SAFplus Platform Console line interface.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&lt;br /&gt;
The code can be found within the following directory&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa104Comp&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     ClUint8T clEoClientLibs[] =&lt;br /&gt;
    {&lt;br /&gt;
        COMP_EO_CLIENTLIB_COR,      /* Lib: Common Object Repository            */&lt;br /&gt;
        COMP_EO_CLIENTLIB_CM,       /* Lib: Chassis Management                  */&lt;br /&gt;
        COMP_EO_CLIENTLIB_NAME,     /* Lib: Name Service                        */&lt;br /&gt;
        COMP_EO_CLIENTLIB_LOG,      /* Lib: Log Service                         */&lt;br /&gt;
        COMP_EO_CLIENTLIB_TRACE,    /* Lib: Trace Service                       */&lt;br /&gt;
        COMP_EO_CLIENTLIB_DIAG,     /* Lib: Diagnostics                         */&lt;br /&gt;
        COMP_EO_CLIENTLIB_TXN,      /* Lib: Transaction Management              */&lt;br /&gt;
        CL_FALSE,                   /* NA */&lt;br /&gt;
        COMP_EO_CLIENTLIB_PROV,     /* Lib: Provisioning Management             */&lt;br /&gt;
        COMP_EO_CLIENTLIB_ALARM,    /* Lib: Alarm Management                    */&lt;br /&gt;
        COMP_EO_CLIENTLIB_DEBUG,    /* Lib: Debug Service                       */&lt;br /&gt;
        COMP_EO_CLIENTLIB_GMS       /* Lib: Cluster/Group Membership Service    */&lt;br /&gt;
    };&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Here we present the Client Libraries. These are set within &amp;lt;code&amp;gt;clCompCfg.h&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompCfg.h&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_COR   CL_TRUE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_CM    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_NAME    CL_FALSE        &lt;br /&gt;
    #define COMP_EO_CLIENTLIB_LOG    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_TRACE    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_DIAG    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_TXN    CL_TRUE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_NA    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_PROV    CL_TRUE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_ALARM    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_DEBUG    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_GMS    CL_FALSE&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Within &amp;lt;code&amp;gt;clCompCfg.h&amp;lt;/code&amp;gt; we set Clovis Object Registry  (COR), the Transaction (TXN), and Provisioning (Prov) libraries to &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 ClCompAppInitialize()&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
    clCorMoIdInitialize(&amp;amp;moId);&lt;br /&gt;
    clCorMoIdAppend(&amp;amp;moId, CLASS_CHASSIS_MO, 0);&lt;br /&gt;
    clCorMoIdAppend(&amp;amp;moId, CLASS_CSA104RES_MO, 0);&lt;br /&gt;
    clCorMoIdServiceSet(&amp;amp;moId, CL_COR_SVC_ID_PROVISIONING_MANAGEMENT);&lt;br /&gt;
    rc = clCorObjectHandleGet(&amp;amp;moId, &amp;amp;objH);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed [0x%x] to get the object handle. &amp;quot;,&lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    while (!exiting)&lt;br /&gt;
    {&lt;br /&gt;
        if (running &amp;amp;&amp;amp; ha_state == CL_AMS_HA_STATE_ACTIVE)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: Hello World! (count = %d)&amp;quot;, appname, counter);&lt;br /&gt;
#ifdef CL_INST&lt;br /&gt;
            if ((rc = clDataTapSend(counter)) != CL_OK &amp;amp;&amp;amp; (rc != CL_ERR_INVALID_PARAMETER))&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed [0x%x] to send data tap data&amp;quot;,&lt;br /&gt;
                            appname, rc);&lt;br /&gt;
            }&lt;br /&gt;
#endif&lt;br /&gt;
            if ((rc = update_counter_in_cor(time(0), objH, counter)) != CL_OK)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: cor update failed. Exiting.&amp;quot;,&lt;br /&gt;
                            appname, rc);&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            /* Checkpoint new counter number */&lt;br /&gt;
            rc = checkpoint_write_counter(counter);&lt;br /&gt;
            if (rc != CL_OK)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: Checkpoint write failed. Exiting.&amp;quot;,&lt;br /&gt;
                            appname, rc);&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            counter++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        usleep((useconds_t)delta_t*1000);&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
The main loop body is as we've seen several times already. But, the sleep, rather than being &amp;lt;code&amp;gt;sleep(1)&amp;lt;/code&amp;gt; is a &amp;lt;code&amp;gt;usleep()&amp;lt;/code&amp;gt; of a variable duration.  The duration: &amp;lt;code&amp;gt;delta_t&amp;lt;/code&amp;gt; is a number in milliseconds that is settable from COR.  We'll see where it gets set later.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;string.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
    #include &amp;lt;clDebugApi.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
We  including standard header files, including &amp;lt;code&amp;gt;clDebugApi.h&amp;lt;/code&amp;gt; which allows the application to interact with the SAFplus Platform Console. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|clcsa104CompOAMPConfig.c &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #include &amp;lt;clcsa104CompOAMPConfig.h&amp;gt;&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
Within &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.c&amp;lt;/code&amp;gt; we include &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.h&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|clcsa104CompOAMPConfig.h &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #include &amp;lt;clOmApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clCorApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clProvOmApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clProvApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clAlarmOM.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clHalApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clHalObjectApi.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    typedef ClRcT (*fp) (CL_OM_PROV_CLASS*, ClHandleT,  ClProvTxnDataT*);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    CL_OM_BEGIN_CLASS(CL_OM_PROV_CLASS,  CL_OM_PROV_CSA104RES_CLASS)&lt;br /&gt;
 &lt;br /&gt;
    CL_OM_END&lt;br /&gt;
 &lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvConstructor( void *pThis, void *pUsrData,&lt;br /&gt;
                                                     ClUint32T usrDataLen );&lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvDestructor ( void *pThis , void  *pUsrData,&lt;br /&gt;
                                                     ClUint32T usrDataLen );&lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvValidate(CL_OM_PROV_CLASS* pThis, &lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
 &lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvUpdate(CL_OM_PROV_CLASS* pThis, &lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
 &lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvRollback(CL_OM_PROV_CLASS* pThis,&lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
&lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvRead(CL_OM_PROV_CLASS* pThis,&lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
&lt;br /&gt;
    void clcsa104CompCSA104RESProvObjectStart(ClCorMOIdPtrT pMoId, &lt;br /&gt;
                               ClHandleT txnHandle);&lt;br /&gt;
&lt;br /&gt;
    void clcsa104CompCSA104RESProvObjectEnd(ClCorMOIdPtrT pMoId, &lt;br /&gt;
                               ClHandleT txnHandle);&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Next in &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.h&amp;lt;/code&amp;gt; we have several header files being included. Included is &amp;lt;code&amp;gt;clOmApi.h&amp;lt;/code&amp;gt; which is the main header file for using the Object Management subsystem.  This is Clovis' support for object-oriented like programming in C.  Next &amp;lt;code&amp;gt;clCorApi.h&amp;lt;/code&amp;gt; is the main header for using the Clovis Object Registry.  &amp;lt;code&amp;gt;clProvOmApi.h&amp;lt;/code&amp;gt;  is the main header for the Clovis Provisioning OM class.  We define an Object Management  class: &amp;lt;code&amp;gt;CL_OM_PROV_CSA104RES_CLASS&amp;lt;/code&amp;gt; which inherits from another Object Management class: &amp;lt;code&amp;gt;CL_OM_PROV_CLASS&amp;lt;/code&amp;gt;.  This last class is the class whose API was imported with the &amp;lt;code&amp;gt;#include clProvOmApi.h&amp;lt;/code&amp;gt;.  The subsequent code in the above table declare functions that will be member functions of the new Object Management class: &amp;lt;code&amp;gt;CL_OM_PROV_CSA104_CLASS&amp;lt;/code&amp;gt;. Note that function header comments have been omitted for clarity.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|  clcsa104Compcsa104Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     extern ClUint32T delta_t;&lt;br /&gt;
     extern ClCharT   appname[80];&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Above we define/declare a variable that is used for provisioning. The extern is a reference to a variable defined in clCompAppMain.c.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa104CompOAMPConfig.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     ClOmClassControlBlockT pAppOmClassTbl[] =&lt;br /&gt;
     {&lt;br /&gt;
         {&lt;br /&gt;
          CSA104COMP_CSA104RES_PROV_CLASS_NAME,&lt;br /&gt;
          sizeof(CL_OM_PROV_CSA104RES_CLASS),&lt;br /&gt;
          CL_OM_PROV_CLASS_TYPE,&lt;br /&gt;
          clcsa104CompCSA104RESProvConstructor,&lt;br /&gt;
          clcsa104CompCSA104RESProvDestructor,&lt;br /&gt;
          NULL,&lt;br /&gt;
          CSA104COMP_CSA104RES_PROV_CLASS_VERSION,&lt;br /&gt;
          0,&lt;br /&gt;
          CL_MAX_OBJ,&lt;br /&gt;
          0,&lt;br /&gt;
          CSA104COMP_CSA104RES_PROV_MAX_SLOTS,&lt;br /&gt;
          CL_OM_PROV_CSA104RES_CLASS_TYPE&lt;br /&gt;
     },&lt;br /&gt;
     &lt;br /&gt;
     &lt;br /&gt;
     };&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Within &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.c&amp;lt;/code&amp;gt; we define the global &amp;lt;code&amp;gt;pAppOmClassTbl&amp;lt;/code&amp;gt; so that will know about the new class and be able to instantiate members of the class.  Line 27 specifies the name of the class.  This is optional.  Defined is the size of instances of the class, next we specify the base class, followed by the constructor and destructor for the class respectively. The &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; specifies the table of functions for the class, in this case there is no such table.  &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is the instance table pointer.  The next three lines of code.&lt;br /&gt;
&amp;lt;br&amp;gt;--&amp;gt; &amp;lt;code&amp;gt;CL_MAX_OBJ,&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;--&amp;gt; &amp;lt;code&amp;gt;0,&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;--&amp;gt; &amp;lt;code&amp;gt;CSA104COMP_CSA104RES_PROV_MAX_SLOTS,&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;specify the max number of object instances allowed, current number of object instances, and max number of object instances so far respectively.  Followed by the Class Type ID for the class.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa104Compcsa104Res.c &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     ClRcT clcsa104CompCSA104RESProvConstructor( void *pThis, void *pUsrData,&lt;br /&gt;
                                                 ClUint32T usrDataLen )&lt;br /&gt;
     {&lt;br /&gt;
         ClRcT rc = CL_OK;&lt;br /&gt;
     &lt;br /&gt;
         /* Override &amp;quot;semantic check&amp;quot; virtual method in provClass*/&lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvObjectStart = clcsa104CompCSA104RESProvObjectStart; 	 &lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvValidate = (fp)clcsa104CompCSA104RESProvValidate; 	 &lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvUpdate = (fp)clcsa104CompCSA104RESProvUpdate; 	 &lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvRollback = (fp)clcsa104CompCSA104RESProvRollback;&lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvRead = (fp)clcsa104CompCSA104RESProvRead;&lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvObjectEnd = clcsa104CompCSA104RESProvObjectEnd; &lt;br /&gt;
&lt;br /&gt;
         ...&lt;br /&gt;
&lt;br /&gt;
         return rc;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     ClRcT clcsa104CompCSA104RESProvDestructor ( void *pThis , void  *pUsrData,&lt;br /&gt;
                                                 ClUint32T usrDataLen )&lt;br /&gt;
     {&lt;br /&gt;
         ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
         ...&lt;br /&gt;
&lt;br /&gt;
         return rc;&lt;br /&gt;
     }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
The above table presents the Contructor. It initializes the function pointers defined in the Base Class.  These are the Update method, the provisioning validation method, and the provisioning rollback method.  These are declared in &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.h&amp;lt;/code&amp;gt; in the class definition.  The destructor doesn't do anything except return &amp;lt;code&amp;gt;CL_OK&amp;lt;/code&amp;gt;.  There's no destruction work to do for this class.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|   clcsa104Compcsa104Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 ClRcT clcsa104CompCSA104RESProvUpdate(CL_OM_PROV_CLASS* pThis,&lt;br /&gt;
                            ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData)&lt;br /&gt;
 {&lt;br /&gt;
     ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
     /*&lt;br /&gt;
       ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
     clprintf(CL_LOG_SEV_INFO, &amp;quot;Inside the function %s&amp;quot;, __FUNCTION__);&lt;br /&gt;
&lt;br /&gt;
     ClNameT     moIdName = {0};&lt;br /&gt;
    &lt;br /&gt;
     rc = clCorMoIdToMoIdNameGet((ClCorMOIdPtrT)pProvTxnData-&amp;gt;pMoId, &amp;amp;moIdName);&lt;br /&gt;
     if (CL_OK != rc)&lt;br /&gt;
     {&lt;br /&gt;
         clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed while getting the MOId Name from moid. rc[0x%x] &amp;quot;, appname, rc);&lt;br /&gt;
         return rc;&lt;br /&gt;
     }&lt;br /&gt;
     /*&lt;br /&gt;
       ---END_APPLICATION_CODE---&lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|   clcsa104Compcsa104Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     switch (pProvTxnData-&amp;gt;provCmd)&lt;br /&gt;
     {&lt;br /&gt;
         case CL_COR_OP_CREATE :&lt;br /&gt;
         case CL_COR_OP_CREATE_AND_SET:&lt;br /&gt;
			&lt;br /&gt;
         /*&lt;br /&gt;
          * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: Inside create request for the object [%s] &amp;quot;, appname, moIdName.value);    &lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---END_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         break;&lt;br /&gt;
         case CL_COR_OP_SET:&lt;br /&gt;
	    &lt;br /&gt;
         /*&lt;br /&gt;
          * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         if ( pProvTxnData-&amp;gt;attrId == CSA104RES_DELTA_T)&lt;br /&gt;
         {&lt;br /&gt;
             delta_t = *(ClUint32T *)pProvTxnData-&amp;gt;pProvData;&lt;br /&gt;
             clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: The delta time is now [%d] &amp;quot;, appname, delta_t);&lt;br /&gt;
         }&lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---END_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         break;&lt;br /&gt;
&lt;br /&gt;
         case  CL_COR_OP_DELETE:&lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---END_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         break;&lt;br /&gt;
         default:&lt;br /&gt;
             clprintf (CL_LOG_SEV_ERROR, &amp;quot;Prov command is not proper&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     ...&lt;br /&gt;
&lt;br /&gt;
     return rc;   &lt;br /&gt;
 }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
When the COR object associated with csa104's provisioning is updated, &amp;lt;code&amp;gt;clcsa104CompCSA104RESProvUpdate&amp;lt;/code&amp;gt; function is called. A new value is set for the &amp;lt;code&amp;gt;delta_t&amp;lt;/code&amp;gt; variable that is used to control the sleep interval in the application's main loop.&lt;br /&gt;
&lt;br /&gt;
===How to Run 104 and what to observe===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Start the application as usual with the SAFplus Platform Console.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 # cd /root/asp/bin&lt;br /&gt;
 # ./asp_console&lt;br /&gt;
&lt;br /&gt;
 cli[Test]-&amp;gt; setc 1&lt;br /&gt;
 cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Again, there are two log files to observe &amp;lt;code&amp;gt;/root/asp/var/log/csa104CompI0Log.latest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/var/log/csa104CompI1Log.latest&amp;lt;/code&amp;gt;. After running the above commands you should see the following output in these logs when using &amp;lt;code&amp;gt;tail -f&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00051 :   INFO)&lt;br /&gt;
 Component [csa104CompI0] : PID [21202]. Initializing&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00052 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00053 :   INFO)&lt;br /&gt;
    IOC Port                : 0x80&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00054 :   INFO)&lt;br /&gt;
 csa104: instantiated as component instance csa104CompI0.&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00055 :   INFO)&lt;br /&gt;
 csa104CompI0: cpmHandle = 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00056 :   INFO)&lt;br /&gt;
 csa104CompI0: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00057 :   INFO)&lt;br /&gt;
 csa104CompI0: checkpoint_initialize&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00064 :   INFO)&lt;br /&gt;
 csa104CompI0: Checkpoint service initialized (handle=0x1)&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00066 :   INFO)&lt;br /&gt;
 csa104CompI0: Checkpoint opened (handle=0x2)&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00067 :   INFO)&lt;br /&gt;
 csa104CompI0: Section created&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI1Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00049 :   INFO)&lt;br /&gt;
 Component [csa104CompI1] : PID [21209]. Initializing&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00050 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00051 :   INFO)&lt;br /&gt;
    IOC Port                : 0x81&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00052 :   INFO)&lt;br /&gt;
 csa104: instantiated as component instance csa104CompI1.&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00053 :   INFO)&lt;br /&gt;
 csa104CompI1: cpmHandle = 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00054 :   INFO)&lt;br /&gt;
 csa104CompI1: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00055 :   INFO)&lt;br /&gt;
 csa104CompI1: checkpoint_initialize&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00062 :   INFO)&lt;br /&gt;
 csa104CompI1: Checkpoint service initialized (handle=0x1)&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00064 :   INFO)&lt;br /&gt;
 csa104CompI1: Checkpoint opened (handle=0x2)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;As before, unlock the application with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsUnlock sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the active component log file you should start to see the &amp;quot;Hello World&amp;quot; lines displaying at a rate of about 1 per second.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00080 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 0)&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00085 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnStart] ****&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00087 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvObjectStart&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00089 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvValidate&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00105 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvUpdate&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00107 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvObjectEnd&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00116 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnEnd] ****&lt;br /&gt;
Mon Jul 14 19:07:28 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00123 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 1)&lt;br /&gt;
Mon Jul 14 19:07:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00124 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 2)&lt;br /&gt;
Mon Jul 14 19:07:30 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00125 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 3)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;In the SAFplus Platform Console return to the Slot 1 context by entering &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; until it prints the Slot 1 prompt: &amp;lt;code&amp;gt;cli[Test:SCNodeI0]-&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now set the context to the COR server using the following command:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc corServer_SCNodeI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then, dump the object tree:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objTreeShow&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see something like the following. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objTreeShow&lt;br /&gt;
&lt;br /&gt;
Objects (Instance Tree):&lt;br /&gt;
    \Chassis:0&lt;br /&gt;
        \PayloadNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \PayloadNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa104Res:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa105Res:0&lt;br /&gt;
            (alarm, provisioning)&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Next, dump the object with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objectShow \Chassis:0\csa104Res:0 PROV&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Showing Object&lt;br /&gt;
ClCorMOId:[Svc: 3] (/).(10001:0000).(10002:0000):&lt;br /&gt;
&lt;br /&gt;
[Class:0x10003] Object &lt;br /&gt;
{&lt;br /&gt;
[CSA104RES_COUNTER             ] [0x0002] = [431]&lt;br /&gt;
[CSA104RES_DELTA_T             ] [0x0003] = [1000]&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now, set the delta_t attribute to 10000 instead of 1000 with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; attrSet \Chassis:0\csa104Res:0 PROV null 3 -1 10000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Execution Result : Passed&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
You should see lines like the following in the logs for csa104:&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04230 :   INFO)&lt;br /&gt;
 csa104CompI0: The delta time is now [10000] &lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04232 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvObjectEnd&lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04241 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnEnd] ****&lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04248 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 510)&lt;br /&gt;
Mon Jul 14 19:16:09 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04249 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 511)&lt;br /&gt;
Mon Jul 14 19:16:09 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04254 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnStart] ****&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
indicating that the component has received the updated value of delta_t&lt;br /&gt;
&lt;br /&gt;
You should also notice that the lines in the log are now being printed with a 10 second interval between lines.&lt;br /&gt;
&lt;br /&gt;
To confirm that the value of delta_t was updated you could dump the object with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objectShow \Chassis:0\csa104Res:0 PROV&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Showing Object&lt;br /&gt;
ClCorMOId:[Svc: 3] (/).(10001:0000).(10002:0000):&lt;br /&gt;
&lt;br /&gt;
[Class:0x10003] Object &lt;br /&gt;
{&lt;br /&gt;
[CSA104RES_COUNTER             ] [0x0002] = [523]&lt;br /&gt;
[CSA104RES_DELTA_T             ] [0x0003] = [10000]&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;To end the example first change the state of csa104SGI0 to LockAssignment.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then change the state to LockInstantiation.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockInstantiation sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then close the SAFplus Platform Console session.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; end&lt;br /&gt;
cli[Test]-&amp;gt; bye&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Summary and References===&lt;br /&gt;
&lt;br /&gt;
We've seen how to:&lt;br /&gt;
*Create a simple ProvOm class.&lt;br /&gt;
*Use callbacks to the class's update method to update variables in the application at runtime.&lt;br /&gt;
*Use the SAFplus Platform Console to cause the classes update method to  be invoked.&lt;br /&gt;
&lt;br /&gt;
For further reading :&lt;br /&gt;
*Clovis SAFplus Platform User Guide: sections on COR, &lt;br /&gt;
*clProvOmApi.h&lt;br /&gt;
*clOmObjectManage.h&lt;br /&gt;
*clOmApi.h&lt;/div&gt;</summary>
		<author><name>Pradeepac</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/csa105</id>
		<title>Doc:latest/evalguide/csa105</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/csa105"/>
				<updated>2010-08-29T03:52:04Z</updated>
		
		<summary type="html">&lt;p&gt;Pradeepac: /* How to Run csa105 and What to Observe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==csa105 Software Alarm Management and Provisioning==&lt;br /&gt;
&lt;br /&gt;
===Objective===&lt;br /&gt;
&lt;br /&gt;
The goal of this sample application is to show &lt;br /&gt;
*how provisioning and alarm libraries work together to achieve a simple software alarm management&lt;br /&gt;
*how COR change notification is utilized&lt;br /&gt;
&lt;br /&gt;
===What You Will Learn===&lt;br /&gt;
&lt;br /&gt;
You will learn how the Clovis Object Manager (OM) is used to achieve interactions between the alarm and provisioning libraries.  In addition, two ways to report an alarm is introduced:  COR change notification and fault reporting.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&lt;br /&gt;
The code in csa105 is a bit different than our previous examples. csa105 contains two components instead of one. The first component (csa105Comp) is much like the other examples. It runs within a loop printing out 'Hello World' and with each iteration it increments a counter value. Once this counter value meets or exceeds a defineable threshold, the component raises an alarm. The second component (csa105AlmLstnerComp) registers itself with SAFplus Platform as an alarm subscriber or listener. Once our first component raises the alarm our second component receives notification of this and prints some information out to a log file so that we can see.&lt;br /&gt;
&lt;br /&gt;
There is also a new source file that you will see. This file is '''clcsa105CompalarmMetaStruct.c'''. This file contains definitions for the counter threshold crossing alarm. Everything in this file is generated by the IDE. We will not be customizing it.&lt;br /&gt;
&lt;br /&gt;
The code can be found within the following directories&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105Comp&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105AlmLstner&lt;br /&gt;
&lt;br /&gt;
This example is built on top of the csa104 example. We will only look at the code that has been added for this example. First we will look at the code in &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105Comp.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClUint32T counter_threshold   = 55; // the value determining the counter threshold.&lt;br /&gt;
...&lt;br /&gt;
static ClRcT raise_alarm_on_counter(ClCorMOIdT, ClNameT, ClUint32T);&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
First we define and initialize the counter threshold. This is the value our counter will be compared against to determine if an alarm should be raised.&lt;br /&gt;
&amp;lt;br&amp;gt;Next we declare the function that will be called to raise the alarm.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
clCompAppInitialize():&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
    if (counter_threshold &amp;lt;= counter)&lt;br /&gt;
    {&lt;br /&gt;
        clCorMoIdServiceSet(&amp;amp;moId, CL_COR_SVC_ID_ALARM_MANAGEMENT);&lt;br /&gt;
        if (( rc = raise_alarm_on_counter (moId, appName, counter)) != CL_OK)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Error [0x%x]: Alarm raise has failed. Exiting. &amp;quot;,&lt;br /&gt;
                        appname, rc);&lt;br /&gt;
            counter = 0;&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        counter = 0;&lt;br /&gt;
        continue;&lt;br /&gt;
    }&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The clCompAppInitialize() function is where our main loop runs that prints 'Hello World' and increments our counter. Each time through the loop we will now compare our counter value against the threshold value. If the counter is equal to or greater than this threshold we will call our raise_alarm_on_counter function. We also set the counter back to 0.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
static ClRcT&lt;br /&gt;
raise_alarm_on_counter (ClCorMOIdT moId , ClNameT compName, ClUint32T counter)&lt;br /&gt;
{&lt;br /&gt;
    ClRcT           rc = CL_OK;&lt;br /&gt;
    static ClUint32T       iterator = 0, lastCounter = 0;&lt;br /&gt;
    ClCharT str [80] = {0};&lt;br /&gt;
    ClAlarmInfoT *pAlarmInfo = {0};&lt;br /&gt;
    ClAlarmHandleT alarmHandle = {0};&lt;br /&gt;
    ClUint8T * pBuf = NULL;&lt;br /&gt;
    ClUint32T size = 0;&lt;br /&gt;
    ClAlarmUtilPayLoadListPtrT pPayloadList = NULL;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    if (lastCounter != counter)&lt;br /&gt;
    {&lt;br /&gt;
        lastCounter = counter;&lt;br /&gt;
        iterator = 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    pPayloadList = clHeapAllocate(sizeof(ClAlarmUtilPayLoadListT));&lt;br /&gt;
    if (pPayloadList == NULL)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed to allocate the memory for the alarm payload list.&amp;quot;);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;numPayLoadEnteries = 1;&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload = clHeapAllocate(sizeof(ClAlarmUtilPayLoadT));&lt;br /&gt;
    if (NULL == pPayloadList-&amp;gt;pPayload)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed while allocating payload array.&amp;quot;);&lt;br /&gt;
        clHeapFree(pPayloadList);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].numTlvs = 1;&lt;br /&gt;
    clCorMoIdClone(&amp;amp;moId, &amp;amp;pPayloadList-&amp;gt;pPayload[0].pMoId);&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].pTlv = clHeapAllocate(sizeof(ClAlarmUtilTlvT));&lt;br /&gt;
    if (NULL == pPayloadList-&amp;gt;pPayload[0].pTlv)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed while allocating the pTlv array. &amp;quot;);&lt;br /&gt;
        clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sprintf(str, &amp;quot;[%s]: The Alarm has been raised as the counter became [%d] for [%d] time&amp;quot;, &lt;br /&gt;
            appname, counter, ++iterator);&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].pTlv[0].type = CL_COR_UINT8;&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].pTlv[0].value = clHeapAllocate(strlen(str) + 1);&lt;br /&gt;
    if (NULL == pPayloadList-&amp;gt;pPayload[0].pTlv[0].value)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed while allocating the value for the attribute.&amp;quot;);&lt;br /&gt;
        clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].pTlv[0].length = strlen(str) + 1;&lt;br /&gt;
&lt;br /&gt;
    memset(pPayloadList-&amp;gt;pPayload[0].pTlv[0].value, 0, strlen(str) + 1);&lt;br /&gt;
&lt;br /&gt;
    memcpy(pPayloadList-&amp;gt;pPayload[0].pTlv[0].value, str, strlen(str));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    rc = clAlarmUtilPayloadFlatten(pPayloadList, &amp;amp;size, &amp;amp;pBuf);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]. Failed while getting the flat buffer for the payload. rc[0x%x]&amp;quot;, &lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pAlarmInfo = clHeapAllocate (sizeof(ClAlarmInfoT) + size);&lt;br /&gt;
    if (NULL == pAlarmInfo)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]: Failed to allocate the memory for alarm information. &amp;quot;, appname);&lt;br /&gt;
        clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
        clAlarmUtilPayloadBufFree(pBuf);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pAlarmInfo-&amp;gt;moId = moId;&lt;br /&gt;
    pAlarmInfo-&amp;gt;probCause = CL_ALARM_PROB_CAUSE_THRESHOLD_CROSSED; &lt;br /&gt;
    pAlarmInfo-&amp;gt;severity = CL_ALARM_SEVERITY_WARNING;&lt;br /&gt;
    memcpy (&amp;amp;pAlarmInfo-&amp;gt;compName, &amp;amp;compName, sizeof(ClNameT));&lt;br /&gt;
    pAlarmInfo-&amp;gt;alarmState = CL_ALARM_STATE_ASSERT;&lt;br /&gt;
    pAlarmInfo-&amp;gt;len = size;&lt;br /&gt;
&lt;br /&gt;
    memcpy(pAlarmInfo-&amp;gt;buff, pBuf, pAlarmInfo-&amp;gt;len);&lt;br /&gt;
&lt;br /&gt;
    clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
    clAlarmUtilPayloadBufFree(pBuf);&lt;br /&gt;
&lt;br /&gt;
    clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]: Raising the alarm as the counter threashold has reached. &amp;quot;, appname); &lt;br /&gt;
&lt;br /&gt;
    rc = clAlarmRaise (pAlarmInfo, &amp;amp;alarmHandle);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: The alarm raise has failed. &amp;quot;, appname, rc);&lt;br /&gt;
        clHeapFree(pAlarmInfo);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }  &lt;br /&gt;
&lt;br /&gt;
    pAlarmInfo-&amp;gt;alarmState = CL_ALARM_STATE_CLEAR;&lt;br /&gt;
    rc = clAlarmRaise (pAlarmInfo, &amp;amp;alarmHandle);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: The alarm clear has failed. &amp;quot;, appname, rc);&lt;br /&gt;
        clHeapFree(pAlarmInfo);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    clHeapFree(pAlarmInfo);&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The raise_alarm_on_counter function receives some information when called such as the application name and the counter value. It creates an &amp;lt;code&amp;gt;ClAlarmInfoT&amp;lt;/code&amp;gt; structure and fills it with some useful information. It then calls the &amp;lt;code&amp;gt;clAlarmRaise&amp;lt;/code&amp;gt; api twice. The first call is to raise the alarm and the second call is to clear the alarm. (Notice that the alarm state is set to &amp;lt;code&amp;gt;CL_ALARM_STATE_ASSERT&amp;lt;/code&amp;gt; for the first call and &amp;lt;code&amp;gt;CL_ALARM_STATE_CLEAR&amp;lt;/code&amp;gt; for the second call). The reason for this is that a given alarm is only raised once unless it is cleared. This is to avoid an alarm continually being sent.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa105CompOAMPConfig.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    ClOmClassControlBlockT pAppOmClassTbl[] =&lt;br /&gt;
    {&lt;br /&gt;
        {  &lt;br /&gt;
        CSA105COMP_CSA105RES_ALARM_CLASS_NAME,&lt;br /&gt;
        sizeof(CL_OM_ALARM_CSA105RES_CLASS),&lt;br /&gt;
        CL_OM_ALARM_CLASS_TYPE,&lt;br /&gt;
        clcsa105CompCSA105RESAlarmConstructor, &lt;br /&gt;
        clcsa105CompCSA105RESAlarmDestructor,&lt;br /&gt;
        NULL,&lt;br /&gt;
        CSA105COMP_CSA105RES_ALARM_CLASS_VERSION,&lt;br /&gt;
        0,&lt;br /&gt;
        CL_MAX_OBJ,&lt;br /&gt;
        0,&lt;br /&gt;
        CSA105COMP_CSA105RES_ALARM_MAX_SLOTS,&lt;br /&gt;
        CL_OM_ALARM_CSA105RES_CLASS_TYPE&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        {  &lt;br /&gt;
        CSA105COMP_CSA105RES_PROV_CLASS_NAME,&lt;br /&gt;
        sizeof(CL_OM_PROV_CSA105RES_CLASS),&lt;br /&gt;
        CL_OM_PROV_CLASS_TYPE,&lt;br /&gt;
        clcsa105CompCSA105RESProvConstructor, &lt;br /&gt;
        clcsa105CompCSA105RESProvDestructor,&lt;br /&gt;
        NULL,&lt;br /&gt;
        CSA105COMP_CSA105RES_PROV_CLASS_VERSION,&lt;br /&gt;
        0,&lt;br /&gt;
        CL_MAX_OBJ,&lt;br /&gt;
        0,&lt;br /&gt;
        CSA105COMP_CSA105RES_PROV_MAX_SLOTS,&lt;br /&gt;
        CL_OM_PROV_CSA105RES_CLASS_TYPE&lt;br /&gt;
        },&lt;br /&gt;
    };&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
This OM class table is generated by the IDE in &amp;lt;code&amp;gt;clcsa105CompOAMPConfig.c&amp;lt;/code&amp;gt;.  The definition for &amp;lt;code&amp;gt;ClOmClassControlBlockT&amp;lt;/code&amp;gt; can be found in:&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/SAFplus/components/om/include/clOmApi.h &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa105Compcsa105Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClRcT clcsa105CompCSA105RESProvUpdate(CL_OM_PROV_CLASS* pThis, ClHandleT txnHandle,&lt;br /&gt;
                                      ClProvTxnDataT* pProvTxnData)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
    switch (pProvTxnData-&amp;gt;provCmd)&lt;br /&gt;
    {&lt;br /&gt;
        case CL_COR_OP_CREATE :&lt;br /&gt;
        case CL_COR_OP_CREATE_AND_SET:&lt;br /&gt;
			&lt;br /&gt;
        /*&lt;br /&gt;
         * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
         &lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Inside create request for the object [%s] &amp;quot;, appname, moIdName.value);    &lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---END_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
        case CL_COR_OP_SET:&lt;br /&gt;
	    &lt;br /&gt;
        /*&lt;br /&gt;
         * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
         &lt;br /&gt;
        switch (pProvTxnData-&amp;gt;attrId)&lt;br /&gt;
        {&lt;br /&gt;
            case CSA105RES_DELTA_T:&lt;br /&gt;
                delta_t = *(ClUint32T *)pProvTxnData-&amp;gt;pProvData;&lt;br /&gt;
                clprintf(CL_LOG_SEV_NOTICE,&amp;quot;%s: The delta time is now [%d] &amp;quot;, appname, delta_t);&lt;br /&gt;
                break;&lt;br /&gt;
            case CSA105RES_COUNTER_THRESH:&lt;br /&gt;
                counter_threshold = *(ClUint32T *)pProvTxnData-&amp;gt;pProvData;&lt;br /&gt;
                clprintf(CL_LOG_SEV_NOTICE,&amp;quot;%s: The counter threshold is now [%d] &amp;quot;, appname, counter_threshold);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---END_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
&lt;br /&gt;
        case  CL_COR_OP_DELETE:&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---END_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
        default:&lt;br /&gt;
            clprintf (CL_LOG_SEV_ERROR, &amp;quot;Prov command is not proper&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
This base provisioning class method is generated by The IDE but requires application-specific logic to be filled in.  &amp;lt;code&amp;gt;clcsa105CompCSA105RESProvUpdate()&amp;lt;/code&amp;gt; is called to update an object's attribute. This has changed from our csa104 example as you can now change the counter threshold as well as the delta time.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa105Compcsa105Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClRcT clcsa105CompCSA105RESAlarmConstructor( void *pThis, void *pUsrData, ClUint32T usrDataLen )&lt;br /&gt;
{&lt;br /&gt;
    ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ClRcT clcsa105CompCSA105RESAlarmDestructor ( void *pThis , void  *pUsrData, ClUint32T usrDataLen )&lt;br /&gt;
{&lt;br /&gt;
    ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
There are two new functions that have been added as well. These are a constructor and destructor for the alarm. The definition for &amp;lt;code&amp;gt;clcsa105CompCSA105RESAlarmConstructor&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;clcsa105CompCSA105RESAlarmDestructor&amp;lt;/code&amp;gt; can be found in the file &amp;lt;code&amp;gt;clcsa105CompOAMPConfig.h&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now lets look at the code in &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105AlmLstner.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
....&lt;br /&gt;
ClRcT &lt;br /&gt;
alarm_event_subscribe_callback(const ClAlarmHandleInfoT* pAlarmInfo);&lt;br /&gt;
...&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Near the top of the module we declare the function that will be used to subscribe to alarm events.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClRcT&lt;br /&gt;
clCompAppAMFCSISet(&lt;br /&gt;
    ClInvocationT       invocation,&lt;br /&gt;
    const ClNameT       *compName,&lt;br /&gt;
    ClAmsHAStateT       haState,&lt;br /&gt;
    ClAmsCSIDescriptorT csiDescriptor)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    switch ( haState )&lt;br /&gt;
    {&lt;br /&gt;
        case CL_AMS_HA_STATE_ACTIVE:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to take the active HA state &lt;br /&gt;
             * for the CSI.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            // ...&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            clCpmResponse(cpmHandle, invocation, CL_OK);&lt;br /&gt;
            &lt;br /&gt;
            rc = clAlarmEventSubscribe(&amp;amp;alarm_event_subscribe_callback);&lt;br /&gt;
            if (CL_OK != rc)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed while subscribing for the alarm events. rc[0x%x]&amp;quot;,&lt;br /&gt;
                                                        appname, rc);&lt;br /&gt;
                return rc;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        case CL_AMS_HA_STATE_STANDBY:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to take the standby HA state &lt;br /&gt;
             * for this CSI.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            // ...&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            clCpmResponse(cpmHandle, invocation, CL_OK);&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        case CL_AMS_HA_STATE_QUIESCED:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to quiesce the CSI currently&lt;br /&gt;
             * assigned the active or quiescing HA state. The application &lt;br /&gt;
             * must stop work associated with the CSI immediately.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            // ...&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            clCpmResponse(cpmHandle, invocation, CL_OK);&lt;br /&gt;
&lt;br /&gt;
            rc = clAlarmEventUnsubscribe();&lt;br /&gt;
            if (CL_OK != rc)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed while un-subscribing for the alarm evnets. rc[0x%x] &amp;quot;,  &lt;br /&gt;
                                                                appname, rc);&lt;br /&gt;
                return rc;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        case CL_AMS_HA_STATE_QUIESCING:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to quiesce the CSI currently&lt;br /&gt;
             * assigned the active HA state. The application must stop work&lt;br /&gt;
             * associated with the CSI gracefully and not accept any new&lt;br /&gt;
             * workloads while the work is being terminated.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            // ...&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            clCpmCSIQuiescingComplete(cpmHandle, invocation, CL_OK);&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        default:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * Should never happen. Ignore.&lt;br /&gt;
             */&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;clCompAppAMFCSISet&amp;lt;/code&amp;gt; function is called when the state of the CSI is set. Here we call the &amp;lt;code&amp;gt;clAlarmEventSubscribe&amp;lt;/code&amp;gt; api (passing it a handle to our callback function) when the CSI becomes active. When the CSI becomes innactive we call the &amp;lt;code&amp;gt;clAlarmEventUnsubscribe&amp;lt;/code&amp;gt; api.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClRcT &lt;br /&gt;
alarm_event_subscribe_callback(const ClAlarmHandleInfoT* pAlarmInfo)&lt;br /&gt;
{&lt;br /&gt;
    ClRcT   rc = CL_OK;&lt;br /&gt;
    ClNameT moIdName = {0};&lt;br /&gt;
    ClCorMOIdT  moId = pAlarmInfo-&amp;gt;alarmInfo.moId;&lt;br /&gt;
    ClAlarmUtilPayLoadListPtrT pPayloadList = NULL;&lt;br /&gt;
&lt;br /&gt;
    rc = clCorMoIdToMoIdNameGet(&amp;amp;moId, &amp;amp;moIdName);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]:Failed while getting the moId from MOId Name. rc[0x%x] &amp;quot;, &lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    rc = clAlarmUtilPayLoadExtract((ClUint8T *)pAlarmInfo-&amp;gt;alarmInfo.buff, &lt;br /&gt;
            pAlarmInfo-&amp;gt;alarmInfo.len, &amp;amp;pPayloadList);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]: Failed while extracting the payload information. rc[0x%x] &amp;quot;, &lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;______________________________________________________&amp;quot;);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;The alarm is [%s] &amp;quot;, pAlarmInfo-&amp;gt;alarmInfo.alarmState ?&amp;quot;RAISED&amp;quot;:&amp;quot;CLEARED&amp;quot;);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;The alarm Raised on the resource [%s]  &amp;quot;, moIdName.value);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;Component which has raised the alarm  is [%s] &amp;quot;, pAlarmInfo-&amp;gt;alarmInfo.compName.value);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;Probable cause of the alarm is [%d] &amp;quot;, pAlarmInfo-&amp;gt;alarmInfo.probCause);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;Severity of the alarm is [%d] &amp;quot;, pAlarmInfo-&amp;gt;alarmInfo.severity);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;The payload information : [%s] &amp;quot;, (char*)pPayloadList-&amp;gt;pPayload[0].pTlv[0].value);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;______________________________________________________&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Finally we the callback function. Since this component has registered itself as an alarm listener when it becomes active, this function will be called when the alarm is raised. The function simply prints out a message displaying some of the data that was loaded into the &amp;lt;code&amp;gt;ClAlarmHandleInfoT&amp;lt;/code&amp;gt; structure when the alarm was raised.&lt;br /&gt;
&lt;br /&gt;
===How to Run csa105 and What to Observe===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Start the application as usual with the SAFplus Platform Console. Since our example has two components we will put them both into a lock assignment state.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 # cd /root/asp/bin&lt;br /&gt;
 # ./asp_console&lt;br /&gt;
&lt;br /&gt;
 cli[Test]-&amp;gt; setc 1&lt;br /&gt;
 cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa105SGI0&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa105AlmLstnerSGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example actually creates three log files...&amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI1Log.latest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/root/asp/var/log/csa105AlmLstnerCompLog.latest&amp;lt;/code&amp;gt;. The only ones that we are interested in are &amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/var/log/csa105AlmLstnerCompLog.latest&amp;lt;/code&amp;gt;. Open up two separate command windows. We will view each of the logs in a separate window. In one window type the command &amp;lt;code&amp;gt;tail -f /root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt;. In the other type the command &amp;lt;code&amp;gt;tail -f /root/asp/var/log/csa105AlmLstnerCompLog.latest&amp;lt;/code&amp;gt;. You should see the following output. (The csa105AlmLstnerComp.log file will not have any output yet.)&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa105CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00135 :   INFO)&lt;br /&gt;
 Component [csa105CompI0] : PID [22201]. Initializing&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00136 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00137 :   INFO)&lt;br /&gt;
    IOC Port                : 0x81&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00138 :   INFO)&lt;br /&gt;
 csa105: instantiated as component instance csa105CompI0.&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00139 :   INFO)&lt;br /&gt;
 csa105CompI0: cpmHandle = 0x1&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00140 :   INFO)&lt;br /&gt;
 csa105CompI0: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00141 :   INFO)&lt;br /&gt;
 csa105CompI0: checkpoint_initialize&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00148 :   INFO)&lt;br /&gt;
 csa105CompI0: Checkpoint service initialized (handle=0x1)&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00150 :   INFO)&lt;br /&gt;
 csa105CompI0: Checkpoint opened (handle=0x2)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now unlock the '''csa105AlmLstnerSGI0''' service group.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsUnlock sg csa105AlmLstnerSGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Next unlock the '''csa105SGI0''' service group.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsUnlock sg csa105SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see the following output in the &amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt; log file.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa105CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00286 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 0)&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00291 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnStart] ****&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00293 :   INFO)&lt;br /&gt;
 Inside the function clcsa105CompCSA105RESProvObjectStart&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00295 :   INFO)&lt;br /&gt;
 Inside the function clcsa105CompCSA105RESProvValidate&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00311 :   INFO)&lt;br /&gt;
 Inside the function clcsa105CompCSA105RESProvUpdate&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00313 :   INFO)&lt;br /&gt;
 Inside the function clcsa105CompCSA105RESProvObjectEnd&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00322 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnEnd] ****&lt;br /&gt;
Mon Jul 14 20:21:19 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00329 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 1)&lt;br /&gt;
Mon Jul 14 20:21:20 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00330 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 2)&lt;br /&gt;
Mon Jul 14 20:21:21 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00331 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 3)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
You will notice that the '''csa105CompI0''' component has begun printing out the 'Hello World'. You can also see that the counter value is incrementing.&lt;br /&gt;
&lt;br /&gt;
Keep watching the counter value as it increments. Remember that we set up an initial counter threshold of 65. Once the counter value reaches 65 you will see the following in the &amp;lt;code&amp;gt;/root/asp/var/log/csa105AlmLstnerCompLog.latest&amp;lt;/code&amp;gt; log file.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/cscsa105AlmLstnerCompLog.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
__________________________________________________________________________________&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00109 :   INFO)&lt;br /&gt;
 The alarm is [RAISED]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00110 :   INFO)&lt;br /&gt;
 The alarm Raised on the resource [\Chassis:0\csa105Res:0]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00111 :   INFO)&lt;br /&gt;
 Component which has raised the alarm  is [csa105CompI1]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00112 :   INFO)&lt;br /&gt;
 Probable cause of the alarm is [16]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00113 :   INFO)&lt;br /&gt;
 Severity of the alarm is [4]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00114 :   INFO)&lt;br /&gt;
 The payload information : [[csa105CompI0]: The Alarm has been raised as the counter &lt;br /&gt;
became [65] for [1] time]&lt;br /&gt;
__________________________________________________________________________________&lt;br /&gt;
__________________________________________________________________________________&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00134 :   INFO)&lt;br /&gt;
 The alarm is [CLEARED]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00135 :   INFO)&lt;br /&gt;
 The alarm Raised on the resource [\Chassis:0\csa105Res:0]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00136 :   INFO)&lt;br /&gt;
 Component which has raised the alarm  is [csa105CompI1]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00137 :   INFO)&lt;br /&gt;
 Probable cause of the alarm is [16]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00138 :   INFO)&lt;br /&gt;
 Severity of the alarm is [4]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00139 :   INFO)&lt;br /&gt;
 The payload information : [[csa105CompI0]: The Alarm has been raised as the counter&lt;br /&gt;
became [65] for [1] time]&lt;br /&gt;
&lt;br /&gt;
__________________________________________________________________________________&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
As you can see our callback function in the module &amp;lt;code&amp;gt;&amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105AlmLstner/clCompAppMain.c&amp;lt;/code&amp;gt; was called twice. Once when the alarm was raised and once when it was cleared. Looking at the &amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt; log file you can see that the alarm was raised and cleared from this component and then the counter value was reset.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa105CompI0Log.l&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 20:22:22 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00812 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 64)&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00813 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 65)&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00814 :   INFO)&lt;br /&gt;
 [csa105CompI0]: Raising the alarm as the counter threashold has reached.&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00843 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 0)&lt;br /&gt;
Mon Jul 14 20:22:24 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00844 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 1)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This behavior will continue each time the counter value reaches 65.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now lets change the threshold value. We do this through the SAFplus Platform Console. In the SAFplus Platform Console return to the SCNodeI0  context by entering &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; until it prints the SCNodeI0 prompt: &amp;lt;code&amp;gt;cli[Test:SCNodeI0]-&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now set the context to the COR server using the following command:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc corServer_SCNodeI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then, dump the object tree:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objTreeShow&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see something like the following.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objtreeshow&lt;br /&gt;
&lt;br /&gt;
Objects (Instance Tree):&lt;br /&gt;
    \Chassis:0&lt;br /&gt;
        \PayloadNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \PayloadNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa104Res:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa105Res:0&lt;br /&gt;
            (alarm, provisioning)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Next, dump object with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objectShow \Chassis:0\csa105Res:0 PROV&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Showing Object&lt;br /&gt;
ClCorMOId:[Svc: 3] (/).(10001:0000).(10004:0000):&lt;br /&gt;
&lt;br /&gt;
[Class:0x10005] Object &lt;br /&gt;
{&lt;br /&gt;
[CSA105RES_COUNTER             ] [0x0004] = [41]&lt;br /&gt;
[CSA105RES_COUNTER_THRESH      ] [0x0005] = [65]&lt;br /&gt;
[CSA105RES_DELTA_T             ] [0x0006] = [1000]&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now, set the counter_thresh attribute to 20 instead of 65 with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; attrSet \Chassis:0\csa105Res:0 PROV null 5 -1 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Execution Result : Passed&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Now you will notice that the alarm is raised every time the counter value reaches 20.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;To end this example first get back to the CPM context.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now shut things down in the usual fashion. Remember that this example has two components to shut down.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa105SGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa105AlmLstnerSGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockInstantiation sg csa105SGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockInstantiation sg csa105AlmLstnerSGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; end&lt;br /&gt;
cli[Test]-&amp;gt; bye&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Summary and References===&lt;br /&gt;
&lt;br /&gt;
This application is built upon the csa104 application and presents :&lt;br /&gt;
*how provisioning and alarm libraries work together to achieve a simple software alarm management&lt;br /&gt;
*how COR change notification is utilized&lt;/div&gt;</summary>
		<author><name>Pradeepac</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/csa105</id>
		<title>Doc:latest/evalguide/csa105</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/csa105"/>
				<updated>2010-08-29T03:50:35Z</updated>
		
		<summary type="html">&lt;p&gt;Pradeepac: /* How to Run csa105 and What to Observe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==csa105 Software Alarm Management and Provisioning==&lt;br /&gt;
&lt;br /&gt;
===Objective===&lt;br /&gt;
&lt;br /&gt;
The goal of this sample application is to show &lt;br /&gt;
*how provisioning and alarm libraries work together to achieve a simple software alarm management&lt;br /&gt;
*how COR change notification is utilized&lt;br /&gt;
&lt;br /&gt;
===What You Will Learn===&lt;br /&gt;
&lt;br /&gt;
You will learn how the Clovis Object Manager (OM) is used to achieve interactions between the alarm and provisioning libraries.  In addition, two ways to report an alarm is introduced:  COR change notification and fault reporting.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&lt;br /&gt;
The code in csa105 is a bit different than our previous examples. csa105 contains two components instead of one. The first component (csa105Comp) is much like the other examples. It runs within a loop printing out 'Hello World' and with each iteration it increments a counter value. Once this counter value meets or exceeds a defineable threshold, the component raises an alarm. The second component (csa105AlmLstnerComp) registers itself with SAFplus Platform as an alarm subscriber or listener. Once our first component raises the alarm our second component receives notification of this and prints some information out to a log file so that we can see.&lt;br /&gt;
&lt;br /&gt;
There is also a new source file that you will see. This file is '''clcsa105CompalarmMetaStruct.c'''. This file contains definitions for the counter threshold crossing alarm. Everything in this file is generated by the IDE. We will not be customizing it.&lt;br /&gt;
&lt;br /&gt;
The code can be found within the following directories&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105Comp&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105AlmLstner&lt;br /&gt;
&lt;br /&gt;
This example is built on top of the csa104 example. We will only look at the code that has been added for this example. First we will look at the code in &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105Comp.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClUint32T counter_threshold   = 55; // the value determining the counter threshold.&lt;br /&gt;
...&lt;br /&gt;
static ClRcT raise_alarm_on_counter(ClCorMOIdT, ClNameT, ClUint32T);&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
First we define and initialize the counter threshold. This is the value our counter will be compared against to determine if an alarm should be raised.&lt;br /&gt;
&amp;lt;br&amp;gt;Next we declare the function that will be called to raise the alarm.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
clCompAppInitialize():&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
    if (counter_threshold &amp;lt;= counter)&lt;br /&gt;
    {&lt;br /&gt;
        clCorMoIdServiceSet(&amp;amp;moId, CL_COR_SVC_ID_ALARM_MANAGEMENT);&lt;br /&gt;
        if (( rc = raise_alarm_on_counter (moId, appName, counter)) != CL_OK)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Error [0x%x]: Alarm raise has failed. Exiting. &amp;quot;,&lt;br /&gt;
                        appname, rc);&lt;br /&gt;
            counter = 0;&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        counter = 0;&lt;br /&gt;
        continue;&lt;br /&gt;
    }&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The clCompAppInitialize() function is where our main loop runs that prints 'Hello World' and increments our counter. Each time through the loop we will now compare our counter value against the threshold value. If the counter is equal to or greater than this threshold we will call our raise_alarm_on_counter function. We also set the counter back to 0.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
static ClRcT&lt;br /&gt;
raise_alarm_on_counter (ClCorMOIdT moId , ClNameT compName, ClUint32T counter)&lt;br /&gt;
{&lt;br /&gt;
    ClRcT           rc = CL_OK;&lt;br /&gt;
    static ClUint32T       iterator = 0, lastCounter = 0;&lt;br /&gt;
    ClCharT str [80] = {0};&lt;br /&gt;
    ClAlarmInfoT *pAlarmInfo = {0};&lt;br /&gt;
    ClAlarmHandleT alarmHandle = {0};&lt;br /&gt;
    ClUint8T * pBuf = NULL;&lt;br /&gt;
    ClUint32T size = 0;&lt;br /&gt;
    ClAlarmUtilPayLoadListPtrT pPayloadList = NULL;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    if (lastCounter != counter)&lt;br /&gt;
    {&lt;br /&gt;
        lastCounter = counter;&lt;br /&gt;
        iterator = 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    pPayloadList = clHeapAllocate(sizeof(ClAlarmUtilPayLoadListT));&lt;br /&gt;
    if (pPayloadList == NULL)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed to allocate the memory for the alarm payload list.&amp;quot;);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;numPayLoadEnteries = 1;&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload = clHeapAllocate(sizeof(ClAlarmUtilPayLoadT));&lt;br /&gt;
    if (NULL == pPayloadList-&amp;gt;pPayload)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed while allocating payload array.&amp;quot;);&lt;br /&gt;
        clHeapFree(pPayloadList);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].numTlvs = 1;&lt;br /&gt;
    clCorMoIdClone(&amp;amp;moId, &amp;amp;pPayloadList-&amp;gt;pPayload[0].pMoId);&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].pTlv = clHeapAllocate(sizeof(ClAlarmUtilTlvT));&lt;br /&gt;
    if (NULL == pPayloadList-&amp;gt;pPayload[0].pTlv)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed while allocating the pTlv array. &amp;quot;);&lt;br /&gt;
        clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sprintf(str, &amp;quot;[%s]: The Alarm has been raised as the counter became [%d] for [%d] time&amp;quot;, &lt;br /&gt;
            appname, counter, ++iterator);&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].pTlv[0].type = CL_COR_UINT8;&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].pTlv[0].value = clHeapAllocate(strlen(str) + 1);&lt;br /&gt;
    if (NULL == pPayloadList-&amp;gt;pPayload[0].pTlv[0].value)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed while allocating the value for the attribute.&amp;quot;);&lt;br /&gt;
        clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].pTlv[0].length = strlen(str) + 1;&lt;br /&gt;
&lt;br /&gt;
    memset(pPayloadList-&amp;gt;pPayload[0].pTlv[0].value, 0, strlen(str) + 1);&lt;br /&gt;
&lt;br /&gt;
    memcpy(pPayloadList-&amp;gt;pPayload[0].pTlv[0].value, str, strlen(str));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    rc = clAlarmUtilPayloadFlatten(pPayloadList, &amp;amp;size, &amp;amp;pBuf);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]. Failed while getting the flat buffer for the payload. rc[0x%x]&amp;quot;, &lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pAlarmInfo = clHeapAllocate (sizeof(ClAlarmInfoT) + size);&lt;br /&gt;
    if (NULL == pAlarmInfo)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]: Failed to allocate the memory for alarm information. &amp;quot;, appname);&lt;br /&gt;
        clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
        clAlarmUtilPayloadBufFree(pBuf);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pAlarmInfo-&amp;gt;moId = moId;&lt;br /&gt;
    pAlarmInfo-&amp;gt;probCause = CL_ALARM_PROB_CAUSE_THRESHOLD_CROSSED; &lt;br /&gt;
    pAlarmInfo-&amp;gt;severity = CL_ALARM_SEVERITY_WARNING;&lt;br /&gt;
    memcpy (&amp;amp;pAlarmInfo-&amp;gt;compName, &amp;amp;compName, sizeof(ClNameT));&lt;br /&gt;
    pAlarmInfo-&amp;gt;alarmState = CL_ALARM_STATE_ASSERT;&lt;br /&gt;
    pAlarmInfo-&amp;gt;len = size;&lt;br /&gt;
&lt;br /&gt;
    memcpy(pAlarmInfo-&amp;gt;buff, pBuf, pAlarmInfo-&amp;gt;len);&lt;br /&gt;
&lt;br /&gt;
    clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
    clAlarmUtilPayloadBufFree(pBuf);&lt;br /&gt;
&lt;br /&gt;
    clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]: Raising the alarm as the counter threashold has reached. &amp;quot;, appname); &lt;br /&gt;
&lt;br /&gt;
    rc = clAlarmRaise (pAlarmInfo, &amp;amp;alarmHandle);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: The alarm raise has failed. &amp;quot;, appname, rc);&lt;br /&gt;
        clHeapFree(pAlarmInfo);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }  &lt;br /&gt;
&lt;br /&gt;
    pAlarmInfo-&amp;gt;alarmState = CL_ALARM_STATE_CLEAR;&lt;br /&gt;
    rc = clAlarmRaise (pAlarmInfo, &amp;amp;alarmHandle);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: The alarm clear has failed. &amp;quot;, appname, rc);&lt;br /&gt;
        clHeapFree(pAlarmInfo);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    clHeapFree(pAlarmInfo);&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The raise_alarm_on_counter function receives some information when called such as the application name and the counter value. It creates an &amp;lt;code&amp;gt;ClAlarmInfoT&amp;lt;/code&amp;gt; structure and fills it with some useful information. It then calls the &amp;lt;code&amp;gt;clAlarmRaise&amp;lt;/code&amp;gt; api twice. The first call is to raise the alarm and the second call is to clear the alarm. (Notice that the alarm state is set to &amp;lt;code&amp;gt;CL_ALARM_STATE_ASSERT&amp;lt;/code&amp;gt; for the first call and &amp;lt;code&amp;gt;CL_ALARM_STATE_CLEAR&amp;lt;/code&amp;gt; for the second call). The reason for this is that a given alarm is only raised once unless it is cleared. This is to avoid an alarm continually being sent.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa105CompOAMPConfig.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    ClOmClassControlBlockT pAppOmClassTbl[] =&lt;br /&gt;
    {&lt;br /&gt;
        {  &lt;br /&gt;
        CSA105COMP_CSA105RES_ALARM_CLASS_NAME,&lt;br /&gt;
        sizeof(CL_OM_ALARM_CSA105RES_CLASS),&lt;br /&gt;
        CL_OM_ALARM_CLASS_TYPE,&lt;br /&gt;
        clcsa105CompCSA105RESAlarmConstructor, &lt;br /&gt;
        clcsa105CompCSA105RESAlarmDestructor,&lt;br /&gt;
        NULL,&lt;br /&gt;
        CSA105COMP_CSA105RES_ALARM_CLASS_VERSION,&lt;br /&gt;
        0,&lt;br /&gt;
        CL_MAX_OBJ,&lt;br /&gt;
        0,&lt;br /&gt;
        CSA105COMP_CSA105RES_ALARM_MAX_SLOTS,&lt;br /&gt;
        CL_OM_ALARM_CSA105RES_CLASS_TYPE&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        {  &lt;br /&gt;
        CSA105COMP_CSA105RES_PROV_CLASS_NAME,&lt;br /&gt;
        sizeof(CL_OM_PROV_CSA105RES_CLASS),&lt;br /&gt;
        CL_OM_PROV_CLASS_TYPE,&lt;br /&gt;
        clcsa105CompCSA105RESProvConstructor, &lt;br /&gt;
        clcsa105CompCSA105RESProvDestructor,&lt;br /&gt;
        NULL,&lt;br /&gt;
        CSA105COMP_CSA105RES_PROV_CLASS_VERSION,&lt;br /&gt;
        0,&lt;br /&gt;
        CL_MAX_OBJ,&lt;br /&gt;
        0,&lt;br /&gt;
        CSA105COMP_CSA105RES_PROV_MAX_SLOTS,&lt;br /&gt;
        CL_OM_PROV_CSA105RES_CLASS_TYPE&lt;br /&gt;
        },&lt;br /&gt;
    };&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
This OM class table is generated by the IDE in &amp;lt;code&amp;gt;clcsa105CompOAMPConfig.c&amp;lt;/code&amp;gt;.  The definition for &amp;lt;code&amp;gt;ClOmClassControlBlockT&amp;lt;/code&amp;gt; can be found in:&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/SAFplus/components/om/include/clOmApi.h &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa105Compcsa105Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClRcT clcsa105CompCSA105RESProvUpdate(CL_OM_PROV_CLASS* pThis, ClHandleT txnHandle,&lt;br /&gt;
                                      ClProvTxnDataT* pProvTxnData)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
    switch (pProvTxnData-&amp;gt;provCmd)&lt;br /&gt;
    {&lt;br /&gt;
        case CL_COR_OP_CREATE :&lt;br /&gt;
        case CL_COR_OP_CREATE_AND_SET:&lt;br /&gt;
			&lt;br /&gt;
        /*&lt;br /&gt;
         * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
         &lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Inside create request for the object [%s] &amp;quot;, appname, moIdName.value);    &lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---END_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
        case CL_COR_OP_SET:&lt;br /&gt;
	    &lt;br /&gt;
        /*&lt;br /&gt;
         * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
         &lt;br /&gt;
        switch (pProvTxnData-&amp;gt;attrId)&lt;br /&gt;
        {&lt;br /&gt;
            case CSA105RES_DELTA_T:&lt;br /&gt;
                delta_t = *(ClUint32T *)pProvTxnData-&amp;gt;pProvData;&lt;br /&gt;
                clprintf(CL_LOG_SEV_NOTICE,&amp;quot;%s: The delta time is now [%d] &amp;quot;, appname, delta_t);&lt;br /&gt;
                break;&lt;br /&gt;
            case CSA105RES_COUNTER_THRESH:&lt;br /&gt;
                counter_threshold = *(ClUint32T *)pProvTxnData-&amp;gt;pProvData;&lt;br /&gt;
                clprintf(CL_LOG_SEV_NOTICE,&amp;quot;%s: The counter threshold is now [%d] &amp;quot;, appname, counter_threshold);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---END_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
&lt;br /&gt;
        case  CL_COR_OP_DELETE:&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---END_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
        default:&lt;br /&gt;
            clprintf (CL_LOG_SEV_ERROR, &amp;quot;Prov command is not proper&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
This base provisioning class method is generated by The IDE but requires application-specific logic to be filled in.  &amp;lt;code&amp;gt;clcsa105CompCSA105RESProvUpdate()&amp;lt;/code&amp;gt; is called to update an object's attribute. This has changed from our csa104 example as you can now change the counter threshold as well as the delta time.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa105Compcsa105Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClRcT clcsa105CompCSA105RESAlarmConstructor( void *pThis, void *pUsrData, ClUint32T usrDataLen )&lt;br /&gt;
{&lt;br /&gt;
    ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ClRcT clcsa105CompCSA105RESAlarmDestructor ( void *pThis , void  *pUsrData, ClUint32T usrDataLen )&lt;br /&gt;
{&lt;br /&gt;
    ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
There are two new functions that have been added as well. These are a constructor and destructor for the alarm. The definition for &amp;lt;code&amp;gt;clcsa105CompCSA105RESAlarmConstructor&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;clcsa105CompCSA105RESAlarmDestructor&amp;lt;/code&amp;gt; can be found in the file &amp;lt;code&amp;gt;clcsa105CompOAMPConfig.h&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now lets look at the code in &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105AlmLstner.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
....&lt;br /&gt;
ClRcT &lt;br /&gt;
alarm_event_subscribe_callback(const ClAlarmHandleInfoT* pAlarmInfo);&lt;br /&gt;
...&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Near the top of the module we declare the function that will be used to subscribe to alarm events.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClRcT&lt;br /&gt;
clCompAppAMFCSISet(&lt;br /&gt;
    ClInvocationT       invocation,&lt;br /&gt;
    const ClNameT       *compName,&lt;br /&gt;
    ClAmsHAStateT       haState,&lt;br /&gt;
    ClAmsCSIDescriptorT csiDescriptor)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    switch ( haState )&lt;br /&gt;
    {&lt;br /&gt;
        case CL_AMS_HA_STATE_ACTIVE:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to take the active HA state &lt;br /&gt;
             * for the CSI.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            // ...&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            clCpmResponse(cpmHandle, invocation, CL_OK);&lt;br /&gt;
            &lt;br /&gt;
            rc = clAlarmEventSubscribe(&amp;amp;alarm_event_subscribe_callback);&lt;br /&gt;
            if (CL_OK != rc)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed while subscribing for the alarm events. rc[0x%x]&amp;quot;,&lt;br /&gt;
                                                        appname, rc);&lt;br /&gt;
                return rc;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        case CL_AMS_HA_STATE_STANDBY:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to take the standby HA state &lt;br /&gt;
             * for this CSI.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            // ...&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            clCpmResponse(cpmHandle, invocation, CL_OK);&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        case CL_AMS_HA_STATE_QUIESCED:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to quiesce the CSI currently&lt;br /&gt;
             * assigned the active or quiescing HA state. The application &lt;br /&gt;
             * must stop work associated with the CSI immediately.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            // ...&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            clCpmResponse(cpmHandle, invocation, CL_OK);&lt;br /&gt;
&lt;br /&gt;
            rc = clAlarmEventUnsubscribe();&lt;br /&gt;
            if (CL_OK != rc)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed while un-subscribing for the alarm evnets. rc[0x%x] &amp;quot;,  &lt;br /&gt;
                                                                appname, rc);&lt;br /&gt;
                return rc;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        case CL_AMS_HA_STATE_QUIESCING:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to quiesce the CSI currently&lt;br /&gt;
             * assigned the active HA state. The application must stop work&lt;br /&gt;
             * associated with the CSI gracefully and not accept any new&lt;br /&gt;
             * workloads while the work is being terminated.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            // ...&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            clCpmCSIQuiescingComplete(cpmHandle, invocation, CL_OK);&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        default:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * Should never happen. Ignore.&lt;br /&gt;
             */&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;clCompAppAMFCSISet&amp;lt;/code&amp;gt; function is called when the state of the CSI is set. Here we call the &amp;lt;code&amp;gt;clAlarmEventSubscribe&amp;lt;/code&amp;gt; api (passing it a handle to our callback function) when the CSI becomes active. When the CSI becomes innactive we call the &amp;lt;code&amp;gt;clAlarmEventUnsubscribe&amp;lt;/code&amp;gt; api.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClRcT &lt;br /&gt;
alarm_event_subscribe_callback(const ClAlarmHandleInfoT* pAlarmInfo)&lt;br /&gt;
{&lt;br /&gt;
    ClRcT   rc = CL_OK;&lt;br /&gt;
    ClNameT moIdName = {0};&lt;br /&gt;
    ClCorMOIdT  moId = pAlarmInfo-&amp;gt;alarmInfo.moId;&lt;br /&gt;
    ClAlarmUtilPayLoadListPtrT pPayloadList = NULL;&lt;br /&gt;
&lt;br /&gt;
    rc = clCorMoIdToMoIdNameGet(&amp;amp;moId, &amp;amp;moIdName);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]:Failed while getting the moId from MOId Name. rc[0x%x] &amp;quot;, &lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    rc = clAlarmUtilPayLoadExtract((ClUint8T *)pAlarmInfo-&amp;gt;alarmInfo.buff, &lt;br /&gt;
            pAlarmInfo-&amp;gt;alarmInfo.len, &amp;amp;pPayloadList);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]: Failed while extracting the payload information. rc[0x%x] &amp;quot;, &lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;______________________________________________________&amp;quot;);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;The alarm is [%s] &amp;quot;, pAlarmInfo-&amp;gt;alarmInfo.alarmState ?&amp;quot;RAISED&amp;quot;:&amp;quot;CLEARED&amp;quot;);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;The alarm Raised on the resource [%s]  &amp;quot;, moIdName.value);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;Component which has raised the alarm  is [%s] &amp;quot;, pAlarmInfo-&amp;gt;alarmInfo.compName.value);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;Probable cause of the alarm is [%d] &amp;quot;, pAlarmInfo-&amp;gt;alarmInfo.probCause);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;Severity of the alarm is [%d] &amp;quot;, pAlarmInfo-&amp;gt;alarmInfo.severity);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;The payload information : [%s] &amp;quot;, (char*)pPayloadList-&amp;gt;pPayload[0].pTlv[0].value);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;______________________________________________________&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Finally we the callback function. Since this component has registered itself as an alarm listener when it becomes active, this function will be called when the alarm is raised. The function simply prints out a message displaying some of the data that was loaded into the &amp;lt;code&amp;gt;ClAlarmHandleInfoT&amp;lt;/code&amp;gt; structure when the alarm was raised.&lt;br /&gt;
&lt;br /&gt;
===How to Run csa105 and What to Observe===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Start the application as usual with the SAFplus Platform Console. Since our example has two components we will put them both into a lock assignment state.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 # cd /root/asp/bin&lt;br /&gt;
 # ./asp_console&lt;br /&gt;
&lt;br /&gt;
 cli[Test]-&amp;gt; setc 1&lt;br /&gt;
 cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa105SGI0&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa105AlmLstnerSGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example actually creates three log files...&amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI1Log.latest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/root/asp/var/log/csa105AlmLstnerCompLog.latest&amp;lt;/code&amp;gt;. The only ones that we are interested in are &amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/var/log/csa105AlmLstnerCompLog.latest&amp;lt;/code&amp;gt;. Open up two separate command windows. We will view each of the logs in a separate window. In one window type the command &amp;lt;code&amp;gt;tail -f /root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt;. In the other type the command &amp;lt;code&amp;gt;tail -f /root/asp/var/log/csa105AlmLstnerCompLog.latest&amp;lt;/code&amp;gt;. You should see the following output. (The csa105AlmLstnerComp.log file will not have any output yet.)&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa105CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00135 :   INFO)&lt;br /&gt;
 Component [csa105CompI0] : PID [22201]. Initializing&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00136 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00137 :   INFO)&lt;br /&gt;
    IOC Port                : 0x81&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00138 :   INFO)&lt;br /&gt;
 csa105: instantiated as component instance csa105CompI0.&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00139 :   INFO)&lt;br /&gt;
 csa105CompI0: cpmHandle = 0x1&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00140 :   INFO)&lt;br /&gt;
 csa105CompI0: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00141 :   INFO)&lt;br /&gt;
 csa105CompI0: checkpoint_initialize&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00148 :   INFO)&lt;br /&gt;
 csa105CompI0: Checkpoint service initialized (handle=0x1)&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00150 :   INFO)&lt;br /&gt;
 csa105CompI0: Checkpoint opened (handle=0x2)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now unlock the '''csa105AlmLstnerSGI0''' service group.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsUnlock sg csa105AlmLstnerSGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Next unlock the '''csa105SGI0''' service group.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsUnlock sg csa105SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see the following output in the &amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt; log file.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa105CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00286 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 0)&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00291 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnStart] ****&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00293 :   INFO)&lt;br /&gt;
 Inside the function clcsa105CompCSA105RESProvObjectStart&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00295 :   INFO)&lt;br /&gt;
 Inside the function clcsa105CompCSA105RESProvValidate&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00311 :   INFO)&lt;br /&gt;
 Inside the function clcsa105CompCSA105RESProvUpdate&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00313 :   INFO)&lt;br /&gt;
 Inside the function clcsa105CompCSA105RESProvObjectEnd&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00322 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnEnd] ****&lt;br /&gt;
Mon Jul 14 20:21:19 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00329 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 1)&lt;br /&gt;
Mon Jul 14 20:21:20 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00330 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 2)&lt;br /&gt;
Mon Jul 14 20:21:21 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00331 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 3)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
You will notice that the '''csa105CompI0''' component has begun printing out the 'Hello World'. You can also see that the counter value is incrementing.&lt;br /&gt;
&lt;br /&gt;
Keep watching the counter value as it increments. Remember that we set up an initial counter threshold of 65. Once the counter value reaches 65 you will see the following in the &amp;lt;code&amp;gt;/root/asp/var/log/csa105AlmLstnerCompLog.latest&amp;lt;/code&amp;gt; log file.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/cscsa105AlmLstnerCompLog.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
__________________________________________________________________________________&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00109 :   INFO)&lt;br /&gt;
 The alarm is [RAISED]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00110 :   INFO)&lt;br /&gt;
 The alarm Raised on the resource [\Chassis:0\csa105Res:0]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00111 :   INFO)&lt;br /&gt;
 Component which has raised the alarm  is [csa105CompI1]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00112 :   INFO)&lt;br /&gt;
 Probable cause of the alarm is [16]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00113 :   INFO)&lt;br /&gt;
 Severity of the alarm is [4]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00114 :   INFO)&lt;br /&gt;
 The payload information : [[csa105CompI0]: The Alarm has been raised as the counter &lt;br /&gt;
became [65] for [1] time]&lt;br /&gt;
__________________________________________________________________________________&lt;br /&gt;
__________________________________________________________________________________&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00134 :   INFO)&lt;br /&gt;
 The alarm is [CLEARED]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00135 :   INFO)&lt;br /&gt;
 The alarm Raised on the resource [\Chassis:0\csa105Res:0]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00136 :   INFO)&lt;br /&gt;
 Component which has raised the alarm  is [csa105CompI1]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00137 :   INFO)&lt;br /&gt;
 Probable cause of the alarm is [16]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00138 :   INFO)&lt;br /&gt;
 Severity of the alarm is [4]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00139 :   INFO)&lt;br /&gt;
 The payload information : [[csa105CompI0]: The Alarm has been raised as the counter&lt;br /&gt;
became [65] for [1] time]&lt;br /&gt;
&lt;br /&gt;
__________________________________________________________________________________&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
As you can see our callback function in the module &amp;lt;code&amp;gt;&amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105AlmLstner/clCompAppMain.c&amp;lt;/code&amp;gt; was called twice. Once when the alarm was raised and once when it was cleared. Looking at the &amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt; log file you can see that the alarm was raised and cleared from this component and then the counter value was reset.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa105CompI0Log.l&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 20:22:22 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00812 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 64)&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00813 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 65)&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00814 :   INFO)&lt;br /&gt;
 [csa105CompI0]: Raising the alarm as the counter threashold has reached.&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00843 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 0)&lt;br /&gt;
Mon Jul 14 20:22:24 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00844 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 1)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This behavior will continue each time the counter value reaches 65.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now lets change the threshold value. We do this through the SAFplus Platform Console. In the SAFplus Platform Console return to the SCNodeI0  context by entering &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; until it prints the SCNodeI0 prompt: &amp;lt;code&amp;gt;cli[Test:SCNodeI0]-&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now set the context to the COR server using the following command:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc corServer_SCNodeI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then, dump the object tree:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objTreeShow&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see something like the following.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objtreeshow&lt;br /&gt;
&lt;br /&gt;
Objects (Instance Tree):&lt;br /&gt;
    \Chassis:0&lt;br /&gt;
        \PayloadNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \PayloadNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa104Res:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa105Res:0&lt;br /&gt;
            (alarm, provisioning)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Next, dump object with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objectShow \Chassis:0\csa105Res:0 PROV&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Showing Object&lt;br /&gt;
ClCorMOId:[Svc: 3] (/).(10001:0000).(10004:0000):&lt;br /&gt;
&lt;br /&gt;
[Class:0x10005] Object &lt;br /&gt;
{&lt;br /&gt;
[CSA105RES_COUNTER             ] [0x0004] = [41]&lt;br /&gt;
[CSA105RES_COUNTER_THRESH      ] [0x0005] = [65]&lt;br /&gt;
[CSA105RES_DELTA_T             ] [0x0006] = [1000]&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt; line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now, set the counter_thresh attribute to 20 instead of 65 with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; attrSet \Chassis:0\csa105Res:0 PROV null 5 -1 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Execution Result : Passed&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Now you will notice that the alarm is raised every time the counter value reaches 20.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;To end this example first get back to the CPM context.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now shut things down in the usual fashion. Remember that this example has two components to shut down.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa105SGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa105AlmLstnerSGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockInstantiation sg csa105SGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockInstantiation sg csa105AlmLstnerSGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; end&lt;br /&gt;
cli[Test]-&amp;gt; bye&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Summary and References===&lt;br /&gt;
&lt;br /&gt;
This application is built upon the csa104 application and presents :&lt;br /&gt;
*how provisioning and alarm libraries work together to achieve a simple software alarm management&lt;br /&gt;
*how COR change notification is utilized&lt;/div&gt;</summary>
		<author><name>Pradeepac</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/csa105</id>
		<title>Doc:latest/evalguide/csa105</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/csa105"/>
				<updated>2010-08-28T15:02:05Z</updated>
		
		<summary type="html">&lt;p&gt;Pradeepac: /* How to Run csa105 and What to Observe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==csa105 Software Alarm Management and Provisioning==&lt;br /&gt;
&lt;br /&gt;
===Objective===&lt;br /&gt;
&lt;br /&gt;
The goal of this sample application is to show &lt;br /&gt;
*how provisioning and alarm libraries work together to achieve a simple software alarm management&lt;br /&gt;
*how COR change notification is utilized&lt;br /&gt;
&lt;br /&gt;
===What You Will Learn===&lt;br /&gt;
&lt;br /&gt;
You will learn how the Clovis Object Manager (OM) is used to achieve interactions between the alarm and provisioning libraries.  In addition, two ways to report an alarm is introduced:  COR change notification and fault reporting.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&lt;br /&gt;
The code in csa105 is a bit different than our previous examples. csa105 contains two components instead of one. The first component (csa105Comp) is much like the other examples. It runs within a loop printing out 'Hello World' and with each iteration it increments a counter value. Once this counter value meets or exceeds a defineable threshold, the component raises an alarm. The second component (csa105AlmLstnerComp) registers itself with SAFplus Platform as an alarm subscriber or listener. Once our first component raises the alarm our second component receives notification of this and prints some information out to a log file so that we can see.&lt;br /&gt;
&lt;br /&gt;
There is also a new source file that you will see. This file is '''clcsa105CompalarmMetaStruct.c'''. This file contains definitions for the counter threshold crossing alarm. Everything in this file is generated by the IDE. We will not be customizing it.&lt;br /&gt;
&lt;br /&gt;
The code can be found within the following directories&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105Comp&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105AlmLstner&lt;br /&gt;
&lt;br /&gt;
This example is built on top of the csa104 example. We will only look at the code that has been added for this example. First we will look at the code in &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105Comp.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClUint32T counter_threshold   = 55; // the value determining the counter threshold.&lt;br /&gt;
...&lt;br /&gt;
static ClRcT raise_alarm_on_counter(ClCorMOIdT, ClNameT, ClUint32T);&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
First we define and initialize the counter threshold. This is the value our counter will be compared against to determine if an alarm should be raised.&lt;br /&gt;
&amp;lt;br&amp;gt;Next we declare the function that will be called to raise the alarm.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
clCompAppInitialize():&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
    if (counter_threshold &amp;lt;= counter)&lt;br /&gt;
    {&lt;br /&gt;
        clCorMoIdServiceSet(&amp;amp;moId, CL_COR_SVC_ID_ALARM_MANAGEMENT);&lt;br /&gt;
        if (( rc = raise_alarm_on_counter (moId, appName, counter)) != CL_OK)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Error [0x%x]: Alarm raise has failed. Exiting. &amp;quot;,&lt;br /&gt;
                        appname, rc);&lt;br /&gt;
            counter = 0;&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        counter = 0;&lt;br /&gt;
        continue;&lt;br /&gt;
    }&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The clCompAppInitialize() function is where our main loop runs that prints 'Hello World' and increments our counter. Each time through the loop we will now compare our counter value against the threshold value. If the counter is equal to or greater than this threshold we will call our raise_alarm_on_counter function. We also set the counter back to 0.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
static ClRcT&lt;br /&gt;
raise_alarm_on_counter (ClCorMOIdT moId , ClNameT compName, ClUint32T counter)&lt;br /&gt;
{&lt;br /&gt;
    ClRcT           rc = CL_OK;&lt;br /&gt;
    static ClUint32T       iterator = 0, lastCounter = 0;&lt;br /&gt;
    ClCharT str [80] = {0};&lt;br /&gt;
    ClAlarmInfoT *pAlarmInfo = {0};&lt;br /&gt;
    ClAlarmHandleT alarmHandle = {0};&lt;br /&gt;
    ClUint8T * pBuf = NULL;&lt;br /&gt;
    ClUint32T size = 0;&lt;br /&gt;
    ClAlarmUtilPayLoadListPtrT pPayloadList = NULL;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    if (lastCounter != counter)&lt;br /&gt;
    {&lt;br /&gt;
        lastCounter = counter;&lt;br /&gt;
        iterator = 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    pPayloadList = clHeapAllocate(sizeof(ClAlarmUtilPayLoadListT));&lt;br /&gt;
    if (pPayloadList == NULL)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed to allocate the memory for the alarm payload list.&amp;quot;);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;numPayLoadEnteries = 1;&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload = clHeapAllocate(sizeof(ClAlarmUtilPayLoadT));&lt;br /&gt;
    if (NULL == pPayloadList-&amp;gt;pPayload)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed while allocating payload array.&amp;quot;);&lt;br /&gt;
        clHeapFree(pPayloadList);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].numTlvs = 1;&lt;br /&gt;
    clCorMoIdClone(&amp;amp;moId, &amp;amp;pPayloadList-&amp;gt;pPayload[0].pMoId);&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].pTlv = clHeapAllocate(sizeof(ClAlarmUtilTlvT));&lt;br /&gt;
    if (NULL == pPayloadList-&amp;gt;pPayload[0].pTlv)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed while allocating the pTlv array. &amp;quot;);&lt;br /&gt;
        clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sprintf(str, &amp;quot;[%s]: The Alarm has been raised as the counter became [%d] for [%d] time&amp;quot;, &lt;br /&gt;
            appname, counter, ++iterator);&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].pTlv[0].type = CL_COR_UINT8;&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].pTlv[0].value = clHeapAllocate(strlen(str) + 1);&lt;br /&gt;
    if (NULL == pPayloadList-&amp;gt;pPayload[0].pTlv[0].value)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed while allocating the value for the attribute.&amp;quot;);&lt;br /&gt;
        clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].pTlv[0].length = strlen(str) + 1;&lt;br /&gt;
&lt;br /&gt;
    memset(pPayloadList-&amp;gt;pPayload[0].pTlv[0].value, 0, strlen(str) + 1);&lt;br /&gt;
&lt;br /&gt;
    memcpy(pPayloadList-&amp;gt;pPayload[0].pTlv[0].value, str, strlen(str));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    rc = clAlarmUtilPayloadFlatten(pPayloadList, &amp;amp;size, &amp;amp;pBuf);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]. Failed while getting the flat buffer for the payload. rc[0x%x]&amp;quot;, &lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pAlarmInfo = clHeapAllocate (sizeof(ClAlarmInfoT) + size);&lt;br /&gt;
    if (NULL == pAlarmInfo)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]: Failed to allocate the memory for alarm information. &amp;quot;, appname);&lt;br /&gt;
        clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
        clAlarmUtilPayloadBufFree(pBuf);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pAlarmInfo-&amp;gt;moId = moId;&lt;br /&gt;
    pAlarmInfo-&amp;gt;probCause = CL_ALARM_PROB_CAUSE_THRESHOLD_CROSSED; &lt;br /&gt;
    pAlarmInfo-&amp;gt;severity = CL_ALARM_SEVERITY_WARNING;&lt;br /&gt;
    memcpy (&amp;amp;pAlarmInfo-&amp;gt;compName, &amp;amp;compName, sizeof(ClNameT));&lt;br /&gt;
    pAlarmInfo-&amp;gt;alarmState = CL_ALARM_STATE_ASSERT;&lt;br /&gt;
    pAlarmInfo-&amp;gt;len = size;&lt;br /&gt;
&lt;br /&gt;
    memcpy(pAlarmInfo-&amp;gt;buff, pBuf, pAlarmInfo-&amp;gt;len);&lt;br /&gt;
&lt;br /&gt;
    clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
    clAlarmUtilPayloadBufFree(pBuf);&lt;br /&gt;
&lt;br /&gt;
    clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]: Raising the alarm as the counter threashold has reached. &amp;quot;, appname); &lt;br /&gt;
&lt;br /&gt;
    rc = clAlarmRaise (pAlarmInfo, &amp;amp;alarmHandle);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: The alarm raise has failed. &amp;quot;, appname, rc);&lt;br /&gt;
        clHeapFree(pAlarmInfo);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }  &lt;br /&gt;
&lt;br /&gt;
    pAlarmInfo-&amp;gt;alarmState = CL_ALARM_STATE_CLEAR;&lt;br /&gt;
    rc = clAlarmRaise (pAlarmInfo, &amp;amp;alarmHandle);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: The alarm clear has failed. &amp;quot;, appname, rc);&lt;br /&gt;
        clHeapFree(pAlarmInfo);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    clHeapFree(pAlarmInfo);&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The raise_alarm_on_counter function receives some information when called such as the application name and the counter value. It creates an &amp;lt;code&amp;gt;ClAlarmInfoT&amp;lt;/code&amp;gt; structure and fills it with some useful information. It then calls the &amp;lt;code&amp;gt;clAlarmRaise&amp;lt;/code&amp;gt; api twice. The first call is to raise the alarm and the second call is to clear the alarm. (Notice that the alarm state is set to &amp;lt;code&amp;gt;CL_ALARM_STATE_ASSERT&amp;lt;/code&amp;gt; for the first call and &amp;lt;code&amp;gt;CL_ALARM_STATE_CLEAR&amp;lt;/code&amp;gt; for the second call). The reason for this is that a given alarm is only raised once unless it is cleared. This is to avoid an alarm continually being sent.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa105CompOAMPConfig.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    ClOmClassControlBlockT pAppOmClassTbl[] =&lt;br /&gt;
    {&lt;br /&gt;
        {  &lt;br /&gt;
        CSA105COMP_CSA105RES_ALARM_CLASS_NAME,&lt;br /&gt;
        sizeof(CL_OM_ALARM_CSA105RES_CLASS),&lt;br /&gt;
        CL_OM_ALARM_CLASS_TYPE,&lt;br /&gt;
        clcsa105CompCSA105RESAlarmConstructor, &lt;br /&gt;
        clcsa105CompCSA105RESAlarmDestructor,&lt;br /&gt;
        NULL,&lt;br /&gt;
        CSA105COMP_CSA105RES_ALARM_CLASS_VERSION,&lt;br /&gt;
        0,&lt;br /&gt;
        CL_MAX_OBJ,&lt;br /&gt;
        0,&lt;br /&gt;
        CSA105COMP_CSA105RES_ALARM_MAX_SLOTS,&lt;br /&gt;
        CL_OM_ALARM_CSA105RES_CLASS_TYPE&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        {  &lt;br /&gt;
        CSA105COMP_CSA105RES_PROV_CLASS_NAME,&lt;br /&gt;
        sizeof(CL_OM_PROV_CSA105RES_CLASS),&lt;br /&gt;
        CL_OM_PROV_CLASS_TYPE,&lt;br /&gt;
        clcsa105CompCSA105RESProvConstructor, &lt;br /&gt;
        clcsa105CompCSA105RESProvDestructor,&lt;br /&gt;
        NULL,&lt;br /&gt;
        CSA105COMP_CSA105RES_PROV_CLASS_VERSION,&lt;br /&gt;
        0,&lt;br /&gt;
        CL_MAX_OBJ,&lt;br /&gt;
        0,&lt;br /&gt;
        CSA105COMP_CSA105RES_PROV_MAX_SLOTS,&lt;br /&gt;
        CL_OM_PROV_CSA105RES_CLASS_TYPE&lt;br /&gt;
        },&lt;br /&gt;
    };&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
This OM class table is generated by the IDE in &amp;lt;code&amp;gt;clcsa105CompOAMPConfig.c&amp;lt;/code&amp;gt;.  The definition for &amp;lt;code&amp;gt;ClOmClassControlBlockT&amp;lt;/code&amp;gt; can be found in:&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/SAFplus/components/om/include/clOmApi.h &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa105Compcsa105Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClRcT clcsa105CompCSA105RESProvUpdate(CL_OM_PROV_CLASS* pThis, ClHandleT txnHandle,&lt;br /&gt;
                                      ClProvTxnDataT* pProvTxnData)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
    switch (pProvTxnData-&amp;gt;provCmd)&lt;br /&gt;
    {&lt;br /&gt;
        case CL_COR_OP_CREATE :&lt;br /&gt;
        case CL_COR_OP_CREATE_AND_SET:&lt;br /&gt;
			&lt;br /&gt;
        /*&lt;br /&gt;
         * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
         &lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Inside create request for the object [%s] &amp;quot;, appname, moIdName.value);    &lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---END_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
        case CL_COR_OP_SET:&lt;br /&gt;
	    &lt;br /&gt;
        /*&lt;br /&gt;
         * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
         &lt;br /&gt;
        switch (pProvTxnData-&amp;gt;attrId)&lt;br /&gt;
        {&lt;br /&gt;
            case CSA105RES_DELTA_T:&lt;br /&gt;
                delta_t = *(ClUint32T *)pProvTxnData-&amp;gt;pProvData;&lt;br /&gt;
                clprintf(CL_LOG_SEV_NOTICE,&amp;quot;%s: The delta time is now [%d] &amp;quot;, appname, delta_t);&lt;br /&gt;
                break;&lt;br /&gt;
            case CSA105RES_COUNTER_THRESH:&lt;br /&gt;
                counter_threshold = *(ClUint32T *)pProvTxnData-&amp;gt;pProvData;&lt;br /&gt;
                clprintf(CL_LOG_SEV_NOTICE,&amp;quot;%s: The counter threshold is now [%d] &amp;quot;, appname, counter_threshold);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---END_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
&lt;br /&gt;
        case  CL_COR_OP_DELETE:&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---END_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
        default:&lt;br /&gt;
            clprintf (CL_LOG_SEV_ERROR, &amp;quot;Prov command is not proper&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
This base provisioning class method is generated by The IDE but requires application-specific logic to be filled in.  &amp;lt;code&amp;gt;clcsa105CompCSA105RESProvUpdate()&amp;lt;/code&amp;gt; is called to update an object's attribute. This has changed from our csa104 example as you can now change the counter threshold as well as the delta time.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa105Compcsa105Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClRcT clcsa105CompCSA105RESAlarmConstructor( void *pThis, void *pUsrData, ClUint32T usrDataLen )&lt;br /&gt;
{&lt;br /&gt;
    ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ClRcT clcsa105CompCSA105RESAlarmDestructor ( void *pThis , void  *pUsrData, ClUint32T usrDataLen )&lt;br /&gt;
{&lt;br /&gt;
    ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
There are two new functions that have been added as well. These are a constructor and destructor for the alarm. The definition for &amp;lt;code&amp;gt;clcsa105CompCSA105RESAlarmConstructor&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;clcsa105CompCSA105RESAlarmDestructor&amp;lt;/code&amp;gt; can be found in the file &amp;lt;code&amp;gt;clcsa105CompOAMPConfig.h&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now lets look at the code in &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105AlmLstner.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
....&lt;br /&gt;
ClRcT &lt;br /&gt;
alarm_event_subscribe_callback(const ClAlarmHandleInfoT* pAlarmInfo);&lt;br /&gt;
...&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Near the top of the module we declare the function that will be used to subscribe to alarm events.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClRcT&lt;br /&gt;
clCompAppAMFCSISet(&lt;br /&gt;
    ClInvocationT       invocation,&lt;br /&gt;
    const ClNameT       *compName,&lt;br /&gt;
    ClAmsHAStateT       haState,&lt;br /&gt;
    ClAmsCSIDescriptorT csiDescriptor)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    switch ( haState )&lt;br /&gt;
    {&lt;br /&gt;
        case CL_AMS_HA_STATE_ACTIVE:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to take the active HA state &lt;br /&gt;
             * for the CSI.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            // ...&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            clCpmResponse(cpmHandle, invocation, CL_OK);&lt;br /&gt;
            &lt;br /&gt;
            rc = clAlarmEventSubscribe(&amp;amp;alarm_event_subscribe_callback);&lt;br /&gt;
            if (CL_OK != rc)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed while subscribing for the alarm events. rc[0x%x]&amp;quot;,&lt;br /&gt;
                                                        appname, rc);&lt;br /&gt;
                return rc;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        case CL_AMS_HA_STATE_STANDBY:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to take the standby HA state &lt;br /&gt;
             * for this CSI.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            // ...&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            clCpmResponse(cpmHandle, invocation, CL_OK);&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        case CL_AMS_HA_STATE_QUIESCED:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to quiesce the CSI currently&lt;br /&gt;
             * assigned the active or quiescing HA state. The application &lt;br /&gt;
             * must stop work associated with the CSI immediately.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            // ...&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            clCpmResponse(cpmHandle, invocation, CL_OK);&lt;br /&gt;
&lt;br /&gt;
            rc = clAlarmEventUnsubscribe();&lt;br /&gt;
            if (CL_OK != rc)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed while un-subscribing for the alarm evnets. rc[0x%x] &amp;quot;,  &lt;br /&gt;
                                                                appname, rc);&lt;br /&gt;
                return rc;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        case CL_AMS_HA_STATE_QUIESCING:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to quiesce the CSI currently&lt;br /&gt;
             * assigned the active HA state. The application must stop work&lt;br /&gt;
             * associated with the CSI gracefully and not accept any new&lt;br /&gt;
             * workloads while the work is being terminated.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            // ...&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            clCpmCSIQuiescingComplete(cpmHandle, invocation, CL_OK);&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        default:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * Should never happen. Ignore.&lt;br /&gt;
             */&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;clCompAppAMFCSISet&amp;lt;/code&amp;gt; function is called when the state of the CSI is set. Here we call the &amp;lt;code&amp;gt;clAlarmEventSubscribe&amp;lt;/code&amp;gt; api (passing it a handle to our callback function) when the CSI becomes active. When the CSI becomes innactive we call the &amp;lt;code&amp;gt;clAlarmEventUnsubscribe&amp;lt;/code&amp;gt; api.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClRcT &lt;br /&gt;
alarm_event_subscribe_callback(const ClAlarmHandleInfoT* pAlarmInfo)&lt;br /&gt;
{&lt;br /&gt;
    ClRcT   rc = CL_OK;&lt;br /&gt;
    ClNameT moIdName = {0};&lt;br /&gt;
    ClCorMOIdT  moId = pAlarmInfo-&amp;gt;alarmInfo.moId;&lt;br /&gt;
    ClAlarmUtilPayLoadListPtrT pPayloadList = NULL;&lt;br /&gt;
&lt;br /&gt;
    rc = clCorMoIdToMoIdNameGet(&amp;amp;moId, &amp;amp;moIdName);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]:Failed while getting the moId from MOId Name. rc[0x%x] &amp;quot;, &lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    rc = clAlarmUtilPayLoadExtract((ClUint8T *)pAlarmInfo-&amp;gt;alarmInfo.buff, &lt;br /&gt;
            pAlarmInfo-&amp;gt;alarmInfo.len, &amp;amp;pPayloadList);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]: Failed while extracting the payload information. rc[0x%x] &amp;quot;, &lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;______________________________________________________&amp;quot;);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;The alarm is [%s] &amp;quot;, pAlarmInfo-&amp;gt;alarmInfo.alarmState ?&amp;quot;RAISED&amp;quot;:&amp;quot;CLEARED&amp;quot;);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;The alarm Raised on the resource [%s]  &amp;quot;, moIdName.value);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;Component which has raised the alarm  is [%s] &amp;quot;, pAlarmInfo-&amp;gt;alarmInfo.compName.value);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;Probable cause of the alarm is [%d] &amp;quot;, pAlarmInfo-&amp;gt;alarmInfo.probCause);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;Severity of the alarm is [%d] &amp;quot;, pAlarmInfo-&amp;gt;alarmInfo.severity);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;The payload information : [%s] &amp;quot;, (char*)pPayloadList-&amp;gt;pPayload[0].pTlv[0].value);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;______________________________________________________&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Finally we the callback function. Since this component has registered itself as an alarm listener when it becomes active, this function will be called when the alarm is raised. The function simply prints out a message displaying some of the data that was loaded into the &amp;lt;code&amp;gt;ClAlarmHandleInfoT&amp;lt;/code&amp;gt; structure when the alarm was raised.&lt;br /&gt;
&lt;br /&gt;
===How to Run csa105 and What to Observe===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Start the application as usual with the SAFplus Platform Console. Since our example has two components we will put them both into a lock assignment state.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 # cd /root/asp/bin&lt;br /&gt;
 # ./asp_console&lt;br /&gt;
&lt;br /&gt;
 cli[Test]-&amp;gt; setc 1&lt;br /&gt;
 cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa105SGI0&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa105AlmLstnerSGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example actually creates three log files...&amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI1Log.latest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/root/asp/var/log/csa105AlmLstnerCompLog.latest&amp;lt;/code&amp;gt;. The only ones that we are interested in are &amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/var/log/csa105AlmLstnerCompLog.latest&amp;lt;/code&amp;gt;. Open up two separate command windows. We will view each of the logs in a separate window. In one window type the command &amp;lt;code&amp;gt;tail -f /root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt;. In the other type the command &amp;lt;code&amp;gt;tail -f /root/asp/var/log/csa105AlmLstnerCompLog.latest&amp;lt;/code&amp;gt;. You should see the following output. (The csa105AlmLstnerComp.log file will not have any output yet.)&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa105CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00135 :   INFO)&lt;br /&gt;
 Component [csa105CompI0] : PID [22201]. Initializing&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00136 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00137 :   INFO)&lt;br /&gt;
    IOC Port                : 0x81&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00138 :   INFO)&lt;br /&gt;
 csa105: instantiated as component instance csa105CompI0.&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00139 :   INFO)&lt;br /&gt;
 csa105CompI0: cpmHandle = 0x1&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00140 :   INFO)&lt;br /&gt;
 csa105CompI0: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00141 :   INFO)&lt;br /&gt;
 csa105CompI0: checkpoint_initialize&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00148 :   INFO)&lt;br /&gt;
 csa105CompI0: Checkpoint service initialized (handle=0x1)&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00150 :   INFO)&lt;br /&gt;
 csa105CompI0: Checkpoint opened (handle=0x2)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now unlock the '''csa105AlmLstnerSGI0''' service group.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsUnlock sg csa105AlmLstnerSGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Next unlock the '''csa105SGI0''' service group.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsUnlock sg csa105SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see the following output in the &amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt; log file.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa105CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00286 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 0)&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00291 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnStart] ****&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00293 :   INFO)&lt;br /&gt;
 Inside the function clcsa105CompCSA105RESProvObjectStart&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00295 :   INFO)&lt;br /&gt;
 Inside the function clcsa105CompCSA105RESProvValidate&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00311 :   INFO)&lt;br /&gt;
 Inside the function clcsa105CompCSA105RESProvUpdate&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00313 :   INFO)&lt;br /&gt;
 Inside the function clcsa105CompCSA105RESProvObjectEnd&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00322 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnEnd] ****&lt;br /&gt;
Mon Jul 14 20:21:19 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00329 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 1)&lt;br /&gt;
Mon Jul 14 20:21:20 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00330 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 2)&lt;br /&gt;
Mon Jul 14 20:21:21 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00331 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 3)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
You will notice that the '''csa105CompI0''' component has begun printing out the 'Hello World'. You can also see that the counter value is incrementing.&lt;br /&gt;
&lt;br /&gt;
Keep watching the counter value as it increments. Remember that we set up an initial counter threshold of 65. Once the counter value reaches 65 you will see the following in the &amp;lt;code&amp;gt;/root/asp/var/log/csa105AlmLstnerCompLog.latest&amp;lt;/code&amp;gt; log file.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/cscsa105AlmLstnerCompLog.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
__________________________________________________________________________________&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00109 :   INFO)&lt;br /&gt;
 The alarm is [RAISED]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00110 :   INFO)&lt;br /&gt;
 The alarm Raised on the resource [\Chassis:0\csa105Res:0]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00111 :   INFO)&lt;br /&gt;
 Component which has raised the alarm  is [csa105CompI1]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00112 :   INFO)&lt;br /&gt;
 Probable cause of the alarm is [16]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00113 :   INFO)&lt;br /&gt;
 Severity of the alarm is [4]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00114 :   INFO)&lt;br /&gt;
 The payload information : [[csa105CompI0]: The Alarm has been raised as the counter &lt;br /&gt;
became [65] for [1] time]&lt;br /&gt;
__________________________________________________________________________________&lt;br /&gt;
__________________________________________________________________________________&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00134 :   INFO)&lt;br /&gt;
 The alarm is [CLEARED]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00135 :   INFO)&lt;br /&gt;
 The alarm Raised on the resource [\Chassis:0\csa105Res:0]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00136 :   INFO)&lt;br /&gt;
 Component which has raised the alarm  is [csa105CompI1]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00137 :   INFO)&lt;br /&gt;
 Probable cause of the alarm is [16]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00138 :   INFO)&lt;br /&gt;
 Severity of the alarm is [4]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00139 :   INFO)&lt;br /&gt;
 The payload information : [[csa105CompI0]: The Alarm has been raised as the counter&lt;br /&gt;
became [65] for [1] time]&lt;br /&gt;
&lt;br /&gt;
__________________________________________________________________________________&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
As you can see our callback function in the module &amp;lt;code&amp;gt;&amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105AlmLstner/clCompAppMain.c&amp;lt;/code&amp;gt; was called twice. Once when the alarm was raised and once when it was cleared. Looking at the &amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt; log file you can see that the alarm was raised and cleared from this component and then the counter value was reset.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa105CompI0Log.l&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 20:22:22 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00812 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 64)&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00813 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 65)&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00814 :   INFO)&lt;br /&gt;
 [csa105CompI0]: Raising the alarm as the counter threashold has reached.&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00843 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 0)&lt;br /&gt;
Mon Jul 14 20:22:24 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00844 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 1)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This behavior will continue each time the counter value reaches 65.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now lets change the threshold value. We do this through the SAFplus Platform Console. In the SAFplus Platform Console return to the SCNodeI0  context by entering &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; until it prints the SCNodeI0 prompt: &amp;lt;code&amp;gt;cli[Test:SCNodeI0]-&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now set the context to the COR server using the following command:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc corServer_SCNodeI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then, dump the object tree:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objTreeShow&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see something like the following.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objtreeshow&lt;br /&gt;
&lt;br /&gt;
Objects (Instance Tree):&lt;br /&gt;
    \Chassis:0&lt;br /&gt;
        \PayloadNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \PayloadNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa104Res:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa105Res:0&lt;br /&gt;
            (alarm, provisioning)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Next, dump object with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objectShow \Chassis:0\csa105Res:0 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Showing Object&lt;br /&gt;
ClCorMOId:[Svc: 3] (/).(10001:0000).(10004:0000):&lt;br /&gt;
&lt;br /&gt;
[Class:0x10005] Object &lt;br /&gt;
{&lt;br /&gt;
[CSA105RES_COUNTER             ] [0x0004] = [41]&lt;br /&gt;
[CSA105RES_COUNTER_THRESH      ] [0x0005] = [65]&lt;br /&gt;
[CSA105RES_DELTA_T             ] [0x0006] = [1000]&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt; line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now, set the counter_thresh attribute to 20 instead of 65 with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; attrSet \Chassis:0\csa105Res:0 PROV null 5 -1 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Execution Result : Passed&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Now you will notice that the alarm is raised every time the counter value reaches 20.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;To end this example first get back to the CPM context.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now shut things down in the usual fashion. Remember that this example has two components to shut down.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa105SGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa105AlmLstnerSGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockInstantiation sg csa105SGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockInstantiation sg csa105AlmLstnerSGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; end&lt;br /&gt;
cli[Test]-&amp;gt; bye&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Summary and References===&lt;br /&gt;
&lt;br /&gt;
This application is built upon the csa104 application and presents :&lt;br /&gt;
*how provisioning and alarm libraries work together to achieve a simple software alarm management&lt;br /&gt;
*how COR change notification is utilized&lt;/div&gt;</summary>
		<author><name>Pradeepac</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/csa105</id>
		<title>Doc:latest/evalguide/csa105</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/csa105"/>
				<updated>2010-08-28T14:55:43Z</updated>
		
		<summary type="html">&lt;p&gt;Pradeepac: /* How to Run csa105 and What to Observe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==csa105 Software Alarm Management and Provisioning==&lt;br /&gt;
&lt;br /&gt;
===Objective===&lt;br /&gt;
&lt;br /&gt;
The goal of this sample application is to show &lt;br /&gt;
*how provisioning and alarm libraries work together to achieve a simple software alarm management&lt;br /&gt;
*how COR change notification is utilized&lt;br /&gt;
&lt;br /&gt;
===What You Will Learn===&lt;br /&gt;
&lt;br /&gt;
You will learn how the Clovis Object Manager (OM) is used to achieve interactions between the alarm and provisioning libraries.  In addition, two ways to report an alarm is introduced:  COR change notification and fault reporting.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&lt;br /&gt;
The code in csa105 is a bit different than our previous examples. csa105 contains two components instead of one. The first component (csa105Comp) is much like the other examples. It runs within a loop printing out 'Hello World' and with each iteration it increments a counter value. Once this counter value meets or exceeds a defineable threshold, the component raises an alarm. The second component (csa105AlmLstnerComp) registers itself with SAFplus Platform as an alarm subscriber or listener. Once our first component raises the alarm our second component receives notification of this and prints some information out to a log file so that we can see.&lt;br /&gt;
&lt;br /&gt;
There is also a new source file that you will see. This file is '''clcsa105CompalarmMetaStruct.c'''. This file contains definitions for the counter threshold crossing alarm. Everything in this file is generated by the IDE. We will not be customizing it.&lt;br /&gt;
&lt;br /&gt;
The code can be found within the following directories&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105Comp&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105AlmLstner&lt;br /&gt;
&lt;br /&gt;
This example is built on top of the csa104 example. We will only look at the code that has been added for this example. First we will look at the code in &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105Comp.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClUint32T counter_threshold   = 55; // the value determining the counter threshold.&lt;br /&gt;
...&lt;br /&gt;
static ClRcT raise_alarm_on_counter(ClCorMOIdT, ClNameT, ClUint32T);&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
First we define and initialize the counter threshold. This is the value our counter will be compared against to determine if an alarm should be raised.&lt;br /&gt;
&amp;lt;br&amp;gt;Next we declare the function that will be called to raise the alarm.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
clCompAppInitialize():&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
    if (counter_threshold &amp;lt;= counter)&lt;br /&gt;
    {&lt;br /&gt;
        clCorMoIdServiceSet(&amp;amp;moId, CL_COR_SVC_ID_ALARM_MANAGEMENT);&lt;br /&gt;
        if (( rc = raise_alarm_on_counter (moId, appName, counter)) != CL_OK)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Error [0x%x]: Alarm raise has failed. Exiting. &amp;quot;,&lt;br /&gt;
                        appname, rc);&lt;br /&gt;
            counter = 0;&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        counter = 0;&lt;br /&gt;
        continue;&lt;br /&gt;
    }&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The clCompAppInitialize() function is where our main loop runs that prints 'Hello World' and increments our counter. Each time through the loop we will now compare our counter value against the threshold value. If the counter is equal to or greater than this threshold we will call our raise_alarm_on_counter function. We also set the counter back to 0.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
static ClRcT&lt;br /&gt;
raise_alarm_on_counter (ClCorMOIdT moId , ClNameT compName, ClUint32T counter)&lt;br /&gt;
{&lt;br /&gt;
    ClRcT           rc = CL_OK;&lt;br /&gt;
    static ClUint32T       iterator = 0, lastCounter = 0;&lt;br /&gt;
    ClCharT str [80] = {0};&lt;br /&gt;
    ClAlarmInfoT *pAlarmInfo = {0};&lt;br /&gt;
    ClAlarmHandleT alarmHandle = {0};&lt;br /&gt;
    ClUint8T * pBuf = NULL;&lt;br /&gt;
    ClUint32T size = 0;&lt;br /&gt;
    ClAlarmUtilPayLoadListPtrT pPayloadList = NULL;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    if (lastCounter != counter)&lt;br /&gt;
    {&lt;br /&gt;
        lastCounter = counter;&lt;br /&gt;
        iterator = 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    pPayloadList = clHeapAllocate(sizeof(ClAlarmUtilPayLoadListT));&lt;br /&gt;
    if (pPayloadList == NULL)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed to allocate the memory for the alarm payload list.&amp;quot;);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;numPayLoadEnteries = 1;&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload = clHeapAllocate(sizeof(ClAlarmUtilPayLoadT));&lt;br /&gt;
    if (NULL == pPayloadList-&amp;gt;pPayload)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed while allocating payload array.&amp;quot;);&lt;br /&gt;
        clHeapFree(pPayloadList);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].numTlvs = 1;&lt;br /&gt;
    clCorMoIdClone(&amp;amp;moId, &amp;amp;pPayloadList-&amp;gt;pPayload[0].pMoId);&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].pTlv = clHeapAllocate(sizeof(ClAlarmUtilTlvT));&lt;br /&gt;
    if (NULL == pPayloadList-&amp;gt;pPayload[0].pTlv)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed while allocating the pTlv array. &amp;quot;);&lt;br /&gt;
        clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sprintf(str, &amp;quot;[%s]: The Alarm has been raised as the counter became [%d] for [%d] time&amp;quot;, &lt;br /&gt;
            appname, counter, ++iterator);&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].pTlv[0].type = CL_COR_UINT8;&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].pTlv[0].value = clHeapAllocate(strlen(str) + 1);&lt;br /&gt;
    if (NULL == pPayloadList-&amp;gt;pPayload[0].pTlv[0].value)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed while allocating the value for the attribute.&amp;quot;);&lt;br /&gt;
        clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].pTlv[0].length = strlen(str) + 1;&lt;br /&gt;
&lt;br /&gt;
    memset(pPayloadList-&amp;gt;pPayload[0].pTlv[0].value, 0, strlen(str) + 1);&lt;br /&gt;
&lt;br /&gt;
    memcpy(pPayloadList-&amp;gt;pPayload[0].pTlv[0].value, str, strlen(str));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    rc = clAlarmUtilPayloadFlatten(pPayloadList, &amp;amp;size, &amp;amp;pBuf);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]. Failed while getting the flat buffer for the payload. rc[0x%x]&amp;quot;, &lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pAlarmInfo = clHeapAllocate (sizeof(ClAlarmInfoT) + size);&lt;br /&gt;
    if (NULL == pAlarmInfo)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]: Failed to allocate the memory for alarm information. &amp;quot;, appname);&lt;br /&gt;
        clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
        clAlarmUtilPayloadBufFree(pBuf);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pAlarmInfo-&amp;gt;moId = moId;&lt;br /&gt;
    pAlarmInfo-&amp;gt;probCause = CL_ALARM_PROB_CAUSE_THRESHOLD_CROSSED; &lt;br /&gt;
    pAlarmInfo-&amp;gt;severity = CL_ALARM_SEVERITY_WARNING;&lt;br /&gt;
    memcpy (&amp;amp;pAlarmInfo-&amp;gt;compName, &amp;amp;compName, sizeof(ClNameT));&lt;br /&gt;
    pAlarmInfo-&amp;gt;alarmState = CL_ALARM_STATE_ASSERT;&lt;br /&gt;
    pAlarmInfo-&amp;gt;len = size;&lt;br /&gt;
&lt;br /&gt;
    memcpy(pAlarmInfo-&amp;gt;buff, pBuf, pAlarmInfo-&amp;gt;len);&lt;br /&gt;
&lt;br /&gt;
    clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
    clAlarmUtilPayloadBufFree(pBuf);&lt;br /&gt;
&lt;br /&gt;
    clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]: Raising the alarm as the counter threashold has reached. &amp;quot;, appname); &lt;br /&gt;
&lt;br /&gt;
    rc = clAlarmRaise (pAlarmInfo, &amp;amp;alarmHandle);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: The alarm raise has failed. &amp;quot;, appname, rc);&lt;br /&gt;
        clHeapFree(pAlarmInfo);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }  &lt;br /&gt;
&lt;br /&gt;
    pAlarmInfo-&amp;gt;alarmState = CL_ALARM_STATE_CLEAR;&lt;br /&gt;
    rc = clAlarmRaise (pAlarmInfo, &amp;amp;alarmHandle);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: The alarm clear has failed. &amp;quot;, appname, rc);&lt;br /&gt;
        clHeapFree(pAlarmInfo);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    clHeapFree(pAlarmInfo);&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The raise_alarm_on_counter function receives some information when called such as the application name and the counter value. It creates an &amp;lt;code&amp;gt;ClAlarmInfoT&amp;lt;/code&amp;gt; structure and fills it with some useful information. It then calls the &amp;lt;code&amp;gt;clAlarmRaise&amp;lt;/code&amp;gt; api twice. The first call is to raise the alarm and the second call is to clear the alarm. (Notice that the alarm state is set to &amp;lt;code&amp;gt;CL_ALARM_STATE_ASSERT&amp;lt;/code&amp;gt; for the first call and &amp;lt;code&amp;gt;CL_ALARM_STATE_CLEAR&amp;lt;/code&amp;gt; for the second call). The reason for this is that a given alarm is only raised once unless it is cleared. This is to avoid an alarm continually being sent.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa105CompOAMPConfig.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    ClOmClassControlBlockT pAppOmClassTbl[] =&lt;br /&gt;
    {&lt;br /&gt;
        {  &lt;br /&gt;
        CSA105COMP_CSA105RES_ALARM_CLASS_NAME,&lt;br /&gt;
        sizeof(CL_OM_ALARM_CSA105RES_CLASS),&lt;br /&gt;
        CL_OM_ALARM_CLASS_TYPE,&lt;br /&gt;
        clcsa105CompCSA105RESAlarmConstructor, &lt;br /&gt;
        clcsa105CompCSA105RESAlarmDestructor,&lt;br /&gt;
        NULL,&lt;br /&gt;
        CSA105COMP_CSA105RES_ALARM_CLASS_VERSION,&lt;br /&gt;
        0,&lt;br /&gt;
        CL_MAX_OBJ,&lt;br /&gt;
        0,&lt;br /&gt;
        CSA105COMP_CSA105RES_ALARM_MAX_SLOTS,&lt;br /&gt;
        CL_OM_ALARM_CSA105RES_CLASS_TYPE&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        {  &lt;br /&gt;
        CSA105COMP_CSA105RES_PROV_CLASS_NAME,&lt;br /&gt;
        sizeof(CL_OM_PROV_CSA105RES_CLASS),&lt;br /&gt;
        CL_OM_PROV_CLASS_TYPE,&lt;br /&gt;
        clcsa105CompCSA105RESProvConstructor, &lt;br /&gt;
        clcsa105CompCSA105RESProvDestructor,&lt;br /&gt;
        NULL,&lt;br /&gt;
        CSA105COMP_CSA105RES_PROV_CLASS_VERSION,&lt;br /&gt;
        0,&lt;br /&gt;
        CL_MAX_OBJ,&lt;br /&gt;
        0,&lt;br /&gt;
        CSA105COMP_CSA105RES_PROV_MAX_SLOTS,&lt;br /&gt;
        CL_OM_PROV_CSA105RES_CLASS_TYPE&lt;br /&gt;
        },&lt;br /&gt;
    };&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
This OM class table is generated by the IDE in &amp;lt;code&amp;gt;clcsa105CompOAMPConfig.c&amp;lt;/code&amp;gt;.  The definition for &amp;lt;code&amp;gt;ClOmClassControlBlockT&amp;lt;/code&amp;gt; can be found in:&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/SAFplus/components/om/include/clOmApi.h &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa105Compcsa105Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClRcT clcsa105CompCSA105RESProvUpdate(CL_OM_PROV_CLASS* pThis, ClHandleT txnHandle,&lt;br /&gt;
                                      ClProvTxnDataT* pProvTxnData)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
    switch (pProvTxnData-&amp;gt;provCmd)&lt;br /&gt;
    {&lt;br /&gt;
        case CL_COR_OP_CREATE :&lt;br /&gt;
        case CL_COR_OP_CREATE_AND_SET:&lt;br /&gt;
			&lt;br /&gt;
        /*&lt;br /&gt;
         * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
         &lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Inside create request for the object [%s] &amp;quot;, appname, moIdName.value);    &lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---END_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
        case CL_COR_OP_SET:&lt;br /&gt;
	    &lt;br /&gt;
        /*&lt;br /&gt;
         * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
         &lt;br /&gt;
        switch (pProvTxnData-&amp;gt;attrId)&lt;br /&gt;
        {&lt;br /&gt;
            case CSA105RES_DELTA_T:&lt;br /&gt;
                delta_t = *(ClUint32T *)pProvTxnData-&amp;gt;pProvData;&lt;br /&gt;
                clprintf(CL_LOG_SEV_NOTICE,&amp;quot;%s: The delta time is now [%d] &amp;quot;, appname, delta_t);&lt;br /&gt;
                break;&lt;br /&gt;
            case CSA105RES_COUNTER_THRESH:&lt;br /&gt;
                counter_threshold = *(ClUint32T *)pProvTxnData-&amp;gt;pProvData;&lt;br /&gt;
                clprintf(CL_LOG_SEV_NOTICE,&amp;quot;%s: The counter threshold is now [%d] &amp;quot;, appname, counter_threshold);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---END_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
&lt;br /&gt;
        case  CL_COR_OP_DELETE:&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---END_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
        default:&lt;br /&gt;
            clprintf (CL_LOG_SEV_ERROR, &amp;quot;Prov command is not proper&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
This base provisioning class method is generated by The IDE but requires application-specific logic to be filled in.  &amp;lt;code&amp;gt;clcsa105CompCSA105RESProvUpdate()&amp;lt;/code&amp;gt; is called to update an object's attribute. This has changed from our csa104 example as you can now change the counter threshold as well as the delta time.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa105Compcsa105Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClRcT clcsa105CompCSA105RESAlarmConstructor( void *pThis, void *pUsrData, ClUint32T usrDataLen )&lt;br /&gt;
{&lt;br /&gt;
    ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ClRcT clcsa105CompCSA105RESAlarmDestructor ( void *pThis , void  *pUsrData, ClUint32T usrDataLen )&lt;br /&gt;
{&lt;br /&gt;
    ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
There are two new functions that have been added as well. These are a constructor and destructor for the alarm. The definition for &amp;lt;code&amp;gt;clcsa105CompCSA105RESAlarmConstructor&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;clcsa105CompCSA105RESAlarmDestructor&amp;lt;/code&amp;gt; can be found in the file &amp;lt;code&amp;gt;clcsa105CompOAMPConfig.h&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now lets look at the code in &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105AlmLstner.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
....&lt;br /&gt;
ClRcT &lt;br /&gt;
alarm_event_subscribe_callback(const ClAlarmHandleInfoT* pAlarmInfo);&lt;br /&gt;
...&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Near the top of the module we declare the function that will be used to subscribe to alarm events.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClRcT&lt;br /&gt;
clCompAppAMFCSISet(&lt;br /&gt;
    ClInvocationT       invocation,&lt;br /&gt;
    const ClNameT       *compName,&lt;br /&gt;
    ClAmsHAStateT       haState,&lt;br /&gt;
    ClAmsCSIDescriptorT csiDescriptor)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    switch ( haState )&lt;br /&gt;
    {&lt;br /&gt;
        case CL_AMS_HA_STATE_ACTIVE:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to take the active HA state &lt;br /&gt;
             * for the CSI.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            // ...&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            clCpmResponse(cpmHandle, invocation, CL_OK);&lt;br /&gt;
            &lt;br /&gt;
            rc = clAlarmEventSubscribe(&amp;amp;alarm_event_subscribe_callback);&lt;br /&gt;
            if (CL_OK != rc)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed while subscribing for the alarm events. rc[0x%x]&amp;quot;,&lt;br /&gt;
                                                        appname, rc);&lt;br /&gt;
                return rc;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        case CL_AMS_HA_STATE_STANDBY:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to take the standby HA state &lt;br /&gt;
             * for this CSI.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            // ...&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            clCpmResponse(cpmHandle, invocation, CL_OK);&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        case CL_AMS_HA_STATE_QUIESCED:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to quiesce the CSI currently&lt;br /&gt;
             * assigned the active or quiescing HA state. The application &lt;br /&gt;
             * must stop work associated with the CSI immediately.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            // ...&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            clCpmResponse(cpmHandle, invocation, CL_OK);&lt;br /&gt;
&lt;br /&gt;
            rc = clAlarmEventUnsubscribe();&lt;br /&gt;
            if (CL_OK != rc)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed while un-subscribing for the alarm evnets. rc[0x%x] &amp;quot;,  &lt;br /&gt;
                                                                appname, rc);&lt;br /&gt;
                return rc;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        case CL_AMS_HA_STATE_QUIESCING:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to quiesce the CSI currently&lt;br /&gt;
             * assigned the active HA state. The application must stop work&lt;br /&gt;
             * associated with the CSI gracefully and not accept any new&lt;br /&gt;
             * workloads while the work is being terminated.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            // ...&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            clCpmCSIQuiescingComplete(cpmHandle, invocation, CL_OK);&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        default:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * Should never happen. Ignore.&lt;br /&gt;
             */&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;clCompAppAMFCSISet&amp;lt;/code&amp;gt; function is called when the state of the CSI is set. Here we call the &amp;lt;code&amp;gt;clAlarmEventSubscribe&amp;lt;/code&amp;gt; api (passing it a handle to our callback function) when the CSI becomes active. When the CSI becomes innactive we call the &amp;lt;code&amp;gt;clAlarmEventUnsubscribe&amp;lt;/code&amp;gt; api.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClRcT &lt;br /&gt;
alarm_event_subscribe_callback(const ClAlarmHandleInfoT* pAlarmInfo)&lt;br /&gt;
{&lt;br /&gt;
    ClRcT   rc = CL_OK;&lt;br /&gt;
    ClNameT moIdName = {0};&lt;br /&gt;
    ClCorMOIdT  moId = pAlarmInfo-&amp;gt;alarmInfo.moId;&lt;br /&gt;
    ClAlarmUtilPayLoadListPtrT pPayloadList = NULL;&lt;br /&gt;
&lt;br /&gt;
    rc = clCorMoIdToMoIdNameGet(&amp;amp;moId, &amp;amp;moIdName);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]:Failed while getting the moId from MOId Name. rc[0x%x] &amp;quot;, &lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    rc = clAlarmUtilPayLoadExtract((ClUint8T *)pAlarmInfo-&amp;gt;alarmInfo.buff, &lt;br /&gt;
            pAlarmInfo-&amp;gt;alarmInfo.len, &amp;amp;pPayloadList);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]: Failed while extracting the payload information. rc[0x%x] &amp;quot;, &lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;______________________________________________________&amp;quot;);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;The alarm is [%s] &amp;quot;, pAlarmInfo-&amp;gt;alarmInfo.alarmState ?&amp;quot;RAISED&amp;quot;:&amp;quot;CLEARED&amp;quot;);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;The alarm Raised on the resource [%s]  &amp;quot;, moIdName.value);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;Component which has raised the alarm  is [%s] &amp;quot;, pAlarmInfo-&amp;gt;alarmInfo.compName.value);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;Probable cause of the alarm is [%d] &amp;quot;, pAlarmInfo-&amp;gt;alarmInfo.probCause);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;Severity of the alarm is [%d] &amp;quot;, pAlarmInfo-&amp;gt;alarmInfo.severity);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;The payload information : [%s] &amp;quot;, (char*)pPayloadList-&amp;gt;pPayload[0].pTlv[0].value);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;______________________________________________________&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Finally we the callback function. Since this component has registered itself as an alarm listener when it becomes active, this function will be called when the alarm is raised. The function simply prints out a message displaying some of the data that was loaded into the &amp;lt;code&amp;gt;ClAlarmHandleInfoT&amp;lt;/code&amp;gt; structure when the alarm was raised.&lt;br /&gt;
&lt;br /&gt;
===How to Run csa105 and What to Observe===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Start the application as usual with the SAFplus Platform Console. Since our example has two components we will put them both into a lock assignment state.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 # cd /root/asp/bin&lt;br /&gt;
 # ./asp_console&lt;br /&gt;
&lt;br /&gt;
 cli[Test]-&amp;gt; setc 1&lt;br /&gt;
 cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa105SGI0&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa105AlmLstnerSGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example actually creates three log files...&amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI1Log.latest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/root/asp/var/log/csa105AlmLstnerCompLog.latest&amp;lt;/code&amp;gt;. The only ones that we are interested in are &amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/var/log/csa105AlmLstnerCompLog.latest&amp;lt;/code&amp;gt;. Open up two separate command windows. We will view each of the logs in a separate window. In one window type the command &amp;lt;code&amp;gt;tail -f /root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt;. In the other type the command &amp;lt;code&amp;gt;tail -f /root/asp/var/log/csa105AlmLstnerCompLog.latest&amp;lt;/code&amp;gt;. You should see the following output. (The csa105AlmLstnerComp.log file will not have any output yet.)&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa105CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00135 :   INFO)&lt;br /&gt;
 Component [csa105CompI0] : PID [22201]. Initializing&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00136 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00137 :   INFO)&lt;br /&gt;
    IOC Port                : 0x81&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00138 :   INFO)&lt;br /&gt;
 csa105: instantiated as component instance csa105CompI0.&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00139 :   INFO)&lt;br /&gt;
 csa105CompI0: cpmHandle = 0x1&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00140 :   INFO)&lt;br /&gt;
 csa105CompI0: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00141 :   INFO)&lt;br /&gt;
 csa105CompI0: checkpoint_initialize&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00148 :   INFO)&lt;br /&gt;
 csa105CompI0: Checkpoint service initialized (handle=0x1)&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00150 :   INFO)&lt;br /&gt;
 csa105CompI0: Checkpoint opened (handle=0x2)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now unlock the '''csa105AlmLstnerSGI0''' service group.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsUnlock sg csa105AlmLstnerSGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Next unlock the '''csa105SGI0''' service group.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsUnlock sg csa105SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see the following output in the &amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt; log file.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa105CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00286 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 0)&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00291 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnStart] ****&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00293 :   INFO)&lt;br /&gt;
 Inside the function clcsa105CompCSA105RESProvObjectStart&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00295 :   INFO)&lt;br /&gt;
 Inside the function clcsa105CompCSA105RESProvValidate&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00311 :   INFO)&lt;br /&gt;
 Inside the function clcsa105CompCSA105RESProvUpdate&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00313 :   INFO)&lt;br /&gt;
 Inside the function clcsa105CompCSA105RESProvObjectEnd&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00322 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnEnd] ****&lt;br /&gt;
Mon Jul 14 20:21:19 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00329 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 1)&lt;br /&gt;
Mon Jul 14 20:21:20 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00330 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 2)&lt;br /&gt;
Mon Jul 14 20:21:21 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00331 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 3)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
You will notice that the '''csa105CompI0''' component has begun printing out the 'Hello World'. You can also see that the counter value is incrementing.&lt;br /&gt;
&lt;br /&gt;
Keep watching the counter value as it increments. Remember that we set up an initial counter threshold of 65. Once the counter value reaches 65 you will see the following in the &amp;lt;code&amp;gt;/root/asp/var/log/csa105AlmLstnerCompLog.latest&amp;lt;/code&amp;gt; log file.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/cscsa105AlmLstnerCompLog.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
__________________________________________________________________________________&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00109 :   INFO)&lt;br /&gt;
 The alarm is [RAISED]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00110 :   INFO)&lt;br /&gt;
 The alarm Raised on the resource [\Chassis:0\csa105Res:0]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00111 :   INFO)&lt;br /&gt;
 Component which has raised the alarm  is [csa105CompI1]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00112 :   INFO)&lt;br /&gt;
 Probable cause of the alarm is [16]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00113 :   INFO)&lt;br /&gt;
 Severity of the alarm is [4]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00114 :   INFO)&lt;br /&gt;
 The payload information : [[csa105CompI0]: The Alarm has been raised as the counter &lt;br /&gt;
became [65] for [1] time]&lt;br /&gt;
__________________________________________________________________________________&lt;br /&gt;
__________________________________________________________________________________&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00134 :   INFO)&lt;br /&gt;
 The alarm is [CLEARED]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00135 :   INFO)&lt;br /&gt;
 The alarm Raised on the resource [\Chassis:0\csa105Res:0]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00136 :   INFO)&lt;br /&gt;
 Component which has raised the alarm  is [csa105CompI1]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00137 :   INFO)&lt;br /&gt;
 Probable cause of the alarm is [16]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00138 :   INFO)&lt;br /&gt;
 Severity of the alarm is [4]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00139 :   INFO)&lt;br /&gt;
 The payload information : [[csa105CompI0]: The Alarm has been raised as the counter&lt;br /&gt;
became [65] for [1] time]&lt;br /&gt;
&lt;br /&gt;
__________________________________________________________________________________&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
As you can see our callback function in the module &amp;lt;code&amp;gt;&amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105AlmLstner/clCompAppMain.c&amp;lt;/code&amp;gt; was called twice. Once when the alarm was raised and once when it was cleared. Looking at the &amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt; log file you can see that the alarm was raised and cleared from this component and then the counter value was reset.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa105CompI0Log.l&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 20:22:22 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00812 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 64)&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00813 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 65)&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00814 :   INFO)&lt;br /&gt;
 [csa105CompI0]: Raising the alarm as the counter threashold has reached.&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00843 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 0)&lt;br /&gt;
Mon Jul 14 20:22:24 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00844 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 1)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This behavior will continue each time the counter value reaches 65.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now lets change the threshold value. We do this through the SAFplus Platform Console. In the SAFplus Platform Console return to the SCNodeI0  context by entering &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; until it prints the SCNodeI0 prompt: &amp;lt;code&amp;gt;cli[Test:SCNodeI0]-&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now set the context to the COR server using the following command:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc corServer_SCNodeI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then, dump the object tree:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objTreeShow&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see something like the following.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objtreeshow&lt;br /&gt;
&lt;br /&gt;
Objects (Instance Tree):&lt;br /&gt;
    \Chassis:0&lt;br /&gt;
        \PayloadNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \PayloadNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa104Res:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa105Res:0&lt;br /&gt;
            (alarm, provisioning)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Next, dump the &amp;lt;code&amp;gt;CLASS_CSA105RES_PROV_MS&amp;lt;/code&amp;gt; object with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objectShow \Chassis:0\csa105Res:0 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Showing Object&lt;br /&gt;
ClCorMOId:[Svc: 3] (/).(10001:0000).(10004:0000):&lt;br /&gt;
&lt;br /&gt;
[Class:0x10005] Object &lt;br /&gt;
{&lt;br /&gt;
[CSA105RES_COUNTER             ] [0x0004] = [41]&lt;br /&gt;
[CSA105RES_COUNTER_THRESH      ] [0x0005] = [65]&lt;br /&gt;
[CSA105RES_DELTA_T             ] [0x0006] = [1000]&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
The 3 is the service ID of the object and is the value in brackets next to the asterisk on the &amp;lt;code&amp;gt;ClassName=CLASS_CSA105RES_PROV_MSO&amp;lt;/code&amp;gt; line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now, set the counter_thresh attribute to 20 instead of 65 with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; attrSet \Chassis:0\csa105Res:0 3 null 5 -1 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Execution Result : Passed&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Now you will notice that the alarm is raised every time the counter value reaches 20.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;To end this example first get back to the CPM context.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now shut things down in the usual fashion. Remember that this example has two components to shut down.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa105SGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa105AlmLstnerSGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockInstantiation sg csa105SGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockInstantiation sg csa105AlmLstnerSGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; end&lt;br /&gt;
cli[Test]-&amp;gt; bye&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Summary and References===&lt;br /&gt;
&lt;br /&gt;
This application is built upon the csa104 application and presents :&lt;br /&gt;
*how provisioning and alarm libraries work together to achieve a simple software alarm management&lt;br /&gt;
*how COR change notification is utilized&lt;/div&gt;</summary>
		<author><name>Pradeepac</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/csa105</id>
		<title>Doc:latest/evalguide/csa105</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/csa105"/>
				<updated>2010-08-28T14:53:27Z</updated>
		
		<summary type="html">&lt;p&gt;Pradeepac: /* How to Run csa105 and What to Observe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==csa105 Software Alarm Management and Provisioning==&lt;br /&gt;
&lt;br /&gt;
===Objective===&lt;br /&gt;
&lt;br /&gt;
The goal of this sample application is to show &lt;br /&gt;
*how provisioning and alarm libraries work together to achieve a simple software alarm management&lt;br /&gt;
*how COR change notification is utilized&lt;br /&gt;
&lt;br /&gt;
===What You Will Learn===&lt;br /&gt;
&lt;br /&gt;
You will learn how the Clovis Object Manager (OM) is used to achieve interactions between the alarm and provisioning libraries.  In addition, two ways to report an alarm is introduced:  COR change notification and fault reporting.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&lt;br /&gt;
The code in csa105 is a bit different than our previous examples. csa105 contains two components instead of one. The first component (csa105Comp) is much like the other examples. It runs within a loop printing out 'Hello World' and with each iteration it increments a counter value. Once this counter value meets or exceeds a defineable threshold, the component raises an alarm. The second component (csa105AlmLstnerComp) registers itself with SAFplus Platform as an alarm subscriber or listener. Once our first component raises the alarm our second component receives notification of this and prints some information out to a log file so that we can see.&lt;br /&gt;
&lt;br /&gt;
There is also a new source file that you will see. This file is '''clcsa105CompalarmMetaStruct.c'''. This file contains definitions for the counter threshold crossing alarm. Everything in this file is generated by the IDE. We will not be customizing it.&lt;br /&gt;
&lt;br /&gt;
The code can be found within the following directories&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105Comp&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105AlmLstner&lt;br /&gt;
&lt;br /&gt;
This example is built on top of the csa104 example. We will only look at the code that has been added for this example. First we will look at the code in &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105Comp.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClUint32T counter_threshold   = 55; // the value determining the counter threshold.&lt;br /&gt;
...&lt;br /&gt;
static ClRcT raise_alarm_on_counter(ClCorMOIdT, ClNameT, ClUint32T);&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
First we define and initialize the counter threshold. This is the value our counter will be compared against to determine if an alarm should be raised.&lt;br /&gt;
&amp;lt;br&amp;gt;Next we declare the function that will be called to raise the alarm.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
clCompAppInitialize():&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
    if (counter_threshold &amp;lt;= counter)&lt;br /&gt;
    {&lt;br /&gt;
        clCorMoIdServiceSet(&amp;amp;moId, CL_COR_SVC_ID_ALARM_MANAGEMENT);&lt;br /&gt;
        if (( rc = raise_alarm_on_counter (moId, appName, counter)) != CL_OK)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Error [0x%x]: Alarm raise has failed. Exiting. &amp;quot;,&lt;br /&gt;
                        appname, rc);&lt;br /&gt;
            counter = 0;&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        counter = 0;&lt;br /&gt;
        continue;&lt;br /&gt;
    }&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The clCompAppInitialize() function is where our main loop runs that prints 'Hello World' and increments our counter. Each time through the loop we will now compare our counter value against the threshold value. If the counter is equal to or greater than this threshold we will call our raise_alarm_on_counter function. We also set the counter back to 0.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
static ClRcT&lt;br /&gt;
raise_alarm_on_counter (ClCorMOIdT moId , ClNameT compName, ClUint32T counter)&lt;br /&gt;
{&lt;br /&gt;
    ClRcT           rc = CL_OK;&lt;br /&gt;
    static ClUint32T       iterator = 0, lastCounter = 0;&lt;br /&gt;
    ClCharT str [80] = {0};&lt;br /&gt;
    ClAlarmInfoT *pAlarmInfo = {0};&lt;br /&gt;
    ClAlarmHandleT alarmHandle = {0};&lt;br /&gt;
    ClUint8T * pBuf = NULL;&lt;br /&gt;
    ClUint32T size = 0;&lt;br /&gt;
    ClAlarmUtilPayLoadListPtrT pPayloadList = NULL;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    if (lastCounter != counter)&lt;br /&gt;
    {&lt;br /&gt;
        lastCounter = counter;&lt;br /&gt;
        iterator = 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    pPayloadList = clHeapAllocate(sizeof(ClAlarmUtilPayLoadListT));&lt;br /&gt;
    if (pPayloadList == NULL)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed to allocate the memory for the alarm payload list.&amp;quot;);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;numPayLoadEnteries = 1;&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload = clHeapAllocate(sizeof(ClAlarmUtilPayLoadT));&lt;br /&gt;
    if (NULL == pPayloadList-&amp;gt;pPayload)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed while allocating payload array.&amp;quot;);&lt;br /&gt;
        clHeapFree(pPayloadList);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].numTlvs = 1;&lt;br /&gt;
    clCorMoIdClone(&amp;amp;moId, &amp;amp;pPayloadList-&amp;gt;pPayload[0].pMoId);&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].pTlv = clHeapAllocate(sizeof(ClAlarmUtilTlvT));&lt;br /&gt;
    if (NULL == pPayloadList-&amp;gt;pPayload[0].pTlv)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed while allocating the pTlv array. &amp;quot;);&lt;br /&gt;
        clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sprintf(str, &amp;quot;[%s]: The Alarm has been raised as the counter became [%d] for [%d] time&amp;quot;, &lt;br /&gt;
            appname, counter, ++iterator);&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].pTlv[0].type = CL_COR_UINT8;&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].pTlv[0].value = clHeapAllocate(strlen(str) + 1);&lt;br /&gt;
    if (NULL == pPayloadList-&amp;gt;pPayload[0].pTlv[0].value)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed while allocating the value for the attribute.&amp;quot;);&lt;br /&gt;
        clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    pPayloadList-&amp;gt;pPayload[0].pTlv[0].length = strlen(str) + 1;&lt;br /&gt;
&lt;br /&gt;
    memset(pPayloadList-&amp;gt;pPayload[0].pTlv[0].value, 0, strlen(str) + 1);&lt;br /&gt;
&lt;br /&gt;
    memcpy(pPayloadList-&amp;gt;pPayload[0].pTlv[0].value, str, strlen(str));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    rc = clAlarmUtilPayloadFlatten(pPayloadList, &amp;amp;size, &amp;amp;pBuf);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]. Failed while getting the flat buffer for the payload. rc[0x%x]&amp;quot;, &lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pAlarmInfo = clHeapAllocate (sizeof(ClAlarmInfoT) + size);&lt;br /&gt;
    if (NULL == pAlarmInfo)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]: Failed to allocate the memory for alarm information. &amp;quot;, appname);&lt;br /&gt;
        clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
        clAlarmUtilPayloadBufFree(pBuf);&lt;br /&gt;
        return CL_ERR_NO_MEMORY;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    pAlarmInfo-&amp;gt;moId = moId;&lt;br /&gt;
    pAlarmInfo-&amp;gt;probCause = CL_ALARM_PROB_CAUSE_THRESHOLD_CROSSED; &lt;br /&gt;
    pAlarmInfo-&amp;gt;severity = CL_ALARM_SEVERITY_WARNING;&lt;br /&gt;
    memcpy (&amp;amp;pAlarmInfo-&amp;gt;compName, &amp;amp;compName, sizeof(ClNameT));&lt;br /&gt;
    pAlarmInfo-&amp;gt;alarmState = CL_ALARM_STATE_ASSERT;&lt;br /&gt;
    pAlarmInfo-&amp;gt;len = size;&lt;br /&gt;
&lt;br /&gt;
    memcpy(pAlarmInfo-&amp;gt;buff, pBuf, pAlarmInfo-&amp;gt;len);&lt;br /&gt;
&lt;br /&gt;
    clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
    clAlarmUtilPayloadBufFree(pBuf);&lt;br /&gt;
&lt;br /&gt;
    clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]: Raising the alarm as the counter threashold has reached. &amp;quot;, appname); &lt;br /&gt;
&lt;br /&gt;
    rc = clAlarmRaise (pAlarmInfo, &amp;amp;alarmHandle);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: The alarm raise has failed. &amp;quot;, appname, rc);&lt;br /&gt;
        clHeapFree(pAlarmInfo);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }  &lt;br /&gt;
&lt;br /&gt;
    pAlarmInfo-&amp;gt;alarmState = CL_ALARM_STATE_CLEAR;&lt;br /&gt;
    rc = clAlarmRaise (pAlarmInfo, &amp;amp;alarmHandle);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: The alarm clear has failed. &amp;quot;, appname, rc);&lt;br /&gt;
        clHeapFree(pAlarmInfo);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    clHeapFree(pAlarmInfo);&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The raise_alarm_on_counter function receives some information when called such as the application name and the counter value. It creates an &amp;lt;code&amp;gt;ClAlarmInfoT&amp;lt;/code&amp;gt; structure and fills it with some useful information. It then calls the &amp;lt;code&amp;gt;clAlarmRaise&amp;lt;/code&amp;gt; api twice. The first call is to raise the alarm and the second call is to clear the alarm. (Notice that the alarm state is set to &amp;lt;code&amp;gt;CL_ALARM_STATE_ASSERT&amp;lt;/code&amp;gt; for the first call and &amp;lt;code&amp;gt;CL_ALARM_STATE_CLEAR&amp;lt;/code&amp;gt; for the second call). The reason for this is that a given alarm is only raised once unless it is cleared. This is to avoid an alarm continually being sent.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa105CompOAMPConfig.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    ClOmClassControlBlockT pAppOmClassTbl[] =&lt;br /&gt;
    {&lt;br /&gt;
        {  &lt;br /&gt;
        CSA105COMP_CSA105RES_ALARM_CLASS_NAME,&lt;br /&gt;
        sizeof(CL_OM_ALARM_CSA105RES_CLASS),&lt;br /&gt;
        CL_OM_ALARM_CLASS_TYPE,&lt;br /&gt;
        clcsa105CompCSA105RESAlarmConstructor, &lt;br /&gt;
        clcsa105CompCSA105RESAlarmDestructor,&lt;br /&gt;
        NULL,&lt;br /&gt;
        CSA105COMP_CSA105RES_ALARM_CLASS_VERSION,&lt;br /&gt;
        0,&lt;br /&gt;
        CL_MAX_OBJ,&lt;br /&gt;
        0,&lt;br /&gt;
        CSA105COMP_CSA105RES_ALARM_MAX_SLOTS,&lt;br /&gt;
        CL_OM_ALARM_CSA105RES_CLASS_TYPE&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        {  &lt;br /&gt;
        CSA105COMP_CSA105RES_PROV_CLASS_NAME,&lt;br /&gt;
        sizeof(CL_OM_PROV_CSA105RES_CLASS),&lt;br /&gt;
        CL_OM_PROV_CLASS_TYPE,&lt;br /&gt;
        clcsa105CompCSA105RESProvConstructor, &lt;br /&gt;
        clcsa105CompCSA105RESProvDestructor,&lt;br /&gt;
        NULL,&lt;br /&gt;
        CSA105COMP_CSA105RES_PROV_CLASS_VERSION,&lt;br /&gt;
        0,&lt;br /&gt;
        CL_MAX_OBJ,&lt;br /&gt;
        0,&lt;br /&gt;
        CSA105COMP_CSA105RES_PROV_MAX_SLOTS,&lt;br /&gt;
        CL_OM_PROV_CSA105RES_CLASS_TYPE&lt;br /&gt;
        },&lt;br /&gt;
    };&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
This OM class table is generated by the IDE in &amp;lt;code&amp;gt;clcsa105CompOAMPConfig.c&amp;lt;/code&amp;gt;.  The definition for &amp;lt;code&amp;gt;ClOmClassControlBlockT&amp;lt;/code&amp;gt; can be found in:&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/SAFplus/components/om/include/clOmApi.h &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa105Compcsa105Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClRcT clcsa105CompCSA105RESProvUpdate(CL_OM_PROV_CLASS* pThis, ClHandleT txnHandle,&lt;br /&gt;
                                      ClProvTxnDataT* pProvTxnData)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
    switch (pProvTxnData-&amp;gt;provCmd)&lt;br /&gt;
    {&lt;br /&gt;
        case CL_COR_OP_CREATE :&lt;br /&gt;
        case CL_COR_OP_CREATE_AND_SET:&lt;br /&gt;
			&lt;br /&gt;
        /*&lt;br /&gt;
         * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
         &lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Inside create request for the object [%s] &amp;quot;, appname, moIdName.value);    &lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---END_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
        case CL_COR_OP_SET:&lt;br /&gt;
	    &lt;br /&gt;
        /*&lt;br /&gt;
         * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
         &lt;br /&gt;
        switch (pProvTxnData-&amp;gt;attrId)&lt;br /&gt;
        {&lt;br /&gt;
            case CSA105RES_DELTA_T:&lt;br /&gt;
                delta_t = *(ClUint32T *)pProvTxnData-&amp;gt;pProvData;&lt;br /&gt;
                clprintf(CL_LOG_SEV_NOTICE,&amp;quot;%s: The delta time is now [%d] &amp;quot;, appname, delta_t);&lt;br /&gt;
                break;&lt;br /&gt;
            case CSA105RES_COUNTER_THRESH:&lt;br /&gt;
                counter_threshold = *(ClUint32T *)pProvTxnData-&amp;gt;pProvData;&lt;br /&gt;
                clprintf(CL_LOG_SEV_NOTICE,&amp;quot;%s: The counter threshold is now [%d] &amp;quot;, appname, counter_threshold);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---END_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
&lt;br /&gt;
        case  CL_COR_OP_DELETE:&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---END_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
        default:&lt;br /&gt;
            clprintf (CL_LOG_SEV_ERROR, &amp;quot;Prov command is not proper&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
This base provisioning class method is generated by The IDE but requires application-specific logic to be filled in.  &amp;lt;code&amp;gt;clcsa105CompCSA105RESProvUpdate()&amp;lt;/code&amp;gt; is called to update an object's attribute. This has changed from our csa104 example as you can now change the counter threshold as well as the delta time.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa105Compcsa105Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClRcT clcsa105CompCSA105RESAlarmConstructor( void *pThis, void *pUsrData, ClUint32T usrDataLen )&lt;br /&gt;
{&lt;br /&gt;
    ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ClRcT clcsa105CompCSA105RESAlarmDestructor ( void *pThis , void  *pUsrData, ClUint32T usrDataLen )&lt;br /&gt;
{&lt;br /&gt;
    ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
There are two new functions that have been added as well. These are a constructor and destructor for the alarm. The definition for &amp;lt;code&amp;gt;clcsa105CompCSA105RESAlarmConstructor&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;clcsa105CompCSA105RESAlarmDestructor&amp;lt;/code&amp;gt; can be found in the file &amp;lt;code&amp;gt;clcsa105CompOAMPConfig.h&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now lets look at the code in &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105AlmLstner.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
....&lt;br /&gt;
ClRcT &lt;br /&gt;
alarm_event_subscribe_callback(const ClAlarmHandleInfoT* pAlarmInfo);&lt;br /&gt;
...&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Near the top of the module we declare the function that will be used to subscribe to alarm events.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClRcT&lt;br /&gt;
clCompAppAMFCSISet(&lt;br /&gt;
    ClInvocationT       invocation,&lt;br /&gt;
    const ClNameT       *compName,&lt;br /&gt;
    ClAmsHAStateT       haState,&lt;br /&gt;
    ClAmsCSIDescriptorT csiDescriptor)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    switch ( haState )&lt;br /&gt;
    {&lt;br /&gt;
        case CL_AMS_HA_STATE_ACTIVE:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to take the active HA state &lt;br /&gt;
             * for the CSI.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            // ...&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            clCpmResponse(cpmHandle, invocation, CL_OK);&lt;br /&gt;
            &lt;br /&gt;
            rc = clAlarmEventSubscribe(&amp;amp;alarm_event_subscribe_callback);&lt;br /&gt;
            if (CL_OK != rc)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed while subscribing for the alarm events. rc[0x%x]&amp;quot;,&lt;br /&gt;
                                                        appname, rc);&lt;br /&gt;
                return rc;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        case CL_AMS_HA_STATE_STANDBY:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to take the standby HA state &lt;br /&gt;
             * for this CSI.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            // ...&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            clCpmResponse(cpmHandle, invocation, CL_OK);&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        case CL_AMS_HA_STATE_QUIESCED:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to quiesce the CSI currently&lt;br /&gt;
             * assigned the active or quiescing HA state. The application &lt;br /&gt;
             * must stop work associated with the CSI immediately.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            // ...&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            clCpmResponse(cpmHandle, invocation, CL_OK);&lt;br /&gt;
&lt;br /&gt;
            rc = clAlarmEventUnsubscribe();&lt;br /&gt;
            if (CL_OK != rc)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed while un-subscribing for the alarm evnets. rc[0x%x] &amp;quot;,  &lt;br /&gt;
                                                                appname, rc);&lt;br /&gt;
                return rc;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        case CL_AMS_HA_STATE_QUIESCING:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * AMF has requested application to quiesce the CSI currently&lt;br /&gt;
             * assigned the active HA state. The application must stop work&lt;br /&gt;
             * associated with the CSI gracefully and not accept any new&lt;br /&gt;
             * workloads while the work is being terminated.&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            // ...&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * ---END_APPLICATION_CODE---&lt;br /&gt;
             */&lt;br /&gt;
&lt;br /&gt;
            clCpmCSIQuiescingComplete(cpmHandle, invocation, CL_OK);&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        default:&lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * Should never happen. Ignore.&lt;br /&gt;
             */&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;clCompAppAMFCSISet&amp;lt;/code&amp;gt; function is called when the state of the CSI is set. Here we call the &amp;lt;code&amp;gt;clAlarmEventSubscribe&amp;lt;/code&amp;gt; api (passing it a handle to our callback function) when the CSI becomes active. When the CSI becomes innactive we call the &amp;lt;code&amp;gt;clAlarmEventUnsubscribe&amp;lt;/code&amp;gt; api.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClRcT &lt;br /&gt;
alarm_event_subscribe_callback(const ClAlarmHandleInfoT* pAlarmInfo)&lt;br /&gt;
{&lt;br /&gt;
    ClRcT   rc = CL_OK;&lt;br /&gt;
    ClNameT moIdName = {0};&lt;br /&gt;
    ClCorMOIdT  moId = pAlarmInfo-&amp;gt;alarmInfo.moId;&lt;br /&gt;
    ClAlarmUtilPayLoadListPtrT pPayloadList = NULL;&lt;br /&gt;
&lt;br /&gt;
    rc = clCorMoIdToMoIdNameGet(&amp;amp;moId, &amp;amp;moIdName);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]:Failed while getting the moId from MOId Name. rc[0x%x] &amp;quot;, &lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    rc = clAlarmUtilPayLoadExtract((ClUint8T *)pAlarmInfo-&amp;gt;alarmInfo.buff, &lt;br /&gt;
            pAlarmInfo-&amp;gt;alarmInfo.len, &amp;amp;pPayloadList);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;[%s]: Failed while extracting the payload information. rc[0x%x] &amp;quot;, &lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;______________________________________________________&amp;quot;);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;The alarm is [%s] &amp;quot;, pAlarmInfo-&amp;gt;alarmInfo.alarmState ?&amp;quot;RAISED&amp;quot;:&amp;quot;CLEARED&amp;quot;);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;The alarm Raised on the resource [%s]  &amp;quot;, moIdName.value);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;Component which has raised the alarm  is [%s] &amp;quot;, pAlarmInfo-&amp;gt;alarmInfo.compName.value);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;Probable cause of the alarm is [%d] &amp;quot;, pAlarmInfo-&amp;gt;alarmInfo.probCause);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;Severity of the alarm is [%d] &amp;quot;, pAlarmInfo-&amp;gt;alarmInfo.severity);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;The payload information : [%s] &amp;quot;, (char*)pPayloadList-&amp;gt;pPayload[0].pTlv[0].value);&lt;br /&gt;
    clprintf(CL_LOG_SEV_INFO,&amp;quot;______________________________________________________&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    clAlarmUtilPayloadListFree(pPayloadList);&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Finally we the callback function. Since this component has registered itself as an alarm listener when it becomes active, this function will be called when the alarm is raised. The function simply prints out a message displaying some of the data that was loaded into the &amp;lt;code&amp;gt;ClAlarmHandleInfoT&amp;lt;/code&amp;gt; structure when the alarm was raised.&lt;br /&gt;
&lt;br /&gt;
===How to Run csa105 and What to Observe===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Start the application as usual with the SAFplus Platform Console. Since our example has two components we will put them both into a lock assignment state.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 # cd /root/asp/bin&lt;br /&gt;
 # ./asp_console&lt;br /&gt;
&lt;br /&gt;
 cli[Test]-&amp;gt; setc 1&lt;br /&gt;
 cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa105SGI0&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa105AlmLstnerSGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example actually creates three log files...&amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI1Log.latest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/root/asp/var/log/csa105AlmLstnerCompLog.latest&amp;lt;/code&amp;gt;. The only ones that we are interested in are &amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/var/log/csa105AlmLstnerCompLog.latest&amp;lt;/code&amp;gt;. Open up two separate command windows. We will view each of the logs in a separate window. In one window type the command &amp;lt;code&amp;gt;tail -f /root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt;. In the other type the command &amp;lt;code&amp;gt;tail -f /root/asp/var/log/csa105AlmLstnerCompLog.latest&amp;lt;/code&amp;gt;. You should see the following output. (The csa105AlmLstnerComp.log file will not have any output yet.)&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa105CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00135 :   INFO)&lt;br /&gt;
 Component [csa105CompI0] : PID [22201]. Initializing&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00136 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00137 :   INFO)&lt;br /&gt;
    IOC Port                : 0x81&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00138 :   INFO)&lt;br /&gt;
 csa105: instantiated as component instance csa105CompI0.&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00139 :   INFO)&lt;br /&gt;
 csa105CompI0: cpmHandle = 0x1&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00140 :   INFO)&lt;br /&gt;
 csa105CompI0: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00141 :   INFO)&lt;br /&gt;
 csa105CompI0: checkpoint_initialize&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00148 :   INFO)&lt;br /&gt;
 csa105CompI0: Checkpoint service initialized (handle=0x1)&lt;br /&gt;
Mon Jul 14 20:15:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00150 :   INFO)&lt;br /&gt;
 csa105CompI0: Checkpoint opened (handle=0x2)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now unlock the '''csa105AlmLstnerSGI0''' service group.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsUnlock sg csa105AlmLstnerSGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Next unlock the '''csa105SGI0''' service group.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsUnlock sg csa105SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see the following output in the &amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt; log file.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa105CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00286 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 0)&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00291 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnStart] ****&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00293 :   INFO)&lt;br /&gt;
 Inside the function clcsa105CompCSA105RESProvObjectStart&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00295 :   INFO)&lt;br /&gt;
 Inside the function clcsa105CompCSA105RESProvValidate&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00311 :   INFO)&lt;br /&gt;
 Inside the function clcsa105CompCSA105RESProvUpdate&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00313 :   INFO)&lt;br /&gt;
 Inside the function clcsa105CompCSA105RESProvObjectEnd&lt;br /&gt;
Mon Jul 14 20:21:18 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00322 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnEnd] ****&lt;br /&gt;
Mon Jul 14 20:21:19 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00329 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 1)&lt;br /&gt;
Mon Jul 14 20:21:20 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00330 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 2)&lt;br /&gt;
Mon Jul 14 20:21:21 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00331 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 3)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
You will notice that the '''csa105CompI0''' component has begun printing out the 'Hello World'. You can also see that the counter value is incrementing.&lt;br /&gt;
&lt;br /&gt;
Keep watching the counter value as it increments. Remember that we set up an initial counter threshold of 65. Once the counter value reaches 65 you will see the following in the &amp;lt;code&amp;gt;/root/asp/var/log/csa105AlmLstnerCompLog.latest&amp;lt;/code&amp;gt; log file.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/cscsa105AlmLstnerCompLog.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
__________________________________________________________________________________&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00109 :   INFO)&lt;br /&gt;
 The alarm is [RAISED]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00110 :   INFO)&lt;br /&gt;
 The alarm Raised on the resource [\Chassis:0\csa105Res:0]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00111 :   INFO)&lt;br /&gt;
 Component which has raised the alarm  is [csa105CompI1]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00112 :   INFO)&lt;br /&gt;
 Probable cause of the alarm is [16]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00113 :   INFO)&lt;br /&gt;
 Severity of the alarm is [4]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00114 :   INFO)&lt;br /&gt;
 The payload information : [[csa105CompI0]: The Alarm has been raised as the counter &lt;br /&gt;
became [65] for [1] time]&lt;br /&gt;
__________________________________________________________________________________&lt;br /&gt;
__________________________________________________________________________________&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00134 :   INFO)&lt;br /&gt;
 The alarm is [CLEARED]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00135 :   INFO)&lt;br /&gt;
 The alarm Raised on the resource [\Chassis:0\csa105Res:0]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00136 :   INFO)&lt;br /&gt;
 Component which has raised the alarm  is [csa105CompI1]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00137 :   INFO)&lt;br /&gt;
 Probable cause of the alarm is [16]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00138 :   INFO)&lt;br /&gt;
 Severity of the alarm is [4]&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22234 : csa105AlmLstner_EO.---.---.00139 :   INFO)&lt;br /&gt;
 The payload information : [[csa105CompI0]: The Alarm has been raised as the counter&lt;br /&gt;
became [65] for [1] time]&lt;br /&gt;
&lt;br /&gt;
__________________________________________________________________________________&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
As you can see our callback function in the module &amp;lt;code&amp;gt;&amp;lt;project-area_dir&amp;gt;/eval/src/app/csa105AlmLstner/clCompAppMain.c&amp;lt;/code&amp;gt; was called twice. Once when the alarm was raised and once when it was cleared. Looking at the &amp;lt;code&amp;gt;/root/asp/var/log/csa105CompI0Log.latest&amp;lt;/code&amp;gt; log file you can see that the alarm was raised and cleared from this component and then the counter value was reset.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa105CompI0Log.l&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 20:22:22 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00812 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 64)&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00813 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 65)&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00814 :   INFO)&lt;br /&gt;
 [csa105CompI0]: Raising the alarm as the counter threashold has reached.&lt;br /&gt;
Mon Jul 14 20:22:23 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00843 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 0)&lt;br /&gt;
Mon Jul 14 20:22:24 2008   (SCNodeI0.22201 : csa105Comp_EO.---.---.00844 :   INFO)&lt;br /&gt;
 csa105CompI0: Hello World! (count = 1)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This behavior will continue each time the counter value reaches 65.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now lets change the threshold value. We do this through the SAFplus Platform Console. In the SAFplus Platform Console return to the SCNodeI0  context by entering &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; until it prints the SCNodeI0 prompt: &amp;lt;code&amp;gt;cli[Test:SCNodeI0]-&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now set the context to the COR server using the following command:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc corServer_SCNodeI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then, dump the object tree:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objTreeShow&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see something like the following.  &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objtreeshow&lt;br /&gt;
&lt;br /&gt;
Objects (Instance Tree):&lt;br /&gt;
    \Chassis:0&lt;br /&gt;
        \PayloadNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \PayloadNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa104Res:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa105Res:0&lt;br /&gt;
            (alarm, provisioning)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Next, dump the &amp;lt;code&amp;gt;CLASS_CSA105RES_PROV_MS&amp;lt;/code&amp;gt; object with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objectShow \Chassis:0\csa105Res:0 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Showing Object&lt;br /&gt;
ClCorMOId:[Svc: 3] (/).(10001:0000).(10004:0000):&lt;br /&gt;
&lt;br /&gt;
[Class:0x10005] Object &lt;br /&gt;
{&lt;br /&gt;
[CSA105RES_COUNTER             ] [0x0004] = [41]&lt;br /&gt;
[CSA105RES_COUNTER_THRESH      ] [0x0005] = [65]&lt;br /&gt;
[CSA105RES_DELTA_T             ] [0x0006] = [1000]&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
The 3 is the service ID of the object and is the value in brackets next to the asterisk on the &amp;lt;code&amp;gt;ClassName=CLASS_CSA105RES_PROV_MSO&amp;lt;/code&amp;gt; line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now, set the counter_thresh attribute to 20 instead of 65 with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; attrSet \Chassis:0\csa105Res:0 3 null 5 -1 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Execution Result : Passed&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Now you will notice that the alarm is raised every time the counter value reaches 20.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;To end this example first get back to the CPM context.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now shut things down in the usual fashion. Remember that this example has two components to shut down.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa105SGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa105AlmLstnerSGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockInstantiation sg csa105SGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockInstantiation sg csa105AlmLstnerSGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; end&lt;br /&gt;
cli[Test]-&amp;gt; bye&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Summary and References===&lt;br /&gt;
&lt;br /&gt;
This application is built upon the csa104 application and presents :&lt;br /&gt;
*how provisioning and alarm libraries work together to achieve a simple software alarm management&lt;br /&gt;
*how COR change notification is utilized&lt;/div&gt;</summary>
		<author><name>Pradeepac</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/csa104</id>
		<title>Doc:latest/evalguide/csa104</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/csa104"/>
				<updated>2010-08-28T14:42:55Z</updated>
		
		<summary type="html">&lt;p&gt;Pradeepac: /* How to Run 104 and what to observe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==csa104 Provisioning==&lt;br /&gt;
&lt;br /&gt;
===Objective===&lt;br /&gt;
&lt;br /&gt;
The objective is to demonstrate some of the features of the Clovis Object Registry (COR) and Clovis' Object Management (OM) framework.&lt;br /&gt;
&lt;br /&gt;
===What you will learn===&lt;br /&gt;
&lt;br /&gt;
*How to use the Clovis Object Registry to set configuration values in a simple SAFplus Platform application.&lt;br /&gt;
*How to manipulate COR values from the SAFplus Platform Console line interface.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&lt;br /&gt;
The code can be found within the following directory&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa104Comp&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     ClUint8T clEoClientLibs[] =&lt;br /&gt;
    {&lt;br /&gt;
        COMP_EO_CLIENTLIB_COR,      /* Lib: Common Object Repository            */&lt;br /&gt;
        COMP_EO_CLIENTLIB_CM,       /* Lib: Chassis Management                  */&lt;br /&gt;
        COMP_EO_CLIENTLIB_NAME,     /* Lib: Name Service                        */&lt;br /&gt;
        COMP_EO_CLIENTLIB_LOG,      /* Lib: Log Service                         */&lt;br /&gt;
        COMP_EO_CLIENTLIB_TRACE,    /* Lib: Trace Service                       */&lt;br /&gt;
        COMP_EO_CLIENTLIB_DIAG,     /* Lib: Diagnostics                         */&lt;br /&gt;
        COMP_EO_CLIENTLIB_TXN,      /* Lib: Transaction Management              */&lt;br /&gt;
        CL_FALSE,                   /* NA */&lt;br /&gt;
        COMP_EO_CLIENTLIB_PROV,     /* Lib: Provisioning Management             */&lt;br /&gt;
        COMP_EO_CLIENTLIB_ALARM,    /* Lib: Alarm Management                    */&lt;br /&gt;
        COMP_EO_CLIENTLIB_DEBUG,    /* Lib: Debug Service                       */&lt;br /&gt;
        COMP_EO_CLIENTLIB_GMS       /* Lib: Cluster/Group Membership Service    */&lt;br /&gt;
    };&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Here we present the Client Libraries. These are set within &amp;lt;code&amp;gt;clCompCfg.h&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompCfg.h&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_COR   CL_TRUE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_CM    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_NAME    CL_FALSE        &lt;br /&gt;
    #define COMP_EO_CLIENTLIB_LOG    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_TRACE    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_DIAG    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_TXN    CL_TRUE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_NA    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_PROV    CL_TRUE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_ALARM    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_DEBUG    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_GMS    CL_FALSE&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Within &amp;lt;code&amp;gt;clCompCfg.h&amp;lt;/code&amp;gt; we set Clovis Object Registry  (COR), the Transaction (TXN), and Provisioning (Prov) libraries to &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 ClCompAppInitialize()&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
    clCorMoIdInitialize(&amp;amp;moId);&lt;br /&gt;
    clCorMoIdAppend(&amp;amp;moId, CLASS_CHASSIS_MO, 0);&lt;br /&gt;
    clCorMoIdAppend(&amp;amp;moId, CLASS_CSA104RES_MO, 0);&lt;br /&gt;
    clCorMoIdServiceSet(&amp;amp;moId, CL_COR_SVC_ID_PROVISIONING_MANAGEMENT);&lt;br /&gt;
    rc = clCorObjectHandleGet(&amp;amp;moId, &amp;amp;objH);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed [0x%x] to get the object handle. &amp;quot;,&lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    while (!exiting)&lt;br /&gt;
    {&lt;br /&gt;
        if (running &amp;amp;&amp;amp; ha_state == CL_AMS_HA_STATE_ACTIVE)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: Hello World! (count = %d)&amp;quot;, appname, counter);&lt;br /&gt;
#ifdef CL_INST&lt;br /&gt;
            if ((rc = clDataTapSend(counter)) != CL_OK &amp;amp;&amp;amp; (rc != CL_ERR_INVALID_PARAMETER))&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed [0x%x] to send data tap data&amp;quot;,&lt;br /&gt;
                            appname, rc);&lt;br /&gt;
            }&lt;br /&gt;
#endif&lt;br /&gt;
            if ((rc = update_counter_in_cor(time(0), objH, counter)) != CL_OK)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: cor update failed. Exiting.&amp;quot;,&lt;br /&gt;
                            appname, rc);&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            /* Checkpoint new counter number */&lt;br /&gt;
            rc = checkpoint_write_counter(counter);&lt;br /&gt;
            if (rc != CL_OK)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: Checkpoint write failed. Exiting.&amp;quot;,&lt;br /&gt;
                            appname, rc);&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            counter++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        usleep((useconds_t)delta_t*1000);&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
The main loop body is as we've seen several times already. But, the sleep, rather than being &amp;lt;code&amp;gt;sleep(1)&amp;lt;/code&amp;gt; is a &amp;lt;code&amp;gt;usleep()&amp;lt;/code&amp;gt; of a variable duration.  The duration: &amp;lt;code&amp;gt;delta_t&amp;lt;/code&amp;gt; is a number in milliseconds that is settable from COR.  We'll see where it gets set later.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;string.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
    #include &amp;lt;clDebugApi.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
We  including standard header files, including &amp;lt;code&amp;gt;clDebugApi.h&amp;lt;/code&amp;gt; which allows the application to interact with the SAFplus Platform Console. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|clcsa104CompOAMPConfig.c &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #include &amp;lt;clcsa104CompOAMPConfig.h&amp;gt;&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
Within &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.c&amp;lt;/code&amp;gt; we include &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.h&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|clcsa104CompOAMPConfig.h &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #include &amp;lt;clOmApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clCorApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clProvOmApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clProvApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clAlarmOM.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clHalApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clHalObjectApi.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    typedef ClRcT (*fp) (CL_OM_PROV_CLASS*, ClHandleT,  ClProvTxnDataT*);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    CL_OM_BEGIN_CLASS(CL_OM_PROV_CLASS,  CL_OM_PROV_CSA104RES_CLASS)&lt;br /&gt;
 &lt;br /&gt;
    CL_OM_END&lt;br /&gt;
 &lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvConstructor( void *pThis, void *pUsrData,&lt;br /&gt;
                                                     ClUint32T usrDataLen );&lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvDestructor ( void *pThis , void  *pUsrData,&lt;br /&gt;
                                                     ClUint32T usrDataLen );&lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvValidate(CL_OM_PROV_CLASS* pThis, &lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
 &lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvUpdate(CL_OM_PROV_CLASS* pThis, &lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
 &lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvRollback(CL_OM_PROV_CLASS* pThis,&lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
&lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvRead(CL_OM_PROV_CLASS* pThis,&lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
&lt;br /&gt;
    void clcsa104CompCSA104RESProvObjectStart(ClCorMOIdPtrT pMoId, &lt;br /&gt;
                               ClHandleT txnHandle);&lt;br /&gt;
&lt;br /&gt;
    void clcsa104CompCSA104RESProvObjectEnd(ClCorMOIdPtrT pMoId, &lt;br /&gt;
                               ClHandleT txnHandle);&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Next in &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.h&amp;lt;/code&amp;gt; we have several header files being included. Included is &amp;lt;code&amp;gt;clOmApi.h&amp;lt;/code&amp;gt; which is the main header file for using the Object Management subsystem.  This is Clovis' support for object-oriented like programming in C.  Next &amp;lt;code&amp;gt;clCorApi.h&amp;lt;/code&amp;gt; is the main header for using the Clovis Object Registry.  &amp;lt;code&amp;gt;clProvOmApi.h&amp;lt;/code&amp;gt;  is the main header for the Clovis Provisioning OM class.  We define an Object Management  class: &amp;lt;code&amp;gt;CL_OM_PROV_CSA104RES_CLASS&amp;lt;/code&amp;gt; which inherits from another Object Management class: &amp;lt;code&amp;gt;CL_OM_PROV_CLASS&amp;lt;/code&amp;gt;.  This last class is the class whose API was imported with the &amp;lt;code&amp;gt;#include clProvOmApi.h&amp;lt;/code&amp;gt;.  The subsequent code in the above table declare functions that will be member functions of the new Object Management class: &amp;lt;code&amp;gt;CL_OM_PROV_CSA104_CLASS&amp;lt;/code&amp;gt;. Note that function header comments have been omitted for clarity.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|  clcsa104Compcsa104Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     extern ClUint32T delta_t;&lt;br /&gt;
     extern ClCharT   appname[80];&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Above we define/declare a variable that is used for provisioning. The extern is a reference to a variable defined in clCompAppMain.c.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa104CompOAMPConfig.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     ClOmClassControlBlockT pAppOmClassTbl[] =&lt;br /&gt;
     {&lt;br /&gt;
         {&lt;br /&gt;
          CSA104COMP_CSA104RES_PROV_CLASS_NAME,&lt;br /&gt;
          sizeof(CL_OM_PROV_CSA104RES_CLASS),&lt;br /&gt;
          CL_OM_PROV_CLASS_TYPE,&lt;br /&gt;
          clcsa104CompCSA104RESProvConstructor,&lt;br /&gt;
          clcsa104CompCSA104RESProvDestructor,&lt;br /&gt;
          NULL,&lt;br /&gt;
          CSA104COMP_CSA104RES_PROV_CLASS_VERSION,&lt;br /&gt;
          0,&lt;br /&gt;
          CL_MAX_OBJ,&lt;br /&gt;
          0,&lt;br /&gt;
          CSA104COMP_CSA104RES_PROV_MAX_SLOTS,&lt;br /&gt;
          CL_OM_PROV_CSA104RES_CLASS_TYPE&lt;br /&gt;
     },&lt;br /&gt;
     &lt;br /&gt;
     &lt;br /&gt;
     };&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Within &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.c&amp;lt;/code&amp;gt; we define the global &amp;lt;code&amp;gt;pAppOmClassTbl&amp;lt;/code&amp;gt; so that will know about the new class and be able to instantiate members of the class.  Line 27 specifies the name of the class.  This is optional.  Defined is the size of instances of the class, next we specify the base class, followed by the constructor and destructor for the class respectively. The &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; specifies the table of functions for the class, in this case there is no such table.  &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is the instance table pointer.  The next three lines of code.&lt;br /&gt;
&amp;lt;br&amp;gt;--&amp;gt; &amp;lt;code&amp;gt;CL_MAX_OBJ,&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;--&amp;gt; &amp;lt;code&amp;gt;0,&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;--&amp;gt; &amp;lt;code&amp;gt;CSA104COMP_CSA104RES_PROV_MAX_SLOTS,&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;specify the max number of object instances allowed, current number of object instances, and max number of object instances so far respectively.  Followed by the Class Type ID for the class.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa104Compcsa104Res.c &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     ClRcT clcsa104CompCSA104RESProvConstructor( void *pThis, void *pUsrData,&lt;br /&gt;
                                                 ClUint32T usrDataLen )&lt;br /&gt;
     {&lt;br /&gt;
         ClRcT rc = CL_OK;&lt;br /&gt;
     &lt;br /&gt;
         /* Override &amp;quot;semantic check&amp;quot; virtual method in provClass*/&lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvObjectStart = clcsa104CompCSA104RESProvObjectStart; 	 &lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvValidate = (fp)clcsa104CompCSA104RESProvValidate; 	 &lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvUpdate = (fp)clcsa104CompCSA104RESProvUpdate; 	 &lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvRollback = (fp)clcsa104CompCSA104RESProvRollback;&lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvRead = (fp)clcsa104CompCSA104RESProvRead;&lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvObjectEnd = clcsa104CompCSA104RESProvObjectEnd; &lt;br /&gt;
&lt;br /&gt;
         ...&lt;br /&gt;
&lt;br /&gt;
         return rc;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     ClRcT clcsa104CompCSA104RESProvDestructor ( void *pThis , void  *pUsrData,&lt;br /&gt;
                                                 ClUint32T usrDataLen )&lt;br /&gt;
     {&lt;br /&gt;
         ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
         ...&lt;br /&gt;
&lt;br /&gt;
         return rc;&lt;br /&gt;
     }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
The above table presents the Contructor. It initializes the function pointers defined in the Base Class.  These are the Update method, the provisioning validation method, and the provisioning rollback method.  These are declared in &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.h&amp;lt;/code&amp;gt; in the class definition.  The destructor doesn't do anything except return &amp;lt;code&amp;gt;CL_OK&amp;lt;/code&amp;gt;.  There's no destruction work to do for this class.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|   clcsa104Compcsa104Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 ClRcT clcsa104CompCSA104RESProvUpdate(CL_OM_PROV_CLASS* pThis,&lt;br /&gt;
                            ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData)&lt;br /&gt;
 {&lt;br /&gt;
     ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
     /*&lt;br /&gt;
       ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
     clprintf(CL_LOG_SEV_INFO, &amp;quot;Inside the function %s&amp;quot;, __FUNCTION__);&lt;br /&gt;
&lt;br /&gt;
     ClNameT     moIdName = {0};&lt;br /&gt;
    &lt;br /&gt;
     rc = clCorMoIdToMoIdNameGet((ClCorMOIdPtrT)pProvTxnData-&amp;gt;pMoId, &amp;amp;moIdName);&lt;br /&gt;
     if (CL_OK != rc)&lt;br /&gt;
     {&lt;br /&gt;
         clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed while getting the MOId Name from moid. rc[0x%x] &amp;quot;, appname, rc);&lt;br /&gt;
         return rc;&lt;br /&gt;
     }&lt;br /&gt;
     /*&lt;br /&gt;
       ---END_APPLICATION_CODE---&lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|   clcsa104Compcsa104Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     switch (pProvTxnData-&amp;gt;provCmd)&lt;br /&gt;
     {&lt;br /&gt;
         case CL_COR_OP_CREATE :&lt;br /&gt;
         case CL_COR_OP_CREATE_AND_SET:&lt;br /&gt;
			&lt;br /&gt;
         /*&lt;br /&gt;
          * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: Inside create request for the object [%s] &amp;quot;, appname, moIdName.value);    &lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---END_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         break;&lt;br /&gt;
         case CL_COR_OP_SET:&lt;br /&gt;
	    &lt;br /&gt;
         /*&lt;br /&gt;
          * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         if ( pProvTxnData-&amp;gt;attrId == CSA104RES_DELTA_T)&lt;br /&gt;
         {&lt;br /&gt;
             delta_t = *(ClUint32T *)pProvTxnData-&amp;gt;pProvData;&lt;br /&gt;
             clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: The delta time is now [%d] &amp;quot;, appname, delta_t);&lt;br /&gt;
         }&lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---END_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         break;&lt;br /&gt;
&lt;br /&gt;
         case  CL_COR_OP_DELETE:&lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---END_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         break;&lt;br /&gt;
         default:&lt;br /&gt;
             clprintf (CL_LOG_SEV_ERROR, &amp;quot;Prov command is not proper&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     ...&lt;br /&gt;
&lt;br /&gt;
     return rc;   &lt;br /&gt;
 }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
When the COR object associated with csa104's provisioning is updated, &amp;lt;code&amp;gt;clcsa104CompCSA104RESProvUpdate&amp;lt;/code&amp;gt; function is called. A new value is set for the &amp;lt;code&amp;gt;delta_t&amp;lt;/code&amp;gt; variable that is used to control the sleep interval in the application's main loop.&lt;br /&gt;
&lt;br /&gt;
===How to Run 104 and what to observe===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Start the application as usual with the SAFplus Platform Console.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 # cd /root/asp/bin&lt;br /&gt;
 # ./asp_console&lt;br /&gt;
&lt;br /&gt;
 cli[Test]-&amp;gt; setc 1&lt;br /&gt;
 cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Again, there are two log files to observe &amp;lt;code&amp;gt;/root/asp/var/log/csa104CompI0Log.latest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/var/log/csa104CompI1Log.latest&amp;lt;/code&amp;gt;. After running the above commands you should see the following output in these logs when using &amp;lt;code&amp;gt;tail -f&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00051 :   INFO)&lt;br /&gt;
 Component [csa104CompI0] : PID [21202]. Initializing&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00052 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00053 :   INFO)&lt;br /&gt;
    IOC Port                : 0x80&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00054 :   INFO)&lt;br /&gt;
 csa104: instantiated as component instance csa104CompI0.&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00055 :   INFO)&lt;br /&gt;
 csa104CompI0: cpmHandle = 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00056 :   INFO)&lt;br /&gt;
 csa104CompI0: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00057 :   INFO)&lt;br /&gt;
 csa104CompI0: checkpoint_initialize&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00064 :   INFO)&lt;br /&gt;
 csa104CompI0: Checkpoint service initialized (handle=0x1)&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00066 :   INFO)&lt;br /&gt;
 csa104CompI0: Checkpoint opened (handle=0x2)&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00067 :   INFO)&lt;br /&gt;
 csa104CompI0: Section created&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI1Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00049 :   INFO)&lt;br /&gt;
 Component [csa104CompI1] : PID [21209]. Initializing&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00050 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00051 :   INFO)&lt;br /&gt;
    IOC Port                : 0x81&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00052 :   INFO)&lt;br /&gt;
 csa104: instantiated as component instance csa104CompI1.&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00053 :   INFO)&lt;br /&gt;
 csa104CompI1: cpmHandle = 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00054 :   INFO)&lt;br /&gt;
 csa104CompI1: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00055 :   INFO)&lt;br /&gt;
 csa104CompI1: checkpoint_initialize&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00062 :   INFO)&lt;br /&gt;
 csa104CompI1: Checkpoint service initialized (handle=0x1)&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00064 :   INFO)&lt;br /&gt;
 csa104CompI1: Checkpoint opened (handle=0x2)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;As before, unlock the application with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsUnlock sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the active component log file you should start to see the &amp;quot;Hello World&amp;quot; lines displaying at a rate of about 1 per second.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00080 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 0)&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00085 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnStart] ****&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00087 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvObjectStart&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00089 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvValidate&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00105 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvUpdate&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00107 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvObjectEnd&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00116 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnEnd] ****&lt;br /&gt;
Mon Jul 14 19:07:28 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00123 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 1)&lt;br /&gt;
Mon Jul 14 19:07:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00124 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 2)&lt;br /&gt;
Mon Jul 14 19:07:30 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00125 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 3)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;In the SAFplus Platform Console return to the Slot 1 context by entering &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; until it prints the Slot 1 prompt: &amp;lt;code&amp;gt;cli[Test:SCNodeI0]-&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now set the context to the COR server using the following command:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc corServer_SCNodeI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then, dump the object tree:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objTreeShow&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see something like the following. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objTreeShow&lt;br /&gt;
&lt;br /&gt;
Objects (Instance Tree):&lt;br /&gt;
    \Chassis:0&lt;br /&gt;
        \PayloadNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \PayloadNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa104Res:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa105Res:0&lt;br /&gt;
            (alarm, provisioning)&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Next, dump the object with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objectShow \Chassis:0\csa104Res:0 PROV&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Showing Object&lt;br /&gt;
ClCorMOId:[Svc: 3] (/).(10001:0000).(10002:0000):&lt;br /&gt;
&lt;br /&gt;
[Class:0x10003] Object &lt;br /&gt;
{&lt;br /&gt;
[CSA104RES_COUNTER             ] [0x0002] = [431]&lt;br /&gt;
[CSA104RES_DELTA_T             ] [0x0003] = [1000]&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now, set the delta_t attribute to 10000 instead of 1000 with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; attrSet \Chassis:0\csa104Res:0 PROV null 3 -1 10000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Execution Result : Passed&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
You should see lines like the following in the logs for csa104:&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04230 :   INFO)&lt;br /&gt;
 csa104CompI0: The delta time is now [10000] &lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04232 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvObjectEnd&lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04241 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnEnd] ****&lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04248 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 510)&lt;br /&gt;
Mon Jul 14 19:16:09 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04249 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 511)&lt;br /&gt;
Mon Jul 14 19:16:09 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04254 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnStart] ****&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
indicating that the component has received the updated value of delta_t&lt;br /&gt;
&lt;br /&gt;
You should also notice that the lines in the log are now being printed with a 10 second interval between lines.&lt;br /&gt;
&lt;br /&gt;
To confirm that the value of delta_t was updated you could dump the object with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objectShow \Chassis:0\csa104Res:0 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Showing Object&lt;br /&gt;
ClCorMOId:[Svc: 3] (/).(10001:0000).(10002:0000):&lt;br /&gt;
&lt;br /&gt;
[Class:0x10003] Object &lt;br /&gt;
{&lt;br /&gt;
[CSA104RES_COUNTER             ] [0x0002] = [523]&lt;br /&gt;
[CSA104RES_DELTA_T             ] [0x0003] = [10000]&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;To end the example first change the state of csa104SGI0 to LockAssignment.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then change the state to LockInstantiation.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockInstantiation sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then close the SAFplus Platform Console session.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; end&lt;br /&gt;
cli[Test]-&amp;gt; bye&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Summary and References===&lt;br /&gt;
&lt;br /&gt;
We've seen how to:&lt;br /&gt;
*Create a simple ProvOm class.&lt;br /&gt;
*Use callbacks to the class's update method to update variables in the application at runtime.&lt;br /&gt;
*Use the SAFplus Platform Console to cause the classes update method to  be invoked.&lt;br /&gt;
&lt;br /&gt;
For further reading :&lt;br /&gt;
*Clovis SAFplus Platform User Guide: sections on COR, &lt;br /&gt;
*clProvOmApi.h&lt;br /&gt;
*clOmObjectManage.h&lt;br /&gt;
*clOmApi.h&lt;/div&gt;</summary>
		<author><name>Pradeepac</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/csa104</id>
		<title>Doc:latest/evalguide/csa104</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/csa104"/>
				<updated>2010-08-28T14:39:32Z</updated>
		
		<summary type="html">&lt;p&gt;Pradeepac: /* How to Run 104 and what to observe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==csa104 Provisioning==&lt;br /&gt;
&lt;br /&gt;
===Objective===&lt;br /&gt;
&lt;br /&gt;
The objective is to demonstrate some of the features of the Clovis Object Registry (COR) and Clovis' Object Management (OM) framework.&lt;br /&gt;
&lt;br /&gt;
===What you will learn===&lt;br /&gt;
&lt;br /&gt;
*How to use the Clovis Object Registry to set configuration values in a simple SAFplus Platform application.&lt;br /&gt;
*How to manipulate COR values from the SAFplus Platform Console line interface.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&lt;br /&gt;
The code can be found within the following directory&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa104Comp&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     ClUint8T clEoClientLibs[] =&lt;br /&gt;
    {&lt;br /&gt;
        COMP_EO_CLIENTLIB_COR,      /* Lib: Common Object Repository            */&lt;br /&gt;
        COMP_EO_CLIENTLIB_CM,       /* Lib: Chassis Management                  */&lt;br /&gt;
        COMP_EO_CLIENTLIB_NAME,     /* Lib: Name Service                        */&lt;br /&gt;
        COMP_EO_CLIENTLIB_LOG,      /* Lib: Log Service                         */&lt;br /&gt;
        COMP_EO_CLIENTLIB_TRACE,    /* Lib: Trace Service                       */&lt;br /&gt;
        COMP_EO_CLIENTLIB_DIAG,     /* Lib: Diagnostics                         */&lt;br /&gt;
        COMP_EO_CLIENTLIB_TXN,      /* Lib: Transaction Management              */&lt;br /&gt;
        CL_FALSE,                   /* NA */&lt;br /&gt;
        COMP_EO_CLIENTLIB_PROV,     /* Lib: Provisioning Management             */&lt;br /&gt;
        COMP_EO_CLIENTLIB_ALARM,    /* Lib: Alarm Management                    */&lt;br /&gt;
        COMP_EO_CLIENTLIB_DEBUG,    /* Lib: Debug Service                       */&lt;br /&gt;
        COMP_EO_CLIENTLIB_GMS       /* Lib: Cluster/Group Membership Service    */&lt;br /&gt;
    };&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Here we present the Client Libraries. These are set within &amp;lt;code&amp;gt;clCompCfg.h&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompCfg.h&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_COR   CL_TRUE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_CM    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_NAME    CL_FALSE        &lt;br /&gt;
    #define COMP_EO_CLIENTLIB_LOG    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_TRACE    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_DIAG    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_TXN    CL_TRUE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_NA    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_PROV    CL_TRUE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_ALARM    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_DEBUG    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_GMS    CL_FALSE&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Within &amp;lt;code&amp;gt;clCompCfg.h&amp;lt;/code&amp;gt; we set Clovis Object Registry  (COR), the Transaction (TXN), and Provisioning (Prov) libraries to &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 ClCompAppInitialize()&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
    clCorMoIdInitialize(&amp;amp;moId);&lt;br /&gt;
    clCorMoIdAppend(&amp;amp;moId, CLASS_CHASSIS_MO, 0);&lt;br /&gt;
    clCorMoIdAppend(&amp;amp;moId, CLASS_CSA104RES_MO, 0);&lt;br /&gt;
    clCorMoIdServiceSet(&amp;amp;moId, CL_COR_SVC_ID_PROVISIONING_MANAGEMENT);&lt;br /&gt;
    rc = clCorObjectHandleGet(&amp;amp;moId, &amp;amp;objH);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed [0x%x] to get the object handle. &amp;quot;,&lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    while (!exiting)&lt;br /&gt;
    {&lt;br /&gt;
        if (running &amp;amp;&amp;amp; ha_state == CL_AMS_HA_STATE_ACTIVE)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: Hello World! (count = %d)&amp;quot;, appname, counter);&lt;br /&gt;
#ifdef CL_INST&lt;br /&gt;
            if ((rc = clDataTapSend(counter)) != CL_OK &amp;amp;&amp;amp; (rc != CL_ERR_INVALID_PARAMETER))&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed [0x%x] to send data tap data&amp;quot;,&lt;br /&gt;
                            appname, rc);&lt;br /&gt;
            }&lt;br /&gt;
#endif&lt;br /&gt;
            if ((rc = update_counter_in_cor(time(0), objH, counter)) != CL_OK)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: cor update failed. Exiting.&amp;quot;,&lt;br /&gt;
                            appname, rc);&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            /* Checkpoint new counter number */&lt;br /&gt;
            rc = checkpoint_write_counter(counter);&lt;br /&gt;
            if (rc != CL_OK)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: Checkpoint write failed. Exiting.&amp;quot;,&lt;br /&gt;
                            appname, rc);&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            counter++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        usleep((useconds_t)delta_t*1000);&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
The main loop body is as we've seen several times already. But, the sleep, rather than being &amp;lt;code&amp;gt;sleep(1)&amp;lt;/code&amp;gt; is a &amp;lt;code&amp;gt;usleep()&amp;lt;/code&amp;gt; of a variable duration.  The duration: &amp;lt;code&amp;gt;delta_t&amp;lt;/code&amp;gt; is a number in milliseconds that is settable from COR.  We'll see where it gets set later.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;string.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
    #include &amp;lt;clDebugApi.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
We  including standard header files, including &amp;lt;code&amp;gt;clDebugApi.h&amp;lt;/code&amp;gt; which allows the application to interact with the SAFplus Platform Console. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|clcsa104CompOAMPConfig.c &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #include &amp;lt;clcsa104CompOAMPConfig.h&amp;gt;&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
Within &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.c&amp;lt;/code&amp;gt; we include &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.h&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|clcsa104CompOAMPConfig.h &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #include &amp;lt;clOmApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clCorApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clProvOmApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clProvApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clAlarmOM.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clHalApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clHalObjectApi.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    typedef ClRcT (*fp) (CL_OM_PROV_CLASS*, ClHandleT,  ClProvTxnDataT*);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    CL_OM_BEGIN_CLASS(CL_OM_PROV_CLASS,  CL_OM_PROV_CSA104RES_CLASS)&lt;br /&gt;
 &lt;br /&gt;
    CL_OM_END&lt;br /&gt;
 &lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvConstructor( void *pThis, void *pUsrData,&lt;br /&gt;
                                                     ClUint32T usrDataLen );&lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvDestructor ( void *pThis , void  *pUsrData,&lt;br /&gt;
                                                     ClUint32T usrDataLen );&lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvValidate(CL_OM_PROV_CLASS* pThis, &lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
 &lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvUpdate(CL_OM_PROV_CLASS* pThis, &lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
 &lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvRollback(CL_OM_PROV_CLASS* pThis,&lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
&lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvRead(CL_OM_PROV_CLASS* pThis,&lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
&lt;br /&gt;
    void clcsa104CompCSA104RESProvObjectStart(ClCorMOIdPtrT pMoId, &lt;br /&gt;
                               ClHandleT txnHandle);&lt;br /&gt;
&lt;br /&gt;
    void clcsa104CompCSA104RESProvObjectEnd(ClCorMOIdPtrT pMoId, &lt;br /&gt;
                               ClHandleT txnHandle);&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Next in &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.h&amp;lt;/code&amp;gt; we have several header files being included. Included is &amp;lt;code&amp;gt;clOmApi.h&amp;lt;/code&amp;gt; which is the main header file for using the Object Management subsystem.  This is Clovis' support for object-oriented like programming in C.  Next &amp;lt;code&amp;gt;clCorApi.h&amp;lt;/code&amp;gt; is the main header for using the Clovis Object Registry.  &amp;lt;code&amp;gt;clProvOmApi.h&amp;lt;/code&amp;gt;  is the main header for the Clovis Provisioning OM class.  We define an Object Management  class: &amp;lt;code&amp;gt;CL_OM_PROV_CSA104RES_CLASS&amp;lt;/code&amp;gt; which inherits from another Object Management class: &amp;lt;code&amp;gt;CL_OM_PROV_CLASS&amp;lt;/code&amp;gt;.  This last class is the class whose API was imported with the &amp;lt;code&amp;gt;#include clProvOmApi.h&amp;lt;/code&amp;gt;.  The subsequent code in the above table declare functions that will be member functions of the new Object Management class: &amp;lt;code&amp;gt;CL_OM_PROV_CSA104_CLASS&amp;lt;/code&amp;gt;. Note that function header comments have been omitted for clarity.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|  clcsa104Compcsa104Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     extern ClUint32T delta_t;&lt;br /&gt;
     extern ClCharT   appname[80];&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Above we define/declare a variable that is used for provisioning. The extern is a reference to a variable defined in clCompAppMain.c.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa104CompOAMPConfig.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     ClOmClassControlBlockT pAppOmClassTbl[] =&lt;br /&gt;
     {&lt;br /&gt;
         {&lt;br /&gt;
          CSA104COMP_CSA104RES_PROV_CLASS_NAME,&lt;br /&gt;
          sizeof(CL_OM_PROV_CSA104RES_CLASS),&lt;br /&gt;
          CL_OM_PROV_CLASS_TYPE,&lt;br /&gt;
          clcsa104CompCSA104RESProvConstructor,&lt;br /&gt;
          clcsa104CompCSA104RESProvDestructor,&lt;br /&gt;
          NULL,&lt;br /&gt;
          CSA104COMP_CSA104RES_PROV_CLASS_VERSION,&lt;br /&gt;
          0,&lt;br /&gt;
          CL_MAX_OBJ,&lt;br /&gt;
          0,&lt;br /&gt;
          CSA104COMP_CSA104RES_PROV_MAX_SLOTS,&lt;br /&gt;
          CL_OM_PROV_CSA104RES_CLASS_TYPE&lt;br /&gt;
     },&lt;br /&gt;
     &lt;br /&gt;
     &lt;br /&gt;
     };&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Within &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.c&amp;lt;/code&amp;gt; we define the global &amp;lt;code&amp;gt;pAppOmClassTbl&amp;lt;/code&amp;gt; so that will know about the new class and be able to instantiate members of the class.  Line 27 specifies the name of the class.  This is optional.  Defined is the size of instances of the class, next we specify the base class, followed by the constructor and destructor for the class respectively. The &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; specifies the table of functions for the class, in this case there is no such table.  &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is the instance table pointer.  The next three lines of code.&lt;br /&gt;
&amp;lt;br&amp;gt;--&amp;gt; &amp;lt;code&amp;gt;CL_MAX_OBJ,&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;--&amp;gt; &amp;lt;code&amp;gt;0,&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;--&amp;gt; &amp;lt;code&amp;gt;CSA104COMP_CSA104RES_PROV_MAX_SLOTS,&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;specify the max number of object instances allowed, current number of object instances, and max number of object instances so far respectively.  Followed by the Class Type ID for the class.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa104Compcsa104Res.c &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     ClRcT clcsa104CompCSA104RESProvConstructor( void *pThis, void *pUsrData,&lt;br /&gt;
                                                 ClUint32T usrDataLen )&lt;br /&gt;
     {&lt;br /&gt;
         ClRcT rc = CL_OK;&lt;br /&gt;
     &lt;br /&gt;
         /* Override &amp;quot;semantic check&amp;quot; virtual method in provClass*/&lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvObjectStart = clcsa104CompCSA104RESProvObjectStart; 	 &lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvValidate = (fp)clcsa104CompCSA104RESProvValidate; 	 &lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvUpdate = (fp)clcsa104CompCSA104RESProvUpdate; 	 &lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvRollback = (fp)clcsa104CompCSA104RESProvRollback;&lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvRead = (fp)clcsa104CompCSA104RESProvRead;&lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvObjectEnd = clcsa104CompCSA104RESProvObjectEnd; &lt;br /&gt;
&lt;br /&gt;
         ...&lt;br /&gt;
&lt;br /&gt;
         return rc;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     ClRcT clcsa104CompCSA104RESProvDestructor ( void *pThis , void  *pUsrData,&lt;br /&gt;
                                                 ClUint32T usrDataLen )&lt;br /&gt;
     {&lt;br /&gt;
         ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
         ...&lt;br /&gt;
&lt;br /&gt;
         return rc;&lt;br /&gt;
     }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
The above table presents the Contructor. It initializes the function pointers defined in the Base Class.  These are the Update method, the provisioning validation method, and the provisioning rollback method.  These are declared in &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.h&amp;lt;/code&amp;gt; in the class definition.  The destructor doesn't do anything except return &amp;lt;code&amp;gt;CL_OK&amp;lt;/code&amp;gt;.  There's no destruction work to do for this class.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|   clcsa104Compcsa104Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 ClRcT clcsa104CompCSA104RESProvUpdate(CL_OM_PROV_CLASS* pThis,&lt;br /&gt;
                            ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData)&lt;br /&gt;
 {&lt;br /&gt;
     ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
     /*&lt;br /&gt;
       ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
     clprintf(CL_LOG_SEV_INFO, &amp;quot;Inside the function %s&amp;quot;, __FUNCTION__);&lt;br /&gt;
&lt;br /&gt;
     ClNameT     moIdName = {0};&lt;br /&gt;
    &lt;br /&gt;
     rc = clCorMoIdToMoIdNameGet((ClCorMOIdPtrT)pProvTxnData-&amp;gt;pMoId, &amp;amp;moIdName);&lt;br /&gt;
     if (CL_OK != rc)&lt;br /&gt;
     {&lt;br /&gt;
         clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed while getting the MOId Name from moid. rc[0x%x] &amp;quot;, appname, rc);&lt;br /&gt;
         return rc;&lt;br /&gt;
     }&lt;br /&gt;
     /*&lt;br /&gt;
       ---END_APPLICATION_CODE---&lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|   clcsa104Compcsa104Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     switch (pProvTxnData-&amp;gt;provCmd)&lt;br /&gt;
     {&lt;br /&gt;
         case CL_COR_OP_CREATE :&lt;br /&gt;
         case CL_COR_OP_CREATE_AND_SET:&lt;br /&gt;
			&lt;br /&gt;
         /*&lt;br /&gt;
          * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: Inside create request for the object [%s] &amp;quot;, appname, moIdName.value);    &lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---END_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         break;&lt;br /&gt;
         case CL_COR_OP_SET:&lt;br /&gt;
	    &lt;br /&gt;
         /*&lt;br /&gt;
          * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         if ( pProvTxnData-&amp;gt;attrId == CSA104RES_DELTA_T)&lt;br /&gt;
         {&lt;br /&gt;
             delta_t = *(ClUint32T *)pProvTxnData-&amp;gt;pProvData;&lt;br /&gt;
             clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: The delta time is now [%d] &amp;quot;, appname, delta_t);&lt;br /&gt;
         }&lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---END_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         break;&lt;br /&gt;
&lt;br /&gt;
         case  CL_COR_OP_DELETE:&lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---END_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         break;&lt;br /&gt;
         default:&lt;br /&gt;
             clprintf (CL_LOG_SEV_ERROR, &amp;quot;Prov command is not proper&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     ...&lt;br /&gt;
&lt;br /&gt;
     return rc;   &lt;br /&gt;
 }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
When the COR object associated with csa104's provisioning is updated, &amp;lt;code&amp;gt;clcsa104CompCSA104RESProvUpdate&amp;lt;/code&amp;gt; function is called. A new value is set for the &amp;lt;code&amp;gt;delta_t&amp;lt;/code&amp;gt; variable that is used to control the sleep interval in the application's main loop.&lt;br /&gt;
&lt;br /&gt;
===How to Run 104 and what to observe===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Start the application as usual with the SAFplus Platform Console.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 # cd /root/asp/bin&lt;br /&gt;
 # ./asp_console&lt;br /&gt;
&lt;br /&gt;
 cli[Test]-&amp;gt; setc 1&lt;br /&gt;
 cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Again, there are two log files to observe &amp;lt;code&amp;gt;/root/asp/var/log/csa104CompI0Log.latest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/var/log/csa104CompI1Log.latest&amp;lt;/code&amp;gt;. After running the above commands you should see the following output in these logs when using &amp;lt;code&amp;gt;tail -f&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00051 :   INFO)&lt;br /&gt;
 Component [csa104CompI0] : PID [21202]. Initializing&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00052 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00053 :   INFO)&lt;br /&gt;
    IOC Port                : 0x80&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00054 :   INFO)&lt;br /&gt;
 csa104: instantiated as component instance csa104CompI0.&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00055 :   INFO)&lt;br /&gt;
 csa104CompI0: cpmHandle = 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00056 :   INFO)&lt;br /&gt;
 csa104CompI0: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00057 :   INFO)&lt;br /&gt;
 csa104CompI0: checkpoint_initialize&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00064 :   INFO)&lt;br /&gt;
 csa104CompI0: Checkpoint service initialized (handle=0x1)&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00066 :   INFO)&lt;br /&gt;
 csa104CompI0: Checkpoint opened (handle=0x2)&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00067 :   INFO)&lt;br /&gt;
 csa104CompI0: Section created&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI1Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00049 :   INFO)&lt;br /&gt;
 Component [csa104CompI1] : PID [21209]. Initializing&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00050 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00051 :   INFO)&lt;br /&gt;
    IOC Port                : 0x81&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00052 :   INFO)&lt;br /&gt;
 csa104: instantiated as component instance csa104CompI1.&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00053 :   INFO)&lt;br /&gt;
 csa104CompI1: cpmHandle = 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00054 :   INFO)&lt;br /&gt;
 csa104CompI1: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00055 :   INFO)&lt;br /&gt;
 csa104CompI1: checkpoint_initialize&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00062 :   INFO)&lt;br /&gt;
 csa104CompI1: Checkpoint service initialized (handle=0x1)&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00064 :   INFO)&lt;br /&gt;
 csa104CompI1: Checkpoint opened (handle=0x2)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;As before, unlock the application with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsUnlock sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the active component log file you should start to see the &amp;quot;Hello World&amp;quot; lines displaying at a rate of about 1 per second.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00080 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 0)&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00085 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnStart] ****&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00087 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvObjectStart&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00089 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvValidate&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00105 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvUpdate&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00107 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvObjectEnd&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00116 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnEnd] ****&lt;br /&gt;
Mon Jul 14 19:07:28 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00123 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 1)&lt;br /&gt;
Mon Jul 14 19:07:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00124 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 2)&lt;br /&gt;
Mon Jul 14 19:07:30 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00125 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 3)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;In the SAFplus Platform Console return to the Slot 1 context by entering &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; until it prints the Slot 1 prompt: &amp;lt;code&amp;gt;cli[Test:SCNodeI0]-&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now set the context to the COR server using the following command:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc corServer_SCNodeI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then, dump the object tree:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objTreeShow&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see something like the following. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objTreeShow&lt;br /&gt;
&lt;br /&gt;
Objects (Instance Tree):&lt;br /&gt;
    \Chassis:0&lt;br /&gt;
        \PayloadNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \PayloadNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa104Res:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa105Res:0&lt;br /&gt;
            (alarm, provisioning)&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Next, dump the object with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objectShow \Chassis:0\csa104Res:0 PROV&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Showing Object&lt;br /&gt;
ClCorMOId:[Svc: 3] (/).(10001:0000).(10002:0000):&lt;br /&gt;
&lt;br /&gt;
[Class:0x10003] Object &lt;br /&gt;
{&lt;br /&gt;
[CSA104RES_COUNTER             ] [0x0002] = [431]&lt;br /&gt;
[CSA104RES_DELTA_T             ] [0x0003] = [1000]&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now, set the delta_t attribute to 10000 instead of 1000 with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; attrSet \Chassis:0\csa104Res:0 PROV null 3 -1 10000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Execution Result : Passed&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
You should see lines like the following in the logs for csa104:&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04230 :   INFO)&lt;br /&gt;
 csa104CompI0: The delta time is now [10000] &lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04232 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvObjectEnd&lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04241 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnEnd] ****&lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04248 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 510)&lt;br /&gt;
Mon Jul 14 19:16:09 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04249 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 511)&lt;br /&gt;
Mon Jul 14 19:16:09 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04254 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnStart] ****&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
indicating that the component has received the updated value of delta_t&lt;br /&gt;
&lt;br /&gt;
You should also notice that the lines in the log are now being printed with a 10 second interval between lines.&lt;br /&gt;
&lt;br /&gt;
To confirm that the value of delta_t was updated you could dump the &amp;lt;code&amp;gt;CLASS_CSA104RES_PROV_MS&amp;lt;/code&amp;gt; object with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objectShow \Chassis:0\csa104Res:0 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Showing Object&lt;br /&gt;
ClCorMOId:[Svc: 3] (/).(10001:0000).(10002:0000):&lt;br /&gt;
&lt;br /&gt;
[Class:0x10003] Object &lt;br /&gt;
{&lt;br /&gt;
[CSA104RES_COUNTER             ] [0x0002] = [523]&lt;br /&gt;
[CSA104RES_DELTA_T             ] [0x0003] = [10000]&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;To end the example first change the state of csa104SGI0 to LockAssignment.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then change the state to LockInstantiation.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockInstantiation sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then close the SAFplus Platform Console session.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; end&lt;br /&gt;
cli[Test]-&amp;gt; bye&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Summary and References===&lt;br /&gt;
&lt;br /&gt;
We've seen how to:&lt;br /&gt;
*Create a simple ProvOm class.&lt;br /&gt;
*Use callbacks to the class's update method to update variables in the application at runtime.&lt;br /&gt;
*Use the SAFplus Platform Console to cause the classes update method to  be invoked.&lt;br /&gt;
&lt;br /&gt;
For further reading :&lt;br /&gt;
*Clovis SAFplus Platform User Guide: sections on COR, &lt;br /&gt;
*clProvOmApi.h&lt;br /&gt;
*clOmObjectManage.h&lt;br /&gt;
*clOmApi.h&lt;/div&gt;</summary>
		<author><name>Pradeepac</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/csa104</id>
		<title>Doc:latest/evalguide/csa104</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/csa104"/>
				<updated>2010-08-28T14:35:09Z</updated>
		
		<summary type="html">&lt;p&gt;Pradeepac: /* How to Run 104 and what to observe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==csa104 Provisioning==&lt;br /&gt;
&lt;br /&gt;
===Objective===&lt;br /&gt;
&lt;br /&gt;
The objective is to demonstrate some of the features of the Clovis Object Registry (COR) and Clovis' Object Management (OM) framework.&lt;br /&gt;
&lt;br /&gt;
===What you will learn===&lt;br /&gt;
&lt;br /&gt;
*How to use the Clovis Object Registry to set configuration values in a simple SAFplus Platform application.&lt;br /&gt;
*How to manipulate COR values from the SAFplus Platform Console line interface.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&lt;br /&gt;
The code can be found within the following directory&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa104Comp&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     ClUint8T clEoClientLibs[] =&lt;br /&gt;
    {&lt;br /&gt;
        COMP_EO_CLIENTLIB_COR,      /* Lib: Common Object Repository            */&lt;br /&gt;
        COMP_EO_CLIENTLIB_CM,       /* Lib: Chassis Management                  */&lt;br /&gt;
        COMP_EO_CLIENTLIB_NAME,     /* Lib: Name Service                        */&lt;br /&gt;
        COMP_EO_CLIENTLIB_LOG,      /* Lib: Log Service                         */&lt;br /&gt;
        COMP_EO_CLIENTLIB_TRACE,    /* Lib: Trace Service                       */&lt;br /&gt;
        COMP_EO_CLIENTLIB_DIAG,     /* Lib: Diagnostics                         */&lt;br /&gt;
        COMP_EO_CLIENTLIB_TXN,      /* Lib: Transaction Management              */&lt;br /&gt;
        CL_FALSE,                   /* NA */&lt;br /&gt;
        COMP_EO_CLIENTLIB_PROV,     /* Lib: Provisioning Management             */&lt;br /&gt;
        COMP_EO_CLIENTLIB_ALARM,    /* Lib: Alarm Management                    */&lt;br /&gt;
        COMP_EO_CLIENTLIB_DEBUG,    /* Lib: Debug Service                       */&lt;br /&gt;
        COMP_EO_CLIENTLIB_GMS       /* Lib: Cluster/Group Membership Service    */&lt;br /&gt;
    };&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Here we present the Client Libraries. These are set within &amp;lt;code&amp;gt;clCompCfg.h&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompCfg.h&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_COR   CL_TRUE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_CM    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_NAME    CL_FALSE        &lt;br /&gt;
    #define COMP_EO_CLIENTLIB_LOG    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_TRACE    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_DIAG    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_TXN    CL_TRUE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_NA    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_PROV    CL_TRUE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_ALARM    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_DEBUG    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_GMS    CL_FALSE&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Within &amp;lt;code&amp;gt;clCompCfg.h&amp;lt;/code&amp;gt; we set Clovis Object Registry  (COR), the Transaction (TXN), and Provisioning (Prov) libraries to &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 ClCompAppInitialize()&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
    clCorMoIdInitialize(&amp;amp;moId);&lt;br /&gt;
    clCorMoIdAppend(&amp;amp;moId, CLASS_CHASSIS_MO, 0);&lt;br /&gt;
    clCorMoIdAppend(&amp;amp;moId, CLASS_CSA104RES_MO, 0);&lt;br /&gt;
    clCorMoIdServiceSet(&amp;amp;moId, CL_COR_SVC_ID_PROVISIONING_MANAGEMENT);&lt;br /&gt;
    rc = clCorObjectHandleGet(&amp;amp;moId, &amp;amp;objH);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed [0x%x] to get the object handle. &amp;quot;,&lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    while (!exiting)&lt;br /&gt;
    {&lt;br /&gt;
        if (running &amp;amp;&amp;amp; ha_state == CL_AMS_HA_STATE_ACTIVE)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: Hello World! (count = %d)&amp;quot;, appname, counter);&lt;br /&gt;
#ifdef CL_INST&lt;br /&gt;
            if ((rc = clDataTapSend(counter)) != CL_OK &amp;amp;&amp;amp; (rc != CL_ERR_INVALID_PARAMETER))&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed [0x%x] to send data tap data&amp;quot;,&lt;br /&gt;
                            appname, rc);&lt;br /&gt;
            }&lt;br /&gt;
#endif&lt;br /&gt;
            if ((rc = update_counter_in_cor(time(0), objH, counter)) != CL_OK)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: cor update failed. Exiting.&amp;quot;,&lt;br /&gt;
                            appname, rc);&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            /* Checkpoint new counter number */&lt;br /&gt;
            rc = checkpoint_write_counter(counter);&lt;br /&gt;
            if (rc != CL_OK)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: Checkpoint write failed. Exiting.&amp;quot;,&lt;br /&gt;
                            appname, rc);&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            counter++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        usleep((useconds_t)delta_t*1000);&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
The main loop body is as we've seen several times already. But, the sleep, rather than being &amp;lt;code&amp;gt;sleep(1)&amp;lt;/code&amp;gt; is a &amp;lt;code&amp;gt;usleep()&amp;lt;/code&amp;gt; of a variable duration.  The duration: &amp;lt;code&amp;gt;delta_t&amp;lt;/code&amp;gt; is a number in milliseconds that is settable from COR.  We'll see where it gets set later.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;string.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
    #include &amp;lt;clDebugApi.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
We  including standard header files, including &amp;lt;code&amp;gt;clDebugApi.h&amp;lt;/code&amp;gt; which allows the application to interact with the SAFplus Platform Console. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|clcsa104CompOAMPConfig.c &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #include &amp;lt;clcsa104CompOAMPConfig.h&amp;gt;&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
Within &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.c&amp;lt;/code&amp;gt; we include &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.h&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|clcsa104CompOAMPConfig.h &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #include &amp;lt;clOmApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clCorApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clProvOmApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clProvApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clAlarmOM.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clHalApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clHalObjectApi.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    typedef ClRcT (*fp) (CL_OM_PROV_CLASS*, ClHandleT,  ClProvTxnDataT*);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    CL_OM_BEGIN_CLASS(CL_OM_PROV_CLASS,  CL_OM_PROV_CSA104RES_CLASS)&lt;br /&gt;
 &lt;br /&gt;
    CL_OM_END&lt;br /&gt;
 &lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvConstructor( void *pThis, void *pUsrData,&lt;br /&gt;
                                                     ClUint32T usrDataLen );&lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvDestructor ( void *pThis , void  *pUsrData,&lt;br /&gt;
                                                     ClUint32T usrDataLen );&lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvValidate(CL_OM_PROV_CLASS* pThis, &lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
 &lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvUpdate(CL_OM_PROV_CLASS* pThis, &lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
 &lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvRollback(CL_OM_PROV_CLASS* pThis,&lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
&lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvRead(CL_OM_PROV_CLASS* pThis,&lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
&lt;br /&gt;
    void clcsa104CompCSA104RESProvObjectStart(ClCorMOIdPtrT pMoId, &lt;br /&gt;
                               ClHandleT txnHandle);&lt;br /&gt;
&lt;br /&gt;
    void clcsa104CompCSA104RESProvObjectEnd(ClCorMOIdPtrT pMoId, &lt;br /&gt;
                               ClHandleT txnHandle);&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Next in &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.h&amp;lt;/code&amp;gt; we have several header files being included. Included is &amp;lt;code&amp;gt;clOmApi.h&amp;lt;/code&amp;gt; which is the main header file for using the Object Management subsystem.  This is Clovis' support for object-oriented like programming in C.  Next &amp;lt;code&amp;gt;clCorApi.h&amp;lt;/code&amp;gt; is the main header for using the Clovis Object Registry.  &amp;lt;code&amp;gt;clProvOmApi.h&amp;lt;/code&amp;gt;  is the main header for the Clovis Provisioning OM class.  We define an Object Management  class: &amp;lt;code&amp;gt;CL_OM_PROV_CSA104RES_CLASS&amp;lt;/code&amp;gt; which inherits from another Object Management class: &amp;lt;code&amp;gt;CL_OM_PROV_CLASS&amp;lt;/code&amp;gt;.  This last class is the class whose API was imported with the &amp;lt;code&amp;gt;#include clProvOmApi.h&amp;lt;/code&amp;gt;.  The subsequent code in the above table declare functions that will be member functions of the new Object Management class: &amp;lt;code&amp;gt;CL_OM_PROV_CSA104_CLASS&amp;lt;/code&amp;gt;. Note that function header comments have been omitted for clarity.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|  clcsa104Compcsa104Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     extern ClUint32T delta_t;&lt;br /&gt;
     extern ClCharT   appname[80];&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Above we define/declare a variable that is used for provisioning. The extern is a reference to a variable defined in clCompAppMain.c.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa104CompOAMPConfig.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     ClOmClassControlBlockT pAppOmClassTbl[] =&lt;br /&gt;
     {&lt;br /&gt;
         {&lt;br /&gt;
          CSA104COMP_CSA104RES_PROV_CLASS_NAME,&lt;br /&gt;
          sizeof(CL_OM_PROV_CSA104RES_CLASS),&lt;br /&gt;
          CL_OM_PROV_CLASS_TYPE,&lt;br /&gt;
          clcsa104CompCSA104RESProvConstructor,&lt;br /&gt;
          clcsa104CompCSA104RESProvDestructor,&lt;br /&gt;
          NULL,&lt;br /&gt;
          CSA104COMP_CSA104RES_PROV_CLASS_VERSION,&lt;br /&gt;
          0,&lt;br /&gt;
          CL_MAX_OBJ,&lt;br /&gt;
          0,&lt;br /&gt;
          CSA104COMP_CSA104RES_PROV_MAX_SLOTS,&lt;br /&gt;
          CL_OM_PROV_CSA104RES_CLASS_TYPE&lt;br /&gt;
     },&lt;br /&gt;
     &lt;br /&gt;
     &lt;br /&gt;
     };&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Within &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.c&amp;lt;/code&amp;gt; we define the global &amp;lt;code&amp;gt;pAppOmClassTbl&amp;lt;/code&amp;gt; so that will know about the new class and be able to instantiate members of the class.  Line 27 specifies the name of the class.  This is optional.  Defined is the size of instances of the class, next we specify the base class, followed by the constructor and destructor for the class respectively. The &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; specifies the table of functions for the class, in this case there is no such table.  &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is the instance table pointer.  The next three lines of code.&lt;br /&gt;
&amp;lt;br&amp;gt;--&amp;gt; &amp;lt;code&amp;gt;CL_MAX_OBJ,&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;--&amp;gt; &amp;lt;code&amp;gt;0,&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;--&amp;gt; &amp;lt;code&amp;gt;CSA104COMP_CSA104RES_PROV_MAX_SLOTS,&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;specify the max number of object instances allowed, current number of object instances, and max number of object instances so far respectively.  Followed by the Class Type ID for the class.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa104Compcsa104Res.c &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     ClRcT clcsa104CompCSA104RESProvConstructor( void *pThis, void *pUsrData,&lt;br /&gt;
                                                 ClUint32T usrDataLen )&lt;br /&gt;
     {&lt;br /&gt;
         ClRcT rc = CL_OK;&lt;br /&gt;
     &lt;br /&gt;
         /* Override &amp;quot;semantic check&amp;quot; virtual method in provClass*/&lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvObjectStart = clcsa104CompCSA104RESProvObjectStart; 	 &lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvValidate = (fp)clcsa104CompCSA104RESProvValidate; 	 &lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvUpdate = (fp)clcsa104CompCSA104RESProvUpdate; 	 &lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvRollback = (fp)clcsa104CompCSA104RESProvRollback;&lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvRead = (fp)clcsa104CompCSA104RESProvRead;&lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvObjectEnd = clcsa104CompCSA104RESProvObjectEnd; &lt;br /&gt;
&lt;br /&gt;
         ...&lt;br /&gt;
&lt;br /&gt;
         return rc;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     ClRcT clcsa104CompCSA104RESProvDestructor ( void *pThis , void  *pUsrData,&lt;br /&gt;
                                                 ClUint32T usrDataLen )&lt;br /&gt;
     {&lt;br /&gt;
         ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
         ...&lt;br /&gt;
&lt;br /&gt;
         return rc;&lt;br /&gt;
     }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
The above table presents the Contructor. It initializes the function pointers defined in the Base Class.  These are the Update method, the provisioning validation method, and the provisioning rollback method.  These are declared in &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.h&amp;lt;/code&amp;gt; in the class definition.  The destructor doesn't do anything except return &amp;lt;code&amp;gt;CL_OK&amp;lt;/code&amp;gt;.  There's no destruction work to do for this class.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|   clcsa104Compcsa104Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 ClRcT clcsa104CompCSA104RESProvUpdate(CL_OM_PROV_CLASS* pThis,&lt;br /&gt;
                            ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData)&lt;br /&gt;
 {&lt;br /&gt;
     ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
     /*&lt;br /&gt;
       ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
     clprintf(CL_LOG_SEV_INFO, &amp;quot;Inside the function %s&amp;quot;, __FUNCTION__);&lt;br /&gt;
&lt;br /&gt;
     ClNameT     moIdName = {0};&lt;br /&gt;
    &lt;br /&gt;
     rc = clCorMoIdToMoIdNameGet((ClCorMOIdPtrT)pProvTxnData-&amp;gt;pMoId, &amp;amp;moIdName);&lt;br /&gt;
     if (CL_OK != rc)&lt;br /&gt;
     {&lt;br /&gt;
         clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed while getting the MOId Name from moid. rc[0x%x] &amp;quot;, appname, rc);&lt;br /&gt;
         return rc;&lt;br /&gt;
     }&lt;br /&gt;
     /*&lt;br /&gt;
       ---END_APPLICATION_CODE---&lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|   clcsa104Compcsa104Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     switch (pProvTxnData-&amp;gt;provCmd)&lt;br /&gt;
     {&lt;br /&gt;
         case CL_COR_OP_CREATE :&lt;br /&gt;
         case CL_COR_OP_CREATE_AND_SET:&lt;br /&gt;
			&lt;br /&gt;
         /*&lt;br /&gt;
          * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: Inside create request for the object [%s] &amp;quot;, appname, moIdName.value);    &lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---END_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         break;&lt;br /&gt;
         case CL_COR_OP_SET:&lt;br /&gt;
	    &lt;br /&gt;
         /*&lt;br /&gt;
          * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         if ( pProvTxnData-&amp;gt;attrId == CSA104RES_DELTA_T)&lt;br /&gt;
         {&lt;br /&gt;
             delta_t = *(ClUint32T *)pProvTxnData-&amp;gt;pProvData;&lt;br /&gt;
             clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: The delta time is now [%d] &amp;quot;, appname, delta_t);&lt;br /&gt;
         }&lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---END_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         break;&lt;br /&gt;
&lt;br /&gt;
         case  CL_COR_OP_DELETE:&lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---END_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         break;&lt;br /&gt;
         default:&lt;br /&gt;
             clprintf (CL_LOG_SEV_ERROR, &amp;quot;Prov command is not proper&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     ...&lt;br /&gt;
&lt;br /&gt;
     return rc;   &lt;br /&gt;
 }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
When the COR object associated with csa104's provisioning is updated, &amp;lt;code&amp;gt;clcsa104CompCSA104RESProvUpdate&amp;lt;/code&amp;gt; function is called. A new value is set for the &amp;lt;code&amp;gt;delta_t&amp;lt;/code&amp;gt; variable that is used to control the sleep interval in the application's main loop.&lt;br /&gt;
&lt;br /&gt;
===How to Run 104 and what to observe===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Start the application as usual with the SAFplus Platform Console.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 # cd /root/asp/bin&lt;br /&gt;
 # ./asp_console&lt;br /&gt;
&lt;br /&gt;
 cli[Test]-&amp;gt; setc 1&lt;br /&gt;
 cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Again, there are two log files to observe &amp;lt;code&amp;gt;/root/asp/var/log/csa104CompI0Log.latest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/var/log/csa104CompI1Log.latest&amp;lt;/code&amp;gt;. After running the above commands you should see the following output in these logs when using &amp;lt;code&amp;gt;tail -f&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00051 :   INFO)&lt;br /&gt;
 Component [csa104CompI0] : PID [21202]. Initializing&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00052 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00053 :   INFO)&lt;br /&gt;
    IOC Port                : 0x80&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00054 :   INFO)&lt;br /&gt;
 csa104: instantiated as component instance csa104CompI0.&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00055 :   INFO)&lt;br /&gt;
 csa104CompI0: cpmHandle = 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00056 :   INFO)&lt;br /&gt;
 csa104CompI0: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00057 :   INFO)&lt;br /&gt;
 csa104CompI0: checkpoint_initialize&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00064 :   INFO)&lt;br /&gt;
 csa104CompI0: Checkpoint service initialized (handle=0x1)&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00066 :   INFO)&lt;br /&gt;
 csa104CompI0: Checkpoint opened (handle=0x2)&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00067 :   INFO)&lt;br /&gt;
 csa104CompI0: Section created&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI1Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00049 :   INFO)&lt;br /&gt;
 Component [csa104CompI1] : PID [21209]. Initializing&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00050 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00051 :   INFO)&lt;br /&gt;
    IOC Port                : 0x81&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00052 :   INFO)&lt;br /&gt;
 csa104: instantiated as component instance csa104CompI1.&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00053 :   INFO)&lt;br /&gt;
 csa104CompI1: cpmHandle = 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00054 :   INFO)&lt;br /&gt;
 csa104CompI1: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00055 :   INFO)&lt;br /&gt;
 csa104CompI1: checkpoint_initialize&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00062 :   INFO)&lt;br /&gt;
 csa104CompI1: Checkpoint service initialized (handle=0x1)&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00064 :   INFO)&lt;br /&gt;
 csa104CompI1: Checkpoint opened (handle=0x2)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;As before, unlock the application with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsUnlock sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the active component log file you should start to see the &amp;quot;Hello World&amp;quot; lines displaying at a rate of about 1 per second.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00080 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 0)&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00085 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnStart] ****&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00087 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvObjectStart&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00089 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvValidate&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00105 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvUpdate&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00107 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvObjectEnd&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00116 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnEnd] ****&lt;br /&gt;
Mon Jul 14 19:07:28 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00123 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 1)&lt;br /&gt;
Mon Jul 14 19:07:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00124 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 2)&lt;br /&gt;
Mon Jul 14 19:07:30 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00125 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 3)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;In the SAFplus Platform Console return to the Slot 1 context by entering &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; until it prints the Slot 1 prompt: &amp;lt;code&amp;gt;cli[Test:SCNodeI0]-&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now set the context to the COR server using the following command:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc corServer_SCNodeI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then, dump the object tree:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objTreeShow&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see something like the following. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objTreeShow&lt;br /&gt;
&lt;br /&gt;
Objects (Instance Tree):&lt;br /&gt;
    \Chassis:0&lt;br /&gt;
        \PayloadNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \PayloadNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa104Res:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa105Res:0&lt;br /&gt;
            (alarm, provisioning)&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Next, dump the object with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objectShow \Chassis:0\csa104Res:0 PROV&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Showing Object&lt;br /&gt;
ClCorMOId:[Svc: 3] (/).(10001:0000).(10002:0000):&lt;br /&gt;
&lt;br /&gt;
[Class:0x10003] Object &lt;br /&gt;
{&lt;br /&gt;
[CSA104RES_COUNTER             ] [0x0002] = [431]&lt;br /&gt;
[CSA104RES_DELTA_T             ] [0x0003] = [1000]&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
The 3 is the service ID of the object and is the value in brackets next to the asterisk on the &amp;lt;code&amp;gt;ClassName=CLASS_CSA104RES_PROV_MSO&amp;lt;/code&amp;gt; line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now, set the delta_t attribute to 10000 instead of 1000 with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; attrSet \Chassis:0\csa104Res:0 3 null 3 -1 10000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Execution Result : Passed&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
You should see lines like the following in the logs for csa104:&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04230 :   INFO)&lt;br /&gt;
 csa104CompI0: The delta time is now [10000] &lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04232 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvObjectEnd&lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04241 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnEnd] ****&lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04248 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 510)&lt;br /&gt;
Mon Jul 14 19:16:09 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04249 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 511)&lt;br /&gt;
Mon Jul 14 19:16:09 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04254 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnStart] ****&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
indicating that the component has received the updated value of delta_t&lt;br /&gt;
&lt;br /&gt;
You should also notice that the lines in the log are now being printed with a 10 second interval between lines.&lt;br /&gt;
&lt;br /&gt;
To confirm that the value of delta_t was updated you could dump the &amp;lt;code&amp;gt;CLASS_CSA104RES_PROV_MS&amp;lt;/code&amp;gt; object with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objectShow \Chassis:0\csa104Res:0 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Showing Object&lt;br /&gt;
ClCorMOId:[Svc: 3] (/).(10001:0000).(10002:0000):&lt;br /&gt;
&lt;br /&gt;
[Class:0x10003] Object &lt;br /&gt;
{&lt;br /&gt;
[CSA104RES_COUNTER             ] [0x0002] = [523]&lt;br /&gt;
[CSA104RES_DELTA_T             ] [0x0003] = [10000]&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;To end the example first change the state of csa104SGI0 to LockAssignment.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then change the state to LockInstantiation.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockInstantiation sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then close the SAFplus Platform Console session.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; end&lt;br /&gt;
cli[Test]-&amp;gt; bye&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Summary and References===&lt;br /&gt;
&lt;br /&gt;
We've seen how to:&lt;br /&gt;
*Create a simple ProvOm class.&lt;br /&gt;
*Use callbacks to the class's update method to update variables in the application at runtime.&lt;br /&gt;
*Use the SAFplus Platform Console to cause the classes update method to  be invoked.&lt;br /&gt;
&lt;br /&gt;
For further reading :&lt;br /&gt;
*Clovis SAFplus Platform User Guide: sections on COR, &lt;br /&gt;
*clProvOmApi.h&lt;br /&gt;
*clOmObjectManage.h&lt;br /&gt;
*clOmApi.h&lt;/div&gt;</summary>
		<author><name>Pradeepac</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/csa104</id>
		<title>Doc:latest/evalguide/csa104</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/csa104"/>
				<updated>2010-08-28T14:33:04Z</updated>
		
		<summary type="html">&lt;p&gt;Pradeepac: /* How to Run 104 and what to observe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==csa104 Provisioning==&lt;br /&gt;
&lt;br /&gt;
===Objective===&lt;br /&gt;
&lt;br /&gt;
The objective is to demonstrate some of the features of the Clovis Object Registry (COR) and Clovis' Object Management (OM) framework.&lt;br /&gt;
&lt;br /&gt;
===What you will learn===&lt;br /&gt;
&lt;br /&gt;
*How to use the Clovis Object Registry to set configuration values in a simple SAFplus Platform application.&lt;br /&gt;
*How to manipulate COR values from the SAFplus Platform Console line interface.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&lt;br /&gt;
The code can be found within the following directory&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa104Comp&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     ClUint8T clEoClientLibs[] =&lt;br /&gt;
    {&lt;br /&gt;
        COMP_EO_CLIENTLIB_COR,      /* Lib: Common Object Repository            */&lt;br /&gt;
        COMP_EO_CLIENTLIB_CM,       /* Lib: Chassis Management                  */&lt;br /&gt;
        COMP_EO_CLIENTLIB_NAME,     /* Lib: Name Service                        */&lt;br /&gt;
        COMP_EO_CLIENTLIB_LOG,      /* Lib: Log Service                         */&lt;br /&gt;
        COMP_EO_CLIENTLIB_TRACE,    /* Lib: Trace Service                       */&lt;br /&gt;
        COMP_EO_CLIENTLIB_DIAG,     /* Lib: Diagnostics                         */&lt;br /&gt;
        COMP_EO_CLIENTLIB_TXN,      /* Lib: Transaction Management              */&lt;br /&gt;
        CL_FALSE,                   /* NA */&lt;br /&gt;
        COMP_EO_CLIENTLIB_PROV,     /* Lib: Provisioning Management             */&lt;br /&gt;
        COMP_EO_CLIENTLIB_ALARM,    /* Lib: Alarm Management                    */&lt;br /&gt;
        COMP_EO_CLIENTLIB_DEBUG,    /* Lib: Debug Service                       */&lt;br /&gt;
        COMP_EO_CLIENTLIB_GMS       /* Lib: Cluster/Group Membership Service    */&lt;br /&gt;
    };&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Here we present the Client Libraries. These are set within &amp;lt;code&amp;gt;clCompCfg.h&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompCfg.h&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_COR   CL_TRUE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_CM    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_NAME    CL_FALSE        &lt;br /&gt;
    #define COMP_EO_CLIENTLIB_LOG    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_TRACE    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_DIAG    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_TXN    CL_TRUE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_NA    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_PROV    CL_TRUE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_ALARM    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_DEBUG    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_GMS    CL_FALSE&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Within &amp;lt;code&amp;gt;clCompCfg.h&amp;lt;/code&amp;gt; we set Clovis Object Registry  (COR), the Transaction (TXN), and Provisioning (Prov) libraries to &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 ClCompAppInitialize()&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
    clCorMoIdInitialize(&amp;amp;moId);&lt;br /&gt;
    clCorMoIdAppend(&amp;amp;moId, CLASS_CHASSIS_MO, 0);&lt;br /&gt;
    clCorMoIdAppend(&amp;amp;moId, CLASS_CSA104RES_MO, 0);&lt;br /&gt;
    clCorMoIdServiceSet(&amp;amp;moId, CL_COR_SVC_ID_PROVISIONING_MANAGEMENT);&lt;br /&gt;
    rc = clCorObjectHandleGet(&amp;amp;moId, &amp;amp;objH);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed [0x%x] to get the object handle. &amp;quot;,&lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    while (!exiting)&lt;br /&gt;
    {&lt;br /&gt;
        if (running &amp;amp;&amp;amp; ha_state == CL_AMS_HA_STATE_ACTIVE)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: Hello World! (count = %d)&amp;quot;, appname, counter);&lt;br /&gt;
#ifdef CL_INST&lt;br /&gt;
            if ((rc = clDataTapSend(counter)) != CL_OK &amp;amp;&amp;amp; (rc != CL_ERR_INVALID_PARAMETER))&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed [0x%x] to send data tap data&amp;quot;,&lt;br /&gt;
                            appname, rc);&lt;br /&gt;
            }&lt;br /&gt;
#endif&lt;br /&gt;
            if ((rc = update_counter_in_cor(time(0), objH, counter)) != CL_OK)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: cor update failed. Exiting.&amp;quot;,&lt;br /&gt;
                            appname, rc);&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            /* Checkpoint new counter number */&lt;br /&gt;
            rc = checkpoint_write_counter(counter);&lt;br /&gt;
            if (rc != CL_OK)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: Checkpoint write failed. Exiting.&amp;quot;,&lt;br /&gt;
                            appname, rc);&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            counter++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        usleep((useconds_t)delta_t*1000);&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
The main loop body is as we've seen several times already. But, the sleep, rather than being &amp;lt;code&amp;gt;sleep(1)&amp;lt;/code&amp;gt; is a &amp;lt;code&amp;gt;usleep()&amp;lt;/code&amp;gt; of a variable duration.  The duration: &amp;lt;code&amp;gt;delta_t&amp;lt;/code&amp;gt; is a number in milliseconds that is settable from COR.  We'll see where it gets set later.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;string.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
    #include &amp;lt;clDebugApi.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
We  including standard header files, including &amp;lt;code&amp;gt;clDebugApi.h&amp;lt;/code&amp;gt; which allows the application to interact with the SAFplus Platform Console. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|clcsa104CompOAMPConfig.c &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #include &amp;lt;clcsa104CompOAMPConfig.h&amp;gt;&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
Within &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.c&amp;lt;/code&amp;gt; we include &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.h&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|clcsa104CompOAMPConfig.h &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #include &amp;lt;clOmApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clCorApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clProvOmApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clProvApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clAlarmOM.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clHalApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clHalObjectApi.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    typedef ClRcT (*fp) (CL_OM_PROV_CLASS*, ClHandleT,  ClProvTxnDataT*);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    CL_OM_BEGIN_CLASS(CL_OM_PROV_CLASS,  CL_OM_PROV_CSA104RES_CLASS)&lt;br /&gt;
 &lt;br /&gt;
    CL_OM_END&lt;br /&gt;
 &lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvConstructor( void *pThis, void *pUsrData,&lt;br /&gt;
                                                     ClUint32T usrDataLen );&lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvDestructor ( void *pThis , void  *pUsrData,&lt;br /&gt;
                                                     ClUint32T usrDataLen );&lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvValidate(CL_OM_PROV_CLASS* pThis, &lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
 &lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvUpdate(CL_OM_PROV_CLASS* pThis, &lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
 &lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvRollback(CL_OM_PROV_CLASS* pThis,&lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
&lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvRead(CL_OM_PROV_CLASS* pThis,&lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
&lt;br /&gt;
    void clcsa104CompCSA104RESProvObjectStart(ClCorMOIdPtrT pMoId, &lt;br /&gt;
                               ClHandleT txnHandle);&lt;br /&gt;
&lt;br /&gt;
    void clcsa104CompCSA104RESProvObjectEnd(ClCorMOIdPtrT pMoId, &lt;br /&gt;
                               ClHandleT txnHandle);&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Next in &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.h&amp;lt;/code&amp;gt; we have several header files being included. Included is &amp;lt;code&amp;gt;clOmApi.h&amp;lt;/code&amp;gt; which is the main header file for using the Object Management subsystem.  This is Clovis' support for object-oriented like programming in C.  Next &amp;lt;code&amp;gt;clCorApi.h&amp;lt;/code&amp;gt; is the main header for using the Clovis Object Registry.  &amp;lt;code&amp;gt;clProvOmApi.h&amp;lt;/code&amp;gt;  is the main header for the Clovis Provisioning OM class.  We define an Object Management  class: &amp;lt;code&amp;gt;CL_OM_PROV_CSA104RES_CLASS&amp;lt;/code&amp;gt; which inherits from another Object Management class: &amp;lt;code&amp;gt;CL_OM_PROV_CLASS&amp;lt;/code&amp;gt;.  This last class is the class whose API was imported with the &amp;lt;code&amp;gt;#include clProvOmApi.h&amp;lt;/code&amp;gt;.  The subsequent code in the above table declare functions that will be member functions of the new Object Management class: &amp;lt;code&amp;gt;CL_OM_PROV_CSA104_CLASS&amp;lt;/code&amp;gt;. Note that function header comments have been omitted for clarity.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|  clcsa104Compcsa104Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     extern ClUint32T delta_t;&lt;br /&gt;
     extern ClCharT   appname[80];&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Above we define/declare a variable that is used for provisioning. The extern is a reference to a variable defined in clCompAppMain.c.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa104CompOAMPConfig.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     ClOmClassControlBlockT pAppOmClassTbl[] =&lt;br /&gt;
     {&lt;br /&gt;
         {&lt;br /&gt;
          CSA104COMP_CSA104RES_PROV_CLASS_NAME,&lt;br /&gt;
          sizeof(CL_OM_PROV_CSA104RES_CLASS),&lt;br /&gt;
          CL_OM_PROV_CLASS_TYPE,&lt;br /&gt;
          clcsa104CompCSA104RESProvConstructor,&lt;br /&gt;
          clcsa104CompCSA104RESProvDestructor,&lt;br /&gt;
          NULL,&lt;br /&gt;
          CSA104COMP_CSA104RES_PROV_CLASS_VERSION,&lt;br /&gt;
          0,&lt;br /&gt;
          CL_MAX_OBJ,&lt;br /&gt;
          0,&lt;br /&gt;
          CSA104COMP_CSA104RES_PROV_MAX_SLOTS,&lt;br /&gt;
          CL_OM_PROV_CSA104RES_CLASS_TYPE&lt;br /&gt;
     },&lt;br /&gt;
     &lt;br /&gt;
     &lt;br /&gt;
     };&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Within &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.c&amp;lt;/code&amp;gt; we define the global &amp;lt;code&amp;gt;pAppOmClassTbl&amp;lt;/code&amp;gt; so that will know about the new class and be able to instantiate members of the class.  Line 27 specifies the name of the class.  This is optional.  Defined is the size of instances of the class, next we specify the base class, followed by the constructor and destructor for the class respectively. The &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; specifies the table of functions for the class, in this case there is no such table.  &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is the instance table pointer.  The next three lines of code.&lt;br /&gt;
&amp;lt;br&amp;gt;--&amp;gt; &amp;lt;code&amp;gt;CL_MAX_OBJ,&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;--&amp;gt; &amp;lt;code&amp;gt;0,&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;--&amp;gt; &amp;lt;code&amp;gt;CSA104COMP_CSA104RES_PROV_MAX_SLOTS,&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;specify the max number of object instances allowed, current number of object instances, and max number of object instances so far respectively.  Followed by the Class Type ID for the class.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa104Compcsa104Res.c &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     ClRcT clcsa104CompCSA104RESProvConstructor( void *pThis, void *pUsrData,&lt;br /&gt;
                                                 ClUint32T usrDataLen )&lt;br /&gt;
     {&lt;br /&gt;
         ClRcT rc = CL_OK;&lt;br /&gt;
     &lt;br /&gt;
         /* Override &amp;quot;semantic check&amp;quot; virtual method in provClass*/&lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvObjectStart = clcsa104CompCSA104RESProvObjectStart; 	 &lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvValidate = (fp)clcsa104CompCSA104RESProvValidate; 	 &lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvUpdate = (fp)clcsa104CompCSA104RESProvUpdate; 	 &lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvRollback = (fp)clcsa104CompCSA104RESProvRollback;&lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvRead = (fp)clcsa104CompCSA104RESProvRead;&lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvObjectEnd = clcsa104CompCSA104RESProvObjectEnd; &lt;br /&gt;
&lt;br /&gt;
         ...&lt;br /&gt;
&lt;br /&gt;
         return rc;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     ClRcT clcsa104CompCSA104RESProvDestructor ( void *pThis , void  *pUsrData,&lt;br /&gt;
                                                 ClUint32T usrDataLen )&lt;br /&gt;
     {&lt;br /&gt;
         ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
         ...&lt;br /&gt;
&lt;br /&gt;
         return rc;&lt;br /&gt;
     }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
The above table presents the Contructor. It initializes the function pointers defined in the Base Class.  These are the Update method, the provisioning validation method, and the provisioning rollback method.  These are declared in &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.h&amp;lt;/code&amp;gt; in the class definition.  The destructor doesn't do anything except return &amp;lt;code&amp;gt;CL_OK&amp;lt;/code&amp;gt;.  There's no destruction work to do for this class.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|   clcsa104Compcsa104Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 ClRcT clcsa104CompCSA104RESProvUpdate(CL_OM_PROV_CLASS* pThis,&lt;br /&gt;
                            ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData)&lt;br /&gt;
 {&lt;br /&gt;
     ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
     /*&lt;br /&gt;
       ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
     clprintf(CL_LOG_SEV_INFO, &amp;quot;Inside the function %s&amp;quot;, __FUNCTION__);&lt;br /&gt;
&lt;br /&gt;
     ClNameT     moIdName = {0};&lt;br /&gt;
    &lt;br /&gt;
     rc = clCorMoIdToMoIdNameGet((ClCorMOIdPtrT)pProvTxnData-&amp;gt;pMoId, &amp;amp;moIdName);&lt;br /&gt;
     if (CL_OK != rc)&lt;br /&gt;
     {&lt;br /&gt;
         clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed while getting the MOId Name from moid. rc[0x%x] &amp;quot;, appname, rc);&lt;br /&gt;
         return rc;&lt;br /&gt;
     }&lt;br /&gt;
     /*&lt;br /&gt;
       ---END_APPLICATION_CODE---&lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|   clcsa104Compcsa104Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     switch (pProvTxnData-&amp;gt;provCmd)&lt;br /&gt;
     {&lt;br /&gt;
         case CL_COR_OP_CREATE :&lt;br /&gt;
         case CL_COR_OP_CREATE_AND_SET:&lt;br /&gt;
			&lt;br /&gt;
         /*&lt;br /&gt;
          * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: Inside create request for the object [%s] &amp;quot;, appname, moIdName.value);    &lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---END_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         break;&lt;br /&gt;
         case CL_COR_OP_SET:&lt;br /&gt;
	    &lt;br /&gt;
         /*&lt;br /&gt;
          * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         if ( pProvTxnData-&amp;gt;attrId == CSA104RES_DELTA_T)&lt;br /&gt;
         {&lt;br /&gt;
             delta_t = *(ClUint32T *)pProvTxnData-&amp;gt;pProvData;&lt;br /&gt;
             clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: The delta time is now [%d] &amp;quot;, appname, delta_t);&lt;br /&gt;
         }&lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---END_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         break;&lt;br /&gt;
&lt;br /&gt;
         case  CL_COR_OP_DELETE:&lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---END_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         break;&lt;br /&gt;
         default:&lt;br /&gt;
             clprintf (CL_LOG_SEV_ERROR, &amp;quot;Prov command is not proper&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     ...&lt;br /&gt;
&lt;br /&gt;
     return rc;   &lt;br /&gt;
 }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
When the COR object associated with csa104's provisioning is updated, &amp;lt;code&amp;gt;clcsa104CompCSA104RESProvUpdate&amp;lt;/code&amp;gt; function is called. A new value is set for the &amp;lt;code&amp;gt;delta_t&amp;lt;/code&amp;gt; variable that is used to control the sleep interval in the application's main loop.&lt;br /&gt;
&lt;br /&gt;
===How to Run 104 and what to observe===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Start the application as usual with the SAFplus Platform Console.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 # cd /root/asp/bin&lt;br /&gt;
 # ./asp_console&lt;br /&gt;
&lt;br /&gt;
 cli[Test]-&amp;gt; setc 1&lt;br /&gt;
 cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Again, there are two log files to observe &amp;lt;code&amp;gt;/root/asp/var/log/csa104CompI0Log.latest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/var/log/csa104CompI1Log.latest&amp;lt;/code&amp;gt;. After running the above commands you should see the following output in these logs when using &amp;lt;code&amp;gt;tail -f&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00051 :   INFO)&lt;br /&gt;
 Component [csa104CompI0] : PID [21202]. Initializing&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00052 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00053 :   INFO)&lt;br /&gt;
    IOC Port                : 0x80&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00054 :   INFO)&lt;br /&gt;
 csa104: instantiated as component instance csa104CompI0.&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00055 :   INFO)&lt;br /&gt;
 csa104CompI0: cpmHandle = 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00056 :   INFO)&lt;br /&gt;
 csa104CompI0: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00057 :   INFO)&lt;br /&gt;
 csa104CompI0: checkpoint_initialize&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00064 :   INFO)&lt;br /&gt;
 csa104CompI0: Checkpoint service initialized (handle=0x1)&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00066 :   INFO)&lt;br /&gt;
 csa104CompI0: Checkpoint opened (handle=0x2)&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00067 :   INFO)&lt;br /&gt;
 csa104CompI0: Section created&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI1Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00049 :   INFO)&lt;br /&gt;
 Component [csa104CompI1] : PID [21209]. Initializing&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00050 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00051 :   INFO)&lt;br /&gt;
    IOC Port                : 0x81&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00052 :   INFO)&lt;br /&gt;
 csa104: instantiated as component instance csa104CompI1.&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00053 :   INFO)&lt;br /&gt;
 csa104CompI1: cpmHandle = 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00054 :   INFO)&lt;br /&gt;
 csa104CompI1: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00055 :   INFO)&lt;br /&gt;
 csa104CompI1: checkpoint_initialize&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00062 :   INFO)&lt;br /&gt;
 csa104CompI1: Checkpoint service initialized (handle=0x1)&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00064 :   INFO)&lt;br /&gt;
 csa104CompI1: Checkpoint opened (handle=0x2)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;As before, unlock the application with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsUnlock sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the active component log file you should start to see the &amp;quot;Hello World&amp;quot; lines displaying at a rate of about 1 per second.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00080 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 0)&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00085 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnStart] ****&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00087 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvObjectStart&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00089 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvValidate&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00105 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvUpdate&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00107 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvObjectEnd&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00116 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnEnd] ****&lt;br /&gt;
Mon Jul 14 19:07:28 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00123 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 1)&lt;br /&gt;
Mon Jul 14 19:07:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00124 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 2)&lt;br /&gt;
Mon Jul 14 19:07:30 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00125 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 3)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;In the SAFplus Platform Console return to the Slot 1 context by entering &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; until it prints the Slot 1 prompt: &amp;lt;code&amp;gt;cli[Test:SCNodeI0]-&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now set the context to the COR server using the following command:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc corServer_SCNodeI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then, dump the object tree:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objTreeShow&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see something like the following. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objTreeShow&lt;br /&gt;
&lt;br /&gt;
Objects (Instance Tree):&lt;br /&gt;
    \Chassis:0&lt;br /&gt;
        \PayloadNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \PayloadNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa104Res:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa105Res:0&lt;br /&gt;
            (alarm, provisioning)&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Next, dump the &amp;lt;code&amp;gt;CLASS_CSA104RES_PROV_MS&amp;lt;/code&amp;gt; object with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objectShow \Chassis:0\csa104Res:0 PROV&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Showing Object&lt;br /&gt;
ClCorMOId:[Svc: 3] (/).(10001:0000).(10002:0000):&lt;br /&gt;
&lt;br /&gt;
[Class:0x10003] Object &lt;br /&gt;
{&lt;br /&gt;
[CSA104RES_COUNTER             ] [0x0002] = [431]&lt;br /&gt;
[CSA104RES_DELTA_T             ] [0x0003] = [1000]&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
The 3 is the service ID of the object and is the value in brackets next to the asterisk on the &amp;lt;code&amp;gt;ClassName=CLASS_CSA104RES_PROV_MSO&amp;lt;/code&amp;gt; line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now, set the delta_t attribute to 10000 instead of 1000 with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; attrSet \Chassis:0\csa104Res:0 3 null 3 -1 10000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Execution Result : Passed&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
You should see lines like the following in the logs for csa104:&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04230 :   INFO)&lt;br /&gt;
 csa104CompI0: The delta time is now [10000] &lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04232 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvObjectEnd&lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04241 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnEnd] ****&lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04248 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 510)&lt;br /&gt;
Mon Jul 14 19:16:09 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04249 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 511)&lt;br /&gt;
Mon Jul 14 19:16:09 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04254 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnStart] ****&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
indicating that the component has received the updated value of delta_t&lt;br /&gt;
&lt;br /&gt;
You should also notice that the lines in the log are now being printed with a 10 second interval between lines.&lt;br /&gt;
&lt;br /&gt;
To confirm that the value of delta_t was updated you could dump the &amp;lt;code&amp;gt;CLASS_CSA104RES_PROV_MS&amp;lt;/code&amp;gt; object with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objectShow \Chassis:0\csa104Res:0 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Showing Object&lt;br /&gt;
ClCorMOId:[Svc: 3] (/).(10001:0000).(10002:0000):&lt;br /&gt;
&lt;br /&gt;
[Class:0x10003] Object &lt;br /&gt;
{&lt;br /&gt;
[CSA104RES_COUNTER             ] [0x0002] = [523]&lt;br /&gt;
[CSA104RES_DELTA_T             ] [0x0003] = [10000]&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;To end the example first change the state of csa104SGI0 to LockAssignment.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then change the state to LockInstantiation.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockInstantiation sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then close the SAFplus Platform Console session.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; end&lt;br /&gt;
cli[Test]-&amp;gt; bye&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Summary and References===&lt;br /&gt;
&lt;br /&gt;
We've seen how to:&lt;br /&gt;
*Create a simple ProvOm class.&lt;br /&gt;
*Use callbacks to the class's update method to update variables in the application at runtime.&lt;br /&gt;
*Use the SAFplus Platform Console to cause the classes update method to  be invoked.&lt;br /&gt;
&lt;br /&gt;
For further reading :&lt;br /&gt;
*Clovis SAFplus Platform User Guide: sections on COR, &lt;br /&gt;
*clProvOmApi.h&lt;br /&gt;
*clOmObjectManage.h&lt;br /&gt;
*clOmApi.h&lt;/div&gt;</summary>
		<author><name>Pradeepac</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/csa104</id>
		<title>Doc:latest/evalguide/csa104</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/csa104"/>
				<updated>2010-08-28T13:04:20Z</updated>
		
		<summary type="html">&lt;p&gt;Pradeepac: /* How to Run 104 and what to observe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==csa104 Provisioning==&lt;br /&gt;
&lt;br /&gt;
===Objective===&lt;br /&gt;
&lt;br /&gt;
The objective is to demonstrate some of the features of the Clovis Object Registry (COR) and Clovis' Object Management (OM) framework.&lt;br /&gt;
&lt;br /&gt;
===What you will learn===&lt;br /&gt;
&lt;br /&gt;
*How to use the Clovis Object Registry to set configuration values in a simple SAFplus Platform application.&lt;br /&gt;
*How to manipulate COR values from the SAFplus Platform Console line interface.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&lt;br /&gt;
The code can be found within the following directory&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa104Comp&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     ClUint8T clEoClientLibs[] =&lt;br /&gt;
    {&lt;br /&gt;
        COMP_EO_CLIENTLIB_COR,      /* Lib: Common Object Repository            */&lt;br /&gt;
        COMP_EO_CLIENTLIB_CM,       /* Lib: Chassis Management                  */&lt;br /&gt;
        COMP_EO_CLIENTLIB_NAME,     /* Lib: Name Service                        */&lt;br /&gt;
        COMP_EO_CLIENTLIB_LOG,      /* Lib: Log Service                         */&lt;br /&gt;
        COMP_EO_CLIENTLIB_TRACE,    /* Lib: Trace Service                       */&lt;br /&gt;
        COMP_EO_CLIENTLIB_DIAG,     /* Lib: Diagnostics                         */&lt;br /&gt;
        COMP_EO_CLIENTLIB_TXN,      /* Lib: Transaction Management              */&lt;br /&gt;
        CL_FALSE,                   /* NA */&lt;br /&gt;
        COMP_EO_CLIENTLIB_PROV,     /* Lib: Provisioning Management             */&lt;br /&gt;
        COMP_EO_CLIENTLIB_ALARM,    /* Lib: Alarm Management                    */&lt;br /&gt;
        COMP_EO_CLIENTLIB_DEBUG,    /* Lib: Debug Service                       */&lt;br /&gt;
        COMP_EO_CLIENTLIB_GMS       /* Lib: Cluster/Group Membership Service    */&lt;br /&gt;
    };&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Here we present the Client Libraries. These are set within &amp;lt;code&amp;gt;clCompCfg.h&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompCfg.h&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_COR   CL_TRUE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_CM    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_NAME    CL_FALSE        &lt;br /&gt;
    #define COMP_EO_CLIENTLIB_LOG    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_TRACE    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_DIAG    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_TXN    CL_TRUE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_NA    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_PROV    CL_TRUE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_ALARM    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_DEBUG    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_GMS    CL_FALSE&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Within &amp;lt;code&amp;gt;clCompCfg.h&amp;lt;/code&amp;gt; we set Clovis Object Registry  (COR), the Transaction (TXN), and Provisioning (Prov) libraries to &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 ClCompAppInitialize()&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
    clCorMoIdInitialize(&amp;amp;moId);&lt;br /&gt;
    clCorMoIdAppend(&amp;amp;moId, CLASS_CHASSIS_MO, 0);&lt;br /&gt;
    clCorMoIdAppend(&amp;amp;moId, CLASS_CSA104RES_MO, 0);&lt;br /&gt;
    clCorMoIdServiceSet(&amp;amp;moId, CL_COR_SVC_ID_PROVISIONING_MANAGEMENT);&lt;br /&gt;
    rc = clCorObjectHandleGet(&amp;amp;moId, &amp;amp;objH);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed [0x%x] to get the object handle. &amp;quot;,&lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    while (!exiting)&lt;br /&gt;
    {&lt;br /&gt;
        if (running &amp;amp;&amp;amp; ha_state == CL_AMS_HA_STATE_ACTIVE)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: Hello World! (count = %d)&amp;quot;, appname, counter);&lt;br /&gt;
#ifdef CL_INST&lt;br /&gt;
            if ((rc = clDataTapSend(counter)) != CL_OK &amp;amp;&amp;amp; (rc != CL_ERR_INVALID_PARAMETER))&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed [0x%x] to send data tap data&amp;quot;,&lt;br /&gt;
                            appname, rc);&lt;br /&gt;
            }&lt;br /&gt;
#endif&lt;br /&gt;
            if ((rc = update_counter_in_cor(time(0), objH, counter)) != CL_OK)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: cor update failed. Exiting.&amp;quot;,&lt;br /&gt;
                            appname, rc);&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            /* Checkpoint new counter number */&lt;br /&gt;
            rc = checkpoint_write_counter(counter);&lt;br /&gt;
            if (rc != CL_OK)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: Checkpoint write failed. Exiting.&amp;quot;,&lt;br /&gt;
                            appname, rc);&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            counter++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        usleep((useconds_t)delta_t*1000);&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
The main loop body is as we've seen several times already. But, the sleep, rather than being &amp;lt;code&amp;gt;sleep(1)&amp;lt;/code&amp;gt; is a &amp;lt;code&amp;gt;usleep()&amp;lt;/code&amp;gt; of a variable duration.  The duration: &amp;lt;code&amp;gt;delta_t&amp;lt;/code&amp;gt; is a number in milliseconds that is settable from COR.  We'll see where it gets set later.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;string.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
    #include &amp;lt;clDebugApi.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
We  including standard header files, including &amp;lt;code&amp;gt;clDebugApi.h&amp;lt;/code&amp;gt; which allows the application to interact with the SAFplus Platform Console. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|clcsa104CompOAMPConfig.c &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #include &amp;lt;clcsa104CompOAMPConfig.h&amp;gt;&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
Within &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.c&amp;lt;/code&amp;gt; we include &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.h&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|clcsa104CompOAMPConfig.h &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #include &amp;lt;clOmApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clCorApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clProvOmApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clProvApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clAlarmOM.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clHalApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clHalObjectApi.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    typedef ClRcT (*fp) (CL_OM_PROV_CLASS*, ClHandleT,  ClProvTxnDataT*);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    CL_OM_BEGIN_CLASS(CL_OM_PROV_CLASS,  CL_OM_PROV_CSA104RES_CLASS)&lt;br /&gt;
 &lt;br /&gt;
    CL_OM_END&lt;br /&gt;
 &lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvConstructor( void *pThis, void *pUsrData,&lt;br /&gt;
                                                     ClUint32T usrDataLen );&lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvDestructor ( void *pThis , void  *pUsrData,&lt;br /&gt;
                                                     ClUint32T usrDataLen );&lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvValidate(CL_OM_PROV_CLASS* pThis, &lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
 &lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvUpdate(CL_OM_PROV_CLASS* pThis, &lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
 &lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvRollback(CL_OM_PROV_CLASS* pThis,&lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
&lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvRead(CL_OM_PROV_CLASS* pThis,&lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
&lt;br /&gt;
    void clcsa104CompCSA104RESProvObjectStart(ClCorMOIdPtrT pMoId, &lt;br /&gt;
                               ClHandleT txnHandle);&lt;br /&gt;
&lt;br /&gt;
    void clcsa104CompCSA104RESProvObjectEnd(ClCorMOIdPtrT pMoId, &lt;br /&gt;
                               ClHandleT txnHandle);&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Next in &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.h&amp;lt;/code&amp;gt; we have several header files being included. Included is &amp;lt;code&amp;gt;clOmApi.h&amp;lt;/code&amp;gt; which is the main header file for using the Object Management subsystem.  This is Clovis' support for object-oriented like programming in C.  Next &amp;lt;code&amp;gt;clCorApi.h&amp;lt;/code&amp;gt; is the main header for using the Clovis Object Registry.  &amp;lt;code&amp;gt;clProvOmApi.h&amp;lt;/code&amp;gt;  is the main header for the Clovis Provisioning OM class.  We define an Object Management  class: &amp;lt;code&amp;gt;CL_OM_PROV_CSA104RES_CLASS&amp;lt;/code&amp;gt; which inherits from another Object Management class: &amp;lt;code&amp;gt;CL_OM_PROV_CLASS&amp;lt;/code&amp;gt;.  This last class is the class whose API was imported with the &amp;lt;code&amp;gt;#include clProvOmApi.h&amp;lt;/code&amp;gt;.  The subsequent code in the above table declare functions that will be member functions of the new Object Management class: &amp;lt;code&amp;gt;CL_OM_PROV_CSA104_CLASS&amp;lt;/code&amp;gt;. Note that function header comments have been omitted for clarity.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|  clcsa104Compcsa104Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     extern ClUint32T delta_t;&lt;br /&gt;
     extern ClCharT   appname[80];&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Above we define/declare a variable that is used for provisioning. The extern is a reference to a variable defined in clCompAppMain.c.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa104CompOAMPConfig.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     ClOmClassControlBlockT pAppOmClassTbl[] =&lt;br /&gt;
     {&lt;br /&gt;
         {&lt;br /&gt;
          CSA104COMP_CSA104RES_PROV_CLASS_NAME,&lt;br /&gt;
          sizeof(CL_OM_PROV_CSA104RES_CLASS),&lt;br /&gt;
          CL_OM_PROV_CLASS_TYPE,&lt;br /&gt;
          clcsa104CompCSA104RESProvConstructor,&lt;br /&gt;
          clcsa104CompCSA104RESProvDestructor,&lt;br /&gt;
          NULL,&lt;br /&gt;
          CSA104COMP_CSA104RES_PROV_CLASS_VERSION,&lt;br /&gt;
          0,&lt;br /&gt;
          CL_MAX_OBJ,&lt;br /&gt;
          0,&lt;br /&gt;
          CSA104COMP_CSA104RES_PROV_MAX_SLOTS,&lt;br /&gt;
          CL_OM_PROV_CSA104RES_CLASS_TYPE&lt;br /&gt;
     },&lt;br /&gt;
     &lt;br /&gt;
     &lt;br /&gt;
     };&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Within &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.c&amp;lt;/code&amp;gt; we define the global &amp;lt;code&amp;gt;pAppOmClassTbl&amp;lt;/code&amp;gt; so that will know about the new class and be able to instantiate members of the class.  Line 27 specifies the name of the class.  This is optional.  Defined is the size of instances of the class, next we specify the base class, followed by the constructor and destructor for the class respectively. The &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; specifies the table of functions for the class, in this case there is no such table.  &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is the instance table pointer.  The next three lines of code.&lt;br /&gt;
&amp;lt;br&amp;gt;--&amp;gt; &amp;lt;code&amp;gt;CL_MAX_OBJ,&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;--&amp;gt; &amp;lt;code&amp;gt;0,&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;--&amp;gt; &amp;lt;code&amp;gt;CSA104COMP_CSA104RES_PROV_MAX_SLOTS,&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;specify the max number of object instances allowed, current number of object instances, and max number of object instances so far respectively.  Followed by the Class Type ID for the class.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa104Compcsa104Res.c &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     ClRcT clcsa104CompCSA104RESProvConstructor( void *pThis, void *pUsrData,&lt;br /&gt;
                                                 ClUint32T usrDataLen )&lt;br /&gt;
     {&lt;br /&gt;
         ClRcT rc = CL_OK;&lt;br /&gt;
     &lt;br /&gt;
         /* Override &amp;quot;semantic check&amp;quot; virtual method in provClass*/&lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvObjectStart = clcsa104CompCSA104RESProvObjectStart; 	 &lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvValidate = (fp)clcsa104CompCSA104RESProvValidate; 	 &lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvUpdate = (fp)clcsa104CompCSA104RESProvUpdate; 	 &lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvRollback = (fp)clcsa104CompCSA104RESProvRollback;&lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvRead = (fp)clcsa104CompCSA104RESProvRead;&lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvObjectEnd = clcsa104CompCSA104RESProvObjectEnd; &lt;br /&gt;
&lt;br /&gt;
         ...&lt;br /&gt;
&lt;br /&gt;
         return rc;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     ClRcT clcsa104CompCSA104RESProvDestructor ( void *pThis , void  *pUsrData,&lt;br /&gt;
                                                 ClUint32T usrDataLen )&lt;br /&gt;
     {&lt;br /&gt;
         ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
         ...&lt;br /&gt;
&lt;br /&gt;
         return rc;&lt;br /&gt;
     }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
The above table presents the Contructor. It initializes the function pointers defined in the Base Class.  These are the Update method, the provisioning validation method, and the provisioning rollback method.  These are declared in &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.h&amp;lt;/code&amp;gt; in the class definition.  The destructor doesn't do anything except return &amp;lt;code&amp;gt;CL_OK&amp;lt;/code&amp;gt;.  There's no destruction work to do for this class.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|   clcsa104Compcsa104Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 ClRcT clcsa104CompCSA104RESProvUpdate(CL_OM_PROV_CLASS* pThis,&lt;br /&gt;
                            ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData)&lt;br /&gt;
 {&lt;br /&gt;
     ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
     /*&lt;br /&gt;
       ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
     clprintf(CL_LOG_SEV_INFO, &amp;quot;Inside the function %s&amp;quot;, __FUNCTION__);&lt;br /&gt;
&lt;br /&gt;
     ClNameT     moIdName = {0};&lt;br /&gt;
    &lt;br /&gt;
     rc = clCorMoIdToMoIdNameGet((ClCorMOIdPtrT)pProvTxnData-&amp;gt;pMoId, &amp;amp;moIdName);&lt;br /&gt;
     if (CL_OK != rc)&lt;br /&gt;
     {&lt;br /&gt;
         clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed while getting the MOId Name from moid. rc[0x%x] &amp;quot;, appname, rc);&lt;br /&gt;
         return rc;&lt;br /&gt;
     }&lt;br /&gt;
     /*&lt;br /&gt;
       ---END_APPLICATION_CODE---&lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|   clcsa104Compcsa104Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     switch (pProvTxnData-&amp;gt;provCmd)&lt;br /&gt;
     {&lt;br /&gt;
         case CL_COR_OP_CREATE :&lt;br /&gt;
         case CL_COR_OP_CREATE_AND_SET:&lt;br /&gt;
			&lt;br /&gt;
         /*&lt;br /&gt;
          * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: Inside create request for the object [%s] &amp;quot;, appname, moIdName.value);    &lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---END_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         break;&lt;br /&gt;
         case CL_COR_OP_SET:&lt;br /&gt;
	    &lt;br /&gt;
         /*&lt;br /&gt;
          * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         if ( pProvTxnData-&amp;gt;attrId == CSA104RES_DELTA_T)&lt;br /&gt;
         {&lt;br /&gt;
             delta_t = *(ClUint32T *)pProvTxnData-&amp;gt;pProvData;&lt;br /&gt;
             clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: The delta time is now [%d] &amp;quot;, appname, delta_t);&lt;br /&gt;
         }&lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---END_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         break;&lt;br /&gt;
&lt;br /&gt;
         case  CL_COR_OP_DELETE:&lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---END_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         break;&lt;br /&gt;
         default:&lt;br /&gt;
             clprintf (CL_LOG_SEV_ERROR, &amp;quot;Prov command is not proper&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     ...&lt;br /&gt;
&lt;br /&gt;
     return rc;   &lt;br /&gt;
 }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
When the COR object associated with csa104's provisioning is updated, &amp;lt;code&amp;gt;clcsa104CompCSA104RESProvUpdate&amp;lt;/code&amp;gt; function is called. A new value is set for the &amp;lt;code&amp;gt;delta_t&amp;lt;/code&amp;gt; variable that is used to control the sleep interval in the application's main loop.&lt;br /&gt;
&lt;br /&gt;
===How to Run 104 and what to observe===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Start the application as usual with the SAFplus Platform Console.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 # cd /root/asp/bin&lt;br /&gt;
 # ./asp_console&lt;br /&gt;
&lt;br /&gt;
 cli[Test]-&amp;gt; setc 1&lt;br /&gt;
 cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Again, there are two log files to observe &amp;lt;code&amp;gt;/root/asp/var/log/csa104CompI0Log.latest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/var/log/csa104CompI1Log.latest&amp;lt;/code&amp;gt;. After running the above commands you should see the following output in these logs when using &amp;lt;code&amp;gt;tail -f&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00051 :   INFO)&lt;br /&gt;
 Component [csa104CompI0] : PID [21202]. Initializing&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00052 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00053 :   INFO)&lt;br /&gt;
    IOC Port                : 0x80&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00054 :   INFO)&lt;br /&gt;
 csa104: instantiated as component instance csa104CompI0.&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00055 :   INFO)&lt;br /&gt;
 csa104CompI0: cpmHandle = 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00056 :   INFO)&lt;br /&gt;
 csa104CompI0: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00057 :   INFO)&lt;br /&gt;
 csa104CompI0: checkpoint_initialize&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00064 :   INFO)&lt;br /&gt;
 csa104CompI0: Checkpoint service initialized (handle=0x1)&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00066 :   INFO)&lt;br /&gt;
 csa104CompI0: Checkpoint opened (handle=0x2)&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00067 :   INFO)&lt;br /&gt;
 csa104CompI0: Section created&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI1Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00049 :   INFO)&lt;br /&gt;
 Component [csa104CompI1] : PID [21209]. Initializing&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00050 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00051 :   INFO)&lt;br /&gt;
    IOC Port                : 0x81&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00052 :   INFO)&lt;br /&gt;
 csa104: instantiated as component instance csa104CompI1.&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00053 :   INFO)&lt;br /&gt;
 csa104CompI1: cpmHandle = 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00054 :   INFO)&lt;br /&gt;
 csa104CompI1: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00055 :   INFO)&lt;br /&gt;
 csa104CompI1: checkpoint_initialize&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00062 :   INFO)&lt;br /&gt;
 csa104CompI1: Checkpoint service initialized (handle=0x1)&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00064 :   INFO)&lt;br /&gt;
 csa104CompI1: Checkpoint opened (handle=0x2)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;As before, unlock the application with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsUnlock sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the active component log file you should start to see the &amp;quot;Hello World&amp;quot; lines displaying at a rate of about 1 per second.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00080 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 0)&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00085 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnStart] ****&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00087 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvObjectStart&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00089 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvValidate&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00105 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvUpdate&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00107 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvObjectEnd&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00116 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnEnd] ****&lt;br /&gt;
Mon Jul 14 19:07:28 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00123 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 1)&lt;br /&gt;
Mon Jul 14 19:07:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00124 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 2)&lt;br /&gt;
Mon Jul 14 19:07:30 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00125 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 3)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;In the SAFplus Platform Console return to the Slot 1 context by entering &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; until it prints the Slot 1 prompt: &amp;lt;code&amp;gt;cli[Test:SCNodeI0]-&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now set the context to the COR server using the following command:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc corServer_SCNodeI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then, dump the object tree:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objTreeShow&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see something like the following. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objTreeShow&lt;br /&gt;
&lt;br /&gt;
Objects (Instance Tree):&lt;br /&gt;
    \Chassis:0&lt;br /&gt;
        \PayloadNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \PayloadNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa104Res:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa105Res:0&lt;br /&gt;
            (alarm, provisioning)&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Next, dump the &amp;lt;code&amp;gt;CLASS_CSA104RES_PROV_MS&amp;lt;/code&amp;gt; object with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objectShow \Chassis:0\csa104Res:0 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Showing Object&lt;br /&gt;
ClCorMOId:[Svc: 3] (/).(10001:0000).(10002:0000):&lt;br /&gt;
&lt;br /&gt;
[Class:0x10003] Object &lt;br /&gt;
{&lt;br /&gt;
[CSA104RES_COUNTER             ] [0x0002] = [431]&lt;br /&gt;
[CSA104RES_DELTA_T             ] [0x0003] = [1000]&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
The 3 is the service ID of the object and is the value in brackets next to the asterisk on the &amp;lt;code&amp;gt;ClassName=CLASS_CSA104RES_PROV_MSO&amp;lt;/code&amp;gt; line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now, set the delta_t attribute to 10000 instead of 1000 with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; attrSet \Chassis:0\csa104Res:0 3 null 3 -1 10000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Execution Result : Passed&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
You should see lines like the following in the logs for csa104:&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04230 :   INFO)&lt;br /&gt;
 csa104CompI0: The delta time is now [10000] &lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04232 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvObjectEnd&lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04241 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnEnd] ****&lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04248 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 510)&lt;br /&gt;
Mon Jul 14 19:16:09 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04249 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 511)&lt;br /&gt;
Mon Jul 14 19:16:09 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04254 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnStart] ****&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
indicating that the component has received the updated value of delta_t&lt;br /&gt;
&lt;br /&gt;
You should also notice that the lines in the log are now being printed with a 10 second interval between lines.&lt;br /&gt;
&lt;br /&gt;
To confirm that the value of delta_t was updated you could dump the &amp;lt;code&amp;gt;CLASS_CSA104RES_PROV_MS&amp;lt;/code&amp;gt; object with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objectShow \Chassis:0\csa104Res:0 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Showing Object&lt;br /&gt;
ClCorMOId:[Svc: 3] (/).(10001:0000).(10002:0000):&lt;br /&gt;
&lt;br /&gt;
[Class:0x10003] Object &lt;br /&gt;
{&lt;br /&gt;
[CSA104RES_COUNTER             ] [0x0002] = [523]&lt;br /&gt;
[CSA104RES_DELTA_T             ] [0x0003] = [10000]&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;To end the example first change the state of csa104SGI0 to LockAssignment.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then change the state to LockInstantiation.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockInstantiation sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then close the SAFplus Platform Console session.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; end&lt;br /&gt;
cli[Test]-&amp;gt; bye&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Summary and References===&lt;br /&gt;
&lt;br /&gt;
We've seen how to:&lt;br /&gt;
*Create a simple ProvOm class.&lt;br /&gt;
*Use callbacks to the class's update method to update variables in the application at runtime.&lt;br /&gt;
*Use the SAFplus Platform Console to cause the classes update method to  be invoked.&lt;br /&gt;
&lt;br /&gt;
For further reading :&lt;br /&gt;
*Clovis SAFplus Platform User Guide: sections on COR, &lt;br /&gt;
*clProvOmApi.h&lt;br /&gt;
*clOmObjectManage.h&lt;br /&gt;
*clOmApi.h&lt;/div&gt;</summary>
		<author><name>Pradeepac</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/csa104</id>
		<title>Doc:latest/evalguide/csa104</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/csa104"/>
				<updated>2010-08-28T13:00:50Z</updated>
		
		<summary type="html">&lt;p&gt;Pradeepac: /* How to Run 104 and what to observe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==csa104 Provisioning==&lt;br /&gt;
&lt;br /&gt;
===Objective===&lt;br /&gt;
&lt;br /&gt;
The objective is to demonstrate some of the features of the Clovis Object Registry (COR) and Clovis' Object Management (OM) framework.&lt;br /&gt;
&lt;br /&gt;
===What you will learn===&lt;br /&gt;
&lt;br /&gt;
*How to use the Clovis Object Registry to set configuration values in a simple SAFplus Platform application.&lt;br /&gt;
*How to manipulate COR values from the SAFplus Platform Console line interface.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&lt;br /&gt;
The code can be found within the following directory&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval/src/app/csa104Comp&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     ClUint8T clEoClientLibs[] =&lt;br /&gt;
    {&lt;br /&gt;
        COMP_EO_CLIENTLIB_COR,      /* Lib: Common Object Repository            */&lt;br /&gt;
        COMP_EO_CLIENTLIB_CM,       /* Lib: Chassis Management                  */&lt;br /&gt;
        COMP_EO_CLIENTLIB_NAME,     /* Lib: Name Service                        */&lt;br /&gt;
        COMP_EO_CLIENTLIB_LOG,      /* Lib: Log Service                         */&lt;br /&gt;
        COMP_EO_CLIENTLIB_TRACE,    /* Lib: Trace Service                       */&lt;br /&gt;
        COMP_EO_CLIENTLIB_DIAG,     /* Lib: Diagnostics                         */&lt;br /&gt;
        COMP_EO_CLIENTLIB_TXN,      /* Lib: Transaction Management              */&lt;br /&gt;
        CL_FALSE,                   /* NA */&lt;br /&gt;
        COMP_EO_CLIENTLIB_PROV,     /* Lib: Provisioning Management             */&lt;br /&gt;
        COMP_EO_CLIENTLIB_ALARM,    /* Lib: Alarm Management                    */&lt;br /&gt;
        COMP_EO_CLIENTLIB_DEBUG,    /* Lib: Debug Service                       */&lt;br /&gt;
        COMP_EO_CLIENTLIB_GMS       /* Lib: Cluster/Group Membership Service    */&lt;br /&gt;
    };&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Here we present the Client Libraries. These are set within &amp;lt;code&amp;gt;clCompCfg.h&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompCfg.h&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_COR   CL_TRUE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_CM    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_NAME    CL_FALSE        &lt;br /&gt;
    #define COMP_EO_CLIENTLIB_LOG    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_TRACE    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_DIAG    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_TXN    CL_TRUE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_NA    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_PROV    CL_TRUE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_ALARM    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_DEBUG    CL_FALSE&lt;br /&gt;
    #define COMP_EO_CLIENTLIB_GMS    CL_FALSE&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Within &amp;lt;code&amp;gt;clCompCfg.h&amp;lt;/code&amp;gt; we set Clovis Object Registry  (COR), the Transaction (TXN), and Provisioning (Prov) libraries to &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 ClCompAppInitialize()&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
    clCorMoIdInitialize(&amp;amp;moId);&lt;br /&gt;
    clCorMoIdAppend(&amp;amp;moId, CLASS_CHASSIS_MO, 0);&lt;br /&gt;
    clCorMoIdAppend(&amp;amp;moId, CLASS_CSA104RES_MO, 0);&lt;br /&gt;
    clCorMoIdServiceSet(&amp;amp;moId, CL_COR_SVC_ID_PROVISIONING_MANAGEMENT);&lt;br /&gt;
    rc = clCorObjectHandleGet(&amp;amp;moId, &amp;amp;objH);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed [0x%x] to get the object handle. &amp;quot;,&lt;br /&gt;
                appname, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    while (!exiting)&lt;br /&gt;
    {&lt;br /&gt;
        if (running &amp;amp;&amp;amp; ha_state == CL_AMS_HA_STATE_ACTIVE)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: Hello World! (count = %d)&amp;quot;, appname, counter);&lt;br /&gt;
#ifdef CL_INST&lt;br /&gt;
            if ((rc = clDataTapSend(counter)) != CL_OK &amp;amp;&amp;amp; (rc != CL_ERR_INVALID_PARAMETER))&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed [0x%x] to send data tap data&amp;quot;,&lt;br /&gt;
                            appname, rc);&lt;br /&gt;
            }&lt;br /&gt;
#endif&lt;br /&gt;
            if ((rc = update_counter_in_cor(time(0), objH, counter)) != CL_OK)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: cor update failed. Exiting.&amp;quot;,&lt;br /&gt;
                            appname, rc);&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            /* Checkpoint new counter number */&lt;br /&gt;
            rc = checkpoint_write_counter(counter);&lt;br /&gt;
            if (rc != CL_OK)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: [0x%x]: Checkpoint write failed. Exiting.&amp;quot;,&lt;br /&gt;
                            appname, rc);&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            counter++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        usleep((useconds_t)delta_t*1000);&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
The main loop body is as we've seen several times already. But, the sleep, rather than being &amp;lt;code&amp;gt;sleep(1)&amp;lt;/code&amp;gt; is a &amp;lt;code&amp;gt;usleep()&amp;lt;/code&amp;gt; of a variable duration.  The duration: &amp;lt;code&amp;gt;delta_t&amp;lt;/code&amp;gt; is a number in milliseconds that is settable from COR.  We'll see where it gets set later.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clCompAppMain.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;string.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
    #include &amp;lt;clDebugApi.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
We  including standard header files, including &amp;lt;code&amp;gt;clDebugApi.h&amp;lt;/code&amp;gt; which allows the application to interact with the SAFplus Platform Console. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|clcsa104CompOAMPConfig.c &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #include &amp;lt;clcsa104CompOAMPConfig.h&amp;gt;&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
Within &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.c&amp;lt;/code&amp;gt; we include &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.h&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|clcsa104CompOAMPConfig.h &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    #include &amp;lt;clOmApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clCorApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clProvOmApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clProvApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clAlarmOM.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clHalApi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;clHalObjectApi.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    typedef ClRcT (*fp) (CL_OM_PROV_CLASS*, ClHandleT,  ClProvTxnDataT*);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    CL_OM_BEGIN_CLASS(CL_OM_PROV_CLASS,  CL_OM_PROV_CSA104RES_CLASS)&lt;br /&gt;
 &lt;br /&gt;
    CL_OM_END&lt;br /&gt;
 &lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvConstructor( void *pThis, void *pUsrData,&lt;br /&gt;
                                                     ClUint32T usrDataLen );&lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvDestructor ( void *pThis , void  *pUsrData,&lt;br /&gt;
                                                     ClUint32T usrDataLen );&lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvValidate(CL_OM_PROV_CLASS* pThis, &lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
 &lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvUpdate(CL_OM_PROV_CLASS* pThis, &lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
 &lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvRollback(CL_OM_PROV_CLASS* pThis,&lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
&lt;br /&gt;
    ClRcT clcsa104CompCSA104RESProvRead(CL_OM_PROV_CLASS* pThis,&lt;br /&gt;
                               ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData);&lt;br /&gt;
&lt;br /&gt;
    void clcsa104CompCSA104RESProvObjectStart(ClCorMOIdPtrT pMoId, &lt;br /&gt;
                               ClHandleT txnHandle);&lt;br /&gt;
&lt;br /&gt;
    void clcsa104CompCSA104RESProvObjectEnd(ClCorMOIdPtrT pMoId, &lt;br /&gt;
                               ClHandleT txnHandle);&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Next in &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.h&amp;lt;/code&amp;gt; we have several header files being included. Included is &amp;lt;code&amp;gt;clOmApi.h&amp;lt;/code&amp;gt; which is the main header file for using the Object Management subsystem.  This is Clovis' support for object-oriented like programming in C.  Next &amp;lt;code&amp;gt;clCorApi.h&amp;lt;/code&amp;gt; is the main header for using the Clovis Object Registry.  &amp;lt;code&amp;gt;clProvOmApi.h&amp;lt;/code&amp;gt;  is the main header for the Clovis Provisioning OM class.  We define an Object Management  class: &amp;lt;code&amp;gt;CL_OM_PROV_CSA104RES_CLASS&amp;lt;/code&amp;gt; which inherits from another Object Management class: &amp;lt;code&amp;gt;CL_OM_PROV_CLASS&amp;lt;/code&amp;gt;.  This last class is the class whose API was imported with the &amp;lt;code&amp;gt;#include clProvOmApi.h&amp;lt;/code&amp;gt;.  The subsequent code in the above table declare functions that will be member functions of the new Object Management class: &amp;lt;code&amp;gt;CL_OM_PROV_CSA104_CLASS&amp;lt;/code&amp;gt;. Note that function header comments have been omitted for clarity.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|  clcsa104Compcsa104Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     extern ClUint32T delta_t;&lt;br /&gt;
     extern ClCharT   appname[80];&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Above we define/declare a variable that is used for provisioning. The extern is a reference to a variable defined in clCompAppMain.c.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa104CompOAMPConfig.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     ClOmClassControlBlockT pAppOmClassTbl[] =&lt;br /&gt;
     {&lt;br /&gt;
         {&lt;br /&gt;
          CSA104COMP_CSA104RES_PROV_CLASS_NAME,&lt;br /&gt;
          sizeof(CL_OM_PROV_CSA104RES_CLASS),&lt;br /&gt;
          CL_OM_PROV_CLASS_TYPE,&lt;br /&gt;
          clcsa104CompCSA104RESProvConstructor,&lt;br /&gt;
          clcsa104CompCSA104RESProvDestructor,&lt;br /&gt;
          NULL,&lt;br /&gt;
          CSA104COMP_CSA104RES_PROV_CLASS_VERSION,&lt;br /&gt;
          0,&lt;br /&gt;
          CL_MAX_OBJ,&lt;br /&gt;
          0,&lt;br /&gt;
          CSA104COMP_CSA104RES_PROV_MAX_SLOTS,&lt;br /&gt;
          CL_OM_PROV_CSA104RES_CLASS_TYPE&lt;br /&gt;
     },&lt;br /&gt;
     &lt;br /&gt;
     &lt;br /&gt;
     };&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Within &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.c&amp;lt;/code&amp;gt; we define the global &amp;lt;code&amp;gt;pAppOmClassTbl&amp;lt;/code&amp;gt; so that will know about the new class and be able to instantiate members of the class.  Line 27 specifies the name of the class.  This is optional.  Defined is the size of instances of the class, next we specify the base class, followed by the constructor and destructor for the class respectively. The &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; specifies the table of functions for the class, in this case there is no such table.  &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is the instance table pointer.  The next three lines of code.&lt;br /&gt;
&amp;lt;br&amp;gt;--&amp;gt; &amp;lt;code&amp;gt;CL_MAX_OBJ,&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;--&amp;gt; &amp;lt;code&amp;gt;0,&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;--&amp;gt; &amp;lt;code&amp;gt;CSA104COMP_CSA104RES_PROV_MAX_SLOTS,&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;specify the max number of object instances allowed, current number of object instances, and max number of object instances so far respectively.  Followed by the Class Type ID for the class.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;| clcsa104Compcsa104Res.c &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     ClRcT clcsa104CompCSA104RESProvConstructor( void *pThis, void *pUsrData,&lt;br /&gt;
                                                 ClUint32T usrDataLen )&lt;br /&gt;
     {&lt;br /&gt;
         ClRcT rc = CL_OK;&lt;br /&gt;
     &lt;br /&gt;
         /* Override &amp;quot;semantic check&amp;quot; virtual method in provClass*/&lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvObjectStart = clcsa104CompCSA104RESProvObjectStart; 	 &lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvValidate = (fp)clcsa104CompCSA104RESProvValidate; 	 &lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvUpdate = (fp)clcsa104CompCSA104RESProvUpdate; 	 &lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvRollback = (fp)clcsa104CompCSA104RESProvRollback;&lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvRead = (fp)clcsa104CompCSA104RESProvRead;&lt;br /&gt;
         ((CL_OM_PROV_CLASS*)pThis)-&amp;gt;clProvObjectEnd = clcsa104CompCSA104RESProvObjectEnd; &lt;br /&gt;
&lt;br /&gt;
         ...&lt;br /&gt;
&lt;br /&gt;
         return rc;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     ClRcT clcsa104CompCSA104RESProvDestructor ( void *pThis , void  *pUsrData,&lt;br /&gt;
                                                 ClUint32T usrDataLen )&lt;br /&gt;
     {&lt;br /&gt;
         ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
         ...&lt;br /&gt;
&lt;br /&gt;
         return rc;&lt;br /&gt;
     }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
The above table presents the Contructor. It initializes the function pointers defined in the Base Class.  These are the Update method, the provisioning validation method, and the provisioning rollback method.  These are declared in &amp;lt;code&amp;gt;clcsa104CompOAMPConfig.h&amp;lt;/code&amp;gt; in the class definition.  The destructor doesn't do anything except return &amp;lt;code&amp;gt;CL_OK&amp;lt;/code&amp;gt;.  There's no destruction work to do for this class.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|   clcsa104Compcsa104Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 ClRcT clcsa104CompCSA104RESProvUpdate(CL_OM_PROV_CLASS* pThis,&lt;br /&gt;
                            ClHandleT txnHandle, ClProvTxnDataT* pProvTxnData)&lt;br /&gt;
 {&lt;br /&gt;
     ClRcT rc = CL_OK;&lt;br /&gt;
&lt;br /&gt;
     /*&lt;br /&gt;
       ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
     clprintf(CL_LOG_SEV_INFO, &amp;quot;Inside the function %s&amp;quot;, __FUNCTION__);&lt;br /&gt;
&lt;br /&gt;
     ClNameT     moIdName = {0};&lt;br /&gt;
    &lt;br /&gt;
     rc = clCorMoIdToMoIdNameGet((ClCorMOIdPtrT)pProvTxnData-&amp;gt;pMoId, &amp;amp;moIdName);&lt;br /&gt;
     if (CL_OK != rc)&lt;br /&gt;
     {&lt;br /&gt;
         clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed while getting the MOId Name from moid. rc[0x%x] &amp;quot;, appname, rc);&lt;br /&gt;
         return rc;&lt;br /&gt;
     }&lt;br /&gt;
     /*&lt;br /&gt;
       ---END_APPLICATION_CODE---&lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffccaa;&amp;quot; align=&amp;quot;center&amp;quot;|   clcsa104Compcsa104Res.c&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
     switch (pProvTxnData-&amp;gt;provCmd)&lt;br /&gt;
     {&lt;br /&gt;
         case CL_COR_OP_CREATE :&lt;br /&gt;
         case CL_COR_OP_CREATE_AND_SET:&lt;br /&gt;
			&lt;br /&gt;
         /*&lt;br /&gt;
          * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: Inside create request for the object [%s] &amp;quot;, appname, moIdName.value);    &lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---END_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         break;&lt;br /&gt;
         case CL_COR_OP_SET:&lt;br /&gt;
	    &lt;br /&gt;
         /*&lt;br /&gt;
          * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         if ( pProvTxnData-&amp;gt;attrId == CSA104RES_DELTA_T)&lt;br /&gt;
         {&lt;br /&gt;
             delta_t = *(ClUint32T *)pProvTxnData-&amp;gt;pProvData;&lt;br /&gt;
             clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: The delta time is now [%d] &amp;quot;, appname, delta_t);&lt;br /&gt;
         }&lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---END_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         break;&lt;br /&gt;
&lt;br /&gt;
         case  CL_COR_OP_DELETE:&lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         /*&lt;br /&gt;
          * ---END_APPLICATION_CODE---&lt;br /&gt;
          */&lt;br /&gt;
&lt;br /&gt;
         break;&lt;br /&gt;
         default:&lt;br /&gt;
             clprintf (CL_LOG_SEV_ERROR, &amp;quot;Prov command is not proper&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     ...&lt;br /&gt;
&lt;br /&gt;
     return rc;   &lt;br /&gt;
 }&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
When the COR object associated with csa104's provisioning is updated, &amp;lt;code&amp;gt;clcsa104CompCSA104RESProvUpdate&amp;lt;/code&amp;gt; function is called. A new value is set for the &amp;lt;code&amp;gt;delta_t&amp;lt;/code&amp;gt; variable that is used to control the sleep interval in the application's main loop.&lt;br /&gt;
&lt;br /&gt;
===How to Run 104 and what to observe===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Start the application as usual with the SAFplus Platform Console.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 # cd /root/asp/bin&lt;br /&gt;
 # ./asp_console&lt;br /&gt;
&lt;br /&gt;
 cli[Test]-&amp;gt; setc 1&lt;br /&gt;
 cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Again, there are two log files to observe &amp;lt;code&amp;gt;/root/asp/var/log/csa104CompI0Log.latest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/var/log/csa104CompI1Log.latest&amp;lt;/code&amp;gt;. After running the above commands you should see the following output in these logs when using &amp;lt;code&amp;gt;tail -f&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00051 :   INFO)&lt;br /&gt;
 Component [csa104CompI0] : PID [21202]. Initializing&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00052 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00053 :   INFO)&lt;br /&gt;
    IOC Port                : 0x80&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00054 :   INFO)&lt;br /&gt;
 csa104: instantiated as component instance csa104CompI0.&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00055 :   INFO)&lt;br /&gt;
 csa104CompI0: cpmHandle = 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00056 :   INFO)&lt;br /&gt;
 csa104CompI0: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00057 :   INFO)&lt;br /&gt;
 csa104CompI0: checkpoint_initialize&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00064 :   INFO)&lt;br /&gt;
 csa104CompI0: Checkpoint service initialized (handle=0x1)&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00066 :   INFO)&lt;br /&gt;
 csa104CompI0: Checkpoint opened (handle=0x2)&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00067 :   INFO)&lt;br /&gt;
 csa104CompI0: Section created&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI1Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00049 :   INFO)&lt;br /&gt;
 Component [csa104CompI1] : PID [21209]. Initializing&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00050 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00051 :   INFO)&lt;br /&gt;
    IOC Port                : 0x81&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00052 :   INFO)&lt;br /&gt;
 csa104: instantiated as component instance csa104CompI1.&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00053 :   INFO)&lt;br /&gt;
 csa104CompI1: cpmHandle = 0x1&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00054 :   INFO)&lt;br /&gt;
 csa104CompI1: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00055 :   INFO)&lt;br /&gt;
 csa104CompI1: checkpoint_initialize&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00062 :   INFO)&lt;br /&gt;
 csa104CompI1: Checkpoint service initialized (handle=0x1)&lt;br /&gt;
Mon Jul 14 19:06:29 2008   (SCNodeI0.21209 : csa104CompEO.---.---.00064 :   INFO)&lt;br /&gt;
 csa104CompI1: Checkpoint opened (handle=0x2)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;As before, unlock the application with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsUnlock sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the active component log file you should start to see the &amp;quot;Hello World&amp;quot; lines displaying at a rate of about 1 per second.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00080 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 0)&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00085 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnStart] ****&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00087 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvObjectStart&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00089 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvValidate&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00105 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvUpdate&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00107 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvObjectEnd&lt;br /&gt;
Mon Jul 14 19:07:27 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00116 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnEnd] ****&lt;br /&gt;
Mon Jul 14 19:07:28 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00123 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 1)&lt;br /&gt;
Mon Jul 14 19:07:29 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00124 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 2)&lt;br /&gt;
Mon Jul 14 19:07:30 2008   (SCNodeI0.21202 : csa104CompEO.---.---.00125 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 3)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;In the SAFplus Platform Console return to the Slot 1 context by entering &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; until it prints the Slot 1 prompt: &amp;lt;code&amp;gt;cli[Test:SCNodeI0]-&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now set the context to the COR server using the following command:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc corServer_SCNodeI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then, dump the object tree:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objTreeShow&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see something like the following.  There may be extra entries, but you should at least see  an entry where &amp;lt;code&amp;gt;ClassName = CLASS_CSA104RES_PROV_MS0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objTreeShow&lt;br /&gt;
&lt;br /&gt;
Objects (Instance Tree):&lt;br /&gt;
    \Chassis:0&lt;br /&gt;
        \PayloadNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \PayloadNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \SCNodeRes:1&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa104Res:0&lt;br /&gt;
            (provisioning)&lt;br /&gt;
        \csa105Res:0&lt;br /&gt;
            (alarm, provisioning)&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Next, dump the &amp;lt;code&amp;gt;CLASS_CSA104RES_PROV_MS&amp;lt;/code&amp;gt; object with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objectShow \Chassis:0\csa104Res:0 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Showing Object&lt;br /&gt;
ClCorMOId:[Svc: 3] (/).(10001:0000).(10002:0000):&lt;br /&gt;
&lt;br /&gt;
[Class:0x10003] Object &lt;br /&gt;
{&lt;br /&gt;
[CSA104RES_COUNTER             ] [0x0002] = [431]&lt;br /&gt;
[CSA104RES_DELTA_T             ] [0x0003] = [1000]&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
The 3 is the service ID of the object and is the value in brackets next to the asterisk on the &amp;lt;code&amp;gt;ClassName=CLASS_CSA104RES_PROV_MSO&amp;lt;/code&amp;gt; line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now, set the delta_t attribute to 10000 instead of 1000 with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; attrSet \Chassis:0\csa104Res:0 3 null 3 -1 10000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Execution Result : Passed&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
You should see lines like the following in the logs for csa104:&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| /root/asp/var/log/csa104CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04230 :   INFO)&lt;br /&gt;
 csa104CompI0: The delta time is now [10000] &lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04232 :   INFO)&lt;br /&gt;
 Inside the function clcsa104CompCSA104RESProvObjectEnd&lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04241 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnEnd] ****&lt;br /&gt;
Mon Jul 14 19:15:59 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04248 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 510)&lt;br /&gt;
Mon Jul 14 19:16:09 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04249 :   INFO)&lt;br /&gt;
 csa104CompI0: Hello World! (count = 511)&lt;br /&gt;
Mon Jul 14 19:16:09 2008   (SCNodeI0.21202 : csa104CompEO.---.---.04254 :   INFO)&lt;br /&gt;
 **** Inside the function : [clCompAppProvTxnStart] ****&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
indicating that the component has received the updated value of delta_t&lt;br /&gt;
&lt;br /&gt;
You should also notice that the lines in the log are now being printed with a 10 second interval between lines.&lt;br /&gt;
&lt;br /&gt;
To confirm that the value of delta_t was updated you could dump the &amp;lt;code&amp;gt;CLASS_CSA104RES_PROV_MS&amp;lt;/code&amp;gt; object with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; objectShow \Chassis:0\csa104Res:0 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot; width=&amp;quot;680&amp;quot;&lt;br /&gt;
 ! style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;| SAFplus Platform Console&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Showing Object&lt;br /&gt;
ClCorMOId:[Svc: 3] (/).(10001:0000).(10002:0000):&lt;br /&gt;
&lt;br /&gt;
[Class:0x10003] Object &lt;br /&gt;
{&lt;br /&gt;
[CSA104RES_COUNTER             ] [0x0002] = [523]&lt;br /&gt;
[CSA104RES_DELTA_T             ] [0x0003] = [10000]&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;To end the example first change the state of csa104SGI0 to LockAssignment.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:COR]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then change the state to LockInstantiation.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockInstantiation sg csa104SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Then close the SAFplus Platform Console session.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; end&lt;br /&gt;
cli[Test:SCNodeI0]-&amp;gt; end&lt;br /&gt;
cli[Test]-&amp;gt; bye&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Summary and References===&lt;br /&gt;
&lt;br /&gt;
We've seen how to:&lt;br /&gt;
*Create a simple ProvOm class.&lt;br /&gt;
*Use callbacks to the class's update method to update variables in the application at runtime.&lt;br /&gt;
*Use the SAFplus Platform Console to cause the classes update method to  be invoked.&lt;br /&gt;
&lt;br /&gt;
For further reading :&lt;br /&gt;
*Clovis SAFplus Platform User Guide: sections on COR, &lt;br /&gt;
*clProvOmApi.h&lt;br /&gt;
*clOmObjectManage.h&lt;br /&gt;
*clOmApi.h&lt;/div&gt;</summary>
		<author><name>Pradeepac</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/build</id>
		<title>Doc:latest/evalguide/build</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/build"/>
				<updated>2010-08-27T11:08:57Z</updated>
		
		<summary type="html">&lt;p&gt;Pradeepac: /* Building the Evaluation System and Deploying Runtime Images */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Building the Evaluation System and Deploying Runtime Images==&lt;br /&gt;
&lt;br /&gt;
This chapter logically follows from the Installation Guide where we installed the OpenClovis SAFplus Platform SDK. The following sections use the term &amp;lt;code&amp;gt;'''&amp;lt;install_dir&amp;gt;'''&amp;lt;/code&amp;gt; to refer to the directory in which the SAFplus Platform SDK was installed.  By default, this directory is &amp;lt;code&amp;gt;/opt/clovis&amp;lt;/code&amp;gt; for root installation and &amp;lt;code&amp;gt;$HOME/clovis&amp;lt;/code&amp;gt; for non root users. The following sections describe how to build the evaluation model and deploy the runtime images so that we can run them and observe their behavior.&lt;br /&gt;
&lt;br /&gt;
===Building the Target Images===&lt;br /&gt;
&lt;br /&gt;
This section describes the steps to:&lt;br /&gt;
* Create a project area&lt;br /&gt;
* Modify OpenClovis sample applications&lt;br /&gt;
* Build SAFplus Platform and the Evaluation System&lt;br /&gt;
* Setup a configuration file to run any of the six Hardware Setups 1.1 to 2.3&lt;br /&gt;
* Create the target image.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
====Creating a Project Area====&lt;br /&gt;
&lt;br /&gt;
To work with the OpenClovis SDK Evaluation System, you will need to use the example project area provided with the SDK. A project area is designed to hold multiple models which share the SAFplus Platform source tree within the SDK installation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If you have write access to the examples area of the &amp;lt;code&amp;gt; &amp;lt;install_dir&amp;gt; &amp;lt;/code&amp;gt; you can simply use this as you project area. In this case your &amp;lt;code&amp;gt;'''&amp;lt;project_area&amp;gt;'''&amp;lt;/code&amp;gt; would be &amp;lt;code&amp;gt;'''&amp;lt;install_dir&amp;gt;/sdk-5.0/src/examples'''&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;If you do not have write access to &amp;lt;code&amp;gt;'''&amp;lt;install_dir&amp;gt;/sdk-5.0/src/examples'''&amp;lt;/code&amp;gt; create a new directory and copy the evaluation system model to it. For example:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir &amp;lt;new_project_area&amp;gt;&lt;br /&gt;
$ cp -r &amp;lt;install_dir&amp;gt;/sdk-5.0/src/examples/eval \&lt;br /&gt;
  &amp;lt;new_project_area&amp;gt;/.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
In this case your &amp;lt;code&amp;gt;'''&amp;lt;project_area&amp;gt;'''&amp;lt;/code&amp;gt; would be &amp;lt;code&amp;gt;'''&amp;lt;new_project_area&amp;gt;'''&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In either case your &amp;lt;code&amp;gt;'''&amp;lt;project_area&amp;gt;'''&amp;lt;/code&amp;gt; should have the following directory structure:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;project_area&amp;gt;&lt;br /&gt;
   |ide_workspace&lt;br /&gt;
   |+eval&lt;br /&gt;
   |   |+build&lt;br /&gt;
   |   |   |+local&lt;br /&gt;
   |   |   |   |-Makefile&lt;br /&gt;
   |   |+src&lt;br /&gt;
   |   |   |+app&lt;br /&gt;
   |   |   |+config&lt;br /&gt;
   |   |   |+doc&lt;br /&gt;
   |   |   |-target.conf&lt;br /&gt;
   |   |-Makefile&lt;br /&gt;
   |-Makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Modifying the Clovis Sample Applications====&lt;br /&gt;
&lt;br /&gt;
We have provided the option to modify and rebuild the supplied sample applications.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Modifying sample application code as you see fit:&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;br&amp;gt;The Clovis Sample Application's are located in:&lt;br /&gt;
&amp;lt;code&amp;gt; '''&amp;lt;project_area&amp;gt;/eval/src/app''' &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;The source files for the sample application components csa101comp to csa113comp are listed here. Make the necessary alteration to the csa files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Build the single/distributed target images, as discussed below.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Building SAFplus Platform and the Evaluation System====&lt;br /&gt;
&lt;br /&gt;
The next step is to build both SAFplus Platform and the evaluation model in the existing project area.&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Configure the eval model for building by running the following:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd &amp;lt;project_area&amp;gt;&lt;br /&gt;
$ &amp;lt;install_dir&amp;gt;/sdk-5.0/src/SAFplus/configure \&lt;br /&gt;
  --with-model-name=eval --with-asp-build&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will configure the eval model for deployment on the local machine.  In order to crossbuild this model for deployment on a non-native target supported by the &amp;lt;crossbuild&amp;gt; toolchain, run:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ &amp;lt;install_dir&amp;gt;/sdk-5.0/src/SAFplus/configure \&lt;br /&gt;
  --with-model-name=eval --with-asp-build \&lt;br /&gt;
  --with-cross-build=&amp;lt;crossbuild&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is possible to configure the model to be built for multiple targets by issuing as many &amp;lt;code&amp;gt;configure&amp;lt;/code&amp;gt; commands as necessary.  Each run sets up a target-specific build location at &amp;lt;code&amp;gt;&amp;lt;project_area&amp;gt;/eval/build&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If this model is to be deployed on an ATCA-based system with OpenHPI-based shelf management, enable Chassis Management with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ &amp;lt;install_dir&amp;gt;/sdk-5.0/src/SAFplus/configure \&lt;br /&gt;
  --with-model-name=eval --with-asp-build \&lt;br /&gt;
  --with-cross-build=&amp;lt;crossbuild&amp;gt; --with-cm-build=openhpi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For a complete list of options to &amp;lt;code&amp;gt;configure&amp;lt;/code&amp;gt;, including a list of available crossbuild toolchains, run:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ &amp;lt;install_dir&amp;gt;/sdk-5.0/src/SAFplus/configure --help&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the necessary crossbuild toolchain does not exist, then you must install it by downloading it adjacent to the OpenClovis SDK installer and re-running &amp;lt;i&amp;gt;install.sh&amp;lt;/i&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The configure step prepares the project area to build the eval model, with the following directory structure:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;project_area&amp;gt;&lt;br /&gt;
   |ide_workspace&lt;br /&gt;
   |+eval&lt;br /&gt;
   |   |+build&lt;br /&gt;
   |   |   |+local&lt;br /&gt;
   |   |   |   |-Makefile&lt;br /&gt;
   |   |   |+&amp;lt;crossbuild&amp;gt;&lt;br /&gt;
   |   |   |   |-Makefile&lt;br /&gt;
   |   |+src&lt;br /&gt;
   |   |   |+app&lt;br /&gt;
   |   |   |+config&lt;br /&gt;
   |   |   |+doc&lt;br /&gt;
   |   |   |-target.conf&lt;br /&gt;
   |   |+target &lt;br /&gt;
   |   |-Makefile&lt;br /&gt;
   |-Makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Build the configured model by issuing &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;'''&amp;lt;project_area&amp;gt;/eval'''&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd &amp;lt;project_area&amp;gt;/eval&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will build the eval model for all the targets it has been configured to build.  In order to do a target-specific build, issue &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; from the target-specific build location. &amp;lt;i&amp;gt;e.g.&amp;lt;/i&amp;gt; for a local build:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd &amp;lt;project_area&amp;gt;/eval/build/local&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
For a target supported by the &amp;lt;crossbuild&amp;gt; toolchain:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd &amp;lt;project_area&amp;gt;/eval/build/&amp;lt;crossbuild&amp;gt;&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For a complete list of options to &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;, run:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ make help&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The model source is located at &amp;lt;code&amp;gt;'''&amp;lt;project_area&amp;gt;/eval/src'''&amp;lt;/code&amp;gt;.  If any changes are made to this, rebuild the model by issuing another &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; from either the target-specific build location or the top project area directory.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Configuration File - target.conf====&lt;br /&gt;
Now that the code has been built we are almost ready to build images for deployment to our hardware. But first we must define the target system's configuration so that we build the correct images. A model's target system configuration is specified using a configuration file - &amp;lt;code&amp;gt;target.conf&amp;lt;/code&amp;gt;.  It is located at &amp;lt;code&amp;gt;&amp;lt;project_area&amp;gt;/eval/src/target.conf&amp;lt;/code&amp;gt;.  Open this file using your favorite editor (&amp;lt;i&amp;gt;e.g.&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;vi&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ vi &amp;lt;project_area&amp;gt;/eval/src/target.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This file specifies a number of parameters that need to be defined for a given run-time target:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;'''TRAP_IP''' (Mandatory): Specifies where the SNMP SubAgent should send traps at runtime.  If you do not have an SNMP SubAgent in your model specify '''127.0.0.1''' as the value.  &amp;lt;i&amp;gt;e.g.&amp;lt;/i&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
TRAP_IP=127.0.0.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;'''CMM_IP''' (Mandatory if deployed on an ATCA chassis): Specifies the IP address of the target system's chassis management module or shelf manager. If you are running Hardware Setup 2.1, 2.2 or 2.3 involving PC(s)/Laptop(s) then do not define this variable. &amp;lt;i&amp;gt;ATCA chassis Example&amp;lt;/i&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
CMM_IP=169.254.1.2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;'''CMM_USERNAME''' and '''CMM_PASSWORD''' (Mandatory if deployed on an ATCA chassis): Specifies the username and password required for the OpenClovis SAFplus Platform Chassis Manager to connect to the target system's chassis management module. &amp;lt;i&amp;gt;e.g.&amp;lt;/i&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
CMM_USERNAME=root&lt;br /&gt;
CMM_PASSWORD=password&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;'''INSTALL_PREREQUISITES=YES|NO''' (Mandatory): Specifies whether the target images will include 3rd party runtime prerequisites or not.  Say '''YES''' if the target nodes do not meet the target host requirements specified in the Installation section of this document.  &amp;lt;i&amp;gt;e.g.&amp;lt;/i&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
INSTALL_PREREQUISITES=YES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;'''INSTANTIATE_IMAGES=YES|NO''' (Mandatory): Specifies whether &amp;lt;code&amp;gt;make images&amp;lt;/code&amp;gt; will generate node-instance specific images instead of only generating node-type specific images.  This option is a development optimization for advanced users of OpenClovis SDK.  If unsure, say '''YES'''. &amp;lt;i&amp;gt;e.g.&amp;lt;/i&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
INSTANTIATE_IMAGES=YES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;'''CREATE_TARBALLS=YES|NO''' (Mandatory): Specifies whether the node-instance specific images created will be packaged into tarballs for deployment onto the target system.  If unsure, say '''YES'''.  &amp;lt;i&amp;gt;e.g.&amp;lt;/i&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE_TARBALLS=YES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;'''TIPC_NETID''' (Mandatory): Specifies a unique identifier used by TIPC to set up interprocess communication across the deployed OpenClovis SAFplus Platform cluster.  This is an unsigned 32-bit integer, and &amp;lt;i&amp;gt;must&amp;lt;/i&amp;gt; be unique for every model that is deployed.  &amp;lt;i&amp;gt;e.g.&amp;lt;/i&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
TIPC_NETID=1337&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;'''Node Instance Details''': These specify the node-instance specific parameters required for deploying the model. For each node in the model there is a corresponding entry in the file:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;'''SLOT_&amp;lt;node instance name&amp;gt;''' (Mandatory): Specifies which slot the node is located in.  The first slot is slot 1 -- DO NOT USE SLOT NUMBER 0, it is invalid.  When deployed to an ATCA chassis, the physical slot in which the blade is actually installed will override this value.  When deployed to regular (non-ATCA) systems, this is a logical slot and must be unique for every node in the cluster. &amp;lt;i&amp;gt;e.g.&amp;lt;/i&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
SLOT_SCNodeI0=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;'''LINK_&amp;lt;node instance name&amp;gt;''' (Optional): Specifies the ethernet interface used by the node for OpenClovis SAFplus Platform communication with the rest of the cluster.  If unspecified, this defaults to &amp;lt;code&amp;gt;eth0&amp;lt;/code&amp;gt;.  &amp;lt;i&amp;gt;e.g.&amp;lt;/i&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
LINK_SCNodeI0=eth0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;'''ARCH_&amp;lt;node instance name&amp;gt;''' (Optional if '''ARCH''' is specified): Specifies the target architecture of the node as a combination of machine architecture (MACH) and linux kernel version.  This is only required on a per-node basis if the target cluster has heterogeneous architectures across the nodes.  If it is a homogeneous cluster, a single '''ARCH''' parameter (described below) will suffice.  &amp;lt;i&amp;gt;e.g.&amp;lt;/i&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ARCH_SCNodeI0=i386/linux-2.6.14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;'''ARCH''' (Optional if node-specific '''ARCH_''' parameters are specified): Specifies the target architecture of all nodes in a homogeneous cluster as a combination of machine architecture (MACH) and linux kernel version.  Note: The build process automatically populates this variable based on the last target the model is built for.&amp;lt;i&amp;gt;e.g.&amp;lt;/i&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ARCH=i386/linux-2.6.14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
For example, if we have a three-node cluster with the following details:&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; width=&amp;quot;600&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | '''Example Node Instance Detail'''&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot;| Node Name&lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot;| Slot Number&lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot;| Link Interface&lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot;| Architecture&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|SCNodeI0&lt;br /&gt;
|1&lt;br /&gt;
|eth0&lt;br /&gt;
|i386/linux-2.6.14&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|PayloadNodeI0&lt;br /&gt;
|3&lt;br /&gt;
|eth0&lt;br /&gt;
|i386/linux-2.6.14&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|PayloadNodeI1&lt;br /&gt;
|4&lt;br /&gt;
|eth1&lt;br /&gt;
|ppc/linux-2.6.9&lt;br /&gt;
|}&lt;br /&gt;
we would specify the node instance details as:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
SLOT_SCNodeI0=1&lt;br /&gt;
SLOT_PayloadNodeI0=3&lt;br /&gt;
SLOT_PayloadNodeI1=4&lt;br /&gt;
&lt;br /&gt;
LINK_SCNodeI0=eth0&lt;br /&gt;
LINK_PayloadNodeI0=eth0&lt;br /&gt;
LINK_PayloadNodeI1=eth1&lt;br /&gt;
&lt;br /&gt;
ARCH_SCNodeI0=i386/linux-2.6.14&lt;br /&gt;
ARCH_PayloadNodeI0=i386/linux-2.6.14&lt;br /&gt;
ARCH_PayloadNodeI1=ppc/linux-2.6.9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Evaluation Kit 'Node Instance Details' Examples=====&lt;br /&gt;
The 'Node Instance Details' of your &amp;lt;code&amp;gt;target.conf&amp;lt;/code&amp;gt; file will be different depending on the hardware setup you are using for your evaluation. Below are some example settings for the various hardware setups.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&amp;lt;li&amp;gt;If you are using single node case as in Hardware Setup 1.1 or 2.1, either using one blade or PC, you set up similar to the following configuration details. Change the slot number accordingly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
SLOT_SCNodeI0=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;If you wish to set up a 3 node distributed system, as in Hardware Setup 1.2 or 2.2, your &amp;lt;code&amp;gt;target.conf&amp;lt;/code&amp;gt; file may be set up similar to the following configuration details. Again change the slot numbers accordingly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
SLOT_SCNodeI0=1&lt;br /&gt;
SLOT_PayloadNodeI0=2&lt;br /&gt;
SLOT_PayloadNodeI1=3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;If you are setting up a 4 node distributed system, as in Hardware Setup 1.3 or 2.3, you would use a configuration that is similar to the following details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
SLOT_SCNodeI0=1&lt;br /&gt;
SLOT_SCNodeI1=2&lt;br /&gt;
SLOT_PayloadNodeI0=3&lt;br /&gt;
SLOT_PayloadNodeI1=4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Building Single/Distributed Target Image(s)====&lt;br /&gt;
&lt;br /&gt;
This section describes how to build target images for particular Hardware Setups. In essence we provide two types of target image, the System Controller or Payload Node. The images are built with the &amp;lt;code&amp;gt;'''make images'''&amp;lt;/code&amp;gt; command:&lt;br /&gt;
 $ cd &amp;lt;project_area&amp;gt;/eval&lt;br /&gt;
 $ make images&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;target.conf&amp;lt;/code&amp;gt; has been configured to instantiate images and create tarballs as recommended, these are populated at &amp;lt;project_area&amp;gt;/target/eval/images.  Each node-specific image is provided as a directory containing the run-time files (binaries, libraries, prerequisites, and configuration files) as well as a tarball with the same content.  &amp;lt;i&amp;gt;e.g.&amp;lt;/i&amp;gt; For a model containing three nodes: &amp;lt;code&amp;gt;SCNodeI0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PayloadNodeI0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;PayloadNodeI1&amp;lt;/code&amp;gt;, the following are the files and directories generated for deployment on the run-time system.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;project_area&amp;gt;&lt;br /&gt;
   |+target&lt;br /&gt;
       |+&amp;lt;model&amp;gt;&lt;br /&gt;
           |+images&lt;br /&gt;
               |+SCNodeI0&lt;br /&gt;
               |   |+bin&lt;br /&gt;
               |   |+etc&lt;br /&gt;
               |   |+lib&lt;br /&gt;
               |   |+var&lt;br /&gt;
               |-SCNodeI0.tgz&lt;br /&gt;
               |+PayloadNodeI0&lt;br /&gt;
               |-PayloadNodeI0.tgz&lt;br /&gt;
               |+PayloadNodeI1&lt;br /&gt;
               |-PayloadNodeI1.tgz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Content of Target Images===&lt;br /&gt;
&lt;br /&gt;
====Content of Single Node Setup====&lt;br /&gt;
&lt;br /&gt;
If you chose to create a single node setup then the following directory structure is created.&lt;br /&gt;
Note it is not the exhaustive directory structure but instead highlights directories and files of importance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;project_area&amp;gt;target/eval/images/&lt;br /&gt;
   |-target&lt;br /&gt;
       |&lt;br /&gt;
       |-eval&lt;br /&gt;
       |   |images&lt;br /&gt;
       |   |   |-generic&lt;br /&gt;
       |   |   |   |+bin&lt;br /&gt;
       |   |   |   |+etc&lt;br /&gt;
       |   |   |   |+lib&lt;br /&gt;
       |   |   |   |+modules&lt;br /&gt;
       |   |   |   |+share&lt;br /&gt;
       |   |   |&lt;br /&gt;
       |   |   |-SCNodeI0&lt;br /&gt;
       |   |   |   |+bin&lt;br /&gt;
       |   |   |   |+etc&lt;br /&gt;
       |   |   |   |+lib&lt;br /&gt;
       |   |   |   |+modules&lt;br /&gt;
       |   |   |   |+share&lt;br /&gt;
       |   |   |&lt;br /&gt;
       |   |   |-SCNodeI0.tgz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The images directory contains everything required to deploy SAFplus Platform on the chosen runtime setup. In this case, a generic node image and one created specifically for SCNodeI0 are created, both containing the following:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;'''bin'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;contains executable binaries and scripts, such as asp_amf, asp_console and csa101.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;'''etc'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;contains XML and text configuration files for SAFplus Platform and third-party tools, as well as an init.d style script to start/stop SAFplus Platform&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;'''lib'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;libraries, including 3rd party dependencies, required by the sample applications&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;'''modules'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;kernel modules (ioc, alarm)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;'''share'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;contains snmp &amp;amp; mib information&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SCNodeI0'''&lt;br /&gt;
&lt;br /&gt;
Contains the System Controller image to be used for the single node case. This image is to be copied to the target platform.&lt;br /&gt;
&lt;br /&gt;
====Content of 3 Node Distributed Setup====&lt;br /&gt;
&lt;br /&gt;
If we are building the distributed Evaluation System, additional images for PayloadNode0 and PayloadNode1 are now utilized and this is represented within the content of the directory structure. (When compared to the single node set up, the bold directories/files represent the difference in file structure).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;project_area&amp;gt;target/eval/images/&lt;br /&gt;
   |-target&lt;br /&gt;
       |&lt;br /&gt;
       |-eval&lt;br /&gt;
       |   |images&lt;br /&gt;
       |   |   |+generic&lt;br /&gt;
       |   |   |&lt;br /&gt;
       |   |   |-PayloadNodeI0&lt;br /&gt;
       |   |   |   |+bin&lt;br /&gt;
       |   |   |   |+etc&lt;br /&gt;
       |   |   |   |+lib&lt;br /&gt;
       |   |   |   |+modules&lt;br /&gt;
       |   |   |   |+share&lt;br /&gt;
       |   |   |-PayloadNodeI0.tgz&lt;br /&gt;
       |   |   |&lt;br /&gt;
       |   |   |-PayloadNodeI1&lt;br /&gt;
       |   |   |   |+bin&lt;br /&gt;
       |   |   |   |+etc&lt;br /&gt;
       |   |   |   |+lib&lt;br /&gt;
       |   |   |   |+modules&lt;br /&gt;
       |   |   |   |+share&lt;br /&gt;
       |   |   |-PayloadNodeI1.tgz&lt;br /&gt;
       |   |   |&lt;br /&gt;
       |   |   |+SCNodeI0&lt;br /&gt;
       |   |   |-SCNodeI0.tgz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''PayloadNode0 &amp;amp; PayloadNode1'''&lt;br /&gt;
&lt;br /&gt;
These additional directories are required for a distributed setup and have a similar structure to SCNodeI0. &amp;lt;code&amp;gt;PayloadNodeI0.tgz&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;PayloadNodeI1.tgz&amp;lt;/code&amp;gt; are the corresponding zipped tar images that are to be copied to the target Payload nodes.  &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There is nothing special about which node should be the System Controller verses a Payload Node, or which node should be Payload Node 0 verses Payload Node 1. You may copy any tar image to any node -- the contents of the tar image will make the node assume the role.  The only exception is, of course, an environment that contains different hardware, for example, an Intel-based machine and a PowerPC based machine.  In that case you need to define your ARCH variables correctly (see above) and deploy images only to matching hardware.&lt;br /&gt;
&lt;br /&gt;
====Content of 4 Node Distributed Setup====&lt;br /&gt;
&lt;br /&gt;
If we are building the 4 node distributed Evaluation System, the additional image SCNodeI1 is now created and this is represented within the content of the directory structure. (When compared to the 3 node distributed set up, the bold directories/files represent the difference in file structure)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;project_area&amp;gt;target/eval/images/&lt;br /&gt;
   |-target&lt;br /&gt;
       |-eval&lt;br /&gt;
       |   |images&lt;br /&gt;
       |   |   |+generic&lt;br /&gt;
       |   |   |&lt;br /&gt;
       |   |   |+PayloadNodeI0&lt;br /&gt;
       |   |   |-PayloadNodeI0.tgz&lt;br /&gt;
       |   |   |+PayloadNodeI1&lt;br /&gt;
       |   |   |-PayloadNodeI1.tgz&lt;br /&gt;
       |   |   |+SCNodeI0&lt;br /&gt;
       |   |   |-SCNodeI0.tgz&lt;br /&gt;
       |   |   |&lt;br /&gt;
       |   |   |-SCNodeI1&lt;br /&gt;
       |   |   |   |+bin&lt;br /&gt;
       |   |   |   |+etc&lt;br /&gt;
       |   |   |   |+lib&lt;br /&gt;
       |   |   |   |+modules&lt;br /&gt;
       |   |   |   |+share&lt;br /&gt;
       |   |   |&lt;br /&gt;
       |   |   |-SCNodeI1.tgz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SCNodeI1'''&lt;br /&gt;
&lt;br /&gt;
These additional directories are required for a distributed setup and have a similar structure to SCNodeI0. SCNodeI1.tgz is the corresponding zipped tar image that needs to be copied to the second System Controller.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Runtime Software Installation===&lt;br /&gt;
&lt;br /&gt;
The hardware setups require steps to copy the runtime images from the Development Machine to the Runtime target machine(s). The following describe the necessary steps required to copy runtime images to the desired target(s).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Installing SCNodeI0====&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;On the Development Machine locate the target images&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd &amp;lt;project_area&amp;gt;/target/eval/images&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Copy the zipped tar System Controller image to the desired target.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ scp SCNodeI0.tgz root@&amp;lt;SystemController IPAddress&amp;gt;:/root/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Enter  password.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 # ssh root@&amp;lt;SystemController IPAddress&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Enter password&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 # cd /root&lt;br /&gt;
 # mkdir asp&lt;br /&gt;
 # cd asp&lt;br /&gt;
 # tar xzvf ../SCNodeI0.tgz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
This unzips and extracts the contents of &amp;lt;code&amp;gt;SCNodeI0.tgz&amp;lt;/code&amp;gt; within &amp;lt;code&amp;gt;/root/asp&amp;lt;/code&amp;gt;. The System Controller is now installed on the target.&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Note.png]] This step is necessary even if the System Controller and Management Machine are the same PC (As in Runtime Hardware Setup 2.1)&lt;br /&gt;
&lt;br /&gt;
If you are setting up a 4 node distributed setup, as in 'Runtime Hardware Setup 1.3.' repeat the above steps, replacing the IP address with SCNodeI1's and securely copying &amp;lt;code&amp;gt;SCNodeI1.tgz&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Installing PayloadNode0 and PayloadNode1====&lt;br /&gt;
&lt;br /&gt;
Perform the following, if the distributed Hardware Setup 1.2, 1.3, 2.2 and 2.3 is chosen:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On the Development machine locate the Target images&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd &amp;lt;project_area&amp;gt;/target/eval/images&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Copy the zipped tar PayloadNode0 image to the desired target.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ scp PayloadNodeI0.tgz root@&amp;lt;PayloadNode0 IPAddress&amp;gt;:/root/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Enter  password.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# ssh root@&amp;lt;PayloadNode0 IPAddress&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Enter password&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# cd /root&lt;br /&gt;
# mkdir asp&lt;br /&gt;
# cd asp&lt;br /&gt;
# tar xzvf ../PayloadNodeI0.tgz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This unzips and extracts the contents of &amp;lt;code&amp;gt;PayloadNodeI0.tgz&amp;lt;/code&amp;gt; within &amp;lt;code&amp;gt;/root/asp&amp;lt;/code&amp;gt;&lt;br /&gt;
The PayloadNode0 is now installed on its target.&lt;br /&gt;
For PayloadNode1 repeat the above 2 steps, replacing the IP address with PayloadNode1's and securely copying &amp;lt;code&amp;gt;PayloadNode1.tgz&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Summary and Next Steps===&lt;br /&gt;
&lt;br /&gt;
This chapter covers a number of possible hardware configurations and the steps required to build and install the target images. Chapter [[Doc:Evalguide/csa#Sample Applications|Sample Applications]], covers all the Evaluation applications that can be run. For each Sample Application, a description on its objective, what you will learn, key areas of code, how to run it, sample output and conclusion is provided.&lt;/div&gt;</summary>
		<author><name>Pradeepac</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/preface</id>
		<title>Doc:latest/evalguide/preface</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/preface"/>
				<updated>2010-08-27T10:50:55Z</updated>
		
		<summary type="html">&lt;p&gt;Pradeepac: /* '''Preface''' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=='''Preface'''==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;To help users gain a better understanding of our product the ''OpenClovis Evaluation System User Guide'' introduces sample applications that utilise the OpenClovis Application Services Platform (SAFplus Platform). It provides all the required information to configure and run the sample applications (or &amp;quot;models&amp;quot;) packaged within the Evaluation System. This document also provides a good understanding of OpenClovis SAFplus Platform functionality.&lt;br /&gt;
&lt;br /&gt;
This document does not cover the creation of the models through the OpenClovis IDE. For a detailed description of how to create the first example model in the OpenClovis IDE see the '''OpenClovis Sample Application Tutorial''' document.&lt;br /&gt;
 &lt;br /&gt;
===Audience===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; The ''OpenClovis Evaluation System User Guide'' is intended for individuals who wish to gain an understanding of the OpenClovis SAFplus Platform. If you wish to run this Evaluation System this document assumes you have installed the OpenClovis SAFplus Platform by following the installation steps found within the ''OpenClovis Installation Guide''.&lt;br /&gt;
&lt;br /&gt;
===Documentation Conventions===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;This guide uses different fonts and symbols to differentiate between document elements and types of information. These conventions are summarized in the following table.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#cdd6e6&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#d3e3ff&amp;quot;| Notation&lt;br /&gt;
!style=&amp;quot;background:#d3e3ff&amp;quot;| Description&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background:#ffccaa&amp;quot; | &amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;Code&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|This font denotes the C code provided in various examples.&amp;lt;br&amp;gt;This font denotes function and variable names&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background:#ffffaa&amp;quot; | &amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;Output&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Terminal Output&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;color:blue&amp;quot; | Cross reference&lt;br /&gt;
|This font denotes a hyperlink. You can click on the hyperlink text to access the reference location, which can be either a section within the guide or a URL link.&amp;lt;br&amp;gt;A cross reference refers to a section name and accesses the first page of that section.&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;code&amp;gt;Filenames&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;DIR&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Files names, Directory paths&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;code&amp;gt;$ Commands ''group_identifier''&amp;lt;/code&amp;gt; &lt;br /&gt;
| Commands to be run from a shell.&amp;lt;br&amp;gt; Italic text indicate an argument. This can be replaced with your desired value.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Definitions====&lt;br /&gt;
&amp;lt;br&amp;gt;Throughout this document the term &amp;quot;node&amp;quot; is used generically to refer to either a PC, laptop or ATCA blade.  Several nodes all running the OpenClovis SAFplus Platform combine to form one tightly coupled distributed computing environment called a &amp;quot;cluster&amp;quot;.  The number and configuration of these nodes and the applications that are running on them together form the &amp;quot;system model&amp;quot;, or just &amp;quot;model&amp;quot;.  In summary the term &amp;quot;SAFplus Platform&amp;quot; denotes the common OpenClovis programs and libraries running on all nodes in the cluster, while the term &amp;quot;model&amp;quot; denotes all of the user applications.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;[[File:OpenClovis_Note.png]]This indicates the presence of notes or annotations, related to the context of the document.&lt;br /&gt;
&amp;lt;br&amp;gt;[[File:OpenClovis_Caution.png]]This indicates that certain precautionary measures must be taken before performing a particular task.&lt;br /&gt;
&amp;lt;br&amp;gt;[[File:OpenClovis_Info.png]]This indicates that additional information is provided to you.&lt;br /&gt;
&lt;br /&gt;
===Related Documents===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;For additional information about OpenClovis products, refer to the following guides:&lt;br /&gt;
&lt;br /&gt;
* '''OpenClovis Release Notes''' provides information about the software and the hardware required to install OpenClovis Application Service Platform (SAFplus Platform) and Integrated Development Environment (IDE). It contains the additional features and enhancements of the product since the previous release. It also summarizes the issues and limitations of the product and provides workarounds wherever applicable.&lt;br /&gt;
&lt;br /&gt;
* '''OpenClovis SA Forum Compliance''' describes the level of compliance of OpenClovis SAFplus Platform and its Application Programming Interface (API) with the relevant Service Availability Forum Specifications.&lt;br /&gt;
&lt;br /&gt;
* '''OpenClovis Installation Guide''' provides the system requirements, installation procedure for OpenClovis SAFplus Platform, IDE, and the Evaluation System.&lt;br /&gt;
&lt;br /&gt;
* '''OpenClovis Sample Application Tutorial''' provides the steps to create and build a sample model using OpenClovis IDE and OpenClovis SAFplus Platform. It also provides troubleshooting information for this process. This provides the logical first step in understanding the OpenClovis offering.&lt;br /&gt;
&lt;br /&gt;
* '''OpenClovis SDK User Guide''' provides information about OpenClovis Application Service Platform (SAFplus Platform) architecture, various OpenClovis SAFplus Platform components, and their interactions. This guide helps you to configure the OpenClovis SAFplus Platform components, compile, and execute the OpenClovis SAFplus Platform code to build your custom application.&lt;br /&gt;
&lt;br /&gt;
* '''OpenClovis IDE User Guide''' describes the usage of Integrated Development Environment (IDE), a graphical development environment that complements the SAFplus Platform platform. This guide helps you to understand how to use the various features of the IDE to build the application.&lt;br /&gt;
&lt;br /&gt;
* '''OpenClovis Log Tool User Guide''' provides information about the usage of OpenClovis Log Tool. OpenClovis Log Tool is an interactive utility that allows you to view binary log files in a readable format and hence monitor system errors, warnings, and other log information. Log Tool allows you to format the &amp;lt;code&amp;gt;.log&amp;lt;/code&amp;gt; files and filter them to view the required entries.&lt;br /&gt;
&lt;br /&gt;
* '''OpenClovis API Reference Guide''' is provided for each component. It describes the Application Programming Interface (API), Service Model, and Management Information Model of the various OpenClovis Application Service Platform (SAFplus Platform) services. It helps the developer to understand the capabilities of the SAFplus Platform services and the APIs provided by these services.&lt;br /&gt;
&lt;br /&gt;
* '''OpenClovis SAFplus Platform Console Reference Guide''' provides details about managing applications built on OpenClovis SAFplus Platform using the SAFplus Platform runtime debug console commands. SAFplus Platform Console commands can be used to manage, monitor, and test your application.&lt;br /&gt;
&lt;br /&gt;
* '''Clovis Sample Application (csa) source code''' &amp;lt;br&amp;gt;For all sample applications provided with this Evaluation System, their source code has been provided within: &amp;lt;br&amp;gt;&amp;lt;code&amp;gt;&amp;lt;install_dir&amp;gt;/sdk-5.0/src/examples/eval/src/app/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Service Availability Forum (SAF)''' - http://www.saforum.org/home/ &amp;lt;br&amp;gt;Further SA Forum information can be found by clicking&amp;lt;br&amp;gt;'''Specifications''' -&amp;gt; '''Download Specifications'''.&amp;lt;br&amp;gt; Here you will be presented with a number of documents. Further information concerning Components, Service Instances, Service Groups, Component Service Instances can be found within the document '&amp;lt;code&amp;gt;SA Forum Specification Overview Document&amp;lt;/code&amp;gt;'.&lt;br /&gt;
&lt;br /&gt;
When the SDK is installed, these documents can be found within &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;install_dir&amp;gt;/sdk-5.0/doc&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As mentioned previously in the ''OpenClovis Installation Guide''. The default directory for installation is &amp;lt;code&amp;gt;/opt/clovis&amp;lt;/code&amp;gt; for root installation and &amp;lt;code&amp;gt;$HOME/clovis&amp;lt;/code&amp;gt; for non root users. Throughout this document we will use &amp;lt;code&amp;gt;&amp;lt;install_dir&amp;gt;&amp;lt;/code&amp;gt; to refer to the installation directory.&lt;br /&gt;
&lt;br /&gt;
===References to Linux Distributions===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Throughout this document we refer constantly to the Linux Distribution (distro) or similar. Our SDK works on Ubuntu 7.04, and is known to work on a wide range of Linux 2.6 distributions.  We are committed to supporting any Linux distribution that our customers require.&lt;br /&gt;
&lt;br /&gt;
===OpenClovis Online Technical Support===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;OpenClovis customers and partners can register on our Web site and receive personalized services and information. If you need any support or assistance while working on OpenClovis products, you can access the following: URL: http://www.openclovis.com. Send your queries to: support@openclovis.com. Open source community support is available at: http://www.openclovis.org/forum.&lt;br /&gt;
&lt;br /&gt;
===Documentation Feedback===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;We are interested in hearing from our customers on the documentation provided with the product. Let us know your comments and suggestions on improving the documentation at OpenClovis Inc. Send your comments to: support@openclovis.com. Post your feedback on documentation at: http://www.openclovis.org/forum.&lt;/div&gt;</summary>
		<author><name>Pradeepac</name></author>	</entry>

	</feed>