<?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=Senthilk</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=Senthilk"/>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Special:Contributions/Senthilk"/>
		<updated>2026-04-25T10:01:21Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.20.2</generator>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/awdguideCrawler</id>
		<title>Doc:latest/awdguideCrawler</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/awdguideCrawler"/>
				<updated>2010-08-27T05:14:05Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Table of contents:&lt;br /&gt;
&lt;br /&gt;
* [[Doc:sdk_4.1/awdguide/preface | Preface ]]&lt;br /&gt;
* [[Doc:sdk_4.1/awdguide/overview | Overview ]]&lt;br /&gt;
* [[Doc:sdk_4.1/awdguide/deppkg | Deployment and Packaging ]]&lt;br /&gt;
* [[Doc:sdk_4.1/awdguide/swmgmt | Software Management ]]&lt;br /&gt;
** [[Doc:sdk_4.1/awdguide/appbundle | Application Bundle Format ]]&lt;br /&gt;
* [[Doc:sdk_4.1/awdguide/pms | Plaftorm Management (ATCA chassis) ]]&lt;br /&gt;
* [[Doc:sdk_4.1/awdguide/screens | Screens ]]&lt;br /&gt;
** [[Doc:sdk_4.1/awdguide/login | Login ]]&lt;br /&gt;
** [[Doc:sdk_4.1/awdguide/frame | AWD Frame and Common Elements ]]&lt;br /&gt;
** [[Doc:sdk_4.1/awdguide/nodes | Nodes Page ]]&lt;br /&gt;
*** [[Doc:sdk_4.1/awdguide/newnode | New Node Page ]]&lt;br /&gt;
** [[Doc:sdk_4.1/awdguide/applications | Applications (SAF Software Bundles) Page ]]&lt;br /&gt;
*** [[Doc:sdk_4.1/awdguide/deploy | Application Deployment Page ]]&lt;br /&gt;
** [[Doc:sdk_4.1/awdguide/deployments | Deployments (SAF Service Groups) Page ]]&lt;br /&gt;
** [[Doc:sdk_4.1/awdguide/programs | Programs (SAF Components) Page ]]&lt;br /&gt;
** [[Doc:sdk_4.1/awdguide/upgrade | Upgrade Page ]]&lt;br /&gt;
** [[Doc:sdk_4.1/awdguide/nodedetails |  Node Details Page ]]&lt;br /&gt;
** [[Doc:sdk_4.1/awdguide/deploymentdetails |  Deployment Details (Service Group) Page ]]&lt;br /&gt;
*** [[Doc:sdk_4.1/awdguide/si | Application Work Details (SAF Service Instance) Page ]]&lt;br /&gt;
* [[Doc:Sdk_4.1/awdguide/apiexamples | API Examples]]&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/awdguide</id>
		<title>Doc:latest/awdguide</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/awdguide"/>
				<updated>2010-08-27T05:13:09Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Table of contents:&lt;br /&gt;
&lt;br /&gt;
* [[Doc:sdk_4.1/awdguide/preface | Preface ]]&lt;br /&gt;
* [[Doc:sdk_4.1/awdguide/overview | Overview ]]&lt;br /&gt;
* [[Doc:sdk_4.1/awdguide/deppkg | Deployment and Packaging ]]&lt;br /&gt;
* [[Doc:sdk_4.1/awdguide/swmgmt | Software Management ]]&lt;br /&gt;
** [[Doc:sdk_4.1/awdguide/swmgmt#Software_Lifecycle | Software Lifecycle ]]&lt;br /&gt;
** [[Doc:sdk_4.1/awdguide/appbundle | Application Bundle Format ]]&lt;br /&gt;
* [[Doc:sdk_4.1/awdguide/upgradedirector | Upgrade Director ]]&lt;br /&gt;
* [[Doc:sdk_4.1/awdguide/pms | Plaftorm Management (ATCA chassis) ]]&lt;br /&gt;
* [[Doc:sdk_4.1/awdguide/screens | Screens ]]&lt;br /&gt;
** [[Doc:sdk_4.1/awdguide/login | Login ]]&lt;br /&gt;
** [[Doc:sdk_4.1/awdguide/frame | AWD Frame and Common Elements ]]&lt;br /&gt;
** [[Doc:sdk_4.1/awdguide/nodes | Nodes Page ]]&lt;br /&gt;
*** [[Doc:sdk_4.1/awdguide/newnode | New Node Page ]]&lt;br /&gt;
** [[Doc:sdk_4.1/awdguide/applications | Applications (SAF Software Bundles) Page ]]&lt;br /&gt;
*** [[Doc:sdk_4.1/awdguide/deploy | Application Deployment Page ]]&lt;br /&gt;
** [[Doc:sdk_4.1/awdguide/deployments | Deployments (SAF Service Groups) Page ]]&lt;br /&gt;
** [[Doc:sdk_4.1/awdguide/programs | Programs (SAF Components) Page ]]&lt;br /&gt;
** [[Doc:sdk_4.1/awdguide/upgrade | Upgrade Page ]]&lt;br /&gt;
** [[Doc:sdk_4.1/awdguide/nodedetails |  Node Details Page ]]&lt;br /&gt;
** [[Doc:sdk_4.1/awdguide/deploymentdetails |  Deployment Details (Service Group) Page ]]&lt;br /&gt;
*** [[Doc:sdk_4.1/awdguide/si | Application Work Details (SAF Service Instance) Page ]]&lt;br /&gt;
* [[Doc:Sdk_4.1/awdguide/apiexamples | API Examples]]&lt;br /&gt;
* [[Doc:Sdk_4.1/awdguide/releasenotes | Release Notes]]&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Deadpages/Doc:Sdk_5.0/taeguide</id>
		<title>Deadpages/Doc:Sdk 5.0/taeguide</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Deadpages/Doc:Sdk_5.0/taeguide"/>
				<updated>2010-08-27T05:11:29Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Table of contents:&lt;br /&gt;
&lt;br /&gt;
* [[Doc:sdk_4.1/taeguide/preface | Preface ]]&lt;br /&gt;
* [[Doc:sdk_4.1/taeguide/overview | Overview ]]&lt;br /&gt;
* [[Doc:sdk_4.1/taeguide/deppkg | Deployment and Packaging ]]&lt;br /&gt;
* [[Doc:sdk_4.1/taeguide/testimpl | Testcase Implementation ]]&lt;br /&gt;
* [[Doc:sdk_4.1/taeguide/testintg | Testcase Integration]]&lt;br /&gt;
* [[Doc:sdk_4.1/taeguide/runtae | Running the TAE ]]&lt;br /&gt;
* [[Doc:sdk_4.1/taeguide/reportserver | TAE Report Server]]&lt;br /&gt;
** [[Doc:sdk_4.1/taeguide/screens | Screens ]]&lt;br /&gt;
*** [[Doc:sdk_4.1/taeguide/projects | Projects ]]&lt;br /&gt;
*** [[Doc:sdk_4.1/taeguide/projectSummary | Project Summary ]]&lt;br /&gt;
*** [[Doc:sdk_4.1/taeguide/reports | Test Reports ]]&lt;br /&gt;
*** [[Doc:sdk_4.1/taeguide/testreport | Test Report in Detail ]]&lt;br /&gt;
*** [[Doc:sdk_4.1/taeguide/logfiles | TAE log files and Node postmortem files ]]&lt;br /&gt;
*** [[Doc:sdk_4.1/taeguide/models | Models ]]&lt;br /&gt;
*** [[Doc:sdk_4.1/taeguide/fixtures | TAE Fixtures ]]&lt;br /&gt;
*** [[Doc:sdk_4.1/taeguide/testcases | Testcases ]]&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/taeguide</id>
		<title>Doc:latest/taeguide</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/taeguide"/>
				<updated>2010-08-27T05:11:29Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Table of contents:&lt;br /&gt;
&lt;br /&gt;
* [[Doc:sdk_4.1/taeguide/preface | Preface ]]&lt;br /&gt;
* [[Doc:sdk_4.1/taeguide/overview | Overview ]]&lt;br /&gt;
* [[Doc:sdk_4.1/taeguide/deppkg | Deployment and Packaging ]]&lt;br /&gt;
* [[Doc:sdk_4.1/taeguide/testimpl | Testcase Implementation ]]&lt;br /&gt;
* [[Doc:sdk_4.1/taeguide/testintg | Testcase Integration]]&lt;br /&gt;
* [[Doc:sdk_4.1/taeguide/runtae | Running the TAE ]]&lt;br /&gt;
* [[Doc:sdk_4.1/taeguide/reportserver | TAE Report Server]]&lt;br /&gt;
** [[Doc:sdk_4.1/taeguide/screens | Screens ]]&lt;br /&gt;
*** [[Doc:sdk_4.1/taeguide/projects | Projects ]]&lt;br /&gt;
*** [[Doc:sdk_4.1/taeguide/projectSummary | Project Summary ]]&lt;br /&gt;
*** [[Doc:sdk_4.1/taeguide/reports | Test Reports ]]&lt;br /&gt;
*** [[Doc:sdk_4.1/taeguide/testreport | Test Report in Detail ]]&lt;br /&gt;
*** [[Doc:sdk_4.1/taeguide/logfiles | TAE log files and Node postmortem files ]]&lt;br /&gt;
*** [[Doc:sdk_4.1/taeguide/models | Models ]]&lt;br /&gt;
*** [[Doc:sdk_4.1/taeguide/fixtures | TAE Fixtures ]]&lt;br /&gt;
*** [[Doc:sdk_4.1/taeguide/testcases | Testcases ]]&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/taeguide/screens</id>
		<title>Doc:latest/taeguide/screens</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/taeguide/screens"/>
				<updated>2010-08-27T05:10:25Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Screens==&lt;br /&gt;
&lt;br /&gt;
Below is a list of some of the screen shots of various tabs present on OpenClovis Test Automation Environment page:&lt;br /&gt;
&lt;br /&gt;
* [[Doc:sdk_4.1/taeguide/projects | Projects ]]&lt;br /&gt;
* [[Doc:sdk_4.1/taeguide/projectSummary | Project Summary ]]&lt;br /&gt;
* [[Doc:sdk_4.1/taeguide/reports | Test Reports ]]&lt;br /&gt;
* [[Doc:sdk_4.1/taeguide/testreport | Test Report in Detail ]]&lt;br /&gt;
* [[Doc:sdk_4.1/taeguide/logfiles | TAE log files and Node postmortem files ]]&lt;br /&gt;
* [[Doc:sdk_4.1/taeguide/models | Models ]]&lt;br /&gt;
* [[Doc:sdk_4.1/taeguide/fixtures | TAE Fixtures ]]&lt;br /&gt;
* [[Doc:sdk_4.1/taeguide/testcases | Testcases ]]&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/taeguide/reportserver</id>
		<title>Doc:latest/taeguide/reportserver</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/taeguide/reportserver"/>
				<updated>2010-08-27T05:08:54Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TAE report server configuration and monitoring&lt;br /&gt;
&lt;br /&gt;
===Start taereport server ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cd &amp;lt;TAEBASE&amp;gt;/tae/taereport&lt;br /&gt;
# python start-taereport.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You should preferably start this server as a background job.&lt;br /&gt;
&lt;br /&gt;
once TAE report server is started, the interface can be accessed through a browser using URL &amp;quot;http://localhost:5000&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Server Configuration files and parameters===&lt;br /&gt;
&lt;br /&gt;
*dev.cfg (present in directory &amp;lt;TAEBASE&amp;gt;/tae/taereport)&amp;lt;br/&amp;gt;&lt;br /&gt;
It contains several configurations but the configuration which user would be interested is &amp;quot;server port&amp;quot;. By default this value is set to 5000&lt;br /&gt;
&lt;br /&gt;
===Report directory===&lt;br /&gt;
All TAE reports should be submitted to the directory &amp;quot;&amp;lt;TAEBASE&amp;gt;/tae/taereport/import&amp;quot;. taereport server continuously polls for report(s) and if present it processes the    report(s) and uploads the processed result(s) to the report server. These reports could be accessed through a browser by opening report server interface using &amp;quot;http://localhost:5000&amp;quot; and then browsing to the correct project and the reports.&lt;br /&gt;
&lt;br /&gt;
* [[Doc:sdk_4.1/taeguide/screens | Screens ]]&lt;br /&gt;
** [[Doc:sdk_4.1/taeguide/projects | Projects ]]&lt;br /&gt;
** [[Doc:sdk_4.1/taeguide/projectSummary | Project Summary ]]&lt;br /&gt;
** [[Doc:sdk_4.1/taeguide/reports | Test Reports ]]&lt;br /&gt;
** [[Doc:sdk_4.1/taeguide/testreport | Test Report in Detail ]]&lt;br /&gt;
** [[Doc:sdk_4.1/taeguide/logfiles | TAE log files and Node postmortem files ]]&lt;br /&gt;
** [[Doc:sdk_4.1/taeguide/models | Models ]]&lt;br /&gt;
** [[Doc:sdk_4.1/taeguide/fixtures | TAE Fixtures ]]&lt;br /&gt;
** [[Doc:sdk_4.1/taeguide/testcases | Testcases ]]&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/taeguide/runtae</id>
		<title>Doc:latest/taeguide/runtae</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/taeguide/runtae"/>
				<updated>2010-08-27T05:08:14Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===TAE help===&lt;br /&gt;
&lt;br /&gt;
To know about various TAE options, you can use &amp;quot;tae --help&amp;quot;. This provides detailed information about all the TAE options and their usage.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# &amp;lt;TAEBASE&amp;gt;/tae/tae --help&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br /&gt;
~~~~~~~  OpenClovis Test Automation Environment (TAE) - Version 0.8 ~~~~~~~~~~&lt;br /&gt;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
  tae [options] [command]&lt;br /&gt;
Options:&lt;br /&gt;
  -h, --help    This help page&lt;br /&gt;
  fetch&lt;br /&gt;
  -f, --force   Force action despite stamp shows it has been completed in&lt;br /&gt;
                previous session, but executing unfinished prerequisites&lt;br /&gt;
  -i, --ignore  Ignore prerequisites. Same as -f (--force), but it does not&lt;br /&gt;
                check for prerequisites. This should be used only if you&lt;br /&gt;
                specifically want to skip prerequisites.&lt;br /&gt;
  -q, --quiet   Be more quiet (can be issued multiple times)&lt;br /&gt;
  -v, --verbose Be more verbose (can be issued multiple times)&lt;br /&gt;
  -s, --suppress&lt;br /&gt;
                Do not show testcase error details on TAE console output&lt;br /&gt;
  -u, --unload-tipc&lt;br /&gt;
                Unload the tipc kernel module before starting SAFplus Platform during the&lt;br /&gt;
                start stage&lt;br /&gt;
  -b, --no-nodeinfo&lt;br /&gt;
                Do not show nodeinfo/bladeinfo for each fixture node. By&lt;br /&gt;
                default this information is requested and printed for each node&lt;br /&gt;
  -w &amp;lt;cols&amp;gt;, --width=&amp;lt;cols&amp;gt;&lt;br /&gt;
                Use this width instead of the actual width of the terminal&lt;br /&gt;
                when printing results to output&lt;br /&gt;
  -c, --clean   Run a 'make clean' before configure&lt;br /&gt;
  -r, --revert  Run an 'svn revert' on any SVN-based images before running&lt;br /&gt;
                'svn update' on the tree&lt;br /&gt;
  --show-config Shows all the config attributes parsed from the config files&lt;br /&gt;
                and then quits&lt;br /&gt;
  -o &amp;lt;variable&amp;gt;=[&amp;lt;value&amp;gt;]&lt;br /&gt;
                Allow manual override of a config attribute&lt;br /&gt;
  -d            Start tae in debug mode. Any Python error will launch a JIT&lt;br /&gt;
                Python debug (pdb) session, allowing quick code analyzis.&lt;br /&gt;
                This applies to Python errors in testcases too, which would&lt;br /&gt;
                otherwise let TAE to continue&lt;br /&gt;
  -n, --netid   Manual override of the TIPC netid that will be used on the&lt;br /&gt;
                target&lt;br /&gt;
  -p &amp;lt;port&amp;gt;, --gms-port=&amp;lt;port&amp;gt;&lt;br /&gt;
                Manual override of the GMS port number used on the target&lt;br /&gt;
  -m &amp;lt;mcast-ip&amp;gt;, --gms-mcast=&amp;lt;mcast-ip&amp;gt;&lt;br /&gt;
                Manual override of the GMS multicast IP address&lt;br /&gt;
  -L, --list    List test cases in model&lt;br /&gt;
  -l &amp;lt;file&amp;gt;, --log=&amp;lt;file&amp;gt;&lt;br /&gt;
                Put detailed tae log here (default is log/tae.log)&lt;br /&gt;
  -t &amp;lt;filter&amp;gt;, --testcase-filter=&amp;lt;filter&amp;gt;&lt;br /&gt;
                Execute test cases matching this filter expression only (by&lt;br /&gt;
                default all testcases in model are executed). A filter&lt;br /&gt;
                expression is a testcase identifier, with wildcard characters&lt;br /&gt;
                also allowed. Examples:&lt;br /&gt;
                    TAE-TST-ACC.TC001&lt;br /&gt;
                    TAE-TST-ACC.TC0??&lt;br /&gt;
                    *-ACC*&lt;br /&gt;
                    *TC001&lt;br /&gt;
  -T &amp;lt;file&amp;gt;, --testcase-file=&amp;lt;file&amp;gt;&lt;br /&gt;
                Execute test cases specified in this file. The first word of&lt;br /&gt;
                each line is treated as a filter expression which will be&lt;br /&gt;
                matched against testcase ids. Lines started with a comment&lt;br /&gt;
                character (#) are ignored.&lt;br /&gt;
  -C &amp;lt;config-file&amp;gt;, --config=&amp;lt;file&amp;gt;&lt;br /&gt;
                Config file to define the model, fixture, mapping, and other&lt;br /&gt;
                operational parameters. This information can be provided in&lt;br /&gt;
                one single file, or can be separated into multiple config&lt;br /&gt;
                files. To read more than one config file this option can be&lt;br /&gt;
                used repeatedly. If the same configuration attribute is defined&lt;br /&gt;
                in more than one file, the last read file takes precedence.&lt;br /&gt;
                If no config file is specified, tae will attempt to&lt;br /&gt;
                read all local files with '*.cfg' extensions in alphabetical&lt;br /&gt;
                order.&lt;br /&gt;
&lt;br /&gt;
  Deprecated config file options:&lt;br /&gt;
  The following four options are still allowed, but their use is deprecated.&lt;br /&gt;
  Use the -C option instead to read any and all config files.&lt;br /&gt;
  -E &amp;lt;file&amp;gt;, --environment=&amp;lt;file&amp;gt;&lt;br /&gt;
                Environment definition config file.&lt;br /&gt;
  -F &amp;lt;file&amp;gt;, --fixture=&amp;lt;file&amp;gt;&lt;br /&gt;
                Test fixture config file.&lt;br /&gt;
  -M &amp;lt;file&amp;gt;, --model=&amp;lt;file&amp;gt;&lt;br /&gt;
                Model definition config file.&lt;br /&gt;
  -P &amp;lt;file&amp;gt;, --mapping=&amp;lt;file&amp;gt;&lt;br /&gt;
                Model node name to fixture node mapping config.&lt;br /&gt;
&lt;br /&gt;
Command:&lt;br /&gt;
&lt;br /&gt;
  Command describes what needs to be done in terms of the sequential stages&lt;br /&gt;
  of a full test run. The following stages are defined (in the order of&lt;br /&gt;
  progression):&lt;br /&gt;
&lt;br /&gt;
    fetch, populate, configure, build, package, deploy, start, test, stop&lt;br /&gt;
&lt;br /&gt;
  The following forms are allowed as command:&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;stage&amp;gt;     Run up to this stage, doing all prerequisites (any previous&lt;br /&gt;
                stages that were not done yet)&lt;br /&gt;
&lt;br /&gt;
  When no command is specified, the last stage  (report) is assumed to be the&lt;br /&gt;
  target stage.&lt;br /&gt;
&lt;br /&gt;
  When combined with the -f (--force) option, the command can be in either of&lt;br /&gt;
  the following forms:&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;stage&amp;gt;     Redo this stage even if it has been done before. Also do all&lt;br /&gt;
                prerequisite stages if they have not been completed yet&lt;br /&gt;
    &amp;lt;stage&amp;gt;    Redo all stages from fetch to the named stage, even if all or&lt;br /&gt;
                some have been done previously.&lt;br /&gt;
    &amp;lt;stage&amp;gt;:    Starting from named stage, redo everything&lt;br /&gt;
    &amp;lt;st1&amp;gt;:&amp;lt;st2&amp;gt; Redo everything from stage st1 through stage st2&lt;br /&gt;
&lt;br /&gt;
  When the -i (--ignore) option used, TAE does not check for prerequisites,&lt;br /&gt;
  but attempt to run the specified stage or stages. It implies the -f (--force)&lt;br /&gt;
  option.&lt;br /&gt;
&lt;br /&gt;
  The meanings of these stages are:&lt;br /&gt;
&lt;br /&gt;
    fetch       Fetch model for purpose of test case extract&lt;br /&gt;
    populate    Grab the images and populate working dirs for build&lt;br /&gt;
    configure   Configure the project for target fixture&lt;br /&gt;
    build       Build project for target fixture&lt;br /&gt;
    package     Package project for target fixture deployment&lt;br /&gt;
    deploy      Deploy images to target fixture&lt;br /&gt;
    start       Bring up SAFplus Platform on target fixture&lt;br /&gt;
    test        Run all or selected tests&lt;br /&gt;
    stop        Shut down SAFplus Platform on target fixture&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TAE configuration files===&lt;br /&gt;
To run TAE with your model, you need to create a directory (rest of the document will refer to this directory using the symbol &amp;lt;TAECFGDIR&amp;gt;). It is generally a good idea to create separate &amp;lt;TAECFGDIR&amp;gt; for testing different models. A &amp;lt;TAECFGDIR&amp;gt; should contain at least following configuration files (these are just sample files, you need to change the configuration according to your requirement):&lt;br /&gt;
&lt;br /&gt;
====mapping.cfg====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- This file maps SAFplus Platform model node names to fixture node names --&amp;gt;&lt;br /&gt;
&amp;lt;map_config ver=&amp;quot;1.0.0.0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;mapping&amp;gt;&lt;br /&gt;
    &amp;lt;SCNode0  node=&amp;quot;node1&amp;quot; role=&amp;quot;controller&amp;quot; order=&amp;quot;1&amp;quot; asp_dir=&amp;quot;/root/simulation/asp1&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;SCNode1  node=&amp;quot;node2&amp;quot; role=&amp;quot;controller&amp;quot; order=&amp;quot;2&amp;quot; asp_dir=&amp;quot;/root/simulation/asp2&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;WorkerNode0  node=&amp;quot;node3&amp;quot; role=&amp;quot;worker&amp;quot; order=&amp;quot;3&amp;quot; asp_dir=&amp;quot;/root/simulation/asp3&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;WorkerNode1  node=&amp;quot;node4&amp;quot; role=&amp;quot;worker&amp;quot; order=&amp;quot;4&amp;quot; asp_dir=&amp;quot;/root/simulation/asp4&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;WorkerNode2  node=&amp;quot;node5&amp;quot; role=&amp;quot;worker&amp;quot; order=&amp;quot;5&amp;quot; asp_dir=&amp;quot;/root/simulation/asp5&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;WorkerNode3  node=&amp;quot;node6&amp;quot; role=&amp;quot;worker&amp;quot; order=&amp;quot;6&amp;quot; asp_dir=&amp;quot;/root/simulation/asp6&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;WorkerNode4  node=&amp;quot;node7&amp;quot; role=&amp;quot;worker&amp;quot; order=&amp;quot;7&amp;quot; asp_dir=&amp;quot;/root/simulation/asp7&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;WorkerNode5  node=&amp;quot;node8&amp;quot; role=&amp;quot;worker&amp;quot; order=&amp;quot;8&amp;quot; asp_dir=&amp;quot;/root/simulation/asp8&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/mapping&amp;gt;&lt;br /&gt;
  &amp;lt;gms mcast_port=&amp;quot;8788&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;tipc netid=&amp;quot;8239&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/map_config&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Where SCNode0, SCNode1, WorkerNode0, etc are the node instances of the model. You also need to mention the role of the node instance. The &amp;quot;order&amp;quot; field is used to set the order of SAFplus Platform bring up on the nodes. &amp;quot;mcast_port&amp;quot; in gms tag can be used to override the value of &amp;quot;GMS_MCAST_PORT&amp;quot; present in &amp;quot;&amp;lt;model&amp;gt;/src/target.conf&amp;quot; Similarly &amp;quot;netid&amp;quot; in tipc tag can be used to override the value of &amp;quot;TIPC_NETID&amp;quot; (these values will be overridden in the &amp;quot;package&amp;quot; stage of TAE)&lt;br /&gt;
*asp_dir attribute is required only when TAE has to run in simulation setup(It deploys the asp images to specified directory), otherwise this attribute has to be removed.&lt;br /&gt;
&lt;br /&gt;
====fixture.cfg====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;fixture_config ver=&amp;quot;1.0.0.0&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;build_server ip='localhost' os='kubuntu' user='build_user' password='password' /&amp;gt;&lt;br /&gt;
 &amp;lt;nodes&amp;gt;&lt;br /&gt;
  &amp;lt;node1 ip='10.10.3.10' os='wrs-pnele-1.4' crossbuild='i586-wrl-pnele1.4-2.6.14-mpcbl0001' user=&amp;quot;root&amp;quot; password=&amp;quot;password-of-this-node&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;node2 ip='10.10.3.20' os='wrs-pnele-1.4' crossbuild='i586-wrl-pnele1.4-2.6.14-mpcbl0001' user=&amp;quot;root&amp;quot; password=&amp;quot;password-of-this-node&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;node3 ip='10.10.3.30' os='wrs-pnele-1.4' crossbuild='i586-wrl-pnele1.4-2.6.14-mpcbl0001' user=&amp;quot;root&amp;quot; password=&amp;quot;password-of-this-node&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;node4 ip='10.10.3.40' os='wrs-pnele-1.4' crossbuild='i586-wrl-pnele1.4-2.6.14-mpcbl0001' user=&amp;quot;root&amp;quot; password=&amp;quot;password-of-this-node&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;node5 ip='10.10.3.50' os='wrs-pnele-1.4' crossbuild='i586-wrl-pnele1.4-2.6.14-mpcbl0001' user=&amp;quot;root&amp;quot; password=&amp;quot;password-of-this-node&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;node6 ip='10.10.3.60' os='wrs-pnele-1.4' crossbuild='i586-wrl-pnele1.4-2.6.14-mpcbl0001' user=&amp;quot;root&amp;quot; password=&amp;quot;password-of-this-node&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;node7 ip='10.10.3.90' os='wrs-pnele-1.4' crossbuild='i586-wrl-pnele1.4-2.6.14-mpcbl0001' user=&amp;quot;root&amp;quot; password=&amp;quot;password-of-this-node&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;node8 ip='10.10.3.100' os='wrs-pnele-1.4' crossbuild='i586-wrl-pnele1.4-2.6.14-mpcbl0001' user=&amp;quot;root&amp;quot; password=&amp;quot;password-of-this-node&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/nodes&amp;gt;&lt;br /&gt;
 &amp;lt;description&amp;gt;&lt;br /&gt;
    HP 14-slot chassis with MPCBL0001 cards&lt;br /&gt;
 &amp;lt;/description&amp;gt;&lt;br /&gt;
 &amp;lt;lockfile value=&amp;quot;/home/build_user/run_tae/test_on_hp/hp_chassis.lock&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;!--simulation value=&amp;quot;yes&amp;quot;/--&amp;gt;&lt;br /&gt;
&amp;lt;/fixture_config&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Normally the build server (where the SAFplus Platform code along with the model is compiled) is localhost (the same machine from where TAE is being run). One can use any other machine on the network for this purpose by specifying the ip, username and password of that machine. &amp;lt;nodes&amp;gt; tag contains the information about the machines where SAFplus Platform will be running during the test run. &lt;br /&gt;
*&amp;quot;crossbuild&amp;quot; attribute in node&amp;lt;number&amp;gt; tag is used for the purpose of building the SAFplus Platform binaries for the machine which is architecturally different than the build machine. The value of &amp;quot;crossbuild&amp;quot; attribute should be the name of the toolchain present for that kind of achitecture (located in &amp;lt;sdk-dir&amp;gt;/buildtools/&amp;quot;). If architecture of build and target machine are same, then &amp;quot;crossbuild&amp;quot; field has to be removed. &lt;br /&gt;
*lockfile tag can be used to maintain the integrity of the test. Once specified it doesn't allow any other test to use the same fixture. This way you can avoid interrupting an already running test on the same fixture.&lt;br /&gt;
*simulation value is used only when tae has to be run in simulation mode i.e. more than one node on same machine.&lt;br /&gt;
&lt;br /&gt;
====model.cfg====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;model_config ver=&amp;quot;1.0.0.0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;project value=&amp;quot;CLASP3.1&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;models&amp;gt;&lt;br /&gt;
  &amp;lt;amsTestGeneric&amp;gt;&lt;br /&gt;
    &amp;lt;image_source value=&amp;quot;dir:~/run_tae/test_on_hp/asptest3.1/&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!--image_source value=&amp;quot;svn://&amp;lt;svn-user&amp;gt;:&amp;lt;password&amp;gt;@clovisforge.openclovis.org:8888/svn/asptest/branches/3.1&amp;quot; /--&amp;gt;&lt;br /&gt;
    &amp;lt;make_options value=&amp;quot;AMS_PERF_TEST=1&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/amsTestGeneric&amp;gt;&lt;br /&gt;
&amp;lt;/models&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;asp&amp;gt;&lt;br /&gt;
  &amp;lt;image_source value=&amp;quot;dir:~/run_tae/test_on_hp/clasp3.1/&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;!--image_source value=&amp;quot;http://&amp;lt;ip&amp;gt;/&amp;lt;path-to-the-tarball&amp;gt;/openclovis-sdk-3.1-latest.tar.gz&amp;quot; /--&amp;gt;&lt;br /&gt;
  &amp;lt;!--image_source value=&amp;quot;svn://&amp;lt;svn-user&amp;gt;:&amp;lt;password&amp;gt;@clovisforge.openclovis.org:8888/svn/clasp/branches/3.1/maint/&amp;quot; /--&amp;gt;&lt;br /&gt;
&amp;lt;/asp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;testcase_dir  value=&amp;quot;~/run_tae/test_on_hp/asptest3.1&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;buildserver&amp;gt;&lt;br /&gt;
    &amp;lt;sdk_root_dir value=&amp;quot;/opt/clovis&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;asp_dir      value=&amp;quot;~/run_tae/test_on_hp/clasp3.1&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;project_dir  value=&amp;quot;~/run_tae/test_on_hp/asptest3.1&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/buildserver&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--skip_stages value=&amp;quot;start&amp;quot; /--&amp;gt;&lt;br /&gt;
&amp;lt;/model_config&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* This file contains the model specific configurations like model name, make options, source code directory etc. In the above sample file &amp;quot;amsTestGeneric&amp;quot; is the model name. &lt;br /&gt;
&lt;br /&gt;
* Below are the description of all the tags in the model.cfg file:&lt;br /&gt;
** &amp;lt;image_source&amp;gt;: In this attribute, we have to specify the location of SAFplus Platform source code and model directory. This can be any directory on build server (In the example it is ~/run_tae/test_on_hp/clasp3.1/ directory on build server) or it can be the path from where we have to checkout from SVN or any other repository or it can be any link on internet or ftp details.&lt;br /&gt;
** &amp;lt;make_options&amp;gt;: In this tag we provide all the flags with which we have to compile the code. In the example above it is AMS_PERF_TEST=1. So, code will be compiled with &amp;quot;make AMS_PERF_TEST=1&amp;quot;.&lt;br /&gt;
** &amp;lt;testcase_dir&amp;gt;: It is the directory where all test cases of the model will be present.&lt;br /&gt;
** &amp;lt;sdk_root_dir&amp;gt;: In this we specify the directory where sdk is installed.&lt;br /&gt;
** &amp;lt;asp_dir&amp;gt;: In this we specify the directory where SAFplus Platform is checked out.&lt;br /&gt;
** &amp;lt;project_dir&amp;gt;: In this we specify the directory where model is checked out.&lt;br /&gt;
** &amp;lt;skip_stages&amp;gt;: By specifying this we can skip some of the steps of complete tae run. &lt;br /&gt;
&lt;br /&gt;
*There are many ways to specify the location of SAFplus Platform source code. &amp;quot;dir:&amp;quot; can be used to specify the local directory as the source code directory for SAFplus Platform in the &amp;lt;asp&amp;gt; &amp;lt;image_source&amp;gt; tag and &amp;lt;model-name&amp;gt;&amp;lt;image_source&amp;gt; tag for the model directory.&lt;br /&gt;
&lt;br /&gt;
====env.cfg====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;env_config ver=&amp;quot;1.0.0.0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;svn&amp;gt; &lt;br /&gt;
    &amp;lt;timeout&amp;gt;&lt;br /&gt;
      &amp;lt;checkout value='10000' /&amp;gt;&lt;br /&gt;
      &amp;lt;update   value='10000' /&amp;gt;&lt;br /&gt;
      &amp;lt;revert   value='3000' /&amp;gt;&lt;br /&gt;
      &amp;lt;status   value='6000' /&amp;gt;&lt;br /&gt;
    &amp;lt;/timeout&amp;gt; &lt;br /&gt;
  &amp;lt;/svn&amp;gt;&lt;br /&gt;
  &amp;lt;report_url value=&amp;quot;scp://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@&amp;lt;ip&amp;gt;/&amp;lt;taereport-dir&amp;gt;/import&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;!--report_url value=&amp;quot;scp://testuser:test@192.168.0.100/taereport/import&amp;quot; /--&amp;gt;&lt;br /&gt;
&amp;lt;/env_config&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*This file contains the timeout values for various TAE operations. After the test run TAE will send the report tarball to the machine specified in &amp;lt;report_url&amp;gt;. Below are the list of all tags used in this config file:&lt;br /&gt;
** checkout: It is time in seconds for which tae will wait for checkout to happen before timing out.&lt;br /&gt;
** update: It is time in seconds for which tae will wait for svn update to complete before timing out.&lt;br /&gt;
** revert: It is time in seconds for which tae will wait for svn revert before timing out.&lt;br /&gt;
** status: It is time in seconds for which tae will wait for svn status before timing out.&lt;br /&gt;
** report_url: In this we specify the command (to copy) and location where tae report has to be copied.&lt;br /&gt;
&lt;br /&gt;
===Selecting and running the tests===&lt;br /&gt;
&lt;br /&gt;
If following command is issued from the &amp;lt;TAECFGDIR&amp;gt; directory, it lists all the test cases present in the model.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        # &amp;lt;TAEBASE&amp;gt;/tae/tae -L&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	#----------------------------------------------------------------------&lt;br /&gt;
	# ID              State  Brief description&lt;br /&gt;
	#----------------------------------------------------------------------&lt;br /&gt;
	AMF-CMP-KIL.TC001   E    Active Comp Kill Test : Verify SI/CSI assignments after fail-over&lt;br /&gt;
	AMF-CSI-DEP.TC001   E    CSI Dependency Test : Verify CSI assignments order after switch-over&lt;br /&gt;
	AMF-HA-TST.TC001    E    SI Swap Test : Verify SI/CSI assignments after switch-over&lt;br /&gt;
	AMF-HA-TST.TC002    E    SU Lock Test : Verify SI/CSI assignments after switch-over&lt;br /&gt;
	AMF-NOD-LCK.TC001   E    Node Lock Test : Verify SI/CSI assignments after switch-over&lt;br /&gt;
	AMF-RDN-PRC.TC001   E    AMF Reduction Procedure Test : Verify SI/CSI assignments in the reduced mode&lt;br /&gt;
	AMF-SU-SDN.TC001    E    SU Shutdown Test : Verify SI/CSI assignments after switch-over&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/pre&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
you can then put some of the test cases in a file (say tests.lst) and specify the test-case-filter-file name while running tae using -T switch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# &amp;lt;TAEBASE&amp;gt;/tae/tae -T tests.lst -f fetch:stop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Note that the above command should be issued from &amp;lt;TAECFGDIR&amp;gt; directory for the model &lt;br /&gt;
&lt;br /&gt;
*It will execute all the steps from fetch to stop (fetch, populate, configure, build, package, deploy, start, test, stop).&lt;br /&gt;
&lt;br /&gt;
*Some of the steps can be skipped by specifying the stage-name in &amp;lt;skip_stages value=&amp;quot;&amp;quot; /&amp;gt; tag present in &amp;quot;model.cfg&amp;quot; file. Alternatively, you can also specify something like &amp;quot;-f build:test&amp;quot; if the requirement is to build the model from already existing code base and then run the test cases.&lt;br /&gt;
&lt;br /&gt;
*If neither of &amp;quot;-t&amp;quot; or &amp;quot;-T&amp;quot; switch is specified, then TAE runs all the test cases present in the &amp;quot;&amp;lt;model&amp;gt;/src/test&amp;quot; directory. One can also use &amp;quot;-t *&amp;quot; to run all the test cases. Remember, the regular expression syntax is supported while specifying the filter for testcases, which can be very handy sometime.&lt;br /&gt;
&lt;br /&gt;
===TAE logs===&lt;br /&gt;
TAE log files will be present in &amp;quot;log&amp;quot; directory of your model &amp;lt;TAECFGDIR&amp;gt;. Following log files are created by TAE for various different purposes:&lt;br /&gt;
&lt;br /&gt;
*tae.log : contains detailed log of all the commands executed by the TAE while performing the test.&lt;br /&gt;
*bash_127.0.0.1_build_server.log : Contains the logs of commands executed during the SAFplus Platform and model build. It also contains the &amp;quot;make&amp;quot; output in case of build error.&lt;br /&gt;
*bash_local.log : Contains the commands performed on the local machine like scp the tarball to the remote nodes etc.&lt;br /&gt;
*Node level postmortem files (e.g. SysCtrlI0.postmortem.tgz) : Contains the node level logs as well as the runtime files of the node.&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/taeguide/testintg</id>
		<title>Doc:latest/taeguide/testintg</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/taeguide/testintg"/>
				<updated>2010-08-27T05:07:40Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Integration ===&lt;br /&gt;
&lt;br /&gt;
After you have created the model using IDE and generated the source, add a &amp;quot;test&amp;quot; directory just below the model's root (as a peer to &amp;quot;app&amp;quot;) and make subdirectories below &amp;quot;test&amp;quot; for your major functional blocks.&lt;br /&gt;
&lt;br /&gt;
==== Python TAE Interface ====&lt;br /&gt;
The python testcase files should be present in &amp;quot;&amp;lt;model&amp;gt;/src/test&amp;quot; directory. Since you are probably already programming your test cases in Python using our testcase framework, nothing further need be done.&lt;br /&gt;
&lt;br /&gt;
==== C TAE Interface ====&lt;br /&gt;
The Python &amp;quot;layer&amp;quot; for an exclusively &amp;quot;C&amp;quot; implementation is simple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import openclovis.test.testcase as testcase&lt;br /&gt;
                &lt;br /&gt;
class test(testcase.TestGroup):&lt;br /&gt;
&lt;br /&gt;
    def test_sg006(self):&lt;br /&gt;
        r&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        \testcase   BIC-UTL-BIT.TG001&lt;br /&gt;
        \brief      Test group based on SG &amp;quot;tcSg005Bitmap&amp;quot;&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        # List of service groups to unlock, Maximum time (in seconds) that the test takes to run&lt;br /&gt;
        self.run_sg_based_test(['tcSg005Bitmap'], 60)&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This python file should be present in &amp;quot;&amp;lt;model&amp;gt;/src/test&amp;quot; directory.&lt;br /&gt;
&lt;br /&gt;
You also need to add some test initialization code in clCompAppMain.c of the component. Here is an example of what all you need to initialize/register : &lt;br /&gt;
&lt;br /&gt;
===== Stub1 =====&lt;br /&gt;
In the global context of the file clCompAppMain.c, you need to add following code with BEGIN/END block :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
int&lt;br /&gt;
clTestBitmapRun(ClTcParamListT *param_list)&lt;br /&gt;
{&lt;br /&gt;
    clTestBitmapMain();&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void*&lt;br /&gt;
clTcRunThread(void *param)&lt;br /&gt;
{&lt;br /&gt;
    clTcRun();&lt;br /&gt;
    return NULL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * ---END_APPLICATION_CODE---&lt;br /&gt;
 */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Where, clTestBitmapMain() is the main test function (where all the test cases will start their execution). The example code for this function is present in &amp;quot;Testcase Implementation&amp;quot; section.&lt;br /&gt;
&lt;br /&gt;
===== Stub2 =====&lt;br /&gt;
In main() function, TC initialize should be done in following way : &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    /*&lt;br /&gt;
     * Do the application specific initialization here.&lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
     */&lt;br /&gt;
    rc = clTcInitialize(&amp;quot;Bitmap Utility&amp;quot;, &amp;quot;BIT&amp;quot;, clTestBitmapRun);&lt;br /&gt;
    if(CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR, &amp;quot;clTcInitialize() failed, rc : 0x%x&amp;quot;, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /*&lt;br /&gt;
     * ---END_APPLICATION_CODE---&lt;br /&gt;
     */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Stub3 =====&lt;br /&gt;
Before blocking on AMF file descriptor for callbacks, in main() function a thread should be created to run the test in the thread context. Alternatively, you can block on the AMF file descriptor in another thread and let the test run in main thread.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    /*&lt;br /&gt;
     * ---BEGIN_APPLICATION_CODE---&lt;br /&gt;
     */&lt;br /&gt;
    rc = clOsalTaskCreateDetached(NULL, CL_OSAL_SCHED_OTHER,&lt;br /&gt;
                                  CL_OSAL_THREAD_PRI_NOT_APPLICABLE,&lt;br /&gt;
                                  CL_OSAL_MIN_STACK_SIZE,&lt;br /&gt;
                                  clTcRunThread, NULL);&lt;br /&gt;
    &lt;br /&gt;
    /*&lt;br /&gt;
     * ---END_APPLICATION_CODE---&lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Block on AMF dispatch file descriptor for callbacks&lt;br /&gt;
     */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Stub4 =====&lt;br /&gt;
In clCompAppTerminate() finalize the TC in following way : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    /*&lt;br /&gt;
     * ---BEGIN_APPLICATION_CODE--- &lt;br /&gt;
     */&lt;br /&gt;
    clTcFinalize();&lt;br /&gt;
    &lt;br /&gt;
    /*&lt;br /&gt;
     * ---END_APPLICATION_CODE---&lt;br /&gt;
     */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Stub5 =====&lt;br /&gt;
In clCompAppAMFCSISet(), call TC activate in SA_AMF_HA_ACTIVE context :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;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;
            clTcActivate((ClAmsCSIDescriptorT*)&amp;amp;csiDescriptor, haState);&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;&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/taeguide/testimpl</id>
		<title>Doc:latest/taeguide/testimpl</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/taeguide/testimpl"/>
				<updated>2010-08-27T05:06:55Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Create your model ===&lt;br /&gt;
&lt;br /&gt;
Create a model using the OpenClovis IDE. Your model can use any redundancy model and contain any number of components and/or service groups. It can expect any number of blades. However, the most common configuration will be 2 system controllers and 0 or more payload blades. It would be best if your model supports this configuration (or fewer) and is capable of utilizing extra blades if they exist.&lt;br /&gt;
&lt;br /&gt;
=== Add your tests ===&lt;br /&gt;
&lt;br /&gt;
There are various ways/options to implement SAFplus Platform testcases:&lt;br /&gt;
# Write testcase in C as part of an SAFplus-based component. Such testcases should use the C TAE Interface, see below.&lt;br /&gt;
#* Such testcases should be triggered by unlocking AMF entities, typically Service Groups.&lt;br /&gt;
#* Such testcases should use the TAE C interface to start and end of testcases, and the result of the testcases.&lt;br /&gt;
#* Such testcases will be activated from the TAE robot, using a special 1-line wrapper (explained in &amp;quot;Testcase Integration&amp;quot; section).&lt;br /&gt;
# Write testcases purely in Python at the TAE robot side.&lt;br /&gt;
#* Such testcase is implemented as a test*.py file.&lt;br /&gt;
#* Such testcases can typically do anything that can be done using normal shell access to the target blades and debug CLI access to SAFplus Platform.&lt;br /&gt;
#* In the near future, direct access to HPI actions will also be supported.&lt;br /&gt;
#* '''It is also possible to invoke C functions in your (test) application from the Python test script, provided that the function is exposed using the SOAP RPC method described with a code snippet below.'''&lt;br /&gt;
#* Such testcases may not use the TAE C interface at all.&lt;br /&gt;
# The 3rd type of testcase is a mixture of the two extremes above, and implement tests using the C interface, but also have more than just one line code in the Python layer (robot side).&lt;br /&gt;
&lt;br /&gt;
==== When to Use What Approach? ====&lt;br /&gt;
When you try to decide what is the best approach for a given testcase, think from a application perspective. Some guidelines:&lt;br /&gt;
* If the scenario you want to test is representative of what applications would do, lean more on the C-level implementation. Example:&lt;br /&gt;
** An application uses the checkpoint service to save some data, and a standby component is trying to read that data.&lt;br /&gt;
* If the scenario has to emulate some artificial external events, use the Python layer to induce the event. Example:&lt;br /&gt;
** You need to reset a blade or emulate a kernel crash by invoking some command line commands. Would this code ever be done in a user application? NO! So, you should not (need to) implement this in C, but rather figure out a simple way of doing this from the Python testcase code.&lt;br /&gt;
* If the scenario involves artificial sequencing of otherwise randomly occurring events across multiple nodes, the sequencing is better to be left for the Python layer. Example:&lt;br /&gt;
** You need to bring some components up, and then crash them in a certain order. Again, you should ask: does the code that crashes the component have a natural place in the application? Would a customer ever write such code as natural part of his application? Hardly. Also, would the sequencing be controlled in C from some other application? No. So, in that case implementing the sequencing and the crash is better to be left to the Python (robot) layer.&lt;br /&gt;
&lt;br /&gt;
==== Python TAE Interface ====&lt;br /&gt;
If you plan to implement your tests in a combination of C and Python by invoking some C functions from Python testcase, you must now add the TAE SOAP server and remotely callable functions to your model.  For an example of how to do this, please look at the &amp;quot;sysctrlcomp&amp;quot; component in the &amp;quot;bicTests&amp;quot; model in the &amp;quot;asptest&amp;quot; project [http://clovisforge.openclovis.org:8888/plugins/scmsvn/viewcvs.php/root/bicTests/src/app/sysctrlcomp/clCompAppMain.c?root=asptest&amp;amp;rev=946&amp;amp;view=markup here].  This component is untouched except for the addition of 2 remotely callable functions.  You must also add the &amp;quot;tae&amp;quot; subdirectory, as seen [http://clovisforge.openclovis.org:8888/plugins/scmsvn/viewcvs.php/root/bicTests/src/app/sysctrlcomp/?root=asptest here]. This is where you define and implement your RPC calls.  Finally, you must hook up the Makefiles, so that the &amp;quot;tae&amp;quot; subdirectory is build, as seen [http://clovisforge.openclovis.org:8888/plugins/scmsvn/viewcvs.php/root/bicTests/src/app/sysctrlcomp/Makefile?root=asptest&amp;amp;rev=1270&amp;amp;view=markup here].&lt;br /&gt;
&lt;br /&gt;
Next you must implement your tests in Python, and have them call down to the C layer.  This information is best shown by example [[Doc:Sdk_4.0/taeguide/testimpl#Python_test_case | test_lint.py]]&lt;br /&gt;
&lt;br /&gt;
==== C TAE Interface ====&lt;br /&gt;
* Any service group instances that run tests MUST be called tcSg&amp;lt;number&amp;gt;[Name]&lt;br /&gt;
* For example:&lt;br /&gt;
* tcSg001MessagingTest, tcSg034,&lt;br /&gt;
** To run 2 service group instances simultaneously use tcSg&amp;lt;same number&amp;gt;[different name]&lt;br /&gt;
** For example:&lt;br /&gt;
** tcSg001a and tcSg001b, or tcSg005MsgClient and tcSg005MsgServer&lt;br /&gt;
&lt;br /&gt;
=====Include and Library=====&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;clTestApi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code is located in the SAFplus Platform utils library (SAFplus/components/utils/...).&lt;br /&gt;
&lt;br /&gt;
=====Summary=====&lt;br /&gt;
&lt;br /&gt;
The module provides a set of functions that are useful while implementing regression tests.  &lt;br /&gt;
&lt;br /&gt;
The module creates a hierarchy of tests;  a test, a test case, and a test point.  The &amp;quot;test&amp;quot; is started/stopped by clTestInitialize/clTestFinalize (clTestStart/End deprecated) and should precede and succeed all other clTest function calls.  In general, you'll call these functions once each in your program.  Next, within a &amp;quot;test&amp;quot;, you are allowed to implement any number of &amp;quot;test cases&amp;quot;.  A test case is whatever you want it to be, but generally think of it as a grouping based on configuration, load, or strategy.  To start/end a test case, use clTestCaseStart/End.  You can also use &amp;quot;clTestCase&amp;quot; if your test is a single line (like a function call) -- it's just syntactic sugar.  &lt;br /&gt;
&lt;br /&gt;
Finally, individual predicates are called &amp;quot;test points&amp;quot;.  Use the clTestXXX for these.  The basic function is clTest.  You essentially pass it a predicate (an expression that evaluates to a boolean) and it checks the truth of that predicate.  There is also a similar function that lets you also execute code if the test failed.  This is mostly used to skip subsequent test points in a setup where each point requires that the prior succeed.  Finally,  you can claim that a test succeeded, failed or malfunctioned, without checking any predicate.&lt;br /&gt;
&lt;br /&gt;
Malfunctioned?  What's that?  A &amp;quot;malfunction&amp;quot; occurs when initial conditions necessary to run the test were not met. For example, let's say you are running a messaging test.  The test checks that messaging works between 2 processes on the same blade, and then checks between 2 blades.  But what if it is run on a chassis with a single blade?  In this case, the test could call TestMalfunction.&lt;br /&gt;
&lt;br /&gt;
=====Context=====&lt;br /&gt;
&lt;br /&gt;
These functions will act differently depending on the context in which they are executed.  &lt;br /&gt;
&lt;br /&gt;
* If run independent of a Test Automation Environment (TAE) they will print out consistently formatted messages that can be analysed by scripts.  '''To stop the deluge of data, there is a mode that does not print test point successes'''&lt;br /&gt;
&lt;br /&gt;
* If run within a TAE, they will communicate state to the TAE.&lt;br /&gt;
&lt;br /&gt;
Note, some functions ask for formatted strings.  Please refrain from using newline or line feeds &amp;quot;\n&amp;quot; or &amp;quot;\l&amp;quot; since these functions will do formatting for you.  Also, do not use success or failure words, for example &amp;quot;Failed&amp;quot;, &amp;quot;Pass&amp;quot;, &amp;quot;Success&amp;quot;, or &amp;quot;Ok&amp;quot;, since the functions will also add this annotation.&lt;br /&gt;
&lt;br /&gt;
=====Functions=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TBD&amp;gt; Available C Test APIs (library : libClTcUtils.a, header file : clTestApi.h, clTcUtilsApi.h)&lt;br /&gt;
&lt;br /&gt;
==== Failover support ====&lt;br /&gt;
&lt;br /&gt;
The Python TAE interface can be used to trigger various failures in the chassis.  Organise your tests to use the Python layer.&lt;br /&gt;
&lt;br /&gt;
==== Multi-blade coordination ====&lt;br /&gt;
&lt;br /&gt;
If your test must coordinate the activity of multiple blades then you must use the Python layer. There are rich set of APIs provided by TAE for this purpose.&lt;br /&gt;
&lt;br /&gt;
=== Debug ===&lt;br /&gt;
&lt;br /&gt;
==== Python TAE Interface ====&lt;br /&gt;
You can call your Python-to-C functions outside of the TAE with some very simple code.  In this example, assume that your RPC function is called &amp;quot;Log&amp;quot;, and that you have set the MyPort variable to the TCP port of your TAE server (initialized in your component).  Your function will be magically created as a member of the WSDL.Proxy class, so in the example below it will be called in the line &amp;quot;soap.Log(...)&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import pdb&lt;br /&gt;
from SOAPpy import *&lt;br /&gt;
from SOAPpy import WSDL&lt;br /&gt;
Config.simplify_objects = 1&lt;br /&gt;
&lt;br /&gt;
MyPort = 8100&lt;br /&gt;
soap = WSDL.Proxy(&amp;quot;http://localhost:%d/wsdl&amp;quot; % MyPort)&lt;br /&gt;
&lt;br /&gt;
# Call your function.  NOTE you MUST use the keyword=value argument format!&lt;br /&gt;
print soap.Log(severity=1, area=&amp;quot;TST&amp;quot;, context=&amp;quot;RPC&amp;quot;, log=&amp;quot;Test the RPC&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== C TAE Interface ====&lt;br /&gt;
You can debug your own test by unlocking it as you would a normal application through the debug CLI (asp_console).  The output of your test (i.e calls to clTestXXX functions)  will be stored in /var/log/testresults.txt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
===Python test case===&lt;br /&gt;
&lt;br /&gt;
*test_lint.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import pdb&lt;br /&gt;
import openclovis.test.testcase as testcase&lt;br /&gt;
&lt;br /&gt;
class arbitraryname(testcase.TestCase): # The name of the class does not matter&lt;br /&gt;
&lt;br /&gt;
    # This function is executed before each test_xxxx member function is called&lt;br /&gt;
    def set_up(self):&lt;br /&gt;
        &lt;br /&gt;
        # self.fixture is a large data structure that models the whole&lt;br /&gt;
        # chassis or cluster (i.e. all of the machines SAFplus Platform runs on).&lt;br /&gt;
        fix = self.fixture&lt;br /&gt;
        # pdb.set_trace()&lt;br /&gt;
        &lt;br /&gt;
        # Get to the right node in the chassis.&lt;br /&gt;
        node = fix.nodes[&amp;quot;SysCtrl0&amp;quot;]&lt;br /&gt;
        &lt;br /&gt;
        # Connect to a process on the system controller blade so RPC calls can&lt;br /&gt;
        # be made. Note that the port 8100 is &amp;quot;well known&amp;quot; for that application.&lt;br /&gt;
        self.rpc = node.get_rpc(&amp;quot;sysctrl&amp;quot;, 8100)&lt;br /&gt;
&lt;br /&gt;
    # This function is executed after each test_xxxx member function is called&lt;br /&gt;
    def tear_down(self):&lt;br /&gt;
        del self.rpc  # Clean up my RPC client&lt;br /&gt;
&lt;br /&gt;
    def test_doesnotmattername(self): # methods with 'test' prefix are testcases&lt;br /&gt;
        r&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        \testcase   SQA-TAE-REG.TC001&lt;br /&gt;
        \brief      TAE regression test and demo testcase (LINT)&lt;br /&gt;
        \description&lt;br /&gt;
        This is a &amp;quot;veterinary horse&amp;quot; kind of a testcase, demonstrating the&lt;br /&gt;
        various features of the test environment and testing these&lt;br /&gt;
        features in the same time.&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        ##----------------------------------------------------------------&lt;br /&gt;
        ##&lt;br /&gt;
        ## Logging&lt;br /&gt;
        ##&lt;br /&gt;
        ## .log                             object&lt;br /&gt;
        ## .log.debug()                     method&lt;br /&gt;
        ## .log.info()                      method&lt;br /&gt;
        ## .log.warning()                   method&lt;br /&gt;
        ## .log.error()                     method&lt;br /&gt;
        ## .log.critical()                  method&lt;br /&gt;
        ##&lt;br /&gt;
        ##----------------------------------------------------------------&lt;br /&gt;
        &lt;br /&gt;
        self.log.debug('This is a sample debug message')&lt;br /&gt;
        self.log.info('This is a sample info message')&lt;br /&gt;
        self.log.warning('A sample warning')&lt;br /&gt;
        self.log.error('A sample error that is recoverable')&lt;br /&gt;
        self.log.critical('A sample critical error')&lt;br /&gt;
        &lt;br /&gt;
        ##----------------------------------------------------------------&lt;br /&gt;
        ## Local bash access&lt;br /&gt;
        ##&lt;br /&gt;
        ## .tae_host                        object&lt;br /&gt;
        ## .tae_host.run()                  method&lt;br /&gt;
        ## .tae_host.run_cmd()              method&lt;br /&gt;
        ##&lt;br /&gt;
        ##----------------------------------------------------------------&lt;br /&gt;
        &lt;br /&gt;
        #&lt;br /&gt;
        # Running Unix commands on the local host that the tae robot is&lt;br /&gt;
        # running (this is not part of the fixture), using the pre-opened&lt;br /&gt;
        # bash session 'tae_host':&lt;br /&gt;
        #&lt;br /&gt;
        &lt;br /&gt;
        # Just need output of command. In case of error, an exception is thrown.&lt;br /&gt;
        # Before using 'run' check for a member function that already implements&lt;br /&gt;
        # your command.  If it exists it will parse the output and return&lt;br /&gt;
        # 'Pythonized' data (like a list of filenames for 'ls').&lt;br /&gt;
&lt;br /&gt;
        # If the member function does not exist, consider writing one!&lt;br /&gt;
        res = self.tae_host.run('wc -l /etc/passwd')&lt;br /&gt;
        &lt;br /&gt;
        # res includes the trailing newline; to ignore it, use rstrip()&lt;br /&gt;
        self.log.debug('Output: %s' % res.rstrip())&lt;br /&gt;
        &lt;br /&gt;
        # Need both return code and output (does not throw an exception)&lt;br /&gt;
        rc, out = self.tae_host.run_cmd('wc -l /etc/passwd')&lt;br /&gt;
        self.log.debug('Return values: rc=[%d] out=[%s]' % (rc, out.rstrip()))&lt;br /&gt;
        &lt;br /&gt;
        ##----------------------------------------------------------------&lt;br /&gt;
        ##&lt;br /&gt;
        ## Build server features&lt;br /&gt;
        ##&lt;br /&gt;
        ## .fixture                         object&lt;br /&gt;
        ## .fixture.build_server            object&lt;br /&gt;
        ## .fixture.build_server.run()      method&lt;br /&gt;
        ## .fixture.build_server.run_cmd()  method&lt;br /&gt;
        ## .fixture.build_server.scp()      method&lt;br /&gt;
        ##&lt;br /&gt;
        ##----------------------------------------------------------------&lt;br /&gt;
        &lt;br /&gt;
        # Running Unix commands on the build server of the fixture&lt;br /&gt;
&lt;br /&gt;
        res = self.fixture.build_server.run('hostname')&lt;br /&gt;
        self.log.debug('The buildserver is [%s]' % res.rstrip())&lt;br /&gt;
        &lt;br /&gt;
        # Miscellaneous info about the build server&lt;br /&gt;
&lt;br /&gt;
        self.log.debug('Build server IP    : [%s]' % self.fixture.build_server.ip)&lt;br /&gt;
        self.log.debug('Build server login : [%s]' % self.fixture.build_server.user)&lt;br /&gt;
        self.log.debug('Build server passwd: [%s]' % self.fixture.build_server.password)&lt;br /&gt;
        &lt;br /&gt;
        # Run scp on the build server to copy in or out something&lt;br /&gt;
        # Syntax: scp(frm, to, pw) where either frm or to can also include&lt;br /&gt;
        # a username.&lt;br /&gt;
        self.log.info('Checking accessibility by ping before attempting scp...')&lt;br /&gt;
        if not self.fixture.build_server.run_cmd('ping -c 1 10.10.6.1')[0]:&lt;br /&gt;
            self.fixture.build_server.scp('root@10.10.6.1:.bashrc', '.', 'clovis')&lt;br /&gt;
        &lt;br /&gt;
        ##----------------------------------------------------------------&lt;br /&gt;
        ##&lt;br /&gt;
        ## Fixture target node features&lt;br /&gt;
        ##&lt;br /&gt;
        ## .fixture.nodes                   object, works as dictionary&lt;br /&gt;
        ## .fixture.nodes.keys()            method&lt;br /&gt;
        ## .fixture.nodes.values()          method&lt;br /&gt;
        ## .fixture.nodes.items()           method&lt;br /&gt;
        ## .fixture.nodes[name].name        str&lt;br /&gt;
        ## .fixture.nodes[name].ip          str&lt;br /&gt;
        ## .fixture.nodes[name].user        str&lt;br /&gt;
        ## .fixture.nodes[name].password    str&lt;br /&gt;
        ## .fixture.nodes[name].ping        method&lt;br /&gt;
        ## &lt;br /&gt;
        ##----------------------------------------------------------------&lt;br /&gt;
        &lt;br /&gt;
        # Target node access, based on the model mapping&lt;br /&gt;
        # Key: self.fixture.nodes is a Python dictionary indexed by the node&lt;br /&gt;
        # names. Each element is a Node class with a few useful info and&lt;br /&gt;
        # methods.&lt;br /&gt;
        &lt;br /&gt;
        # List of node names in the fixture:&lt;br /&gt;
        node_names = self.fixture.nodes.keys()&lt;br /&gt;
        self.log.debug('Model node names: %s' % str(node_names))&lt;br /&gt;
        &lt;br /&gt;
        # To access a given node:&lt;br /&gt;
        node = self.fixture.nodes['SysCtrl0']&lt;br /&gt;
&lt;br /&gt;
        # A few useful values in node:&lt;br /&gt;
        self.log.debug('Fixture node name  : [%s]' % node.name)&lt;br /&gt;
        self.log.debug('Fixture node ip    : [%s]' % node.ip)&lt;br /&gt;
        self.log.debug('Fixture node login : [%s]' % node.user)&lt;br /&gt;
        self.log.debug('Fixture node passwd: [%s]' % node.password)&lt;br /&gt;
&lt;br /&gt;
        # A few useful methods:&lt;br /&gt;
        if node.ping(): # ping node from tae server and check if accessible&lt;br /&gt;
            self.log.debug('Fixture [%s] at [%s] is accessible' %&lt;br /&gt;
                           (node.name, node.ip))&lt;br /&gt;
        else:&lt;br /&gt;
            self.log.error('Fixture [%s] at [%s] is not accessible' %&lt;br /&gt;
                           (node.name, node.ip))&lt;br /&gt;
&lt;br /&gt;
        ##----------------------------------------------------------------&lt;br /&gt;
        ##&lt;br /&gt;
        ## Unix commands on fixture node&lt;br /&gt;
        ##&lt;br /&gt;
        ## .fixture.nodes[name].bash            object (session)&lt;br /&gt;
        ## .fixture.nodes[name].bash.run()      method&lt;br /&gt;
        ## .fixture.nodes[name].bash.run_cmd()  method&lt;br /&gt;
        ##&lt;br /&gt;
        ##----------------------------------------------------------------&lt;br /&gt;
        &lt;br /&gt;
        # To run a Unix command line command on the fixture node using a&lt;br /&gt;
        # preinstantiated bash session (this works in the same way as the&lt;br /&gt;
        # build_server bash session above):&lt;br /&gt;
        res = self.fixture.nodes['SysCtrl0'].bash.run('df -h . | tail -n 1')&lt;br /&gt;
        self.log.debug('Disk on fixture node [%s] is [%s] percent full ([%s] available)' %&lt;br /&gt;
                       (node.name, res.split()[4], res.split()[3]))&lt;br /&gt;
&lt;br /&gt;
        # Note you must leave this bash session at the Unix prompt!&lt;br /&gt;
        # For example, do not do .bash.run(&amp;quot;tail -f /var/log/asp&amp;quot;)&lt;br /&gt;
        # For this, you can create your own bash session.&lt;br /&gt;
&lt;br /&gt;
        shell =  self.fixture.nodes['SysCtrl0'].create_bash()&lt;br /&gt;
        # To start a command that you don't expect to complete:&lt;br /&gt;
        # expect = shell.start(&amp;quot;tail -f /var/log/messages&amp;quot;)&lt;br /&gt;
        # Returned is a pexpect object&lt;br /&gt;
&lt;br /&gt;
        ##----------------------------------------------------------------&lt;br /&gt;
        ##&lt;br /&gt;
        ## Other generic fixture node methods (also available as methods&lt;br /&gt;
        ## of any bash session)&lt;br /&gt;
        ##&lt;br /&gt;
        ## .fixture.nodes[name].get_pid()       method&lt;br /&gt;
        ## .fixture.nodes[name].kill()          method&lt;br /&gt;
        ## .fixture.nodes[name].killall()       method&lt;br /&gt;
        ##&lt;br /&gt;
        ##----------------------------------------------------------------&lt;br /&gt;
        &lt;br /&gt;
        # To get list of pids for any running process by given name&lt;br /&gt;
        pids = self.fixture.nodes['SysCtrl0'].get_pid('bash') # returns a list&lt;br /&gt;
        self.log.debug('Number of bash sessions: [%d]' % len(pids))&lt;br /&gt;
        self.log.debug('PID of first bash session: [%s]' % &lt;br /&gt;
                       (len(pids) and pids[0] or 'N/A'))&lt;br /&gt;
&lt;br /&gt;
        # To kill a process by pid or process name&lt;br /&gt;
        node = self.fixture.nodes['SysCtrl0']&lt;br /&gt;
        node.bash.run('ping localhost &amp;gt; /dev/null &amp;amp; ' * 4) # starting 4 pings&lt;br /&gt;
        pids = node.get_pid('ping')&lt;br /&gt;
        self.log.debug('Number of ping sessions: [%d]' % len(pids))&lt;br /&gt;
&lt;br /&gt;
        node.kill(pids[0])&lt;br /&gt;
        node.kill(pids[1], signal=9)&lt;br /&gt;
        self.log.debug('Number of ping sessions: [%d]' % len(node.get_pid('ping')))&lt;br /&gt;
&lt;br /&gt;
        node.killall('ping')&lt;br /&gt;
        self.log.debug('Number of ping sessions: [%d]' % len(node.get_pid('ping')))&lt;br /&gt;
&lt;br /&gt;
        ##----------------------------------------------------------------&lt;br /&gt;
        ##&lt;br /&gt;
        ## SAFplus Platform specific fixture node methods&lt;br /&gt;
        ##&lt;br /&gt;
        ## .fixture.nodes[name].asp_running()   method&lt;br /&gt;
        ## .fixture.nodes[name].start_asp()     method&lt;br /&gt;
        ## .fixture.nodes[name].stop_asp()      method&lt;br /&gt;
        ## .fixture.nodes[name].restart_asp()   method&lt;br /&gt;
        ##&lt;br /&gt;
        ##----------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
        # Check if SAFplus Platform is running and start it if not&lt;br /&gt;
        &lt;br /&gt;
        # Note, the framework starts the SAFplus Platform before running your test case,&lt;br /&gt;
        # so you can assume that the SAFplus Platform is running.  That is, you don't&lt;br /&gt;
        # need to call this function, unless your test shuts down SAFplus Platform.&lt;br /&gt;
        &lt;br /&gt;
        if self.fixture.nodes['Worker0'].asp_running():&lt;br /&gt;
            self.log.debug('SAFplus Platform is running on the node already')&lt;br /&gt;
        else:&lt;br /&gt;
            self.fixture.nodes['Worker0'].start_asp()&lt;br /&gt;
&lt;br /&gt;
        # Bring down SAFplus Platform and then back&lt;br /&gt;
        if self.fixture.nodes['Worker0'].asp_running():&lt;br /&gt;
            self.log.debug('Stopping SAFplus')&lt;br /&gt;
            self.fixture.nodes['Worker0'].stop_asp()&lt;br /&gt;
        self.fixture.nodes['Worker0'].start_asp()&lt;br /&gt;
        &lt;br /&gt;
        # Restart SAFplus Platform in a single command&lt;br /&gt;
        self.fixture.nodes['Worker0'].restart_asp()&lt;br /&gt;
                    &lt;br /&gt;
        ##----------------------------------------------------------------&lt;br /&gt;
        ##&lt;br /&gt;
        ## Fixture-wide methods&lt;br /&gt;
        ## Note that all fixture-wide methods have node equivalents that&lt;br /&gt;
        ## have the same name but are members of the 'node' object.&lt;br /&gt;
        ##&lt;br /&gt;
        ## .fixture.start_asp()                 method&lt;br /&gt;
        ## .fixture.stop_asp()                  method&lt;br /&gt;
        ## .fixture.restart_asp()               method&lt;br /&gt;
        ##&lt;br /&gt;
        ##----------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
        # Stopping SAFplus Platform on all nodes&lt;br /&gt;
        ### self.fixture.stop_asp()&lt;br /&gt;
        &lt;br /&gt;
        # Starting up SAFplus Platform on all nodes&lt;br /&gt;
        ### self.fixture.start_asp()&lt;br /&gt;
        &lt;br /&gt;
        # Restarting SAFplus Platform on all nodes&lt;br /&gt;
        # Does it wait?&lt;br /&gt;
        ### self.fixture.restart_asp()&lt;br /&gt;
&lt;br /&gt;
        # self.fixture.wait_until_asp_up(50)   # TBD, &lt;br /&gt;
        &lt;br /&gt;
        ##----------------------------------------------------------------&lt;br /&gt;
        ##&lt;br /&gt;
        ## Test case python script debugging&lt;br /&gt;
        ##&lt;br /&gt;
        ## pdb.set_trace()                      method&lt;br /&gt;
        ##&lt;br /&gt;
        ##----------------------------------------------------------------&lt;br /&gt;
        ##&lt;br /&gt;
        ## To get the python debugger break during test execution, issue the&lt;br /&gt;
        ## pdb.set_trace() call ANYWHERE IN YOUR TESTCASE code. To check this&lt;br /&gt;
        ## feature out, uncomment the two lines below&lt;br /&gt;
        ##&lt;br /&gt;
        &lt;br /&gt;
        #import pdb&lt;br /&gt;
        #pdb.set_trace()&lt;br /&gt;
&lt;br /&gt;
        ##----------------------------------------------------------------&lt;br /&gt;
        ##&lt;br /&gt;
        ## Debug CLI access&lt;br /&gt;
        ##&lt;br /&gt;
        ## .fixture.has_debug_cli()             method&lt;br /&gt;
        ## .fixture.start_debug_cli()           method&lt;br /&gt;
        ## .fixture.debug_cli.root()            method&lt;br /&gt;
        ## .fixture.debug_cli.run()             method&lt;br /&gt;
        ##&lt;br /&gt;
        ##----------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
        # All &amp;quot;get_xxx&amp;quot; functions return a cached version if it exists or create&lt;br /&gt;
        # if it does not.&lt;br /&gt;
        # All &amp;quot;create_xxx&amp;quot; functions create a new one and pass it back to you.&lt;br /&gt;
&lt;br /&gt;
        # In the case of the debug CLI, there can be only 1 instance, so there&lt;br /&gt;
        # is no &amp;quot;create&amp;quot; function.&lt;br /&gt;
        dbgcli = self.fixture.get_debug_cli()&lt;br /&gt;
        &lt;br /&gt;
        # Run some native debug cli commands:&lt;br /&gt;
        dbgcli.run('setc 1')&lt;br /&gt;
        dbgcli.run('setc cpm')&lt;br /&gt;
&lt;br /&gt;
        # You may also use the fixture variable debug_cli, if you are sure&lt;br /&gt;
        # that it is valid.&lt;br /&gt;
        res = self.fixture.debug_cli.run('compList')&lt;br /&gt;
        self.log.debug('First 20 partial lines of component list:')&lt;br /&gt;
        for line in res.splitlines()[:20]:&lt;br /&gt;
            self.log.debug('&amp;gt;&amp;gt; %-65s ...' % line[:60])&lt;br /&gt;
&lt;br /&gt;
    ##----------------------------------------------------------------&lt;br /&gt;
    ##&lt;br /&gt;
    ## Determining test result&lt;br /&gt;
    ##&lt;br /&gt;
    ## Test ERROR is not the same as a FAIL-ed test&lt;br /&gt;
    ##&lt;br /&gt;
    ## The former means the test is not conclusive because the test&lt;br /&gt;
    ## procedure itself could not be completed dur to some errors.&lt;br /&gt;
    ## The latter means the test subject failed the test.&lt;br /&gt;
    ##&lt;br /&gt;
    ## Test errors:  any unhandled Python exception that occurs during&lt;br /&gt;
    ##               running the testcase will be regarded by the test&lt;br /&gt;
    ##               framework as a test error and the failure of the&lt;br /&gt;
    ## Test failure: test failures are generated when an explicit&lt;br /&gt;
    ##               verification of some result produces a negative&lt;br /&gt;
    ##               result. These types of check are done using one of&lt;br /&gt;
    ##               the following method calls:&lt;br /&gt;
    ##&lt;br /&gt;
    ## .assert_true(condition [, failure info])&lt;br /&gt;
    ## .assert_false(condition [, failure info])&lt;br /&gt;
    ## .assert_equal(value1, value2 [, failure info])&lt;br /&gt;
    ## .assert_not_equal(value1, value2 [, failure info])&lt;br /&gt;
    ## .assert_almost_equal(value1, value2 [, failure info])&lt;br /&gt;
    ## .assert_not_almost_equal(value1, value2 [, failure info])&lt;br /&gt;
    ## .assert_raises(exception [, failure info])&lt;br /&gt;
    ##&lt;br /&gt;
    ## These are demonstrated in separate testcases below not as part&lt;br /&gt;
    ## of this LINT testcase&lt;br /&gt;
    ##&lt;br /&gt;
    ##----------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
    def test_always_errors1(self):&lt;br /&gt;
        r&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        \testcase   SQA-TAE-REG.TC002&lt;br /&gt;
        \brief      This testcase should always produce an ERROR&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        l = [0, 1]&lt;br /&gt;
        print l[100] # index is out of range, will generate a python exception&lt;br /&gt;
    &lt;br /&gt;
    def test_always_fails(self):&lt;br /&gt;
        r&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        \testcase   SQA-TAE-REG.TC003&lt;br /&gt;
        \brief      This testcase should always produce a FAIL&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.assert_equal(1, 10, 'This test is failed purposely')&lt;br /&gt;
&lt;br /&gt;
    def test_well_documented(self):&lt;br /&gt;
        r&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        \testcase   SQA-TAE-REG.TC004&lt;br /&gt;
        &lt;br /&gt;
        \brief      This is a well documented testcase example&lt;br /&gt;
        &lt;br /&gt;
        \description&lt;br /&gt;
        You can have an arbitrarily long description of the testcase.&lt;br /&gt;
        You can have an arbitrarily long description of the testcase.&lt;br /&gt;
        You can have an arbitrarily long description of the testcase.&lt;br /&gt;
&lt;br /&gt;
        You can have an arbitrarily long description of the testcase.&lt;br /&gt;
        You can have an arbitrarily long description of the testcase.&lt;br /&gt;
        You can have an arbitrarily long description of the testcase.&lt;br /&gt;
&lt;br /&gt;
        You can have an arbitrarily long description of the testcase.&lt;br /&gt;
        You can have an arbitrarily long description of the testcase.&lt;br /&gt;
        You can have an arbitrarily long description of the testcase.&lt;br /&gt;
&lt;br /&gt;
        \state      enabled&lt;br /&gt;
&lt;br /&gt;
        \prerequisites&lt;br /&gt;
         * SC0 is accessible&lt;br /&gt;
         * OS booted on system controller&lt;br /&gt;
         * Python test environment (with PyOpenHPI) is available on SC0&lt;br /&gt;
         * IP address to shelf manager is know as SHMGR_IP environment variable&lt;br /&gt;
&lt;br /&gt;
        \steps&lt;br /&gt;
         1 start test application which will attempt to setup HPI session and&lt;br /&gt;
           wait till its output is printed&lt;br /&gt;
&lt;br /&gt;
        \criteria&lt;br /&gt;
          \li HPI session open returns with success&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        pass # always passes&lt;br /&gt;
&lt;br /&gt;
    def test_unimplemented(self):&lt;br /&gt;
        r&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        \testcase   SQA-TAE-REG.TC005&lt;br /&gt;
        &lt;br /&gt;
        \brief      Unimplemented testcase (always errors out)&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.log.debug('This is an unimplemented testcase')&lt;br /&gt;
        raise testcase.TestcaseNotImplemented&lt;br /&gt;
&lt;br /&gt;
    def test_with_measurement(self):&lt;br /&gt;
        r&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        \testcase   SQA-TAE-REG.TC006&lt;br /&gt;
        &lt;br /&gt;
        \brief      Testcase example with measurements&lt;br /&gt;
        &lt;br /&gt;
        \description&lt;br /&gt;
        This measures two attributes, as described below.&lt;br /&gt;
        &lt;br /&gt;
        \measured&lt;br /&gt;
        \data FREE_DISK_SPACE  [MB] Free disk space on first node&lt;br /&gt;
        \data RANDOM_NUMBERS   []   Random numbers in [0, 1) interval&lt;br /&gt;
        \data ASP_STARTUP_TIME [ms] Ping latency between two nodes&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        ##----------------------------------------------------------------&lt;br /&gt;
        ##&lt;br /&gt;
        ## Measurements related stuff&lt;br /&gt;
        ##&lt;br /&gt;
        ## openclovis.test.bin                  module&lt;br /&gt;
        ## openclovis.test.bin.Bin()            class&lt;br /&gt;
        ## openclovis.test.bin.Bin.record()     method&lt;br /&gt;
        ## .report_data()                       method&lt;br /&gt;
        ##&lt;br /&gt;
        ##----------------------------------------------------------------&lt;br /&gt;
        &lt;br /&gt;
        import openclovis.test.bin as bin&lt;br /&gt;
&lt;br /&gt;
        # Free disk space example&lt;br /&gt;
        raw_data = self.fixture.nodes['SysCtrl0'].bash.run('df -m . | tail -n 1')&lt;br /&gt;
        free_space = int(raw_data.split()[3])&lt;br /&gt;
        self.report_data(bin.Bin('FREE_DISK_SPACE', free_space, unit='MB'))&lt;br /&gt;
&lt;br /&gt;
        # Random number measurement&lt;br /&gt;
        import random&lt;br /&gt;
        array = [random.random() for foo in range(10000)]&lt;br /&gt;
        self.report_data(bin.Bin('RANDOM_NUMBERS', array, fmt='%6.4f'))&lt;br /&gt;
        &lt;br /&gt;
        # Step-by-step data collection&lt;br /&gt;
        data = bin.Bin('ASP_STARTUP_TIME', unit='s')&lt;br /&gt;
        import time&lt;br /&gt;
        self.log.info('Measuring SAFplus Platform startup time, using 5 runs')&lt;br /&gt;
        if self.fixture.nodes['Worker0'].asp_running():&lt;br /&gt;
            self.fixture.nodes['Worker0'].stop_asp()&lt;br /&gt;
        for i in range(5):&lt;br /&gt;
            start_time = time.time()&lt;br /&gt;
            self.fixture.nodes['Worker0'].start_asp()&lt;br /&gt;
            stop_time = time.time()&lt;br /&gt;
            data.record(stop_time - start_time)&lt;br /&gt;
            self.fixture.nodes['Worker0'].stop_asp()&lt;br /&gt;
            self.log.debug('- Iteration %d done' % (i+1))&lt;br /&gt;
        self.report_data(data)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def test_with_rpc(self):&lt;br /&gt;
        r&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        \testcase   SQA-TAE-REG.TC007&lt;br /&gt;
        \brief      Testcase example with RPC calls&lt;br /&gt;
        &lt;br /&gt;
        \description&lt;br /&gt;
        This runs 2 functions on the target within a particular process.&lt;br /&gt;
        To see the server side implementation, look at:&lt;br /&gt;
        SAFplus/models/unitTests/app/sysctrlcomp/tae&lt;br /&gt;
        &lt;br /&gt;
        \measured&lt;br /&gt;
        \data Length of a task delay.&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        # This example shows passing strings.&lt;br /&gt;
        self.rpc.Log(severity=1,area=&amp;quot;TST&amp;quot;,context=&amp;quot;LNT&amp;quot;, log=&amp;quot;Testing the RPC mechanism.  This log actually originated from the test_lint.py script running on the TAE.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # This example shows how a complex data structure can be returned.&lt;br /&gt;
        ret = self.rpc.TaskSleep(sec=3,msec=0)&lt;br /&gt;
        self.log.info(&amp;quot;Raw data received from RPC call: %s&amp;quot; % str(ret))&lt;br /&gt;
        self.log.info('Sleep of 3 seconds was measured (on the node) as taking %d ms' % ((int(ret[&amp;quot;sec&amp;quot;]) * 1000) + int(ret[&amp;quot;msec&amp;quot;])))&lt;br /&gt;
        &lt;br /&gt;
    def test_disabled(self):&lt;br /&gt;
        r&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        \testcase   SQA-TAE-REG.TC008&lt;br /&gt;
        \brief      Disabled testcase&lt;br /&gt;
        \state      disabled&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.log.critical('You should never see this testcase executed by TAE')&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===C testcase (SG based)===&lt;br /&gt;
&lt;br /&gt;
*testBitmap.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void TC2_BitMap(void)&lt;br /&gt;
{&lt;br /&gt;
    ClBitmapHandleT bitHdl  =   CL_BM_INVALID_BITMAP_HANDLE;&lt;br /&gt;
    ClRcT           rc      =   CL_OK;&lt;br /&gt;
    ClRcT           retVal  =   CL_OK;&lt;br /&gt;
    ClUint32T       bitCount=   0;&lt;br /&gt;
    ClUint32T       bitNum  =   0;&lt;br /&gt;
&lt;br /&gt;
    for(bitCount = 3, bitNum = 1; bitCount &amp;lt;= 100; bitCount += 2, bitNum++)&lt;br /&gt;
    {&lt;br /&gt;
        clTestCaseMalfunction(&lt;br /&gt;
               (&amp;quot;Bitmap create&amp;quot;),&lt;br /&gt;
               (rc = clBitmapCreate(&amp;amp;bitHdl, bitCount)) == CL_OK,&lt;br /&gt;
               return);&lt;br /&gt;
&lt;br /&gt;
        clTest((&amp;quot;Bitmap set bit [%d]&amp;quot;, bitNum),&lt;br /&gt;
               (rc = clBitmapBitSet(bitHdl, bitNum)) == CL_OK,&lt;br /&gt;
               (&amp;quot;Error: rc[0x %x]&amp;quot;, rc));&lt;br /&gt;
&lt;br /&gt;
        clTest((&amp;quot;Bitmap is bit[%d] set?&amp;quot;, bitNum),&lt;br /&gt;
               (((clBitmapIsBitSet(bitHdl, bitNum, &amp;amp;retVal)) &lt;br /&gt;
                 == CL_BM_BIT_SET) &amp;amp;&amp;amp; CL_OK == retVal),&lt;br /&gt;
               (&amp;quot;Error: rc[0x %x]&amp;quot;, retVal));&lt;br /&gt;
&lt;br /&gt;
        clTest((&amp;quot;Bitmap set bit [%d]&amp;quot;, (bitNum + 2)),&lt;br /&gt;
               (rc = clBitmapBitSet(bitHdl, (bitNum + 2))) == CL_OK,&lt;br /&gt;
               (&amp;quot;Error: rc[0x %x]&amp;quot;, rc));&lt;br /&gt;
&lt;br /&gt;
        clTest((&amp;quot;Bitmap is bit[%d] set?&amp;quot;, (bitNum + 2)),&lt;br /&gt;
               (((clBitmapIsBitSet(bitHdl, (bitNum + 2), &amp;amp;retVal)) &lt;br /&gt;
                 == CL_BM_BIT_SET) &amp;amp;&amp;amp; CL_OK == retVal),&lt;br /&gt;
               (&amp;quot;Error: rc[0x %x]&amp;quot;, retVal));&lt;br /&gt;
&lt;br /&gt;
        clTest((&amp;quot;Bitmap destroy&amp;quot;),&lt;br /&gt;
               (rc = clBitmapDestroy(bitHdl)) == CL_OK,&lt;br /&gt;
               (&amp;quot;Error: rc[0x %x]&amp;quot;, rc));&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
clTestBitmapMain(void)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    clTestGroupInitialize((&amp;quot;Test of Bitmap utility&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
    clTestCase((&amp;quot;BIC-UTL-BIT.TC003 Set Bits in a bitmap and Verify whether the bits are set&amp;quot;), &lt;br /&gt;
		TC2_BitMap());&lt;br /&gt;
&lt;br /&gt;
    (void) clTestGroupFinalize();&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* This example shows just one test case of many that can appear in a single service group.  To make this example a &amp;quot;fully&amp;quot; runnable standalone test, you would have to call clTestGroupInitialize and clTestGroupFinalize functions before and after calling a set of clTestCase().&lt;br /&gt;
&lt;br /&gt;
*When a service group is assigned work (a CSI) this should trigger your test to run. When your test is complete it should simply wait until the work is unassigned. Also, the service group should be modeled to be in lock assigned mode.&lt;br /&gt;
&lt;br /&gt;
* Your tests must call the functions in the Test API defined in &amp;quot;clTestApi.h&amp;quot;.  You can also use the Test Lifecycle APIs defined in &amp;quot;clTcUtilsApi.h&amp;quot; to facilitate starting test cases with different parameters.&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/taeguide/deppkg</id>
		<title>Doc:latest/taeguide/deppkg</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/taeguide/deppkg"/>
				<updated>2010-08-27T05:05:01Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Deployment and Packaging==&lt;br /&gt;
The OpenClovis TAE is provided in the form of a gzipped tar file (.tar.gz).  You can open this file (tar xvfz &amp;lt;filename&amp;gt;) in directory (as &amp;quot;root&amp;quot; user). It will create a directory called openclovis-tae-&amp;lt;version&amp;gt;. The rest of this document will refer to this directory using the symbol &amp;lt;TAEBASE&amp;gt;. This directory should contain following files/directories :&lt;br /&gt;
*README.txt&lt;br /&gt;
*Python-2.5.2.tgz&lt;br /&gt;
*setuptools-0.6c9.tar.gz&lt;br /&gt;
*TG_setup_files.tgz&lt;br /&gt;
*tae (directory)&lt;br /&gt;
&lt;br /&gt;
==Steps to install TAE==&lt;br /&gt;
&lt;br /&gt;
* Install Python-2.5.2&lt;br /&gt;
# tar zxvf Python-2.5.2.tgz&lt;br /&gt;
# cd Python-2.5.2&lt;br /&gt;
# ./configure&lt;br /&gt;
# make&lt;br /&gt;
# make install&lt;br /&gt;
&lt;br /&gt;
* Install setuptools (required for easy_install used in next step) &lt;br /&gt;
&lt;br /&gt;
# tar zxvf setuptools-0.6c9.tar.gz&lt;br /&gt;
# cd setuptools-0.6c9&lt;br /&gt;
# python setup.py install&lt;br /&gt;
&lt;br /&gt;
* Install Turbougear and tae-report server dependent packages&lt;br /&gt;
&lt;br /&gt;
# tar zxvf TG_setup_files.tgz&lt;br /&gt;
# cd TG_setup_files&lt;br /&gt;
# easy_install -Hlocalhost *.egg&lt;br /&gt;
&lt;br /&gt;
* Install tae 3rdparty packages&lt;br /&gt;
&lt;br /&gt;
# cd tae/3rdparty/&lt;br /&gt;
# make install&lt;br /&gt;
&lt;br /&gt;
* Build initial database&lt;br /&gt;
&lt;br /&gt;
# cd taereport&lt;br /&gt;
# rm devdata.sqlite*&lt;br /&gt;
# tg-admin sql create&lt;br /&gt;
&lt;br /&gt;
* Run&lt;br /&gt;
&lt;br /&gt;
# iptables -F  # Turn off firewall needed on some linux distributions (or you can edit your firewall settings to let TAE through)&lt;br /&gt;
# python start-taereport.py&lt;br /&gt;
&lt;br /&gt;
* Set up database&lt;br /&gt;
&lt;br /&gt;
#Open browser, and go to &amp;lt;taeserver&amp;gt;:5000/catwalk&lt;br /&gt;
#Click project-&amp;gt;Add project&lt;br /&gt;
#Status: 1&lt;br /&gt;
#Description: &amp;lt;anything&amp;gt;&lt;br /&gt;
#Created: &amp;lt;leave&amp;gt;&lt;br /&gt;
#Brief: &amp;lt;anything&amp;gt;&lt;br /&gt;
#Label: &amp;lt;specify the project name that appears throughout the rest of the TAE reports&amp;gt;&lt;br /&gt;
#anonymous_view: &amp;lt;specify 1 to allow anonymous users&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* All Done!&lt;br /&gt;
&lt;br /&gt;
#Use TAE report server: Open browser, and go to &amp;lt;taeserver&amp;gt;:5000&lt;br /&gt;
&lt;br /&gt;
* Next steps: &lt;br /&gt;
&lt;br /&gt;
# Read and follow the OpenClovis TAE user/programming guide &lt;br /&gt;
# Start running tests and upload them to &amp;lt;taeserver&amp;gt;/&amp;lt;taedirectory&amp;gt;/taereport/import&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/taeguide/overview</id>
		<title>Doc:latest/taeguide/overview</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/taeguide/overview"/>
				<updated>2010-08-27T05:04:02Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Organization ==&lt;br /&gt;
&lt;br /&gt;
The TAE is organized following the [http://en.wikipedia.org/wiki/Matryoshka_doll Matryoshka principle] in that each facility requires all &amp;quot;smaller&amp;quot; facilities, yet any particular facility and all &amp;quot;smaller&amp;quot; facilities comprises a working automation environment (albeit missing the features provided by the &amp;quot;larger&amp;quot; facilities) and is useful in certain circumstances.&lt;br /&gt;
&lt;br /&gt;
The purpose of this organization is most importantly to create an incremental development schedule that will yield a usable test framework rapidly and a fully-featured one when those features are required.&lt;br /&gt;
&lt;br /&gt;
Another extremely important purpose is to allow the automation environment to be run in a variety of different situations and by a variety of different users.  For example, it could be run by an automated nightly verification system (layer 3), or by a developer fixing a bug (layer 1,2).  It could be run by an OpenClovis engineer (layer 1,2 or 3), or by a customer who is verifying compatibility with his hardware (layer 3).&lt;br /&gt;
&lt;br /&gt;
Lastly, it is designed to allow programs written for a variety of purposes -- test, demo, eval, and real systems -- to be run.  Traditionally automated test frameworks are so encompassing that the only software that can be run are test suites designed from the bottom-up to fit within the automated test framework.  This framework allows software that was not written for the express purpose of testing to be annotated with compile-time optional tests (similar to assert()) that can be used to verify the correct execution of that software.&lt;br /&gt;
&lt;br /&gt;
Each layer is summarized in this document and contains a link to a detailed design.&lt;br /&gt;
&lt;br /&gt;
=== Layer 1: C program API (Clovis Test API) ===&lt;br /&gt;
&lt;br /&gt;
The smallest layer is the API used in a program to run tests.  This layer consists of a set of C macros that group and run tests. When not testing, these macros can be compiled out.  This is very similar to unit testing packages found for many languages.&lt;br /&gt;
&lt;br /&gt;
If this layer is run alone, it will simply print test successes and failures to the screen.&lt;br /&gt;
&lt;br /&gt;
When run within the layer 3 framework, test successes and failures will be posted to the TAE report server.&lt;br /&gt;
&lt;br /&gt;
=== Layer 2: Python based testing (using APIs provided by TAE)===&lt;br /&gt;
&lt;br /&gt;
This is another layer to write test programs in python and run tests. Here the test program uses the rich set of APIs (written in python) present in the TAE infrastructure. This layer provides multiple utilities to run tests in a distributed environment.&lt;br /&gt;
&lt;br /&gt;
If this layer is run alone, it will simply print test successes and failures to the screen.&lt;br /&gt;
&lt;br /&gt;
When run within the layer 3 framework, test successes and failures will be posted to the TAE report server.&lt;br /&gt;
=== Layer 3: Test Execution Management and Event Simulation ===&lt;br /&gt;
&lt;br /&gt;
The Test Execution Management and Event Simulation (TEMES) layer consists of a separate machine (test driver) that controls the test &amp;quot;fixture&amp;quot; (the set of machines that constitute a test environment).  It is capable of taking software from either a local directory, a ftp site, an http site or from subversion repository, unpacking it (if needed), installing it on the fixture, compiling it, and running a series of tests.&lt;br /&gt;
&lt;br /&gt;
These tests primarily constitute executable programs that use the Layer 1 and 2 APIs, and conform to a loose modeling format.&lt;br /&gt;
&lt;br /&gt;
Additionally, a test-specific scripts may be run on the TEMES that can &amp;quot;drive&amp;quot; the progress of the test and cause events such as process, network, and machine failures.&lt;br /&gt;
&lt;br /&gt;
If this layer is run alone, it will run through a complete test suite and report successes and failures.&lt;br /&gt;
&lt;br /&gt;
=== Layer 4: Automated Run and Longitudinal Reports ===&lt;br /&gt;
&lt;br /&gt;
The Automated Run and Longitudinal Reporting (ARLR) layer consists of a single globally accessible server (ARLR server) and a source repository (subversion etc).  The ARLR server contains a web site that allows users to see which source code branches are failing which tests on what hardware and it keeps a history of this information.  It also will communicate with unused (or layer 3 dedicated) test drivers to schedule runs of a set of test suites against a set of branches and receive results from these drivers.&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/taeguide/preface</id>
		<title>Doc:latest/taeguide/preface</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/taeguide/preface"/>
				<updated>2010-08-27T05:03:23Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=='''Preface'''==&lt;br /&gt;
&lt;br /&gt;
''OpenClovis Test Automation Environment (TAE) User Guide'' provides information about the usage of OpenClovis TAE. TAE provides an infrastructure to allow comprehensive system and unit tests to be written and executed easily. It also contains a web-based test report server for permanent storage and retrieval of test reports. This guide helps you to utilize the OpenClovis TAE in your own environment.&lt;br /&gt;
&lt;br /&gt;
OpenClovis TAE is designed to simplify and accelerate the testing of Telecom application software over OpenClovis platform. It also provides a simple and powerful mechanism to coordinate the activities of multiple blades of a chassis or multiple systems in a network.&lt;br /&gt;
&lt;br /&gt;
===Audience===&lt;br /&gt;
&lt;br /&gt;
OpenClovis TAE User Guide is designed for system integrators, developers, and testers. To use this OpenClovis product, you must be aware of the fundamentals of operation, management, and configuration of telecommunication and networking domains. You must also be familiar with Python programming, the OpenClovis SAFplus Platform product, and have a basic knowledge of Linux.&lt;br /&gt;
&lt;br /&gt;
===Documentation Conventions===&lt;br /&gt;
&lt;br /&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;0&amp;quot; cellpadding=&amp;quot;3&amp;quot;&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot;| Notation &lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot;| Description&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:black&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 source code provided in various examples.&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Cross reference&lt;br /&gt;
|&lt;br /&gt;
This font denotes a hyper link. You can click on the hyper link text to access the reference location, which can be either a section within the User Guide or a URL link.&lt;br /&gt;
A cross reference refers to a section name accesses the first page of that section.&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
'''Bold Text''' &lt;br /&gt;
|&lt;br /&gt;
Menu items and button names.&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
''Italic Text'' &lt;br /&gt;
|&lt;br /&gt;
Variables for which you enter values.&lt;br /&gt;
|}&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 Documentation===&lt;br /&gt;
&lt;br /&gt;
For additional information about OpenClovis products, refer to the following guides:&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;
* '''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;
* '''OpenClovis Installation Guide''' provides the system requirements, installation procedure for OpenClovis SAFplus Platform, IDE, and the Evaluation System.&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;
* '''OpenClovis Evaluation System User Guide''' provides all the required information to configure and run the sample models packaged within the Evaluation System. This document also provides good understanding of OpenClovis SAFplus Platform's functionality. This is the natural follow on to the ''OpenClovis Sample Application Tutorial'' as it builds on the example created in that document. &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;
* '''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;
* '''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;
* '''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;
For additional information about TurboGears, the web application mega-framework used by the OpenClovis SAFplus Platform Web Director please refer to:&lt;br /&gt;
* Turbogears web site at http://www.turbogears.org.&lt;br /&gt;
&lt;br /&gt;
===OpenClovis Online Technical Support===&lt;br /&gt;
&lt;br /&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;
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>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Deadpages/Doc:Sdk_5.0/taeguide</id>
		<title>Deadpages/Doc:Sdk 5.0/taeguide</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Deadpages/Doc:Sdk_5.0/taeguide"/>
				<updated>2010-08-27T05:02:57Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Table of contents:&lt;br /&gt;
&lt;br /&gt;
* [[Doc:sdk_5.0/taeguide/preface | Preface ]]&lt;br /&gt;
* [[Doc:sdk_5.0/taeguide/overview | Overview ]]&lt;br /&gt;
* [[Doc:sdk_5.0/taeguide/deppkg | Deployment and Packaging ]]&lt;br /&gt;
* [[Doc:sdk_5.0/taeguide/testimpl | Testcase Implementation ]]&lt;br /&gt;
* [[Doc:sdk_5.0/taeguide/testintg | Testcase Integration]]&lt;br /&gt;
* [[Doc:sdk_5.0/taeguide/runtae | Running the TAE ]]&lt;br /&gt;
* [[Doc:sdk_5.0/taeguide/reportserver | TAE Report Server]]&lt;br /&gt;
** [[Doc:sdk_5.0/taeguide/screens | Screens ]]&lt;br /&gt;
*** [[Doc:sdk_5.0/taeguide/projects | Projects ]]&lt;br /&gt;
*** [[Doc:sdk_5.0/taeguide/projectSummary | Project Summary ]]&lt;br /&gt;
*** [[Doc:sdk_5.0/taeguide/reports | Test Reports ]]&lt;br /&gt;
*** [[Doc:sdk_5.0/taeguide/testreport | Test Report in Detail ]]&lt;br /&gt;
*** [[Doc:sdk_5.0/taeguide/logfiles | TAE log files and Node postmortem files ]]&lt;br /&gt;
*** [[Doc:sdk_5.0/taeguide/models | Models ]]&lt;br /&gt;
*** [[Doc:sdk_5.0/taeguide/fixtures | TAE Fixtures ]]&lt;br /&gt;
*** [[Doc:sdk_5.0/taeguide/testcases | Testcases ]]&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/taeguide</id>
		<title>Doc:latest/taeguide</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/taeguide"/>
				<updated>2010-08-27T05:02:57Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Table of contents:&lt;br /&gt;
&lt;br /&gt;
* [[Doc:latest/taeguide/preface | Preface ]]&lt;br /&gt;
* [[Doc:latest/taeguide/overview | Overview ]]&lt;br /&gt;
* [[Doc:latest/taeguide/deppkg | Deployment and Packaging ]]&lt;br /&gt;
* [[Doc:latest/taeguide/testimpl | Testcase Implementation ]]&lt;br /&gt;
* [[Doc:latest/taeguide/testintg | Testcase Integration]]&lt;br /&gt;
* [[Doc:latest/taeguide/runtae | Running the TAE ]]&lt;br /&gt;
* [[Doc:latest/taeguide/reportserver | TAE Report Server]]&lt;br /&gt;
** [[Doc:latest/taeguide/screens | Screens ]]&lt;br /&gt;
*** [[Doc:latest/taeguide/projects | Projects ]]&lt;br /&gt;
*** [[Doc:latest/taeguide/projectSummary | Project Summary ]]&lt;br /&gt;
*** [[Doc:latest/taeguide/reports | Test Reports ]]&lt;br /&gt;
*** [[Doc:latest/taeguide/testreport | Test Report in Detail ]]&lt;br /&gt;
*** [[Doc:latest/taeguide/logfiles | TAE log files and Node postmortem files ]]&lt;br /&gt;
*** [[Doc:latest/taeguide/models | Models ]]&lt;br /&gt;
*** [[Doc:latest/taeguide/fixtures | TAE Fixtures ]]&lt;br /&gt;
*** [[Doc:latest/taeguide/testcases | Testcases ]]&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/sdkguide/glossary</id>
		<title>Doc:latest/sdkguide/glossary</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/sdkguide/glossary"/>
				<updated>2010-08-27T04:14:25Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=='''Appendix A: Glossary of Terms'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Alarm''' An alarm is a warning about the abnormal conditions of Managed Object (MO).&lt;br /&gt;
&amp;lt;br&amp;gt;[[File:OpenClovis_Note.png]]An alarm always does not represent an error.&lt;br /&gt;
&lt;br /&gt;
'''Alarm Lifecycle''' The Alarm Managed Service Object (MSO) associated with an MO depicts the lifecycle of an alarm as: &lt;br /&gt;
* An alarm is raised by the alarm service, if the abnormal condition relating to the alarm persists for a time, at least equal to the soaking interval specified. This alarm may be cleared by:&lt;br /&gt;
** The alarm service, when it gets a notification from the MO that the abnormal condition which caused the alarm has been cleared.&lt;br /&gt;
** RESET, if the MO is hardware, and RESTART, if the MO is software Execution Object (EO).&lt;br /&gt;
&lt;br /&gt;
'''Alarm Manager''' The alarm manager enables configuring and handling of alarms. It provides support for alarm soaking, masking, alarm hierarchies, retrieving previous alarm conditions, and correlation of the alarms before publishing. &lt;br /&gt;
&lt;br /&gt;
'''Alarm Masking''' Multiple alarms can be raised in a system. Alarm-masking is a procedure that enables the alarm service to publish the alarms with high priority for fault recovery.The current alarm-masking logic implies that all MOs are organized in a fault containment hierarchy which represents the relationship &amp;quot;is physically contained in&amp;quot; for hardware and &amp;quot;runs on&amp;quot; for software. The alarm-masking algorithm masks all alarms of the same or lesser severity level within any sub-tree in the hierarchy. &lt;br /&gt;
&lt;br /&gt;
'''Alarm Service''' The OpenClovis alarm service implements a generic engine to process abnormal conditions reported by managed resources. The process includes identifying the alarm type and its severity level and determining whether an alarm has to be raised after running it through soaking and masking procedures.Potential subscribers for alarm events are - OpenClovis Fault Management Service, OpenClovis Availability Management Service and other agents like SNMP, CLI, and so on for reporting alarms to external managers. &lt;br /&gt;
&lt;br /&gt;
'''Alarm Severity''' The alarm severity specifies the condition of the service provided by the MO. The severity levels can be critical, major, minor, warning, or cleared and indeterminate (CCITT X.733). The cleared and indeterminate level indicates clearing of one or more previously reported alarms. The critical and major alarms are service-affecting alarms. &lt;br /&gt;
&lt;br /&gt;
'''Alarm Soaking''' Soaking is the time defined for extreme conditions before reporting as an alarm. Alarm soaking is possible when a managed resource provides a pair of notifications - one for the occurrence of an extreme condition and another for clearing of the extreme condition. Soaking avoids raising an alarm unless the extreme condition of the alarm persists for a period of time. Sometimes, you may not get a notification for clearing of an extreme condition. In such cases, a poll mechanism can be used to see if the alarm condition is still present after the soaking interval. &lt;br /&gt;
&lt;br /&gt;
'''Application''' An Application is customer software built using OpenClovis infrastructure that provides services to the end users. For instance: A SIP server customer application. &lt;br /&gt;
&lt;br /&gt;
'''SAFplus Platform Console''' A command-line Interface for debugging allows access to the managed object repository for creating, deleting and otherwise manipulating objects. SAFplus Platform Console also provides viewers for system log and trace data as well as interfaces to individual EOs to view and modify their private (non-persistent) data. &lt;br /&gt;
&lt;br /&gt;
'''Attributes''' Attributes are the characteristics or parameters of a Managed Object. &lt;br /&gt;
&lt;br /&gt;
'''ATCA Chassis''' An Advanced Telecom Computing Architecture [ATCA] specification is designed to use in the central office grade equipment at the telecommunications sector. The ATCA defines the rack and chassis [shelf] form factors, [passive] backplane, cards, power, and keying. An ATCA card can handle up to 4 PMC daughter cards. &lt;br /&gt;
&lt;br /&gt;
'''Availability Management Framework (AMF)''' AMF is a software entity that provides a framework for high availability of applications in a system. It is responsible for instantiating and managing all the OpenClovis SAFplus Platform services. It executes configured recovery actions on the failure of application components. The AMF is built with the close association of two OpenClovis SAFplus Platform components: Component Manager and the Availability Management Service (AMS). &lt;br /&gt;
&lt;br /&gt;
'''Boot Level''' OpenClovis SAFplus Platform services and customer applications are mapped to different Boot Levels. The Boot Management Service starts these services (applications) when it reaches the specified BOOT_LEVEL. The BMS can be constrained to boot-up only to a specified BOOT_LEVEL.&lt;br /&gt;
&amp;lt;br&amp;gt;[[File:OpenClovis_Note.png]]BOOT_LEVEL is conceptually similar to the run_level concept in Unix.&lt;br /&gt;
&lt;br /&gt;
'''Boot Management Service''' OpenClovis Boot Management Service provides the support for starting or shutting down of the OpenClovis SAFplus Platform services and customer applications on a OpenClovis SAFplus Platform managed platform. The Boot service assumes that an OS has already been booted-up in the target environment. While starting or shutting down a system, the BMS has several BOOT_LEVELS in sequence. At each level, certain services (applications) are started or shutdown. &lt;br /&gt;
&lt;br /&gt;
'''Boot Profile''' The boot profile defines a particular type or a particular mode of boot configuration. The list of services performed can be different for different profiles. This helps in obtaining different configurations containing different set of boot levels and different Service Units assigned to them.For Instance, a profile named debug can define a boot configuration, which can be helpful in debugging the boot up process, whereas a profile named production can be used when the desired configuration for normal deployment boot needs to be specified. &lt;br /&gt;
&lt;br /&gt;
'''Boot State Machine''' The boot state machine provides a mechanism for a customer to control boot-up (sequences, dependencies, exception handling) using BOOT_LEVELS, RUN-LEVELS, and so on. &lt;br /&gt;
&lt;br /&gt;
'''Chassis Management Service''' OpenClovis Chassis Management Service provides support for resource discovery, sensors, and controls on chassis-based hardware platforms. The platforms can be standard-based (ATCA, BladeCenter and so on) or proprietary. The Chassis Management Service can be customized for any platform by providing the platform specific plug-ins. &lt;br /&gt;
&lt;br /&gt;
'''Checkpoint Service (CPS)''' CPS provides synchronization of run-time data and context to ensure a seamless failover or switchover of applications. It allows the application to store its internal state and retrieve the information. It also provides a facility for processes to record checkpoint data incrementally and supports non-transparent mode of Checkpointing. &lt;br /&gt;
&lt;br /&gt;
'''Clovis Object Repository (COR)''' Clovis Object Repository (COR) is an in-memory object-oriented hierarchical distributed repository of MOs. COR contains the description of each MO and relationships between different MOs. Multiple relationships - hierarchical containment and associations - are supported. COR provides Object lifecycle management, transactions on multiple objects, object change notification, object change propagation and other services.Each OpenClovis SAFplus Platform instance has an instance of the Clovis Object Repository associated with it.The COR instance on the System Director links with COR instances on Blade Directors to provide a single logical system view of all the MOs. &lt;br /&gt;
&lt;br /&gt;
'''Cold Restart''' Cold Restart is an element that carries out the entire initialization sequence from the beginning. For example power-on. &lt;br /&gt;
&lt;br /&gt;
'''COR Persistence''' The Clovis Object Repository may be persisted using a persistent database. The effect of this is as follows: When a OpenClovis SAFplus Platform instance boots up, COR reads the database and restores the persisted state to each MO. This state is used, for example, by the provisioning service to provision all objects on boot-up. &lt;br /&gt;
&lt;br /&gt;
'''DBAL''' Provides a standard interface for any OpenClovis SAFplus Platform infrastructure component or application to interface with the commonly used relational. DBAL currently supports GNU Database Manager. &lt;br /&gt;
&lt;br /&gt;
'''Default Boot Level''' During startup, the Component Manager boots the components to a boot level called default boot level as specified in the deployment configuration file. All the components specified up to and including the default boot level are started. &lt;br /&gt;
&lt;br /&gt;
'''EO Management service''' The OpenClovis Execution Object (EO) Management Service monitors the health and controls the state of all Execution Objects in the system. State control includes the ability to start, stop, suspend, resume, kill and restart an EO. &lt;br /&gt;
&lt;br /&gt;
'''EOID''' Identifier for execution object (EOID is unique within a OpenClovis SAFplus Platform instance). &lt;br /&gt;
&lt;br /&gt;
'''Error''' Error is the deviation in the system state or behavior as a result of the use of incorrect data or signal. &lt;br /&gt;
&lt;br /&gt;
'''Event''' Events are means by which data may be exchanged between event publishers and event subscribers. An event is characterized by an event channel and event ID. &lt;br /&gt;
&lt;br /&gt;
'''Event Channel''' An event channel is a mechanism used by the event service for publishers and subscribers to communicate via events. One or more events (with distinct event ID's) may correspond to an event channel. &lt;br /&gt;
&lt;br /&gt;
'''Event Filter''' These are filters used by an EO to specify the events it is interested in. &lt;br /&gt;
&lt;br /&gt;
'''Event Publisher''' An EO that publishes an event. &lt;br /&gt;
&lt;br /&gt;
'''Event Service''' An OpenClovis SAFplus Platform service that provides a mechanism to publish or subscribe communication based on event channels and asynchronous communication between publishers and subscribers. &lt;br /&gt;
&lt;br /&gt;
'''Event Subscriber''' An EO that is interested in receiving published events on a specific event channel. &lt;br /&gt;
&lt;br /&gt;
'''Execution Object''' The motivation for the OpenClovis EO is to provide execution contexts independent of process architecture in any OS.Execution objects are programs that implement management interfaces (mandated by OpenClovis SAFplus Platform). These programs allow them to be managed in a OpenClovis SAFplus Platform environment. (Refer to EO Management Service, for details of management functions).EOs may use services provided by other EOs (For example, Checkpointing service). If so, they need to implement client interfaces for the service in question.EOs may provide services to other EOs. In this case they need to implement the service interface.EOs may be made visible to an external manager by representing them as MOs. &lt;br /&gt;
&lt;br /&gt;
'''Failure''' A failure in a system occurs when the consumer (human or non-human) of a service is affected by the fact that the system has not delivered the expected service. It is a reflection of unacceptable or incorrect results delivered by a system with respect to a specification. It is an unexpected behavior perceived by the consumer or user of a service. &lt;br /&gt;
&lt;br /&gt;
'''Fault''' A fault is a Physical or algorithmic cause of a malfunction. Faults manifest themselves as errors. &lt;br /&gt;
&lt;br /&gt;
'''Fault Diagnosis''' Fault Diagnosis is the process of determining the cause of a fault. Fault diagnosis is provided to the granularity of an FRU to support maintainability or serviceability. &lt;br /&gt;
&lt;br /&gt;
'''Fault Management Service''' OpenClovis FMS provides a framework for fault management, including fault diagnosis and progressive recovery. Standard recovery methods for software exceptions are available. You can plug-in custom fault recovery methods. &lt;br /&gt;
&lt;br /&gt;
'''Fault Manager''' The Fault Manager manages faults in a system and initiates actions. It can handle various user-defined run-time faults, including hardware and software faults. It can prioritize faults to ensure that the critical faults are addressed before the normal or the low-priority faults.The Fault Manager client library notifies alarms to the Fault Manager server located on the same node. The actions to be taken on receiving a fault are controlled by the FM policy associated with the faults. &lt;br /&gt;
&lt;br /&gt;
'''Field Replaceable Unit (FRU)''' Field Replaceable Unit is the hardware element of a system that can be replaced by a similar element in the field. &lt;br /&gt;
&lt;br /&gt;
'''Group Membership Service (GMS)''' Group membership service provides the facility of leader election. Any application or OpenClovis SAFplus Platform service can register with GMS to keep track of information such as leader change and cluster membership change. &lt;br /&gt;
&lt;br /&gt;
'''Hardware Abstraction Layer''' Provides a uniform management interface to hardware peripheral devices via their respective device drivers. Device types include Framer, NP, ASIC, LIU, Switch chip, DSP, and so on. HAL supports the following interfaces: Access, Init, Open, Close, Control, Retrieve, Send, Receive, Download OpenClovis SAFplus Platform. Customer applications are made entirely transparent to configuration changes in the underlying devices by the HAL. &lt;br /&gt;
&lt;br /&gt;
'''Heartbeat''' Heartbeat is a message exchanged at regular intervals between two OpenClovis SAFplus Platform instances. A missed heartbeat is the non-arrival of a heartbeat within a timeout period. A configurable number of missed heartbeats are taken to indicate that one of the two instances in question is no longer running or is incommunicable. &lt;br /&gt;
&lt;br /&gt;
'''Heartbeat Service''' A service that runs on every OpenClovis SAFplus Platform instance and monitors the health of other OpenClovis SAFplus Platform instances using the heartbeats. &lt;br /&gt;
&lt;br /&gt;
'''High Availability (HA)''' High Availability (HA) is used when referring to a system that is capable of providing service most of the time.  &lt;br /&gt;
&lt;br /&gt;
'''Hot Plug Unit''' An FRU that can be removed or re-inserted even while the system is powered. &lt;br /&gt;
&lt;br /&gt;
'''Intelligent Object Communication (IOC)''' OpenClovis Intelligent Object Communication (IOC) provides a transport and OS neutral, fault tolerant communication between OpenClovis Execution Objects using physical links available and user defined transports (E.g.: UDP, TCP, or Ethernet). &lt;br /&gt;
&lt;br /&gt;
'''Interface Definition Language (IDL)''' )IDL is a library used by all EOs to communicate efficiently across nodes. Using IDL, OpenClovis SAFplus Platform services can communicate across endian machines and mixed mode (32-bit and 64-bit architecture). &lt;br /&gt;
&lt;br /&gt;
'''IOC Address''' Address of a OpenClovis IOC instance that maps to a transport address for each transport or physical link provided. &lt;br /&gt;
&lt;br /&gt;
'''Link''' A link is a physical interconnection between nodes. Also referred to as physical medium. &lt;br /&gt;
&lt;br /&gt;
'''Local Managed Object''' A managed object abstracting a local resource. &lt;br /&gt;
&lt;br /&gt;
'''Local Resource''' A resource that is contained from a fault-containment point of view within a physical node. (Local resources can be software abstractions implemented by programs running on the node, or hardware attached to the node, or the node itself). &lt;br /&gt;
&lt;br /&gt;
'''Log Service''' Log service collects, translates, and publishes log messages to record any significant event in the system. For example: operational state change of a component, managed object attribute value change, and so on. &lt;br /&gt;
&lt;br /&gt;
'''Managed Object (MO)''' Managed Object provides an abstraction for the manageable properties of a resource in the system. MOs have attributes, support management operations, exhibit behavior and can emit notifications(CCITT X.700).Operations on an MO can be Create or Delete Instances; Get or Modify attributes; Action.Notifications emitted by an MO instance are instance created/deleted; report attribute change; class specific notification such as alarms.Attributes can be single valued, multivalued or grouped in an attribute group (Ex; Chassis attributes relating to blades may be grouped). &lt;br /&gt;
&lt;br /&gt;
'''Managed Service Object (MSO)''' MSOs encapsulate the attributes of a Managed Object specific to the particular Object Implement (OI) they are associated with. (Ex: Alarm severity is an attribute related to the alarm MSO; it is a part of the Alarm MSO associated with any MO desiring an alarm service). &lt;br /&gt;
&lt;br /&gt;
'''Management Information Base (MIB)''' Management Information Base is a data structure that holds information on how a system is configured or functioning.  &lt;br /&gt;
&lt;br /&gt;
'''Management Interfaces''' Methods available for managing a system at the boundary of the system and management middleware. In OpenClovis SAFplus Platform, management interfaces (for different management protocols) are provided by the Mediation Library. &lt;br /&gt;
&lt;br /&gt;
'''Mediation Library''' The Mediation Library mediates between management agents implementing standard protocols (such as CISCO CLI or SNMP) and the OpenClovis SAFplus Platform to service management requests from respective (CLI, SNMP) management stations. Requests from outside the system are translated to requests on MOs and forwarded to the appropriate MO. &lt;br /&gt;
&lt;br /&gt;
'''Mean Time to Failure (MTTF)''' MTTF is the interval in which the system or element can provide service without failure. &lt;br /&gt;
&lt;br /&gt;
'''Mean Time to Repair (MTTR)''' MTTR represents the interval in time it takes to resume service whenever a failure occurs. &lt;br /&gt;
&lt;br /&gt;
'''Middleware''' OpenClovis SAFplus Platform is often referred to as a middleware. This is to reflect that OpenClovis SAFplus Platform is a layer over the OS, providing system services and APIs to user applications. Applications must be written to OpenClovis SAFplus Platform API's (rather than directly to OS API's) in order to be OS, database and hardware independent and to be manageable and available. &lt;br /&gt;
&lt;br /&gt;
'''MOID''' Managed Object Identifier - The MOs have unique global handles associated with them within the system, and using these handles one can address the MOs. The COR handle uses a pair of object class index and object instance index. Object class index uniquely identifies a managed object class and managed object instance index uniquely identifies an instance of a managed object within that class. &lt;br /&gt;
&lt;br /&gt;
'''MO (Instance) Tree''' Managed Object Instance Naming Tree - The MO fault containment hierarchy (see OpenClovis Information Model) is used to name instances of objects. For example, in a chassis based system, an instance of a port could be located as follows: Chassis (0)/Blade (3)/Port (2) &lt;br /&gt;
&lt;br /&gt;
'''MSG-Q''' A transport supported by the OpenClovis SAFplus Platform infrastructure as an alternative to UDP using message queuing service of the OS. Restricted to use when the sender &amp;amp; the receiver are in the same OS/OpenClovis SAFplus Platform instance. &lt;br /&gt;
&lt;br /&gt;
'''Name Service''' The name service facilitates location transparency to the communicating objects by allowing use of object name instead of location specific address. The name service provides name to IOC address translation. A name is user-defined data. &lt;br /&gt;
&lt;br /&gt;
'''Node Profile''' Node Profile describes the list of services that can be run on this node and the various attributes of these services. It also describes the characteristics of the node with respect to its role in the chassis. A node can either behave as a Controller Node for the complete chassis or as a normal processing node in the chassis. &lt;br /&gt;
&lt;br /&gt;
'''Notification''' Managed Objects emit notifications. Notifications emitted by an MO instance are instance created/ deleted; report attribute-change; class-specific notification such as Alarm (Also referred to as COR notification). &lt;br /&gt;
&lt;br /&gt;
'''OAMP''' Refers to Operations, Administration, Maintenance and Provisioning. &lt;br /&gt;
&lt;br /&gt;
'''OpenClovis SAFplus Platform Services''' OpenClovis SAFplus Platform services are Execution Objects that provide core-underlying services for OpenClovis SAFplus Platform and applications. &lt;br /&gt;
&lt;br /&gt;
'''OpenClovis IDE''' This is a Graphical User Interface (GUI) tool designed to simplify and accelerate the development of System Infrastructure Software for Telecom and other networking products. It enables the customer to rapidly create an information model of the Resources that will be required to manage. It generates customized code for OpenClovis SAFplus Platform, a flagship product of OpenClovis Inc. &lt;br /&gt;
&lt;br /&gt;
'''OpenClovis Information Model''' An OpenClovis Information Model (IM) is a generic framework or an abstract representation of the entities in a managed environment.It is a mechanism that describes the characteristics of the network element for which the infrastructure software is being implemented. IM provides a unified view and association of all the physical and logical objects in the managed environment. Information Modeling transports the current content or state of a OpenClovis SAFplus Platform Object such as a blade, port, or any other logical object between different Execution Objects. &lt;br /&gt;
&lt;br /&gt;
'''Operating System Abstraction Layer (OSAL)''' The OpenClovis Operating System Abstraction Layer provides commonly used APIs to abstract OS services for OpenClovis EOs and customer applications.The basic OS services include the following:&lt;br /&gt;
* Memory Management, Timer Management, Executive Task/Process/thread Management, Signal/Event Management, Resource Management, Messaging services, RTOS task profiling services, synchronization and semaphore management.&lt;br /&gt;
* OSAL enables one to easily port the OpenClovis SAFplus Platform and OpenClovis SAFplus-enabled customer applications onto new RTOS environments.&lt;br /&gt;
&lt;br /&gt;
'''Physical Node''' A physical node is a particular type of resource that can run a single instance of the operating system and OpenClovis software. (Ex: a blade with a general purpose CPU). Physical nodes may be interconnected via some form of communication medium (Ex: multiple blades via a chassis backplane).The process model describes how OpenClovis SAFplus Platform service EO's and user application EO's map to processes in a specific operating system. (Example: in the multi-process version of Release 1.0 for Linux, all OpenClovis SAFplus Platform EOs run in a single Unix process and user application EOs may be combined in one or more processes). &lt;br /&gt;
&lt;br /&gt;
'''Pre-provisioning''' Normally, the provisioning of an object corresponding to an FRU occurs when that FRU is present. However, pre-provisioning takes place when an MO exists and the FRU is absent. Scenarios where this occurs:&lt;br /&gt;
* A blade lost power or was extracted from the chassis after being provisioned.&lt;br /&gt;
* A user pre-provisioned a blade in the Provision Manager's database in the absence of a blade.&lt;br /&gt;
* When the blade becomes active, the provisioning service on the System Controller verifies the provisioned data against the properties of the blade and pushes the data down to the blade if the blade's properties match; otherwise, an identity mismatch alarm will be raised and no data will be pushed down.&lt;br /&gt;
&lt;br /&gt;
'''Provisioning Service''' The Provisioning service is an Engine that provisions any type of equipment and facility, virtual or physical in the most generic way. Provisioning is accomplished using the Provisioning EOs and provisioning MSOs. &lt;br /&gt;
&lt;br /&gt;
'''Reboot''' Cold reboot occurs when a system is powered off and then powered on. In a warm reboot, the hardware remains powered on and provisioning is not disturbed; the OS is re-started. &lt;br /&gt;
&lt;br /&gt;
'''Remote Method Dispatch (RMD)''' Remote Method Dispatch is the foundation for all OpenClovis SAFplus Platform client APIs. It implements remote procedure call semantics using both synchronous and asynchronous methods. &lt;br /&gt;
&lt;br /&gt;
'''Resource''' A resource is any entity that can be managed by the OpenClovis SAFplus Platform. A resource is either hardware equipment (for example, a blade) or a software abstraction implemented by programs running on that hardware (for example, a software process). &lt;br /&gt;
&lt;br /&gt;
'''Routing Table''' Based on the information in this table, IOC module selects a transport and the next IOC hop, to send a message towards its destination. Multiple routes (to the same destination) are required for fault tolerance. &lt;br /&gt;
&lt;br /&gt;
'''Rule-Based Engine (RBE)''' Rule-Based Engine (RBE) provides a mechanism to create rules to be applied to the system instance databased on simple expressions. An expression consists of a mask and a value. These expressions are evaluated on user data and generate a boolean value for the decision. &lt;br /&gt;
&lt;br /&gt;
'''Run Level''' Mechanism used to synchronize and order the execution of EOs within and across different OpenClovis SAFplus Platform instances.OpenClovis EOs are configured to execute at some run-level; therefore, they can be controlled by the Boot Manager's Run-Level Controller (RLC). For example, the Alarm Agent is configured at Level 2 after the Provisioning Agent, which is at Level 1. This implies that the Alarm Agent has some execution dependency on the Provisioning Agent and that there is some critical section in the Provisioning Agent's initialization code that needs to execute first before the Alarm Agent can continue its execution. &lt;br /&gt;
&lt;br /&gt;
'''Shelf''' It is a structure/frame where one or more chassis are mounted. &lt;br /&gt;
&lt;br /&gt;
'''Service''' Service is the output of a system that meets the specification for which the system is devised. &lt;br /&gt;
&lt;br /&gt;
'''Service ID''' Uniquely references a service (OpenClovis SAFplus Platform or customer designed). &lt;br /&gt;
&lt;br /&gt;
'''Simple Network Management Protocol (SNMP)''' Simple Network Management Protocol (SNMP) is a sub-agent, which provides the flexibility to manage platform and non-platform hardware and OpenClovis SAFplus Platform Information Model. Using SNMP, you can manage the attributes of an MO that includes run a get, set, or notification. &lt;br /&gt;
&lt;br /&gt;
'''Route Station List''' List of EOs associated with an COR MSO that need to be visited before an attribute of that MSO is modified. &lt;br /&gt;
&lt;br /&gt;
'''System''' The system consists of a collection of physical nodes and programs running on those nodes (Ex: A chassis with multiple blades and running software programs). &lt;br /&gt;
&lt;br /&gt;
'''System Log''' A persistent file that records the significant events occuring in the system. Typical entries include events related to boot-up, shutdown, errors, recovery, operator commands, operator log-on and log-off. Each log entry contains a timestamp, reporting entity, affected entity, and severity code and operator identity (if applicable). &lt;br /&gt;
&lt;br /&gt;
'''Transactions''' OpenClovis SAFplus Platform supports transactions in the following sense:&lt;br /&gt;
* Any service that changes the state of managed objects may provide three methods: validate(), update () and rollback(). All these methods must be successfully executed for the transaction to be complete. The affected MO state is also updated in the persistent COR database as part of the transaction.&lt;br /&gt;
* OpenClovis SAFplus Platform also supports complex transactions. A list of component (called route station list) may be associated with each MO/MSO. Each component in the list may provide the three methods listed above. The nested transaction is implemented as follows: The list is traversed top down and the validate method of each successive component is executed. When the last component in the list is reached, the update methods for all the components are executed. If there is any failure happening in the validate() callback, then the rollback () callback is executed for all the components involved in the transaction. The transaction is considered successful if no error is reported by validate method executed as part of transaction. Any error happening in the update phase or the rollback phase is not returned as transaction failure.&lt;br /&gt;
&lt;br /&gt;
'''Transport''' OpenClovis term for user (system developer) provided communication facility, which provides IOC access to the physical medium.&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/sdkguide/troubleshooting</id>
		<title>Doc:latest/sdkguide/troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/sdkguide/troubleshooting"/>
				<updated>2010-08-27T04:13:38Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Troubleshooting SAFplus Platform==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Conventions:'''&lt;br /&gt;
&lt;br /&gt;
* '''Sandbox'''&lt;br /&gt;
&lt;br /&gt;
When you extract SAFplus Platform image (output of make images) into particular location, the following directory structure will be created&lt;br /&gt;
&lt;br /&gt;
** &amp;lt;top-level&amp;gt;&lt;br /&gt;
*** bin -- Location of all SAFplus Platform as well as application binaries&lt;br /&gt;
*** etc -- Location of all SAFplus Platform configuration files&lt;br /&gt;
*** lib -- Location of all the libraries used by SAFplus Platform (except system)&lt;br /&gt;
*** modules -- Ignore this&lt;br /&gt;
*** share -- SNMP MIB related stuff. Ignore if you are not using SNMP features provided by SAFplus Platform.&lt;br /&gt;
*** var -- All the runtime data generated by SAFplus Platform and their locations inside var/&lt;br /&gt;
*** all the log files -- var/log&lt;br /&gt;
*** all the non persistent database files and other run time files -- var/run&lt;br /&gt;
*** all the persistent database files -- var/lib/&amp;lt;comp-name&amp;gt; where component name is currently ams and cor&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;top-level&amp;gt; directory is called '''sandbox'''.&lt;br /&gt;
&lt;br /&gt;
===Environment Variables===&lt;br /&gt;
&lt;br /&gt;
* '''ASP_SAVE_PREV_LOGS''' -- if set to 1 will save logs in the sandbox from the previous run of SAFplus Platform (if any) during SAFplus Platform startup into location specified by the environment variable ASP_PREV_LOG_DIR or to /tmp/asp_saved_logs, creating the directory if necessary. If set to 0, the logs will deleted. Default value is 1.&lt;br /&gt;
&lt;br /&gt;
* '''ASP_PREV_LOG_DIR''' -- place where logs of previous SAFplus Platform run will be stored. Default value is /tmp/asp_saved_logs&lt;br /&gt;
&lt;br /&gt;
* '''ASP_LOG_FILTER_DIR''' -- place where log filter file should be present. It should be named logfilter.txt. Default value /tmp&lt;br /&gt;
&lt;br /&gt;
* '''CL_LOG_SEVERITY''' -- Environment variable used to set the log filter. You can export this env variable to any log severity like DEBUG, INFO, NOTICE, ERROR, etc. Note that setting of this env variable has higher priority than the log filter file explained above.&lt;br /&gt;
&lt;br /&gt;
* '''CL_LOG_CODE_LOCATION_ENABLE''' -- Environment variable if set to 1, will show the file name, function name and line number when displaying logs. Default value is 0.&lt;br /&gt;
&lt;br /&gt;
* '''ASP_RESTART_SAFplus''' -- if set to 1 will restart SAFplus Platform in case AMF crashed or SAFplus Platform was not able to come up for some reason, if set to 0 will not restart SAFplus Platform. Default value is 1.&lt;br /&gt;
&lt;br /&gt;
* '''ASP_APP_BINDIR''' -- Can be used to specify if the application binaries are stored in a different place than &amp;lt;sandbox&amp;gt;/bin directory.&lt;br /&gt;
&lt;br /&gt;
===Logging===&lt;br /&gt;
&lt;br /&gt;
* The logs generated by SAFplus Platform are present in two places:&lt;br /&gt;
** Standard out/standard error &amp;amp; startup/shutdown: -- stored in &amp;lt;sandbox&amp;gt;/var/log/&amp;lt;node-name.log&amp;gt;&lt;br /&gt;
*** Output can be controlled by log filter&lt;br /&gt;
** By Log infrastructure -- stored in &amp;lt;sandbox&amp;gt;/var/log/&amp;lt;stream-name&amp;gt;.latest (by default)&lt;br /&gt;
*** sys and app are two streams created by default. The &amp;quot;sys&amp;quot; logs are logs coming from the SAFplus Platform, &amp;quot;app&amp;quot; logs come from your programs. For e.g. var/log/sys.latest will contain log messages written to the system stream.&lt;br /&gt;
*** Output cannot be controlled by log filter&lt;br /&gt;
* Log filter file&lt;br /&gt;
&lt;br /&gt;
The log filter file lets you selectively filter logging at log generation time, so that you can focus on debugging a subset of components. The log filter file is a text file located at /tmp/logfilter.txt OR $(ASP_LOG_FILTER_DIR)/logfilter.txt (i.e. you may set this env variable to your preferred directory).&lt;br /&gt;
&lt;br /&gt;
Log filter file should contain one rule per line, where the format of the rule is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(&amp;lt;node-name&amp;gt;:&amp;lt;component-eo-name&amp;gt;.&amp;lt;area&amp;gt;.&amp;lt;context&amp;gt;)[file_name]=&amp;lt;severity&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The '*' matches anything and can be used in any field. Any line starting with # starts a comment.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;node-name&amp;gt;&amp;lt;/code&amp;gt; is the name of the SAFplus Platform node as found in etc/asp.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;component-eo-name&amp;gt;&amp;lt;/code&amp;gt; can be found by looking in etc/clEoConfig.xml&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;area&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;lt;context&amp;gt;&amp;lt;/code&amp;gt; are string that denote particular sub component of the component.&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;file_name&amp;gt;&amp;lt;/code&amp;gt; refers to the name of the file in which the message was logged.&lt;br /&gt;
&lt;br /&gt;
E.g.:&lt;br /&gt;
&lt;br /&gt;
* show debugging (and greater severity) messages from all the components, useful when debugging.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
(*:*.*.*)[*]=DEBUG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* show debugging messages only from AMF and error messages from all the other components (note that both lines are required)&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;  &lt;br /&gt;
(*:*.*.*)[*]=ERROR&lt;br /&gt;
(*:AMF.*.*)[*]=DEBUG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* show debugging messages of AMF and CKPT&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
(*:*.*.*)[*]=ERROR&lt;br /&gt;
(*:AMF.*.*)[*]=DEBUG&lt;br /&gt;
(*:CKP.*.*)[*]=DEBUG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
Please refer to section 5.1.1.8 of OpenClovis 3.1 SDK guide for more information.&lt;br /&gt;
&lt;br /&gt;
* Enabling openais logs&lt;br /&gt;
** In etc/clGmsConfig.xml file change the value of tag &amp;quot;openAisLoggingOption&amp;quot; from &amp;quot;none&amp;quot; to &amp;quot;stderr&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Possible errors during startup of SAFplus Platform and solutions/workarounds===&lt;br /&gt;
&lt;br /&gt;
As you troubleshoot using the logs, note that when an error occurs the system&lt;br /&gt;
shuts down and issues a lot of logging describing its shutdown actions. These&lt;br /&gt;
logs are not going to help diagnose the problem. Instead you need to find the&lt;br /&gt;
error that caused the shutdown. A general rule of thumb is to look for the&lt;br /&gt;
first error in the file...&lt;br /&gt;
&lt;br /&gt;
Please look for messages at the log levels of ERROR, CRITICAL and if they are any of the following, follow the steps as mentioned in the Solution section.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; '''Error:'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Fri Jan 2 04:50:09 1970 (SCMI0.256802883 : AMF.---.---.00035 : NOTICE) AMF&lt;br /&gt;
server fully up&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Fri Jan 2 04:50:09 1970 (SCMI0.256802883 : AMF.CPM.LCM.00037 : NOTICE)&lt;br /&gt;
Launching binary image [asp_logd] as component [logServer_SCMI0]...&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Fri Jan 2 04:50:09 1970 (SCMI0.256921623 : LOG.---.---.00015 : ERROR) Error&lt;br /&gt;
finding opening shared library 'libClSQLiteDB.so': No such file or directory&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Fri Jan 2 04:50:09 1970 (SCMI0.256921623 : LOG. EO.INI.00016 : CRITIC)&lt;br /&gt;
Failed to initialize basic library [Dbal], error [0x30011&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Fri Jan 2 04:50:09 1970 (SCMI0.256921623 : LOG. EO.INI.00017 : CRITIC)&lt;br /&gt;
Failed to initialize all basic libraries, error [0x30011]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Fri Jan 2 04:50:09 1970 (SCMI0.256921623 : LOG. EO.INI.00018 : CRITIC)&lt;br /&gt;
Exiting : EO setup failed, error [0x30011]&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; '''Solution:'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
This problem means that proper database has not been specified in the file&lt;br /&gt;
etc/clDbalConfig.xml. Please uncomment the proper &amp;quot;Engine&amp;quot; tag in this&lt;br /&gt;
file. (For qnx it is libBerkeleyDB.so)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; '''Error:'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Wed Nov 19 10:20:35 2008 (SysCtrlI0.29013 : GMS.GEN.---.00032 : NOTICE) GMS&lt;br /&gt;
Server registering with debug service&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wed Nov 19 10:20:35 2008 (SysCtrlI0.29013 : GMS.GEN.---.00033 : DEBUG)&lt;br /&gt;
LINK_NAME env is exported. Value is eth1&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wed Nov 19 10:20:36 2008 (SysCtrlI0.29013 : GMS.GEN.---.00034 : EMRGN)&lt;br /&gt;
ioctl() system call failed while getting details of interface [eth1]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wed Nov 19 10:20:36 2008 (SysCtrlI0.29013 : GMS.GEN.---.00035 : EMRGN) -&lt;br /&gt;
ioctl() returned error [Cannot assign requested address]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wed Nov 19 10:20:36 2008 (SysCtrlI0.29013 : GMS.GEN.---.00036 : EMRGN) -&lt;br /&gt;
This could be because the interface [eth1] is not configured on the system&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wed Nov 19 10:21:25 2008 (SysCtrlI0.28990 : AMF.TSK.POL.00042 : INFO)&lt;br /&gt;
Creating new task&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wed Nov 19 10:21:25 2008 (SysCtrlI0.28990 : AMF.---.---.00043 : ERROR)&lt;br /&gt;
Component [gmsServer_SysCtrlI0] did not instantiated within the specified&lt;br /&gt;
limit&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wed Nov 19 10:21:25 2008 (SysCtrlI0.28990 : AMF.---.---.00044 : ERROR)&lt;br /&gt;
Component gmsServer_SysCtrlI0 did not start within the specified limit&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; '''Solution:'''&lt;br /&gt;
This error is because of the ethernet interface specified in asp.conf (as&lt;br /&gt;
value of LINK_NAME env variable) is not present in the system.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; '''Error:'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Thu Jan 1 02:25:00 1970 (SCMI1.2818074 : AMF.CPM.GMS.00075 : ERROR) Failed&lt;br /&gt;
to receive GMS cluster track callback, error [0x10014]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; '''Solution:'''&lt;br /&gt;
Please make sure that firewall is not enabled on the machine. Try increasing&lt;br /&gt;
the value of &amp;quot;bootElectionTimeout&amp;quot; in etc/clGmsConfig.xml to some higher&lt;br /&gt;
value (default value is 5, try making it 10 or 15). If this doesn't help,&lt;br /&gt;
try enabling the openais logs as indicated in the logging section, to see if&lt;br /&gt;
any other unwanted node is communicating with this node.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; '''Error:'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Wed Nov 19 09:33:39 2008   (SysControllerI0.6139 : GMS.LEA.---.00068 :&lt;br /&gt;
CRITIC) No nodes in the cluster view to run leader election.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wed Nov 19 09:33:39 2008   (SysControllerI0.6139 : GMS.LEA.---.00069 :&lt;br /&gt;
CRITIC) - This could be because:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wed Nov 19 09:33:39 2008   (SysControllerI0.6139 : GMS.LEA.---.00070 :&lt;br /&gt;
CRITIC) - Firewall is enabled on your machine which is restricting multicast&lt;br /&gt;
messages&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wed Nov 19 09:33:39 2008   (SysControllerI0.6139 : GMS.LEA.---.00071 :&lt;br /&gt;
CRITIC) - Use 'iptables -F' to disable firewall&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wed Nov 19 09:33:39 2008   (SysControllerI0.6139 : GMS.LEA.---.00072 :&lt;br /&gt;
ERROR) Error in boot time leader election. rc [0x11]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; '''Solution:'''&lt;br /&gt;
This error is coming because, GMS uses IP Multicast and if firewall is&lt;br /&gt;
configured on your machine, then it would be blocking the multicast&lt;br /&gt;
messages. Hence GMS is not able to see any node joins in the cluster, as&lt;br /&gt;
described in the above error message.&lt;br /&gt;
&lt;br /&gt;
To resolve this problem you can run &amp;quot;iptables -F&amp;quot; command on the machine&lt;br /&gt;
which will flush all the firewall rules and enable IP multicast. Note that&lt;br /&gt;
this setting remains until next reboot of the node. So you need to run&lt;br /&gt;
this command every time you reboot your machine. Otherwise, contact your&lt;br /&gt;
system administrator to disable or configure the firewall to allow IP&lt;br /&gt;
multicast.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; '''Error:'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Thu Jan 1 02:26:55 1970 (SCMI1.2818074 : AMF.AMS.BOO.00116 : CRITIC)&lt;br /&gt;
Inconsistency between GMS and TIPC configuration detected, master address as&lt;br /&gt;
per GMS is [0x1], but master address as per TIPC is [0x2]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; '''Solution:'''&lt;br /&gt;
Please make sure that the value of &amp;quot;multicastPort&amp;quot; is not clashing with that&lt;br /&gt;
of any other nodes, except the one that are configured in the cluster. Similary make sure that TIPC netid (exported as TIPC_NETID in etc/asp.conf) is not clashing with other unwanted nodes.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; '''Error:'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Thu Jan 1 01:26:28 1970 (SCMI0.13049881 : AMF.---.---.01234 : CRITIC)&lt;br /&gt;
Duplicate entry SCMI0 in AMS configuration&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; '''Solution :''' same as above &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; '''Error:'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Error in parsing XML tag &amp;lt;tag-name&amp;gt; in file [clAmfDefinitions.xml]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Fri May 23 20:25:17 2008 (SCMI0.9282 : AMF.---.---.00071 : CRITIC) Fn&lt;br /&gt;
[clAmsParserMain (DEFN_FILE_NAME,CONFIG_FILE_NAME)] returned [0x220105]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Fri May 23 20:25:17 2008 (SCMI0.9282 : AMF.---.---.00072 : ERROR) ALERT&lt;br /&gt;
[clAmsInitialize:293] : Fn&lt;br /&gt;
[clAmsParserMain(DEFN_FILE_NAME,CONFIG_FILE_NAME)] returned [0x220105]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Fri May 23 20:25:17 2008 (SCMI0.9282 : AMF.CPM.AMS.00073 : CRITIC) Unable&lt;br /&gt;
to initialize AMS, error = [0x220105]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; '''Solution:'''&lt;br /&gt;
This means that there was an error in parsing the XML configuration file. This error should not occur unless you have hand edited the XML file. In case the error does occur, it indicates either SAFplus Platform IDE modelling error or bug in SAFplus Platform.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; '''Error:'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
DBAL: .: No such file or directory&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DBAL: PANIC: No such file or directory&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DBAL: environment open: DB_RUNRECOVERY: Fatal error, run database recovery&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; '''Solution:'''&lt;br /&gt;
Unfortunately this errors comes only on QNX and we are still looking into resolving the same. Simply restarting the SAFplus Platform may make the problem go away.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; '''Error:'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Tue Jun 10 21:45:41 2008 (SCMI1.13591 : AMF.CPM.AMS.00372 : CRITIC)&lt;br /&gt;
Node failfast called on [standby] node [ SCMI0] !!!&lt;br /&gt;
This indicates that the cluster has become unstable. Doing self&lt;br /&gt;
shutdown...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; '''Solution:'''&lt;br /&gt;
This error indicates that:&lt;br /&gt;
* There was a change in network configuration of the cluster.&lt;br /&gt;
* Some other nodes are interfering with the cluster. Please make sure TIPC netid and GMS port are same on all the nodes of the cluster and is unique per cluster.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; '''Error:'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Tue Jul 22 10:33:43 2008 (SCMI0.5935 : AMF.---.---.00192 : ERROR) Component&lt;br /&gt;
[&amp;lt;comp-name&amp;gt;] did not instantiated within the specified limit&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Thu Jan 1 01:00:55 1970 (SCMI0.3211296 : AMF.---.---.00376 : ERROR)&lt;br /&gt;
Component [&amp;lt;comp-name&amp;gt;] instantiate error [0x220014]. Will cleanup&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; '''Solution:'''&lt;br /&gt;
These error messages indicates that SAFplus Platform was not able to start the component within the configured timeout value in clAmfDefinitions.xml file. Possible reasons for this happening are:&lt;br /&gt;
* Component is taking too long to start. For e.g. it may be taking a lot of time in initialization etc. Increasing the instantiation timeout value (using IDE or if you know what you are doing, directly in clAmfDefinitions.xml file itself) should help in this case.&lt;br /&gt;
* Component has crashed before registering with AMF. Look for core dump in &amp;lt;sandbox&amp;gt;/var/run/ (for linux) or in /root (for qnx) to see if the component has dumped core.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; '''Error:'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Thu Jan 1 01:25:43 1970 (SCMI0.13049881 : AMF.---.---.00814 : ERROR) SI&lt;br /&gt;
[&amp;lt;si-name&amp;gt;] assignment to SU [&amp;lt;su-name&amp;gt;] returned Error [0x220014]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; '''Solution:'''&lt;br /&gt;
This error message indicates that SAFplus Platform was not able to assign work(SI) for particular SU due to time out. Possible reasons for this error are:&lt;br /&gt;
* The component crashed in the work assignment processing callback i.e. csi set/remove callback.&lt;br /&gt;
* The component is not responding with saAmfResponse(clCpmResponse) function within the csi set/remove timeout value configured in clAmfDefinitions.xml file.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; '''Error:'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Wed Nov 19 09:50:49 2008   (SysControllerI0.20584 : AMF.TRIGGER.INI.00073&lt;br /&gt;
WARN) Trigger XML parse error. Running with defaults&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; ''' Solution:'''&lt;br /&gt;
Above warning message are related to AMF entity trigger framework and they&lt;br /&gt;
can be ignored.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; '''Error:'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
12:25:33:Mon Nov 17 15:32:59 2008   (SysControllerI0.11049 : GMS.GEN.---.&lt;br /&gt;
00201 :  ERROR) This sync message is not intended for this node&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; '''Solution:'''&lt;br /&gt;
This error message is releated to GMS process group service and can be ignored.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; '''Error:'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Thu Jan 1 04:25:48 1970 (SCMI0.39657513 : AlarmMgr_EO.ACU.IDG.39051 : ERROR) Failed to get the alarm index for probable cause [2] and specific problem [0]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Thu Jan 1 04:25:48 1970 (SCMI0.39657513 : AlarmMgr_EO.ALM.ALE.39052 : ERROR) Failed to get the alarm index for the probable cause [2]:Specific Problem [0]. rc[0x4]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Thu Jan 1 04:25:48 1970 (SCMI0.39657513 : AlarmMgr_EO.ALM.ALR.39053 : ERROR) Failed while processing the alarm . rc[0x4]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Thu Jan 1 04:25:48 1970 (SCMI0.39657513 : AlarmMgr_EO.ALM.ALR.39054 : ERROR) Failed while Sending RMD to the client owning the alarm resource. rc[0x4]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Thu Jan 1 04:25:48 1970 (SCMI0.39657513 : AlarmMgr_EO.---.---.39055 : ERROR) Error in raising alarm, rc [0x4]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; '''Solution:'''&lt;br /&gt;
This error message shows that the user is trying to raise alarm with invalid probable cause and specific problem combination which is not modeled. Please check the list of alarm profiles attached to that resource, inside alarm owner&lt;br /&gt;
cl&amp;lt;comp-name&amp;gt;alarmMetaStruct.c file.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Informational messages to observe in SAFplus Platform log files===&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; '''Message:'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Mon Nov 17 15:35:08 2008   (SysControllerI0.11049 : GMS.OPN.AIS.00206 : DEBUG) GMS CONFIGURATION CHANGE&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Mon Nov 17 15:35:08 2008   (SysControllerI0.11049 : GMS.OPN.AIS.00207 : DEBUG) GMS Configuration:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Mon Nov 17 15:35:08 2008   (SysControllerI0.11049 : GMS.OPN.AIS.00208 : DEBUG)         r(0) ip(192.168.11.11)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Mon Nov 17 15:35:08 2008   (SysControllerI0.11049 : GMS.OPN.AIS.00209 : DEBUG)         r(0) ip(192.168.90.44)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Mon Nov 17 15:35:08 2008   (SysControllerI0.11049 : GMS.OPN.AIS.00210 : DEBUG) Members Left:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Mon Nov 17 15:35:08 2008   (SysControllerI0.11049 : GMS.OPN.AIS.00211 : DEBUG)         r(0) ip(192.168.90.43)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Mon Nov 17 15:35:08 2008   (SysControllerI0.11049 : GMS.OPN.AIS.00212 : DEBUG) Members Joined:&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; '''Description:'''&lt;br /&gt;
These messages above are indicating the join/leave states of the nodes in&lt;br /&gt;
the cluster. In the above sample output, you can note that the node with IP&lt;br /&gt;
192.168.90.43 has left the cluster and at this point the cluster configuration has nodes 192.168.11.11 and 192.168.90.44.&lt;br /&gt;
&lt;br /&gt;
This info will be useful when debugging few issues where a node is repeatedly going down or not behaving as expected.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; '''Message:'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Mon Nov 17 15:35:10 2008   (SysControllerI0.11014 : AMF.CPM.AMS.00827 :&lt;br /&gt;
CRITIC) CPM/G active got IOC/TIPC notification for node [3] --&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Mon Nov 17 15:35:10 2008   (SysControllerI0.11014 : AMF.CPM.AMS.00828 :&lt;br /&gt;
CRITIC) - Possible reasons for this are on node [3] :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Mon Nov 17 15:35:10 2008   (SysControllerI0.11014 : AMF.CPM.AMS.00829 :&lt;br /&gt;
CRITIC) - 1. AMF crashed.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Mon Nov 17 15:35:10 2008   (SysControllerI0.11014 : AMF.CPM.AMS.00830 :&lt;br /&gt;
CRITIC) - 2. AMF was killed.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Mon Nov 17 15:35:10 2008   (SysControllerI0.11014 : AMF.CPM.AMS.00831 :&lt;br /&gt;
CRITIC) - 3. Critical component failed.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Mon Nov 17 15:35:10 2008   (SysControllerI0.11014 : AMF.CPM.AMS.00832 :&lt;br /&gt;
CRITIC) - 4. Kernel panicked.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Mon Nov 17 15:35:10 2008   (SysControllerI0.11014 : AMF.CPM.AMS.00833 :&lt;br /&gt;
CRITIC) - 5. Communication was lost.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Mon Nov 17 15:35:10 2008   (SysControllerI0.11014 : AMF.CPM.AMS.00834 :&lt;br /&gt;
CRITIC) - 6. AMF was shutdown.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; '''Description:'''&lt;br /&gt;
Above error message means that this node has detected TIPC notification for node death for node 3 and the message also explains probable reasons for this to happen. So user need to observe if this node death was due to admin operations or due to any error.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; '''Message:'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Mon Nov 17 15:35:44 2008   (SysControllerI0.11014 : AMF.CPM.GMS.00844 : DEBUG) Received cluster track callback from GMS on node [SysControllerI0]&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Mon Nov 17 15:35:44 2008   (SysControllerI0.11014 : AMF.CPM.GMS.00845 : DEBUG) - Leader : [1]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Mon Nov 17 15:35:44 2008   (SysControllerI0.11014 : AMF.CPM.GMS.00846 : DEBUG) - Deputy : [3] (-1 -&amp;gt; No deputy)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; '''Description:'''&lt;br /&gt;
Above message indicates the result of leader election for system controllers. As it is described after this leader election node 1 has become active (leader) and node 3 is standby (deputy). If Deputy value is -1, it indicates that there is only 1 system controller running in the cluster.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; '''Message:'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Wed Nov 19 10:11:49 2008   (PayloadNodeI0.23101 : GMS.LEA.---.00100 :&lt;br /&gt;
WARN) Could not elect any leader from the current cluster view.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wed Nov 19 10:11:49 2008   (PayloadNodeI0.23101 : GMS.LEA.---.00101 :   WARN)&lt;br /&gt;
- Possibly no system controller is running&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wed Nov 19 10:11:49 2008   (PayloadNodeI0.23101 : GMS.CLM.---.00102 :  ERROR)&lt;br /&gt;
Leader election failed. rc = 0x0&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wed Nov 19 10:12:11 2008   (PayloadNodeI0.23068 : AMF.CPM.CPM.00081 :   WARN)&lt;br /&gt;
CPM/G standby/Worker blade waiting for CPM/G active to come up...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; '''Description:'''&lt;br /&gt;
Above 2 warning messages indicate that a payload node was started without having any system controller node running in the cluster.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; '''Message:'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Tue Nov 18 16:24:48 2008   (ctrlI0.17729 : AMF.CPM.LCM.00339 : NOTICE)&lt;br /&gt;
[clCpmComponent.c:1885] Launching binary image [ClusterMgr] as component&lt;br /&gt;
[ClusterMgrI0]...&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Tue Nov 18 16:24:48 2008   (ctrlI0.17729 : AMF.CPM.LCM.00340 :   INFO)&lt;br /&gt;
[clCpmComponent.c:1952] Component [ClusterMgrI0] started, PID [17822]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; '''Description:'''&lt;br /&gt;
These logs indicate that the AMF attempted to start your component.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; '''Message:'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Tue Nov 18 16:24:48 2008 (ctrlI0.17729 : AMF. SU.INST.00343 : INFO)&lt;br /&gt;
[clAmsPolicyEngine.c:6615] SU [ClusterMgrSUI0] instantiated [1] components&lt;br /&gt;
at level [1]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; '''Description:'''&lt;br /&gt;
This log indicates that your component registered with the AMF.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Essential &amp;lt;code&amp;gt;asp_console&amp;lt;/code&amp;gt; commands to understand the system state of SAFplus Platform===&lt;br /&gt;
&lt;br /&gt;
The asp_console command in &amp;lt;sandbox&amp;gt;/bin directory is a very useful utility&lt;br /&gt;
to understand the SAFplus Platform state at any point of time. After starting SAFplus Platform, you&lt;br /&gt;
can start it using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd &amp;lt;sandbox&amp;gt;&lt;br /&gt;
$ ./bin/asp_console&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will see a message and the following prompt like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
To get started, type 'help intro'&lt;br /&gt;
&lt;br /&gt;
cli[Test]-&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are a first time user please give the command &amp;quot;help intro&amp;quot; as&lt;br /&gt;
indicated and read the brief help message.&lt;br /&gt;
&lt;br /&gt;
You can press TAB to autocomplete any command or show the list of all the commands.&lt;br /&gt;
&lt;br /&gt;
Press ? to see the list of available commands&lt;br /&gt;
&lt;br /&gt;
Typing list (or li, if a command has unique prefix, then just typing that and pressing enter is equivalent to giving that command) in the above prompt gives:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test]-&amp;gt; list&lt;br /&gt;
&lt;br /&gt;
Slot    Node&lt;br /&gt;
1       SCNode0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cli[Test]-&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It means that currently cluster is running with one node named SCNode0. You&lt;br /&gt;
MUST see in this list as many nodes as you have started, that are meant to&lt;br /&gt;
be part of this cluster. Otherwise it means that the nodes are not communicating because of either GMS or TIPC issues as indicated above. Make sure that GMS multicast port as well as TIPC netid is same on all the nodes involved.&lt;br /&gt;
&lt;br /&gt;
Type the command setc (&amp;quot;set context&amp;quot;) followed by the slot to change context to the node &amp;quot;master&amp;quot; i.e. the active node in the cluster.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test]-&amp;gt; setc master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and you should see a prompt like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNode0]-&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(please remember that you can type either 'help' or ? to see list of&lt;br /&gt;
available commands)&lt;br /&gt;
    &lt;br /&gt;
You can also &amp;quot;setc&amp;quot; to a particular slot by passing a number:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test]-&amp;gt; setc 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
but this is used rarely.&lt;br /&gt;
&lt;br /&gt;
Type the command setc again this time to change context to a particular  component within node 1 i.e. SCNode0. You can type the command 'list' to see the list of available components. You can register your application component too with this console using debug cli client library.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNode0]-&amp;gt; list&lt;br /&gt;
cpm&lt;br /&gt;
corServer_SCNode0&lt;br /&gt;
faultServer_SCNode0&lt;br /&gt;
eventServer_SCNode0&lt;br /&gt;
nameServer_SCNode0&lt;br /&gt;
txnServer_SCNode0&lt;br /&gt;
gmsServer_SCNode0&lt;br /&gt;
alarmServer_SCNode0&lt;br /&gt;
logServer_SCNode0&lt;br /&gt;
ckptServer_SCNode0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cli[Test:SCNode0]-&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to change context to AMF for e.g. give the following command&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNode0]-&amp;gt; setc cpm&lt;br /&gt;
&lt;br /&gt;
cli[Test:SCNode0:CPM]-&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can type help to see the available commands followed by a brief descriptive message about what the command does.&lt;br /&gt;
&lt;br /&gt;
To move up a context (i.e. from component context to node context or from node context to top level context) type the command 'end'. For e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNode0:CPM]-&amp;gt; end&lt;br /&gt;
&lt;br /&gt;
cli[Test:SCNode0]-&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The SAFplus Platform components except for the AMF, are suffixed by the node name.&lt;br /&gt;
&lt;br /&gt;
To view if the cluster is in a consistent state give this command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNode0]-&amp;gt;  setc gmsServer_SCNode0&lt;br /&gt;
&lt;br /&gt;
cli[Test:SCNode0:gms]-&amp;gt; memberList 0&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Cluster/Group Name : cluster0&lt;br /&gt;
bootTime           : Wed Nov 12 17:36:56 2008&lt;br /&gt;
View Number        : 2&lt;br /&gt;
--------------------------------------------------------------------------------------------------------&lt;br /&gt;
NodeId NodeName        HostAddr Port Leader Credentials PrefLead LeadshipSet BootTime&lt;br /&gt;
--------------------------------------------------------------------------------------------------------&lt;br /&gt;
1      SCNode0         1        9    Yes    100         No       No          Wed Nov 12 17:36:56 2008&lt;br /&gt;
2      SCNode1         2        9    No     100         No       No          Wed Nov 12 19:28:42 2008&lt;br /&gt;
&lt;br /&gt;
cli[Test:SCNode0:gms]-&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Again, you should see as many nodes as configured in the cluster. In the&lt;br /&gt;
above output, node with id 1 is a leader.&lt;br /&gt;
&lt;br /&gt;
To see if a node has come up properly:&lt;br /&gt;
(don't forget: &lt;br /&gt;
setc master&lt;br /&gt;
setc cpm&lt;br /&gt;
to get into the correct context!)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNode0:CPM]-&amp;gt; amsentityprint node SCNode0&lt;br /&gt;
&lt;br /&gt;
Name                                          | SCNode0&lt;br /&gt;
Configuration ------------------------------- | ---------------------------&lt;br /&gt;
Start time                                    | Wed Nov 12 17:37:02 2008&lt;br /&gt;
Admin State                                   | Unlocked&lt;br /&gt;
Computed Admin State                          | Unlocked&lt;br /&gt;
Id                                            | 0&lt;br /&gt;
Class Type                                    | Class B&lt;br /&gt;
SubClass Type                                 |  &lt;br /&gt;
Is Swappable                                  | True&lt;br /&gt;
Is Restartable                                | True&lt;br /&gt;
Is SAFplus Platform Aware                                  | True&lt;br /&gt;
Auto Repair on Join                           | True&lt;br /&gt;
SU Failover Probation Time                    | 10000 ms&lt;br /&gt;
SU Failover Count                             | 10&lt;br /&gt;
Node Dependents                               | Count[0]&lt;br /&gt;
                                              |    &amp;lt;None&amp;gt;&lt;br /&gt;
Node Dependencies                             | Count[0]&lt;br /&gt;
                                              |    &amp;lt;None&amp;gt;&lt;br /&gt;
SUs in Node                                   | Count[6]&lt;br /&gt;
                                              |    SC0_twoNAdmin_SU0&lt;br /&gt;
                                              |    SC0_amsTestGenTC_SU0&lt;br /&gt;
                                              |    SC0_noRedundancy_SU0&lt;br /&gt;
                                              |    SC0_twoNRank_SU0&lt;br /&gt;
                                              |    SC0_twoNRank_Spare_SU1&lt;br /&gt;
                                              |    SC0_twoNRank_Spare_SU0&lt;br /&gt;
Status -------------------------------------- | ---------------------------&lt;br /&gt;
Presence State                                | Instantiated&lt;br /&gt;
Oper State                                    | Enabled&lt;br /&gt;
Is Instantiable                               | True&lt;br /&gt;
Is Cluster Member                             | True&lt;br /&gt;
Was Cluster Member Before                     | False&lt;br /&gt;
Last Recovery                                 | None&lt;br /&gt;
Num Instantiated SUs                          | 0&lt;br /&gt;
Num Assigned SUs                              | 0&lt;br /&gt;
SU Failover Probation Timer                   | Inactive&lt;br /&gt;
SU Failover Count                             | 0&lt;br /&gt;
--------------------------------------------- | ---------------------------&lt;br /&gt;
Timers Running                                | 0&lt;br /&gt;
Debug Flags                                   | 0x1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Miscellaneous===&lt;br /&gt;
&lt;br /&gt;
* Please note that by default, SAFplus Platform assumes that the shared memory location (tmpfs) is mounted on standard location /dev/shm and cleans up whatever shared memory segments created by the SAFplus Platform during previous run. If you have mounted your tmpfs some where else, you have two options:&lt;br /&gt;
** Mount the tmpfs to /dev/shm so that SAFplus Platform will take care of cleaning up shared memory segments. ('''Recommended''')&lt;br /&gt;
** During packaging of the model add a cleanup script in model-name/src/extras/asp.d/ (creating this location if it is not there) which will be called with 'start' argument before SAFplus Platform starts. This cleanup script can then remove the shared memory segments from whichever location the tmpfs is currently mounted on.&lt;br /&gt;
* Please note that starting SAFplus Platform &amp;quot;by hand&amp;quot; is not supported, i.e. starting asp_amf executable by command line is not supported. The starting of SAFplus Platform depends for some setup/cleanup actions on the SAFplus Platform startup script and hence SAFplus Platform should always be started using the etc/init.d/asp script.&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/sdkguide/knowledgebase</id>
		<title>Doc:latest/sdkguide/knowledgebase</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/sdkguide/knowledgebase"/>
				<updated>2010-08-27T04:12:11Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=='''Knowledge Base'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Logging===&lt;br /&gt;
&lt;br /&gt;
====What is the default log rotation policy, and how can it be set?====&lt;br /&gt;
The default file rotation policy is WRAP (as specified by fileFullAction&lt;br /&gt;
tag in clLog.xml file in &amp;lt;model-name&amp;gt;/src/config or &amp;lt;sandbox&amp;gt;/etc/).&lt;br /&gt;
This value has to be specified per stream.&lt;br /&gt;
&lt;br /&gt;
The value WRAP means that the log service will start to overwrite the&lt;br /&gt;
file once log file becomes full (the file size can be specified by&lt;br /&gt;
fileUnitSize tag (again per stream).&lt;br /&gt;
&lt;br /&gt;
Other possible actions are HALT and ROTATE.  HALT means that log service will stop writing into file as soon as it becomes full.  ROTATE policy means that log service will rotate the logs up to certain number of files (as specified by maximumFilesRotated tag) before overwriting the oldest log file. This is similar to the policy used by /var/log/messages.&lt;br /&gt;
&lt;br /&gt;
It can be set either in IDE or by hand modifying the clLog.xml file. In&lt;br /&gt;
IDE you can set it under log section in SAFplus Platform component configuration in&lt;br /&gt;
clovis menu. Please refer to ide user guide section 7.2.2. Only thing to&lt;br /&gt;
remember is that you need to set maximumFilesRotated to 0 if rotation&lt;br /&gt;
policy is either HALT or WRAP.&lt;br /&gt;
&lt;br /&gt;
Programmatically it can be set when you are creating a new log stream using clLogStreamOpen() API. You need to set the fileFullAction field of pStreamAttr field (of type ClLogStreamAttributesT) which is fourth parameter to clLogStreamOpen() API.&lt;br /&gt;
&lt;br /&gt;
====Can it be set dynamically?====&lt;br /&gt;
&lt;br /&gt;
Once the stream is already opened with a set of attributes (through APIs at runtime), its attributes cannot be changed thereafter. So if you already opened a stream with fileFullAction set to ROTATE, you cannot change it to HALT.&lt;br /&gt;
&lt;br /&gt;
====Is there a way to operationally force a log file rotation?====&lt;br /&gt;
The rotation for nodename.log files could be forced through debug cli on cpm context.&lt;br /&gt;
&lt;br /&gt;
bin/asp_console&lt;br /&gt;
&lt;br /&gt;
setc master ;setc cpm; logrotate&lt;br /&gt;
&lt;br /&gt;
(setc master would directly work on AMF master. You could also do : setc &amp;lt;slotid&amp;gt; to target a particular node listed with &amp;quot;list&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
After the above debug cli, a subsequent: amsdbprint output goes to a new nodename.log and the last one is moved to nodename.log.1.&lt;br /&gt;
&lt;br /&gt;
I also found it pretty useful.&lt;br /&gt;
&lt;br /&gt;
Unrelated though but useful for you:&lt;br /&gt;
export CPM_LOG_FILE_SIZE=5m&lt;br /&gt;
export CPM_LOG_FILE_ROTATIONS=3&lt;br /&gt;
would force the nodename log files to be rotated within 5MB limit 3 times.&lt;br /&gt;
&lt;br /&gt;
The default is 10MB, 4 rotations.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Is the flush interval applicable to log server or log client?====&lt;br /&gt;
&lt;br /&gt;
This is applicable to the Log server. i.e. When an application has any logs to be written, the log client would immediately write the records into the shared memory, and it won't wait for the flush interval. However, the log server would flush these records from the shared memory to the log handler (a file) at the given flush interval.  This means that if a component crashes or hangs all logs will be written.  However if the board fails, it is possible to lose all logs that haven't been flushed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Does SAFplus Platform take any action when we fail to log?  For example, if the log server is not able to log the records because the disk is full, then do we take any action so that we failover?====&lt;br /&gt;
&lt;br /&gt;
No. As of now the log server does not escalate this error to the AMF and hence failover is not done.&lt;br /&gt;
&lt;br /&gt;
====Can logs appear on both the system controller nodes?====&lt;br /&gt;
&lt;br /&gt;
By default the SAFplus Platform is configured to log to a local file for debugging convenience.  However, the SAFplus Platform allows logs to be sent to other nodes in the system via configuration in the log.xml file.  Additionally, a program on any node can always open any global log stream and process or forward the logs in any desired manner.  See the Log API documentation for more details.&lt;br /&gt;
&lt;br /&gt;
===Startup Log Messages===&lt;br /&gt;
 &lt;br /&gt;
====Invalid [identifier] value in tag or attribute, rc=[0x0]====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====ERROR) Cannot get IOC master, return code [0x50016]====&lt;br /&gt;
These can be ignored during bootup.  &amp;quot;Cannot get IOC master&amp;quot; from log server during bootup is the phase during which AMF awaits leader election callback from GMS for the cluster leader and our log service is dependent on this since it also has HA.&lt;br /&gt;
&lt;br /&gt;
====ERROR) Configuration file [.../etc/clAmfEntityTrigger.xml] is missing====&lt;br /&gt;
The AMF trigger xml parse error is fine (unless, of course you are using the AMF trigger feature). It refers to a feature w.r.t feeding triggers into a amftrigger framework controlled by thresholds for various entities as defined in clAmfEntityTrigger.xml which won't be present for normal cases.&lt;br /&gt;
&lt;br /&gt;
====ERROR) Parser open error for file [clAmfEntityTrigger.xml]====&lt;br /&gt;
The AMF trigger xml parse error is fine (unless, of course you are using the AMF trigger feature). It refers to a feature w.r.t feeding triggers into a amftrigger framework controlled by thresholds for various entities as defined in clAmfEntityTrigger.xml which won't be present for normal cases.&lt;br /&gt;
&lt;br /&gt;
====WARN) DB not present. Reading AMS config from XML====&lt;br /&gt;
The DB read warning from AMS means that you are either doing a first time startup or a start with --remove-persistent-db option (./etc/init.d/asp start --remove-persistent-db).  It means that the model configuration is being read from XML files instead of from database, so the model that comes up will be the unmodified model created in the IDE.  Any modification you may have made through the AMF mgmt API calls are stored in the DB.&lt;br /&gt;
&lt;br /&gt;
===Alarms===&lt;br /&gt;
&lt;br /&gt;
====Could I replace OpenClovis's alarm mib (current alarm table...) with a proprietary MIB?====&lt;br /&gt;
First of all there is no OpenClovis' propriety alarm MIB. Customers can use any propriety MIB with alarms defined and the generated code would take care of raising traps when an alarm is raised.&lt;br /&gt;
&lt;br /&gt;
====Is there an alarm history mib?====&lt;br /&gt;
No. But the alarm history can be viewed/queried via our debug CLI commands viz. queryAlarm, querypublishedAlarms, showpublishedAlarms.&lt;br /&gt;
&lt;br /&gt;
===Mixed Endian and Mixed Word-size (Heterogeneous) Clusters===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====How are mixed endian and mixed word-size clusters supported?====&lt;br /&gt;
&lt;br /&gt;
Certain OpenClovis communications mechanisms, notably RMD (our remote procedure call library), allow communications to occur between machines of different endian (endian agnostic).  Since all OpenClovis components are based on RMD, this allows OpenClovis to run in a heterogeneous environment.&lt;br /&gt;
&lt;br /&gt;
Xdr is the library that transforms data structures to and from network-endian format (and into canonical-size data items) so that they can be sent to other machines.  RMD uses Xdr internally to implement its endian-agnostic feature.&lt;br /&gt;
&lt;br /&gt;
The customer can also take advantage of XDR and RMD.  There are 2 ways; first, you can always just access the APIs directly (for example the APIs located in clXdrApi.h to do endian-swapping).  Secondly, by defining your remote procedure calls in an XML format that we call &amp;quot;IDL&amp;quot; we will automatically generate wrappers around the RMD and XDR APIs that implement the marshalling and unmarshalling required to do a remote procedure call, with the result that on the client side the remote procedure call looks just like a normal function call.&lt;br /&gt;
&lt;br /&gt;
====Is Mixed Endian Checkpointing supported?====&lt;br /&gt;
&lt;br /&gt;
The SAF checkpoint API does not handle endian-swapping as it is defined based on a byte buffer.  Unfortunately, without knowing the structure of the data it is impossible to byte-swap data to be checkpointed.  Therefore to implement endian-safe checkpointing, you first transform the buffer via calls to the XDR library, and then write the checkpoint.  Of course, upon read you must again use XDR to transform the buffer back to the machine's endian.&lt;br /&gt;
&lt;br /&gt;
====Are there any limitations to using mixed endian in the cluster?====&lt;br /&gt;
&lt;br /&gt;
The 2 system controllers must be of the same architecture (endian and word size).  By requiring this, we reduce the latency and the CPU utilization of the communication that occurs between the 2 system controllers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Failovers===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====When a split brain scenario (double failure of ethernet link) is healed, who becomes master?====&lt;br /&gt;
&lt;br /&gt;
In case of split brain, always the node with higher node ID will take over as leader. So you could set a higher node ID to the node which you want to be the leader, and this will take effect on merge from split brain.&lt;br /&gt;
&lt;br /&gt;
===Healthcheck/Heartbeat===&lt;br /&gt;
&lt;br /&gt;
====Is component health check supported?====&lt;br /&gt;
&lt;br /&gt;
Yes, there are two component heathcheck mechanisms, passive and SAF.  Passive healthchecking is enabled by default.  To enable the SAF healthcheck just use the SAF APIs supported by OpenClovis. The minimum SAF healthcheck period is 5 seconds.  However, the passive healthcheck operates in the order of few milliseconds.  Essentially, the SAFplus Platform intranode communications mechanism implements a healthcheck.  Whenever a component dies, the TIPC Linux driver is notified since each component has open TIPC sockets.  The SAFplus Platform AMF receives TIPC notifications of component deaths and publishes an event. Any of your applications interested in knowing the departure of the component can subscribe for these events and act appropriately.  Note that this is the faster means of healthcheck (in the order of few milliseconds), and this is the reason active healthcheck is disabled by default.  To use this means of healthcheck your program simply must quit or abort (exit(), abort(), assert() for example) when it has an unrecoverable error. &lt;br /&gt;
&lt;br /&gt;
This passive heartbeating through TIPC avoids majority of the requirement for a SAF-style healthcheck except for the case when the component is deadlocked. To take care of this case you can enable SAF healthcheck, or you can create your own periodic thread that analyses verifies the operation of your program and exits if there is a problem.&lt;br /&gt;
&lt;br /&gt;
===AMF Configuration (Cluster-wide Application Structure)===&lt;br /&gt;
&lt;br /&gt;
====Load Balancing Applications:  We have two applications that have a dependency on each other, such that if either one restarts the other must also be restarted.  The complication is they are running on separate blades, and therefore separate service groups.  Can you suggest how we can restart the dependant application when either is restarted?====&lt;br /&gt;
&lt;br /&gt;
There are 2 ways of adding dependencies in the system, inter-node and inter-Service Instance.&lt;br /&gt;
&lt;br /&gt;
If you want application 1 to depend on 2, then I would recommend using SI (service instance) dependencies.  SI dependencies essentially means that the dependent application (2) will not be &amp;quot;unlocked&amp;quot; until application 1 is unlocked, and 2 will be &amp;quot;locked assignment&amp;quot; if 1 fails.  Now this may not be quite what you were asking for, because you wanted 2 to be &amp;quot;restarted&amp;quot; (aka &amp;quot;locked instantiation&amp;quot; in SAF terminology), not just moved to &amp;quot;locked assignment&amp;quot;.  However, it should not be too hard to implement &amp;quot;shutdown&amp;quot; logic at the application layer in app 2 whenever the app is &amp;quot;locked assignment&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The best &amp;quot;shutdown&amp;quot; implementation would be to stop the app's processing and wait in an idle loop.  That interpretation is most in line with SAF concepts and will help you when you add HA to the systems.&lt;br /&gt;
&lt;br /&gt;
To set up SI dependencies, in the IDE use Clovis-&amp;gt;AMF Configuration-&amp;gt;Service Group List-&amp;gt;(pick dependent SG)-&amp;gt;Service Instance List-&amp;gt;(Pick your SI)-&amp;gt;Dependencies Edit button.  A dialog box will pop up showing all SIs in the system.  Pick the one you want to be dependent on.&lt;br /&gt;
&lt;br /&gt;
The inter-node method creates dependencies between nodes, which only is useful to solve the above problem if you are running just one application on each node.&lt;br /&gt;
If you want the system to require blade B, than you can specify all other blades to be dependent on B.  This is available in the IDE under the Clovis-&amp;gt;AMF Configuration-&amp;gt;Node Instance List-&amp;gt;(pick dependent node)-&amp;gt;Dependencies Edit button.  Check node B and then click OK.  You need to do this for every node that is dependent on B.&lt;br /&gt;
&lt;br /&gt;
==== How do I make an application automatically run (or not run) when the SAFplus Platform is started? ====&lt;br /&gt;
You can start and stop applications using our debug cli; refer to the evaluation guide as to how to do so.  But to have the system start up with a particular application stopped, you must modify the startup configuration.  You may do so via the IDE and regenerate the configuration files, but in this case it will be faster to simply edit the config files directly.&lt;br /&gt;
&lt;br /&gt;
Go to the system controller blade and load the file &amp;quot;/root/asp/etc/amfDefinitions.xml&amp;quot;.  In here, all of the &amp;quot;service groups&amp;quot; (SAF terminology for a highly available group of applications) are defined.  Each definition looks like this:&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;sgType name=&amp;quot;vlcGroup_MN&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;failbackOption&amp;gt;CL_FALSE&amp;lt;/failbackOption&amp;gt;&lt;br /&gt;
      &amp;lt;restartDuration&amp;gt;10000&amp;lt;/restartDuration&amp;gt;&lt;br /&gt;
      &amp;lt;numPrefActiveSUs&amp;gt;2&amp;lt;/numPrefActiveSUs&amp;gt;&lt;br /&gt;
      &amp;lt;numPrefStandbySUs&amp;gt;1&amp;lt;/numPrefStandbySUs&amp;gt;&lt;br /&gt;
      &amp;lt;numPrefInserviceSUs&amp;gt;3&amp;lt;/numPrefInserviceSUs&amp;gt;&lt;br /&gt;
      &amp;lt;numPrefAssignedSUs&amp;gt;3&amp;lt;/numPrefAssignedSUs&amp;gt;&lt;br /&gt;
      &amp;lt;numPrefActiveSUsPerSI&amp;gt;1&amp;lt;/numPrefActiveSUsPerSI&amp;gt;&lt;br /&gt;
      &amp;lt;maxActiveSIsPerSU&amp;gt;1&amp;lt;/maxActiveSIsPerSU&amp;gt;&lt;br /&gt;
      &amp;lt;maxStandbySIsPerSU&amp;gt;2&amp;lt;/maxStandbySIsPerSU&amp;gt;&lt;br /&gt;
      &amp;lt;compRestartDuration&amp;gt;10000&amp;lt;/compRestartDuration&amp;gt;&lt;br /&gt;
      &amp;lt;compRestartCountMax&amp;gt;0&amp;lt;/compRestartCountMax&amp;gt;&lt;br /&gt;
      &amp;lt;suRestartDuration&amp;gt;10000&amp;lt;/suRestartDuration&amp;gt;&lt;br /&gt;
      &amp;lt;suRestartCountMax&amp;gt;0&amp;lt;/suRestartCountMax&amp;gt;&lt;br /&gt;
      &amp;lt;adminState&amp;gt;CL_AMS_ADMIN_STATE_LOCKED_I&amp;lt;/adminState&amp;gt;&lt;br /&gt;
      &amp;lt;redundancyModel&amp;gt;CL_AMS_SG_REDUNDANCY_MODEL_M_PLUS_N&amp;lt;/redundancyModel&amp;gt;&lt;br /&gt;
      &amp;lt;loadingStrategy&amp;gt;CL_AMS_SG_LOADING_STRATEGY_LEAST_SI_PER_SU&amp;lt;/loadingStrategy&amp;gt;&lt;br /&gt;
      &amp;lt;autoRepair&amp;gt;CL_TRUE&amp;lt;/autoRepair&amp;gt;&lt;br /&gt;
    &amp;lt;/sgType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the first tag names the &amp;quot;service group&amp;quot;:&lt;br /&gt;
&amp;lt;sgType name=&amp;quot;vlcGroup_MN&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example the service group is named &amp;quot;vlcGroup_MN&amp;quot;.  Go down to the &amp;lt;adminState&amp;gt; tag.  It is probably &amp;quot;CL_AMS_ADMIN_STATE_UNLOCKED&amp;quot;.  &amp;quot;Unlocked&amp;quot; is SAF terminology for &amp;quot;run this application&amp;quot;.  To not run the application when the system is started, change this field to &amp;quot;CL_AMS_ADMIN_STATE_LOCKED_I&amp;quot;.  &amp;quot;LOCKED_I&amp;quot; is short for &amp;quot;Locked Instantiation&amp;quot;, which is the SAF terminology for &amp;quot;do not run this application&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So, specifically, set all service groups to &amp;quot;CL_AMS_ADMIN_STATE_LOCKED_I&amp;quot; except for the one named &amp;quot;vlcGroup&amp;quot;.  That one is the havlc program.&lt;br /&gt;
&lt;br /&gt;
Remember to make this edit on the system controller!  Making this change on any other blade will have no effect, since it is the system controller that starts and stops applications on all blades.&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/sdkguide/commandref</id>
		<title>Doc:latest/sdkguide/commandref</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/sdkguide/commandref"/>
				<updated>2010-08-27T04:11:30Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==SAFplus Platform Command Line and Environment Variable Reference==&lt;br /&gt;
&lt;br /&gt;
===Environment Variables===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Variables controlling automatic restart or reboot of SAFplus Platform or Node====&lt;br /&gt;
* '''ASP_RESTART_SAFplus''' -- If set to 1 will restart SAFplus Platform in case AMF crashed or SAFplus Platform was not able to come up for some reason, if set to 0 will not restart SAFplus Platform. Default value is 1.&lt;br /&gt;
* '''ASP_NODE_REBOOT_DISABLE''' -- &lt;br /&gt;
* '''ASP_NODE_RESTART''' --&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
This table describes the interaction between the various SAFplus Platform restart and reboot variables:&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;3&amp;quot;&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot;| ASP_NODE_REBOOT_DISABLE&lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot;| ASP_RESTART_SAFplus Platform&lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot;| ASP_NODE_RESTART&lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot;| Action taken&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
| undefined&lt;br /&gt;
| undefined&lt;br /&gt;
| undefined&lt;br /&gt;
| reboot&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
| 1 &lt;br /&gt;
| undefined &lt;br /&gt;
| undefined &lt;br /&gt;
| Restart SAFplus Platform&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| undefined&lt;br /&gt;
| SAFplus Platform stopped&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| Restart SAFplus Platform&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Cluster Membership Configuration (GMS)====&lt;br /&gt;
* '''CL_LEADER_NODE_ID''' --&lt;br /&gt;
* '''LINK_NAME''' -- This tells SAFplus Platform which Network Interface (ex. eth0, bind0, lo, etc.) to be used for communication with other SAFplus Platform's on same/other nodes.&lt;br /&gt;
* '''ASP_MULTINODE''' -- This environment variable must be used, when multiple SAFplus Platform's are to be run on single machine. Then user must export this environment variable before starting each of SAFplus Platform's.&lt;br /&gt;
&lt;br /&gt;
====ValGrind====&lt;br /&gt;
* '''ASP_VALGRIND_FILTER''' --&lt;br /&gt;
* '''ASP_VALGRIND_CMD''' --&lt;br /&gt;
&lt;br /&gt;
====Logging====&lt;br /&gt;
&lt;br /&gt;
* '''ASP_LOG_FILTER_DIR''' -- place where log filter file should be present. It should be named logfilter.txt. Default value /tmp&lt;br /&gt;
* '''CL_LOG_SEVERITY''' -- Environment variable used to set the log filter. You can export this env variable to any log severity like DEBUG, INFO, NOTICE, ERROR, etc. Note that setting of this env variable has higher priority than the log filter file explained above.&lt;br /&gt;
* '''CL_LOG_CODE_LOCATION_ENABLE''' -- Environment variable if set to 1, will show the file name, function name and line number when displaying logs. Default value is 0.&lt;br /&gt;
* '''CL_LOG_TO_FILE'''&lt;br /&gt;
* '''CL_LOG_STREAM_ENABLE'''&lt;br /&gt;
* '''CL_LOG_TIME_ENABLE'''&lt;br /&gt;
* '''CL_LOG_DEBUG_LEVEL''' (clLogDebug.c)&lt;br /&gt;
* '''ASP_SAVE_PREV_LOGS''' -- if set to 1 will save logs in the sandbox from the previous run of SAFplus Platform (if any) during SAFplus Platform startup into location specified by the environment variable ASP_PREV_LOG_DIR or to /tmp/asp_saved_logs, creating the directory if necessary. If set to 0, the logs will deleted. Default value is 1.&lt;br /&gt;
* '''ASP_PREV_LOG_DIR''' -- place where logs of previous SAFplus Platform run will be stored. Default value is /tmp/asp_saved_logs&lt;br /&gt;
* '''AMS_DEBUG''' -- Enable special availability management framework console logging.  This occurs outside of the normal log infrastructure since the AMF process manages the logging process. &lt;br /&gt;
* '''AMS_NOTIFICATION_DEBUG''' --&lt;br /&gt;
* '''CPM_LOG_FILE_SIZE''' --&lt;br /&gt;
* '''CPM_LOG_FILE_ROTATIONS''' --&lt;br /&gt;
* '''ASP_CPM_LOGFILE''' --&lt;br /&gt;
&lt;br /&gt;
====Miscellaneous====&lt;br /&gt;
* '''ASP_RMD_METRIC''' --&lt;br /&gt;
* '''CL_TXN_DSBLE_CKPT''' --&lt;br /&gt;
* '''CL_HEAP_DEBUG''' --&lt;br /&gt;
* '''CL_MEM_TIME''' --&lt;br /&gt;
* '''ASP_WITHOUT_CPM''' --&lt;br /&gt;
* '''CL_NODE_REPRESENTATIVE''' --&lt;br /&gt;
* '''ASP_DB_SYNC''' --&lt;br /&gt;
&lt;br /&gt;
====Debugging====&lt;br /&gt;
* '''CL_DEBUG_PAUSE''' --&lt;br /&gt;
* '''CL_DEBUG_PAUSE_CODE_ERROR''' --&lt;br /&gt;
* '''CL_DEBUG_COMP_NO_KILL''' --&lt;br /&gt;
* '''CL_DEBUG_COMP_TIMEOUT_OVERRIDE''' --&lt;br /&gt;
* '''CL_DEBUG_LOG_LEVEL''' --&lt;br /&gt;
* '''CL_DEBUG_RESOURCE_LOG_LEVEL''' --&lt;br /&gt;
* '''CL_DEBUG_REVERSE_TIMING''' --&lt;br /&gt;
&lt;br /&gt;
====Intra-Cluster Message Traffic Shaping====&lt;br /&gt;
OpenClovis SAFplus Platform optionally uses a well known traffic shaping algorithm to modulate intracluster traffic.  This is very useful if the internal communications between your applications can potentially overwhelm an application with requests.  But if your application's inter-communication is designed to ensure that this cannot happen then the traffic shaping is not needed.  By default (compile time) it is off.&lt;br /&gt;
&lt;br /&gt;
These environment variables can be used to override the default leaky bucket intra-cluster message shaping parameters.  &lt;br /&gt;
* '''CL_LEAKY_BUCKET_VOL''' -- Leaky bucket volume in bytes&lt;br /&gt;
* '''CL_LEAKY_BUCKET_LEAK_SIZE''' -- Leaky bucket removal in bytes&lt;br /&gt;
* '''CL_LEAKY_BUCKET_LEAK_INTERVAL''' -- How often the leak occurs in milliSeconds&lt;br /&gt;
&lt;br /&gt;
===Environment Variables Set by OpenClovis SAFplus Platform===&lt;br /&gt;
These variables are available for use in your application:&lt;br /&gt;
&lt;br /&gt;
====Locations====&lt;br /&gt;
Note these environment variables have equivalent &amp;quot;C&amp;quot; global variables (defined in clEoApi.h) which are recommended over using the environment variable directly.&lt;br /&gt;
&lt;br /&gt;
* '''ASP_NODENAME''' -- The name of the node (as defined in the SAF AMF model)&lt;br /&gt;
* '''ASP_COMPNAME''' -- The name of this component (as defined in the SAF AMF model)&lt;br /&gt;
* '''ASP_RUNDIR''' -- The &amp;quot;current working directory&amp;quot; SAFplus Platform runs from&lt;br /&gt;
* '''ASP_LOGDIR''' -- The SAFplus Platform log directory&lt;br /&gt;
* '''ASP_BINDIR''' -- The location of SAFplus Platform binaries &lt;br /&gt;
* '''ASP_APP_BINDIR''' -- The location of the program binary.  This is often, but not always the same as ASP_BINDIR.&lt;br /&gt;
* '''ASP_CONFIG''' -- Directory of the SAFplus Platform configuration files (normally &amp;lt;asp install dir&amp;gt;/etc)&lt;br /&gt;
* '''ASP_CPM_CWD''' -- The current working directory to use for SAFplus Platform and programs started by SAFplus Platform (defaults to var/run)&lt;br /&gt;
* '''ASP_DBDIR''' -- The location the SAFplus Platform stores its database files&lt;br /&gt;
&lt;br /&gt;
===Starting and Stopping SAFplus Platform: &amp;lt;aspDir&amp;gt;/etc/init.d/asp===&lt;br /&gt;
Usage : asp {start|stop|restart|console|status|zap|help} [options]&lt;br /&gt;
&lt;br /&gt;
options can be one of the following : (these options only work with start command, e.g. etc/init.d/asp start -v etc.)&lt;br /&gt;
&lt;br /&gt;
-v                            :  Be verbose&lt;br /&gt;
--enforce-tipc-settings       :  Use etc/asp.conf's TIPC settings overriding the system TIPC settings&lt;br /&gt;
--ignore-tipc-settings        :  Use systems TIPC settings ignoring the etc/asp.conf's settings&lt;br /&gt;
--remove-persistent-db        :  Delete all of the SAFplus Platform persistent database files&lt;br /&gt;
--asp-log-level &amp;lt;level&amp;gt;       :  Start SAFplus Platform with particular log level. &amp;lt;level&amp;gt; is [trace|debug|info|notice|warning|error|critical]&lt;br /&gt;
&lt;br /&gt;
===CLI===&lt;br /&gt;
&lt;br /&gt;
====bin/asp_console====&lt;br /&gt;
SAFplus Platform console is a comprehensive CLI for examination and debugging of the SAFplus Platform system.  SAFplus Platform console documentation is available as a separate document.&lt;br /&gt;
&lt;br /&gt;
Start:&lt;br /&gt;
&amp;lt;aspDir&amp;gt;/etc/init.d/asp console&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;aspDir&amp;gt;/bin/asp_console&lt;br /&gt;
&lt;br /&gt;
====bin/asp_info====&lt;br /&gt;
The SAFplus Platform info CLI is a simple interface for display of SAFplus Platform status and basic control&lt;br /&gt;
&lt;br /&gt;
&amp;lt;aspDir&amp;gt;/bin/asp_info&lt;br /&gt;
&lt;br /&gt;
===Directly running a component: bin/asp_run===&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/sdkguide/startermodels</id>
		<title>Doc:latest/sdkguide/startermodels</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/sdkguide/startermodels"/>
				<updated>2010-08-27T04:08:14Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;quot;Starter&amp;quot; Applications (Models)==&lt;br /&gt;
&lt;br /&gt;
Experts at the OpenClovis IDE can brew a complex redundancy model from scratch in just an hour or two.  However building a model from scratch is more difficult for a beginner than modifying an existing model.  To help new users, the OpenClovis SAFplus Platform provides &amp;quot;starter&amp;quot; models that can be used to begin your model.  These are different from the &amp;quot;eval&amp;quot; kit in that the eval kit is made to showcase the features and functionality of the SAFplus Platform and as such are defined to use a very minimal physical (2-3 nodes) layout and simple redundancy model.  On the other hand, the &amp;quot;Starter&amp;quot; Models are useful models that you may base your model off of.&lt;br /&gt;
&lt;br /&gt;
The models are located src/examples/ide_workspace (IDE model) and src/examples/ (generated code).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===The &amp;quot;Starter&amp;quot; Application - IP Address Failover - src/examples/virtualIp ===&lt;br /&gt;
&lt;br /&gt;
This starter model implements a commonly-desired feature that is often considered difficult to implement, but becomes very simple on top of the OpenClovis SAFplus Platform infrastructure - IP address failover.  &lt;br /&gt;
&lt;br /&gt;
The idea behind IP address failover is to have a &amp;quot;virtual IP&amp;quot; address that can be moved from the active blade to another blade when the active fails.  This is an essential component of many highly available network servers. &lt;br /&gt;
&lt;br /&gt;
The Translation into a SAF/OpenClovis model is very simple.  Each Virtual IP address is defined as a &amp;quot;Component Service Instance&amp;quot; (CSI), essentially a &amp;quot;work assignment&amp;quot;.  Each CSI contains the IP Address (e.g. 192.168.1.2) and the physical network interface (e.g. eth0) on which it should be assigned.  When the OpenClovis SAFplus Platform &amp;quot;assigns&amp;quot; the CSI to a blade, the software assigns the IP address to the physical network interface using the standard linux &amp;quot;ifconfig&amp;quot; utility.  It then issues a &amp;quot;gratituous ARP&amp;quot; to notify the larger network of the IP address change.  When the OpenClovis SAFplus Platform &amp;quot;removes&amp;quot; the CSI from a blade, the software removes the IP address from the physical network interface using &amp;quot;ifconfig&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The only custom code needed is the application-specific code needed to bring up an interface and issue the gratituous ARP.&lt;br /&gt;
&lt;br /&gt;
This model can be packaged with the OpenClovis SAFplus Platform or as an application-only deployable bundle (using SAFplus Platform Web Director).  To create an application-only bundle, first build SAFplus Platform package normally (i.e. configure; make).  Next, go to the &amp;quot;virtualIp/bundle&amp;quot; directory and type &amp;quot;make&amp;quot;.  An application tarball will be created.&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/sdkguide/envvars</id>
		<title>Doc:latest/sdkguide/envvars</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/sdkguide/envvars"/>
				<updated>2010-08-27T03:57:55Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Runtime environmental variables exported by the OpenClovis SAFplus Platform environment==&lt;br /&gt;
&lt;br /&gt;
Following are the environmental variables exported by the OpenClovis SAFplus Platform environment, which are available to the application developers. Using these environmental variables to create additional files/logs (if any) etc is recommended, because in case of any problems in SAFplus Platform, it will be easier to correlate the log files present in these locations and hence to diagnose the cause of the problem.&lt;br /&gt;
&lt;br /&gt;
* '''ASP_DIR''' - Location of the sandbox directory, i.e. the directory in which SAFplus Platform is deployed.&lt;br /&gt;
* '''ASP_RUNDIR''' - Default working directory of application components.&lt;br /&gt;
* '''ASP_LOGDIR''' - Place where the log files should be created. (This can be overridden using the clLog.xml, but it is recommended that application developers create their logs here.)&lt;br /&gt;
* '''ASP_DBDIR''' - Location where persistent files (if any) by the application should be created.&lt;br /&gt;
* '''ASP_CONFIG''' - Place where all the configuration data used by the SAFplus Platform is stored.&lt;br /&gt;
* '''ASP_BINDIR''' - Location of all the binaries (SAFplus Platform as well as user applications).&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Note.png]]When deploying SAFplus Platform images on a particular node, if there is a 'extras' directory present in the model directory, then the directory structure underneath it will be overlaid on top of the sandbox directory, without overwriting the files in the sandbox directory, in case of file name clash. For e.g. if model name is test, and if there is a file called test/extras/bin/test_bin, then if the deployed image is extracted to directory called `asp', then asp/bin/ will contain test_bin file (provided there already isn't test_bin file in bin/ directory). This can be helpful to package custom scripts, binaries etc when deploying an SAFplus Platform image.&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/sdkguide/deploy</id>
		<title>Doc:latest/sdkguide/deploy</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/sdkguide/deploy"/>
				<updated>2010-08-27T03:57:19Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Deployment==&lt;br /&gt;
&lt;br /&gt;
This chapter covers various topics related to deploying SAFplus Platform and the SAFplus-based applications onto a given target hardware (cluster).&lt;br /&gt;
&lt;br /&gt;
===Deploying and Running OpenClovis SAFplus Platform on a Target System===&lt;br /&gt;
&lt;br /&gt;
In order to deploy an OpenClovis SAFplus-based model on to a run-time target system, we need to specify the model's target system configuration, and create the run-time images that will be deployed on the target system.  The target system is configured using the &amp;lt;code&amp;gt;target.conf&amp;lt;/code&amp;gt; configuration file and the run-time images are created using the &amp;lt;code&amp;gt;make images&amp;lt;/code&amp;gt; command.  This step creates run-time images for all types of nodes covered by the model (system controller nodes and worker nodes).&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Note.png]] Image generation can also be accomplished in IDE. For more information, see ''OpenClovis IDE User Guide''.&lt;br /&gt;
&lt;br /&gt;
====Target System Configuration - target.conf====&lt;br /&gt;
&lt;br /&gt;
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;/&amp;lt;model&amp;gt;/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;/&amp;lt;model&amp;gt;/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 and 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 &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_IP=10.10.4.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;'''CMM_USERNAME''', '''CMM_PASSWORD''' and '''CMM_AUTH_TYPE''' (Mandatory if deployed on an ATCA chassis): Specifies the username, password, and authentication type 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;
CMM_AUTH_TYPE=md5&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 at.  When deployed to an ATCA chassis, this corresponds to the physical slot the blade is situated at.  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;
|eth0&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=eth0&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;li&amp;gt;'''AUTO_ASSIGN_NODEADDR=default|physical-slot''' (Optional): Specifies the scheme that determines how Node Addresses are assigned at run time.  If &amp;lt;code&amp;gt;physical-slot&amp;lt;/code&amp;gt; is specified, the SAFplus Platform startup script will attempt to determine it's own slot number and utilize that instead of the SLOT_ number specified above if it is able.  If &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; is specified, or the value is unspecified, it will function in the default manner of using the SLOT_ number defined above.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Generating Run-time Images====&lt;br /&gt;
&lt;br /&gt;
In order to generate the run-time images based on the target system configuration specified in &amp;lt;code&amp;gt;target.conf&amp;lt;/code&amp;gt;, run the following command at the &amp;lt;code&amp;gt;&amp;lt;project_area&amp;gt;/&amp;lt;model&amp;gt;&amp;lt;/code&amp;gt; directory:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ make images&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&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/&amp;lt;model&amp;gt;/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;
====Copying Images to Run-time System====&lt;br /&gt;
&lt;br /&gt;
The node-specific images are deployed to the nodes in the run-time system at &amp;lt;code&amp;gt;/root/asp&amp;lt;/code&amp;gt;.  They can be deployed to the target nodes in a variety of ways, for example:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Using '''rsync''':  This option requires an ssh server running on each target node.  In order to use this option, run the following commands on each target node:&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;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
On the development host, switch to the target image directory using the following command:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd &amp;lt;project_area&amp;gt;/target/&amp;lt;model&amp;gt;/images&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Then, for each node instance &amp;lt;node_instance&amp;gt;, run the following command to copy the image to its corresponding target node at &amp;lt;node_ip&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ rsync -avH &amp;lt;node_instance&amp;gt;/* root@&amp;lt;node_ip&amp;gt;:asp/.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Using the generated node-specific tarballs:&lt;br /&gt;
Copy the node-specific tarballs from the development host to the target nodes using ftp, scp, or any method that is available.  &amp;lt;i&amp;gt;e.g.&amp;lt;/i&amp;gt; To copy the tarballs using &amp;lt;code&amp;gt;scp&amp;lt;/code&amp;gt;, switch to the target image directory on the development host using the following command:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd &amp;lt;project_area&amp;gt;/target/&amp;lt;model&amp;gt;/images&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Then, for each node instance &amp;lt;node_instance&amp;gt;, run the following command to copy the image to its corresponding target node at &amp;lt;node_ip&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ scp &amp;lt;node_instance&amp;gt;.tgz root@&amp;lt;node_ip&amp;gt;:.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
On each target node, run the following commands to finish deploying the image:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# mkdir /root/asp&lt;br /&gt;
# cd /root/asp&lt;br /&gt;
# tar xzfm ../&amp;lt;node_instance&amp;gt;.tgz&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;
====Running OpenClovis SAFplus Platform on the Deployed Run-time System====&lt;br /&gt;
&lt;br /&gt;
To start OpenClovis SAFplus Platform on the run-time system, run the following commands as root on each target node:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# cd /root/asp&lt;br /&gt;
# etc/init.d/asp start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Note.png]] If SAFplus Platform fails to start properly it could be due to the machine's firewall being enabled. SAFplus Platform will not run properly with an enabled firewall. See the ''Environment Related Observation'' section of the ''OpenClovis Release Notes'' for more information.&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Note.png]] By default SCNodeI0, PayloadNodeI0 and PayloadNodeI1 are configured (see target.conf) to use the eth0 ethernet interface. Within each of the nodes this configuration information is stored within the following two files.&lt;br /&gt;
*&amp;lt;code&amp;gt;/root/asp/etc/clGmsConfig.xml&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;/root/asp/etc/asp.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is not always the case, for example on one of your nodes you may want to switch to eth1. If you would like to do so without changing target.conf and rebuilding the images and redeploying then use your favourite editor, eg vi, to replace the occurrence of eth0 with the appropriate form, e.g. eth1 in these two files.&lt;br /&gt;
&lt;br /&gt;
===Deployment of OpenClovis SAFplus Platform on Production Systems===&lt;br /&gt;
&lt;br /&gt;
The deployment mechanism described above is well suited for development environments and will also work for production environments.  However, sometimes different deployment behavior is desired in production environments.  For example, in the above deployment the node's &amp;quot;personality&amp;quot; depends on what software (tar file) is loaded and run on the node.  Another option is to have the node's &amp;quot;personality&amp;quot; depend on what slot the node is inserted into.  For example, a project that is using physically different blades or deploying rack mount servers (i.e. there is no &amp;quot;slot&amp;quot;) will likely want the personality to follow the loaded software.  But a project that uses the exact same blade in and ATCA chassis may want the personality to follow the slot for simplicity in FRU replacement (i.e. a spare blade will automatically use the correct &amp;quot;personality&amp;quot; when inserted in the dead blade's slot).  Alternately, a project that requires a specific pairing of blades due to custom hardware or upstream network redundancy will require that the personality follow the slot.&lt;br /&gt;
&lt;br /&gt;
To change the &amp;quot;personality&amp;quot; of a blade edit the &amp;quot;etc/asp.conf&amp;quot; file on your node after the SAFplus Platform software has been deployed.  This file defines several environment variables:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;'''export NODENAME=\&amp;lt;your node name\&amp;gt;'''&lt;br /&gt;
&amp;lt;br&amp;gt;This variable controls the node personality. The NODENAME variable defines the node's personality as you specified in the AMF configuration dialog in the OpenClovis IDE.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;'''export SYSTEM_CONTROLLER=\&amp;lt;1 or 0\&amp;gt;'''&lt;br /&gt;
&amp;lt;br&amp;gt;This second variable defines whether this node is a system controller or not.  Note that this variable cannot be changed to &amp;quot;toggle&amp;quot; system controller functionality -- whether or not the node is a system controller is defined by the node's personality in the OpenClovis IDE and this variable must be set correctly.  It exists due to the internal design of the SAFplus Platform platform; essentially the SAFplus Platform must act as a system controller (or not) before it gains enough information to know whether a particular NODENAME is supposed to be a system controller.&lt;br /&gt;
&amp;lt;br&amp;gt;Therefore to toggle system controller behavior, you must change both NODENAME and the SYSTEM_CONTROLLER variables.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;'''export DEFAULT_NODEADDR=\&amp;lt;a positive integer\&amp;gt;''' &lt;br /&gt;
&amp;lt;br&amp;gt;This variable is only used in rack-mount systems or systems where OpenClovis SAFplus Platform cannot determine the slot number.  Every node in the cluster must be given a unique node address.  In &amp;quot;slot-based&amp;quot; systems, the slot number will be used as the node address, but in systems where OpenClovis SAFplus Platform cannot determine the slot number then this default will be used.&lt;br /&gt;
&amp;lt;br&amp;gt;As an aside, note that to integrate OpenClovis SAFplus's slot numbering with a custom chassis all that must be done is to set this variable to the actual slot number.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Deployment on Machines that Lack Storage====&lt;br /&gt;
&lt;br /&gt;
The mechanics of deployment on diskless machines (i.e using PXE or tftp to get a linux kernel from another node on the network) is node and operating system specific and is beyond the scope of the OpenClovis SDK.  However, commonly these methods require that a single image be booted on all nodes.  Therefore, the default OpenClovis deployment where the node &amp;quot;personality&amp;quot; is determined by the software image is not appropriate.  Instead, deployment on diskless machines can be accomplished using the same strategy used for deployment where the personality is determined by the slot, as described in the prior section.  &lt;br /&gt;
&lt;br /&gt;
Note that although this strategy was presented using the slot number as the deterministic value it is not limited in this way.  Any accessible data can be used to set the NODENAME, SYSTEM_CONTROLLER, and DEFAULT_NODEADDR variables.  Implementation is left to the customer but some options include a byte in the node's non-volatile (CMOS or flash) memory, the node's MAC address, a file in a mounted NFS volume, or a boot-time parameter.&lt;br /&gt;
&lt;br /&gt;
===Setting Up SAFplus Platform On A Multi-Subnet System===&lt;br /&gt;
&lt;br /&gt;
Clustered environments often assume that all nodes in the cluster are connected via the same Layer-2 subnet, such as an Ethernet subnet, or often a redundant pair of such subnets.&lt;br /&gt;
Indeed, OpenClovis SAFplus Platform has been designed to exploit the benefits of the single-subnet setup to achieve optimal communication and failover performance.&lt;br /&gt;
&lt;br /&gt;
However, in certain systems the cluster must span across multiple layer-2 subnets that are connected directly or indirectly over layer-3 (IP) routers. Albeit somewhat more involved, SAFplus Platform can be setup for these networks, as it is explained and demonstrated in this section.&lt;br /&gt;
&lt;br /&gt;
====Requirements on the Subnet Connectivity====&lt;br /&gt;
&lt;br /&gt;
SAFplus Platform uses three types of communications among its nodes, all of which must be working in order to provide its functionality:&lt;br /&gt;
* IP (UDP) unicast forwarding, used by the Group Membership Service (GMS) protocol&lt;br /&gt;
* IP (UDP) multicast forwarding, used also by GMS&lt;br /&gt;
* Layer 2 forwarding, used by TIPC for the rest of the inter-node communication&lt;br /&gt;
&lt;br /&gt;
Hence, in order to provide all 3 types of connectivity between the subnets, the router(s) or switch(es) that connect the subnets must provide the following capabilities. These capabilitits are rather common in modern routers and switches, and are also provided by standard Linux-based systems:&lt;br /&gt;
* IPv4 unicast forwarding (routing)&lt;br /&gt;
* IPv4 multicast forwarding (multicast routing)&lt;br /&gt;
* Ethernet bridging for selected Ethernet frames, based on Ethernet protocol type field&lt;br /&gt;
&lt;br /&gt;
====Example Setup Using a Linux-based Router====&lt;br /&gt;
&lt;br /&gt;
Setting up a router to perform the above services is vendor and model specific. Therefore we illustrate the setup for the case when a common Linux-based PC is used as a router between the subnets. This configuration can be directly transposed to other commercial router products that have the above 3 capabilities.&lt;br /&gt;
&lt;br /&gt;
We assume that the Linux PC has two Ethernet NICs. The steps involves setting up IP forwarding to allow normal traffic to be routed across the subnets, creating an Ethernet bridge to allow TIPC traffic to be bridged across the subnets (i.e. see both subnets as one), and setting up multicast routing across the subnets to allow SAFplus Platform GMS traffic across the subnets (i.e., again, to see both subnets as one).&lt;br /&gt;
&lt;br /&gt;
In our example we assume that the two subnets are:&lt;br /&gt;
*&amp;lt;code&amp;gt;10.10.0.0/16&amp;lt;/code&amp;gt; (gateway &amp;lt;code&amp;gt;10.10.0.1&amp;lt;/code&amp;gt;)&lt;br /&gt;
*&amp;lt;code&amp;gt;10.20.0.0/16&amp;lt;/code&amp;gt; (gateway &amp;lt;code&amp;gt;10.20.0.1&amp;lt;/code&amp;gt;)&lt;br /&gt;
and our Linux router will have the following two interfaces:&lt;br /&gt;
*&amp;lt;code&amp;gt;eth0: 10.10.0.99&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;eth1: 10.20.0.1&amp;lt;/code&amp;gt; (gateway for &amp;lt;code&amp;gt;10.20.0.0/16&amp;lt;/code&amp;gt; subnet)&lt;br /&gt;
&lt;br /&gt;
=====IP Unicast Forwarding=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ensure that IP Forwarding is enabled by setting the following in &amp;lt;code&amp;gt;/etc/sysctl.conf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
net.ipv4.ip_forward = 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Run the following to reload &amp;lt;code&amp;gt;/etc/sysctl.conf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# sysctl -p&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;
With the two interfaces configured, ensure that the default route points to &amp;lt;code&amp;gt;10.10.0.1&amp;lt;/code&amp;gt; on &amp;lt;code&amp;gt;eth0&amp;lt;/code&amp;gt;:&lt;br /&gt;
 # route del default&lt;br /&gt;
 # route add default gw 10.10.0.1 dev eth0&lt;br /&gt;
&lt;br /&gt;
Note: Ensure that the gateway for the &amp;lt;code&amp;gt;10.10.0.0/16&amp;lt;/code&amp;gt; subnet (in our case &amp;lt;code&amp;gt;10.10.0.1&amp;lt;/code&amp;gt;) has a route in place for the &amp;lt;code&amp;gt;10.20.0.0&amp;lt;/code&amp;gt; subnet using the following command:&lt;br /&gt;
 # route add -net 10.20.0.0 netmask 255.255.0.0 gw 10.10.0.99&lt;br /&gt;
&lt;br /&gt;
=====Ethernet Bridging for TIPC traffic=====&lt;br /&gt;
&lt;br /&gt;
You will need the &amp;lt;code&amp;gt;ebtables&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;bridge-utils&amp;lt;/code&amp;gt; packages installed, as well as support for Ethernet bridging (802.1d) and ebtables enabled in the kernel. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Create a new Ethernet bridge using the following:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# brctl addbr br0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Add &amp;lt;code&amp;gt;eth0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;eth1&amp;lt;/code&amp;gt; to the bridge:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# brctl addif br0 eth0&lt;br /&gt;
# brctl addif br0 eth1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Bring the bridge interface &amp;lt;code&amp;gt;br0&amp;lt;/code&amp;gt; up:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# ifconfig br0 0.0.0.0 up&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Next, set the default bridge &amp;quot;brouting&amp;quot; policy to &amp;lt;code&amp;gt;DROP&amp;lt;/code&amp;gt; to ensure that all traffic is routed at Layer-3 via iptables as normal:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# ebtables -t broute -P BROUTING DROP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Finally, allow TIPC traffic (protocol &amp;lt;code&amp;gt;0x88ca&amp;lt;/code&amp;gt;) to be bridged across the subnets, bypassing Layer-3 routing:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# ebtables -t broute -A BROUTING -p 0x88ca -j ACCEPT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;0x88ca&amp;lt;/code&amp;gt; is the Ethernet protocol type value for TIPC Ethernet frames.&lt;br /&gt;
&lt;br /&gt;
=====Multicast Routing Using mrouted for SAFplus Platform GMS Traffic=====&lt;br /&gt;
&lt;br /&gt;
You will need the &amp;lt;code&amp;gt;mrouted&amp;lt;/code&amp;gt; package installed and support for multicast routing enabled in your kernel. Do not proceed before these are installed and your kernel is multicast-enabled.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Add the following entries to &amp;lt;code&amp;gt;/etc/mrouted.conf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
phyint eth0 rate_limit 0 igmpv1&lt;br /&gt;
phyint eth1 rate_limit 0 igmpv1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Add the default multicast route to the routing table with the following command:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Start &amp;lt;code&amp;gt;mrouted&amp;lt;/code&amp;gt; using the following command:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# mrouted -c /etc/mrouted.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
or using the appropriate service startup script, e.g.:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/init.d/mrouted start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
for Red Hat, Gentoo, Ubuntu and other distributions&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more information, please see the [http://www.jukie.net/~bart/multicast/Linux-Mrouted-MiniHOWTO.html Linux-Mrouted-MiniHOWTO].&lt;br /&gt;
&lt;br /&gt;
=====Patching SAFplus Platform to Allow GMS Multicast Packets to Traverse the Router=====&lt;br /&gt;
&lt;br /&gt;
In the current version of SAFplus Platform, when the multicast port is opened by GMS, the default TTL value 1 (Linux default) is unchanged. Consequently, the router will drop the GMS multicast packets. &lt;br /&gt;
To allow multicast routing, the GMS code must be modified to override the default TTL value. When the two subnets are connected directly via a router, the TTL=2 value is sufficient. (In case the connectivity involves tunnels and/or multiple routers, a larger TTL value may be needed, depending on the number of hops. In order to prevent multicast traffic &amp;quot;leaking&amp;quot; into neighboring subnets, never use a TTL value larger than what you really need.)&lt;br /&gt;
&lt;br /&gt;
Hence, the following patch needs to be applied to the code. In the next release of SAFplus Platform, the TTL value will be configurable from the GMS configuration file, so this patch is a temporary fix.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: 3rdparty/openais/openais-0.80.3/exec/totemnet.c&lt;br /&gt;
===================================================================&lt;br /&gt;
--- 3rdparty/openais/openais-0.80.3/exec/totemnet.c	(revision 1710)&lt;br /&gt;
+++ 3rdparty/openais/openais-0.80.3/exec/totemnet.c	(working copy)&lt;br /&gt;
@@ -885,6 +885,7 @@&lt;br /&gt;
 	int addrlen;&lt;br /&gt;
 	int res;&lt;br /&gt;
 	int flag;&lt;br /&gt;
+    unsigned char ttl;&lt;br /&gt;
 	&lt;br /&gt;
 	/*&lt;br /&gt;
 	 * Create multicast recv socket&lt;br /&gt;
@@ -1066,16 +1067,23 @@&lt;br /&gt;
 	 * Set multicast packets TTL&lt;br /&gt;
 	 */&lt;br /&gt;
 &lt;br /&gt;
-	if ( bindnet_address-&amp;gt;family == AF_INET6 )&lt;br /&gt;
-	{&lt;br /&gt;
+	switch ( bindnet_address-&amp;gt;family ) {&lt;br /&gt;
+        case AF_INET:&lt;br /&gt;
+        ttl = 2;&lt;br /&gt;
+        if (setsockopt (sockets-&amp;gt;mcast_send, IPPROTO_IP, &lt;br /&gt;
+                IP_MULTICAST_TTL, &amp;amp;ttl, sizeof(ttl)) &amp;lt; 0) {&lt;br /&gt;
+            perror (&amp;quot;cannot set mcast ttl&amp;quot;);&lt;br /&gt;
+            return (-1);&lt;br /&gt;
+        }&lt;br /&gt;
+        break;&lt;br /&gt;
+        case AF_INET6:&lt;br /&gt;
 		flag = 255;&lt;br /&gt;
-		res = setsockopt (sockets-&amp;gt;mcast_send, IPPROTO_IPV6,&lt;br /&gt;
-			IPV6_MULTICAST_HOPS, &amp;amp;flag, sizeof (flag));&lt;br /&gt;
-		if (res == -1) {&lt;br /&gt;
-			perror (&amp;quot;setp mcast hops&amp;quot;);&lt;br /&gt;
+		if (setsockopt (sockets-&amp;gt;mcast_send, IPPROTO_IPV6, &lt;br /&gt;
+			IPV6_MULTICAST_HOPS, &amp;amp;flag, sizeof (flag)) &amp;lt; 0) {&lt;br /&gt;
+			perror (&amp;quot;cannot set mcast ttl&amp;quot;);&lt;br /&gt;
 			return (-1);&lt;br /&gt;
 		}&lt;br /&gt;
-	}&lt;br /&gt;
+        break;&lt;br /&gt;
+    }&lt;br /&gt;
 &lt;br /&gt;
 	/*&lt;br /&gt;
 	 * Bind to a specific interface for multicast send and receive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please copy the above patch into a file, e.g., &amp;lt;code&amp;gt;gms_ttl2.patch&amp;lt;/code&amp;gt;, and apply it to the SAFplus Platform source tree as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# cd &amp;lt;clovis-sdk-dir&amp;gt;/sdk-3.0/src/SAFplus Platform&lt;br /&gt;
# patch -p0 &amp;lt; gms_ttl2.patch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
and rebuild SAFplus Platform.&lt;br /&gt;
&lt;br /&gt;
=====GMS Multicast IP Address Selection=====&lt;br /&gt;
&lt;br /&gt;
In order to allow GMS multicast packets traverse the router, don't forget to pick a routable multicast address. Addresses between 224.0.0.0 through 224.0.0.255 are not routable, but 224.0.1.0 or above are routable. This address can be specified in various ways, including:&lt;br /&gt;
* by using the IDE&lt;br /&gt;
* by modifying the target.conf file manually before packaging for deployment&lt;br /&gt;
* by modifying the clGmsConfig.xml file on the target nodes after deployment&lt;br /&gt;
&lt;br /&gt;
=====Bringing Up SAFplus Platform on the Multi-Subnet Cluster=====&lt;br /&gt;
&lt;br /&gt;
At this point SAFplus Platform can be started on nodes connected to either of the two subnets, they will be able to join the SAFplus Platform cluster irrespective of their location. Starting, stopping, and using SAFplus Platform is identical to the single subnet case.&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/sdkguide/build</id>
		<title>Doc:latest/sdkguide/build</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/sdkguide/build"/>
				<updated>2010-08-27T03:54:58Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Building SAFplus Platform and SAFplus-based Systems==&lt;br /&gt;
&lt;br /&gt;
This chapter covers new features that are related to building SAFplus Platform and SAFplus-based systems. Key new features include:&lt;br /&gt;
&lt;br /&gt;
#SAFplus Platform and model tree separation&lt;br /&gt;
#Pre-built SAFplus Platform library support&lt;br /&gt;
#Multi-target build support&lt;br /&gt;
#Integration with WindRiver Workbench SDK&lt;br /&gt;
&lt;br /&gt;
Note: In the context of this chapter, a target platform is any blade type or architecture that OpenClovis SAFplus Platform can be built for (e.g. WindRiver PNE-LE 1.4 on dual Xeon-based Intel MPCBL0001 blades, or Yellow Dog Linux on PowerPC based blades).  OpenClovis provides a variety of cross build toolchains that can optionally be used with the SDK to build SAFplus Platform for these targets.&lt;br /&gt;
&lt;br /&gt;
Working with the OpenClovis SDK involves the following steps:&lt;br /&gt;
&lt;br /&gt;
#Installing the SDK, which is covered in ''OpenClovis Installation Guide''&lt;br /&gt;
#Optionally preparing the SDK for use with the WindRiver Workbench development tools&lt;br /&gt;
#Optionally pre-building SAFplus Platform libraries for a given target platform.&lt;br /&gt;
#Creating a project area (optionally populated with one or more existing SAFplus Platform models)&lt;br /&gt;
#Using the OpenClovis IDE to create a new SAFplus Platform model, generate its code, and modify this code to create desired functionality. This part is covered in ''OpenClovis IDE User Guide''&lt;br /&gt;
#Configuring and building the desired model for one or more target platform&lt;br /&gt;
&lt;br /&gt;
===Using OpenClovis SDK with the WindRiver Workbench===&lt;br /&gt;
&lt;br /&gt;
It is possible to use OpenClovis SDK with the WindRiver Workbench development tools.  This section describes an optional step that creates a 'virtual' toolchain that allows SAFplus Platform to be built using the WindRiver Workbench development tools for a given WindRiver board support package.  This also builds the 3rd party prerequisites using the Workbench tools so that they may be deployed on the specific platform.  It requires both WindRiver Workbench (for the development tools) as well as a WindRiver board support package for a specific target platform.  Platform specific HPI libraries from Pigeon Point Systems and RadiSys can optionally be built into the virtual toolchains using packages supplied by either vendor.  It is possible to create as many virtual toolchains as necessary for a variety of platforms.&lt;br /&gt;
&lt;br /&gt;
This is done by using the cl-create-wrs-toolchain utility (as root, if OpenClovis SDK was installed as root, or as a normal user if not):&lt;br /&gt;
&lt;br /&gt;
 # cl-create-wrs-toolchain -w &amp;lt;WindRiver Workbench install dir&amp;gt; \&lt;br /&gt;
                           -b &amp;lt;bsp name&amp;gt; \&lt;br /&gt;
                         [ -l &amp;lt;libhcl_tarball&amp;gt; ] \&lt;br /&gt;
                         [ -p &amp;lt;pps_openhpi_tarball&amp;gt; ] \&lt;br /&gt;
                           &amp;lt;toolchain_name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt; option accepts the full path to a RadiSys-provided libhcl package tarball.  If specified, it will be built in to the virtual toolchain.&lt;br /&gt;
The &amp;lt;code&amp;gt;-p&amp;lt;/code&amp;gt; option accepts the full path to a Pigeon Point Systems-provided OpenHPI package tarball.  If specified, it will be built into the virtual toolchain instead of the stock OpenHPI package from the OpenClovis-provided 3rd party package tarball.&lt;br /&gt;
&lt;br /&gt;
e.g.:&lt;br /&gt;
&lt;br /&gt;
 # cl-create-wrs-toolchain -w /opt/WindRiver \&lt;br /&gt;
                           -b intel_mpcbl0001 wrs_mpcbl0001&lt;br /&gt;
&lt;br /&gt;
This will create a toolchain called &amp;lt;code&amp;gt;wrs_mpcbl0001&amp;lt;/code&amp;gt; in your existing SDK buildtools directory that is built using the WindRiver installation at &amp;lt;code&amp;gt;/opt/WindRiver&amp;lt;/code&amp;gt; for the &amp;lt;code&amp;gt;intel_mpcbl0001&amp;lt;/code&amp;gt; board support package.  This toolchain will be visible when using &amp;lt;code&amp;gt;configure --help&amp;lt;/code&amp;gt;, as will be noted in a following section.&lt;br /&gt;
&lt;br /&gt;
Note: The virtual toolchain requires the WindRiver Workbench installation to be available when it is used, as it merely provides references to the development tools in the Workbench installation.  Should the installation be moved or replaced, the virtual toolchain would need to be built again.&lt;br /&gt;
&lt;br /&gt;
===Pre-building SAFplus Platform Libraries for a Given Target Platform===&lt;br /&gt;
&lt;br /&gt;
This is an optional step that pre-builds SAFplus Platform libraries for use with a given platform (i.e. using a specific toolchain).  With these in place, it is no longer necessary to rebuild SAFplus Platform every time in order to build an SAFplus Platform model.  (For the purpose of this document, we assume that the SDK is installed at &amp;lt;code&amp;gt;/opt/clovis&amp;lt;/code&amp;gt;, by root.  Consequently, example steps will be run as root.  If the SDK is installed as a normal user at a location available to him, these steps can be run as the normal user itself.)&lt;br /&gt;
&lt;br /&gt;
We first create a special project area for the SAFplus Platform library build, and change to it:&lt;br /&gt;
&lt;br /&gt;
 # mkdir asp_build&lt;br /&gt;
 # cd asp_build&lt;br /&gt;
&lt;br /&gt;
This project area is then initialized with the configure script as:&lt;br /&gt;
&lt;br /&gt;
 # /opt/clovis/sdk-3.0/src/SAFplus/configure --with-asp-build \&lt;br /&gt;
                         [--with-cross-build=&amp;lt;toolchain&amp;gt;] \&lt;br /&gt;
         [--prefix=&amp;lt;alternate SAFplus Platform libs installation dir&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
By default, the libraries will ultimately be installed to the SDK installation directory, in this case: &amp;lt;code&amp;gt;/opt/clovis/sdk-3.0/target/&amp;lt;arch&amp;gt;/&amp;lt;kernel&amp;gt;/lib&amp;lt;/code&amp;gt;, and header files will be available at &amp;lt;code&amp;gt;/opt/clovis/sdk-3.0/include&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If --with-cross-build=&amp;lt;toolchain&amp;gt; is unspecified, libraries will be built for the local system.&lt;br /&gt;
&lt;br /&gt;
If --prefix=&amp;lt;prefix&amp;gt; is specified, libraries will be installed to &amp;lt;code&amp;gt;&amp;lt;prefix&amp;gt;/&amp;lt;arch&amp;gt;/&amp;lt;kernel&amp;gt;/lib&amp;lt;/code&amp;gt;, and header files to &amp;lt;code&amp;gt;&amp;lt;prefix&amp;gt;/include&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
 # /opt/clovis/sdk-3.0/src/SAFplus/configure --with-asp-build \&lt;br /&gt;
   --with-cross-build=i586-wrl-pnele1.4-2.6.14_mpcbl0001&lt;br /&gt;
&lt;br /&gt;
will cause libraries to be built from the i586-wrl-pnele1.4-2.6.14_mpcbl0001 toolchain and installed to &amp;lt;code&amp;gt;/opt/clovis/sdk-3.0/target/i386/linux-2.6.14/lib&amp;lt;/code&amp;gt;, with header files populated at &amp;lt;code&amp;gt;/opt/clovis/sdk-3.0/include&amp;lt;/code&amp;gt;, and&lt;br /&gt;
&lt;br /&gt;
 # /opt/clovis/sdk-3.0/src/SAFplus/configure --with-asp-build \&lt;br /&gt;
                                         --prefix=/opt/asplib&lt;br /&gt;
&lt;br /&gt;
on an Ubuntu 7.04 (feisty fawn) system will cause libraries to be installed to &amp;lt;code&amp;gt;/opt/asplib/i686/linux-2.6.20/lib&amp;lt;/code&amp;gt;, and header files to be populated at &amp;lt;code&amp;gt;/opt/asplib/include&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The following steps build and install the libraries as configured above:&lt;br /&gt;
&lt;br /&gt;
 # make asp-libs&lt;br /&gt;
 # make asp-install&lt;br /&gt;
&lt;br /&gt;
===Creating a Project Area===&lt;br /&gt;
&lt;br /&gt;
A new project area with no model code is created by running the &amp;lt;code&amp;gt;cl-create-project-area&amp;lt;/code&amp;gt; command:&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/bin/cl-create-project-area project_area&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This project area is ready for use with OpenClovis IDE to generate model code that will be built in a following step.&lt;br /&gt;
&lt;br /&gt;
Existing models (from model-specific branches) can be copied over into a project area, and re-running &amp;lt;code&amp;gt;configure&amp;lt;/code&amp;gt; using &amp;lt;code&amp;gt;--with-model-name&amp;lt;/code&amp;gt; with any copied models will configure them for building.&lt;br /&gt;
&lt;br /&gt;
A typical project area is laid out as:&lt;br /&gt;
&lt;br /&gt;
 project_area&lt;br /&gt;
     +- ide_workspace&lt;br /&gt;
          +- model_1&lt;br /&gt;
          +- model_2&lt;br /&gt;
     +- model_1&lt;br /&gt;
          +- src/&lt;br /&gt;
              +- target.conf&lt;br /&gt;
          +- build/&lt;br /&gt;
          +- target/&lt;br /&gt;
     +- model_2&lt;br /&gt;
          +- src/&lt;br /&gt;
              +- target.conf&lt;br /&gt;
          +- build/&lt;br /&gt;
          +- target/&lt;br /&gt;
&lt;br /&gt;
Note:  The &amp;lt;code&amp;gt;configure&amp;lt;/code&amp;gt; script does not copy models into the project area.  The old behavior of copying models out from SAFplus/models is no longer required.  The sample evaluation model that was at &amp;lt;code&amp;gt;&amp;lt;install_dir&amp;gt;/sdk-3.0/src/SAFplus/models&amp;lt;/code&amp;gt; has been moved to its own &amp;lt;code&amp;gt;examples&amp;lt;/code&amp;gt; project area adjacent to the SAFplus Platform tree, at &amp;lt;code&amp;gt;&amp;lt;install_dir&amp;gt;/sdk-3.0/src/examples&amp;lt;/code&amp;gt;. To use it, one would change to the &amp;lt;code&amp;gt;examples&amp;lt;/code&amp;gt; directory and issue a &amp;lt;code&amp;gt;&amp;lt;path-to&amp;gt;/configure --with-model-name=eval&amp;lt;/code&amp;gt;.  Alternately, if the &amp;lt;code&amp;gt;examples&amp;lt;/code&amp;gt; project area is in a non-user-writeable location (e.g. in the case of a root-installed SDK), it can be copied out to a user-writeable location and used there instead in the same manner.&lt;br /&gt;
&lt;br /&gt;
===Configuring and Building the Model===&lt;br /&gt;
&lt;br /&gt;
In this section, we will configure and build the &amp;lt;model&amp;gt; model in an existing project area.&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Configure the &amp;lt;model&amp;gt; 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-3.0/src/SAFplus/configure --with-model-name=&amp;lt;model&amp;gt; \&lt;br /&gt;
                                          --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 &amp;lt;model&amp;gt; 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-3.0/src/SAFplus/configure --with-model-name=&amp;lt;model&amp;gt; \&lt;br /&gt;
                                          --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;/&amp;lt;model&amp;gt;/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 Manager with:&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 --with-model-name=&amp;lt;model&amp;gt; \&lt;br /&gt;
                                          --with-asp-build \&lt;br /&gt;
                                          --with-cross-build=&amp;lt;crossbuild&amp;gt; \&lt;br /&gt;
                                          --with-cm-build=openhpi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
[[File:OpenClovis_Note.png]] '''Using Chassis Manager requires OpenClovis Platform Support Package, distributed separately from OpenClovis SDK.'''&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-3.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 &amp;lt;model&amp;gt; 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;
   |+&amp;lt;model&amp;gt;&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;
&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;/&amp;lt;model&amp;gt;&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&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;
This will build the &amp;lt;model&amp;gt; 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;/&amp;lt;model&amp;gt;/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;/&amp;lt;model&amp;gt;/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;/&amp;lt;model&amp;gt;/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 model directory.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Note.png]] Model building can also be accomplished in IDE. For more information, see ''OpenClovis IDE User Guide''.&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latestsdkguide/debugging</id>
		<title>Doc:latestsdkguide/debugging</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latestsdkguide/debugging"/>
				<updated>2010-08-27T03:53:41Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Debugging EO Applications and SAFplus Platform Components==&lt;br /&gt;
&lt;br /&gt;
The high availability features of the SAFplus Platform interfere with debugging applications because the act of debugging an application breaks the performance and availability &amp;quot;contract&amp;quot; between the SAFplus Platform and an application and therefore causes the SAFplus Platform to restart the application.&lt;br /&gt;
&lt;br /&gt;
This HOWTO describes strategies that can be used to debug within an high availability environment.  It is not a primer on gdb.  In fact, it assumes an in-depth knowledge of debugging using gdb (or gdb derivatives such as Wind River's IDE) and therefore focuses exclusively on the interactions between the debugger and the SAFplus Platform.&lt;br /&gt;
&lt;br /&gt;
It is useful to toggle the following debugging interventions on an as needed basis since many &amp;quot;defeat&amp;quot; the high availability features of the SAFplus Platform.  Therefore the examples below use a global variable (defined in your component's clCompAppMain.c) called debuggingOn to control these features.&lt;br /&gt;
&lt;br /&gt;
 int debuggingOn = 1; /* Set to 0 to turn debugging off, 1 to turn it on */&lt;br /&gt;
&lt;br /&gt;
These features will be generally available and integrated into the SAFplus Platform in the upcoming release.&lt;br /&gt;
&lt;br /&gt;
=== Stopping Process Health Monitoring ===&lt;br /&gt;
&lt;br /&gt;
It is extremely irritating to attach to your process via a debugger only to have the SAFplus's high availability features intervene and kill the process you are trying to debug!  Certain techniques can be used to temporarily &amp;quot;defeat&amp;quot; this feature to allow debugging to occur.  Of course, while the feature is &amp;quot;off&amp;quot; the high availability features will not work.&lt;br /&gt;
&lt;br /&gt;
==== Turning off heartbeat  ====&lt;br /&gt;
&lt;br /&gt;
Turning off your component's heartbeat solves 95% of the problem.  The SAFplus Platform expects your process to periodically state that it is &amp;quot;OK&amp;quot;; if it does not (for example, if stopped in a debugger) the SAFplus Platform will kill your process.&lt;br /&gt;
&lt;br /&gt;
Replace the function in clCompAppMain.c (in every one of your components) with this function, and create a &amp;quot;debuggingOn&amp;quot; global variable.  This will turn off the polling of your component and so the SAFplus Platform will not kill your component if it is being debugged.  This will allow you to load up gdb and then &amp;quot;attach&amp;quot; to your component.&lt;br /&gt;
&lt;br /&gt;
 int debuggingOn = 1;&lt;br /&gt;
&lt;br /&gt;
 ClRcT clCompAppHealthCheck(ClEoSchedFeedBackT* schFeedback)&lt;br /&gt;
 {&lt;br /&gt;
    /*&lt;br /&gt;
       Add code for application specific health check below. The defaults&lt;br /&gt;
       indicate EO is healthy and polling interval is unaltered.&lt;br /&gt;
    */&lt;br /&gt;
 &lt;br /&gt;
    ClRcT rc = CL_OK;&lt;br /&gt;
 &lt;br /&gt;
    /* If you want to attach to gdb */&lt;br /&gt;
    if (debuggingOn) schFeedback-&amp;gt;freq   = CL_EO_DONT_POLL;  &lt;br /&gt;
    else &lt;br /&gt;
      {&lt;br /&gt;
        schFeedback-&amp;gt;freq   = CL_EO_DEFAULT_POLL; &lt;br /&gt;
        schFeedback-&amp;gt;status = CL_CPM_EO_ALIVE;&lt;br /&gt;
        rc = eoapp-&amp;gt;HealthCheck();&lt;br /&gt;
      }&lt;br /&gt;
 &lt;br /&gt;
    return rc;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;ACK&amp;quot;ing Messages Early  ====&lt;br /&gt;
&lt;br /&gt;
The SAFplus Platform also monitors the response of certain crutial messages to your component.  If your component does not respond in time, the SAFplus Platform kills your component.  This feature ensures that your application does not have a bug in the handling of these messages; however when debugging the message handling we must &amp;quot;defeat&amp;quot; this feature.  The most common messages are the CSI assignment messages, which trigger the &amp;quot;clCompAppAMFCSISet&amp;quot; (clCompAppMain.c) function call.  When debugging your component, it is best to &amp;quot;ACK&amp;quot; the message right away so the SAFplus Platform will think that you have handled the message.  However, it is important to NOT do so when not in debugging mode, to ensure that the HA features work.  &lt;br /&gt;
&lt;br /&gt;
In the routine below, note that the &amp;quot;clCpmResponse(cpmHandle, invocation, CL_OK);&amp;quot; function has been moved above the switch statement when debugging is on (and moved to below it, for succinctness, when debugging is off).&lt;br /&gt;
&lt;br /&gt;
 ClRcT 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;
    /* If component hang detection is off, then reply with an OK first, &lt;br /&gt;
       so that this call won't time out causing the controller to kill me. */&lt;br /&gt;
    if (debuggingOn)&lt;br /&gt;
      {&lt;br /&gt;
        if (haState != CL_AMS_HA_STATE_QUIESCING)&lt;br /&gt;
          clCpmResponse(cpmHandle, invocation, CL_OK);&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
    /* DO NOT SET BREAKPOINTS ABOVE THIS LINE (IN THIS FUNCTION)&lt;br /&gt;
 &lt;br /&gt;
       (the controller will think that your process is dead)&lt;br /&gt;
 &lt;br /&gt;
       To set a breakpoint in this routine:&lt;br /&gt;
 &lt;br /&gt;
       1. First set &amp;quot;debuggingOn&amp;quot; to 1&lt;br /&gt;
       2. Set your breakpoint below this comment&lt;br /&gt;
       3. Continue&lt;br /&gt;
    */  &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    /* Print information about the CSI Set */&lt;br /&gt;
    clprintf (&amp;quot;Component [%s] : PID [%d]. CSI Set Received\n&amp;quot;, &lt;br /&gt;
               compName-&amp;gt;value, mypid);&lt;br /&gt;
    clCompAppAMFPrintCSI(csiDescriptor, haState);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    /* Take appropriate action based on state */&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;
            break;&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;
            break;&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;
            break;&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;
            clCpmCSIQuiescingComplete(cpmHandle, invocation, CL_OK);&lt;br /&gt;
            break;&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;
    /* If I'm am killing components, then reply with an OK after&lt;br /&gt;
       execution, to ensure that the handling did not hang */&lt;br /&gt;
    if (!debuggingOn)&lt;br /&gt;
      {&lt;br /&gt;
        if (haState != CL_AMS_HA_STATE_QUIESCING)&lt;br /&gt;
          clCpmResponse(cpmHandle, invocation, CL_OK);&lt;br /&gt;
      }&lt;br /&gt;
    return CL_OK;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Component State Transition Timeouts ====&lt;br /&gt;
&lt;br /&gt;
The SAFplus Platform also ensures that your component transitions through various states within reasonable a time.  To debug during these transitions (startup, shutdown, etc) it is necessary to increase these timeouts.&lt;br /&gt;
&lt;br /&gt;
The code that must be changed is in function cpmCompConfigure() in SAFplus/components/amf/server/cpm/clCpmComponent.c.  In each timeout there is a &amp;quot;tsSec&amp;quot; variable that is set to zero since the configured value is specified in milliseconds.  Instead of setting it to zero, set it to a global variable (in this case &amp;quot;clDbgComTimeoutOverride&amp;quot;).  When debugging, set this variable to a large number so that the timeout essentially never fires.&lt;br /&gt;
&lt;br /&gt;
Here is the changed code:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
   Create One shot timer component instantiation, with a timeout value&lt;br /&gt;
   equal to comp-&amp;gt;compConfig-&amp;gt;compInstantiateTimeout &lt;br /&gt;
*/&lt;br /&gt;
cpmTimeOut.tsSec = clDbgCompTimeoutOverride; /* default is zero, */&lt;br /&gt;
/* this override help debug apps, since the app won't be killed &lt;br /&gt;
   if you set the # high. */&lt;br /&gt;
cpmTimeOut.tsMilliSec = tmpComp-&amp;gt;compConfig-&amp;gt;compInstantiateTimeout;&lt;br /&gt;
rc = clTimerCreate(cpmTimeOut, CL_TIMER_ONE_SHOT, CL_TIMER_SEPARATE_CONTEXT,&lt;br /&gt;
                   cpmTimerCallback, (void *) tmpComp,&lt;br /&gt;
                   &amp;amp;(tmpComp-&amp;gt;cpmInstantiateTimerHandle));&lt;br /&gt;
/*&lt;br /&gt;
   Create One shot timer for component termination, with a timeout value&lt;br /&gt;
   equal to comp-&amp;gt;compConfig-&amp;gt;compTerminateCallbackTimeOut &lt;br /&gt;
*/&lt;br /&gt;
cpmTimeOut.tsSec = clDbgCompTimeoutOverride; /* default is zero, */&lt;br /&gt;
/* this override help debug apps, since the app won't be killed &lt;br /&gt;
   if you set the # high. */&lt;br /&gt;
cpmTimeOut.tsMilliSec = tmpComp-&amp;gt;compConfig-&amp;gt;compTerminateCallbackTimeOut;&lt;br /&gt;
rc = clTimerCreate(cpmTimeOut, CL_TIMER_ONE_SHOT, CL_TIMER_SEPARATE_CONTEXT,&lt;br /&gt;
                   cpmTimerCallback, (void *) tmpComp,&lt;br /&gt;
                   &amp;amp;(tmpComp-&amp;gt;cpmTerminateTimerHandle));&lt;br /&gt;
/*&lt;br /&gt;
   FIXME: following two need should be created only if this component is&lt;br /&gt;
   proxy for a component&lt;br /&gt;
*/&lt;br /&gt;
/*&lt;br /&gt;
   Create One shot timer proxied component Instantiate, with a timeout&lt;br /&gt;
   value equal to comp-&amp;gt;compConfig-&amp;gt;compInstantiateTimeout &lt;br /&gt;
*/&lt;br /&gt;
cpmTimeOut.tsSec = clDbgCompTimeoutOverride; /* default is zero, */&lt;br /&gt;
/* this override help debug apps, since the app won't be killed &lt;br /&gt;
   if you set the # high. */&lt;br /&gt;
cpmTimeOut.tsMilliSec =&lt;br /&gt;
    tmpComp-&amp;gt;compConfig-&amp;gt;compProxiedCompInstantiateCallbackTimeout;&lt;br /&gt;
rc = clTimerCreate(cpmTimeOut, CL_TIMER_ONE_SHOT, CL_TIMER_SEPARATE_CONTEXT,&lt;br /&gt;
                   cpmTimerCallback, (void *) tmpComp,&lt;br /&gt;
                   &amp;amp;(tmpComp-&amp;gt;cpmProxiedInstTimerHandle));&lt;br /&gt;
/*&lt;br /&gt;
   Create One shot timer for proxied component cleanup, with a timeout&lt;br /&gt;
   value equal to comp-&amp;gt;compConfig-&amp;gt;compInstantiateTimeout &lt;br /&gt;
*/&lt;br /&gt;
cpmTimeOut.tsSec = clDbgCompTimeoutOverride; /* default is zero, */&lt;br /&gt;
/* this override help debug apps, since the app won't be killed &lt;br /&gt;
   if you set the # high. */&lt;br /&gt;
cpmTimeOut.tsMilliSec =&lt;br /&gt;
    tmpComp-&amp;gt;compConfig-&amp;gt;compProxiedCompCleanupCallbackTimeout;&lt;br /&gt;
rc = clTimerCreate(cpmTimeOut, CL_TIMER_ONE_SHOT, CL_TIMER_SEPARATE_CONTEXT,&lt;br /&gt;
                   cpmTimerCallback, (void *) tmpComp,&lt;br /&gt;
                   &amp;amp;(tmpComp-&amp;gt;cpmProxiedCleanupTimerHandle));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating core files on failure ===&lt;br /&gt;
&lt;br /&gt;
To create core files, you need to change the core file size limit.  Do this by adding &amp;quot;ulimit -c unlimited&amp;quot; to the &amp;quot;asp/etc/init.d/sisp&amp;quot; script just before the sisp_amf program is run in the &amp;quot;start()&amp;quot; function.  The following code shows the change:&lt;br /&gt;
&lt;br /&gt;
        cd $SISP_DIR/bin&lt;br /&gt;
        ulimit -c unlimited&lt;br /&gt;
        env $SISP_ENV ./$prog $SISP_OPTIONS &amp;gt; ${SISP_OUTPUT} 2&amp;gt;&amp;amp;1 &amp;amp;&lt;br /&gt;
        RETVAL=$?&lt;br /&gt;
&lt;br /&gt;
Core files will be created in the &amp;quot;bin&amp;quot; (/root/asp/bin) directory.  You can test core creation by jamming a SEGFAULT into a program by doing &amp;quot;kill -SEGV &amp;lt;process id&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Note that when you redeploy (i.e. detar your image tarball onto the target machine) this file is overwritten!'''  I just keep a copy in my home directory and copy it back after deployment.&lt;br /&gt;
&lt;br /&gt;
=== Pausing and Resuming a Thread ===&lt;br /&gt;
&lt;br /&gt;
Sometimes a problem occurs during startup -- before you have the opportunity to attach to a process, set a breakpoint, and resume the process.    In a standard application this is easy to debug because &amp;quot;gdb&amp;quot; starts up with your program &amp;quot;stopped&amp;quot;.  But in a high availability framework, where the SAFplus Platform starts and stops programs, this is trickier.&lt;br /&gt;
 &lt;br /&gt;
To debug this, I added 2 functions, one which &amp;quot;pauses&amp;quot; the calling thread, the other &amp;quot;resumes&amp;quot; it.  The programmer adds the &amp;quot;pause&amp;quot; function to the code and recompiles.  When &amp;quot;debuggingOn&amp;quot; is true and the function is called, the thread will output a log and block on a semaphore.  The programmer can then check the logs to see if a thread was paused.  If so, he goes into gdb, attaches to the process, finds the thread that is paused  -- &amp;quot;thread apply all backtrace&amp;quot; (&amp;quot;thr a a bt&amp;quot;) and look for a call to &amp;quot;pause&amp;quot; -- switches to that thread (&amp;quot;thread x&amp;quot;), and then &amp;quot;resumes&amp;quot; the thread by calling the &amp;quot;resume&amp;quot; function from gdb's prompt:&lt;br /&gt;
&lt;br /&gt;
 gdb&amp;gt; call clDbgResume()&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;pause&amp;quot; function is actually a macro so that I can also pass the file and line from which the function was called.  This information is very useful if you accidently forget to remove a call to clDbgPause!&lt;br /&gt;
&lt;br /&gt;
 #define clDbgPause() clDbgPauseFn(__FILE__,__LINE__)&lt;br /&gt;
&lt;br /&gt;
 sem_t  clDbgSem;&lt;br /&gt;
 int    clDbgSemInited           = 0;&lt;br /&gt;
 &lt;br /&gt;
 /* Call this from the code to pause your program. */&lt;br /&gt;
 void clDbgPauseFn(char* file, int line)&lt;br /&gt;
 {&lt;br /&gt;
  if (debuggingOn != 0)&lt;br /&gt;
    {&lt;br /&gt;
      if (!clDbgSemInited)&lt;br /&gt;
        {&lt;br /&gt;
          int rc;&lt;br /&gt;
          clDbgSemInited = 1;&lt;br /&gt;
          rc = sem_init(&amp;amp;clDbgSem,0,0);&lt;br /&gt;
          if (rc == 0)&lt;br /&gt;
            {&lt;br /&gt;
              CL_DEBUG_PRINT(CL_DEBUG_CRITICAL,&lt;br /&gt;
                 (&amp;quot;dbgPause function called from %s:%d. Thread is paused.&amp;quot;&lt;br /&gt;
                  &amp;quot;Open the debugger and execute dbgResume() to continue.&amp;quot;,&lt;br /&gt;
                  file,line));&lt;br /&gt;
              do {&lt;br /&gt;
                rc = sem_wait(&amp;amp;clDbgSem);&lt;br /&gt;
              } while ((rc == -1)&amp;amp;&amp;amp;(errno == EINTR));&lt;br /&gt;
            }&lt;br /&gt;
          else &lt;br /&gt;
            {&lt;br /&gt;
              int err = errno;          &lt;br /&gt;
              CL_DEBUG_PRINT(CL_DEBUG_CRITICAL,&lt;br /&gt;
                 (&amp;quot;Can't create debug semaphore, error: %s, errno %d.&amp;quot;, &lt;br /&gt;
                  strerror(err), err));&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 /* Call this from gdb to continue your program. */&lt;br /&gt;
 void clDbgResume()&lt;br /&gt;
 {&lt;br /&gt;
   sem_post(&amp;amp;clDbgSem);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Intercepting the Automatic Start of a Component ===&lt;br /&gt;
&lt;br /&gt;
It is possible to run your component within a wrapper application (such as gdb or purify).  When the SAFplus Platform is deployed on a target, all applications are placed in the &amp;quot;bin&amp;quot; subdirectory of the SAFplus Platform tree (for example &amp;quot;/root/asp/bin&amp;quot;).  To intercept the application start for debugging purposes:&lt;br /&gt;
# rename your application&lt;br /&gt;
# create a script and name it the same as the original application name&lt;br /&gt;
# edit the script to add your wrapper.&lt;br /&gt;
## Note that you will have to start a separate window for applications that need a console (like gdb)&lt;br /&gt;
&lt;br /&gt;
For example the following simple script can be used to make your application start within gdb (note though that it must be used in conjunction with the techniques described in the &amp;quot;Stopping Process Health Monitoring&amp;quot; section above unless you are a very fast typist, since your application's initialization will be monitored by the OpenClovis HA infrastructure to ensure that it succeeds). This script assumes that your application is called &amp;quot;myapp&amp;quot; and that you moved it to &amp;quot;/root/asp/bin/myapp.orig&amp;quot;.  It also assumes that your Linux installation has X-windows and the gnome desktop environment installed:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
/usr/bin/gnome-terminal --window --command \&lt;br /&gt;
&amp;quot;gdb /root/asp/bin/myapp.orig $1 $2 $3 $4 $5 $6 $7 $8 $9&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/sdkguide/compdev</id>
		<title>Doc:latest/sdkguide/compdev</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/sdkguide/compdev"/>
				<updated>2010-08-27T03:52:55Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Developing Application Components in OpenClovis SAFplus Platform Environment==&lt;br /&gt;
&lt;br /&gt;
===Eonization===&lt;br /&gt;
&lt;br /&gt;
'''Eonization''' is a mechanism that enables the user application to communicate with OpenClovis SAFplus Platform. The name eonization derives from the word 'EO' or execution object. The end product of eonization is an EO that is able to communicate with other EOs in the SAFplus Platform environment.&lt;br /&gt;
&lt;br /&gt;
Eonization enables an application to :&lt;br /&gt;
# Invoke services exposed by the other EOs.&lt;br /&gt;
# Expose services so that other EOs can invoke the same.&lt;br /&gt;
# Provide some callbacks so that its lifecycle can be monitored by the SAFplus Platform.&lt;br /&gt;
# Use the manageability features provided by the SAFplus Platform.&lt;br /&gt;
# Integrate it with the AMF so that the application becomes highly available.&lt;br /&gt;
&lt;br /&gt;
====Significance of Eonization====&lt;br /&gt;
&lt;br /&gt;
The two most common software entities which are provided and managed (rather primitively) by many operating systems are '''processes''' and the '''threads'''. In most systems, processes are isolated from each other, whereas threads share same address space and hence error/failure in one of the threads can lead to errors/failures in other threads also.&lt;br /&gt;
 &lt;br /&gt;
In UNIX, the interaction between the OS and a process is passive. The OS starts up the process, sets up its environment and executes its main function. This enables the process to execute without any direct interference from the OS. It can either enter into an infinite loop or choose to intermittently request for services from the OS. Since the OS is unaware of the process' internals, it reacts only when it receives service requests from the process. The only mechanism for pro-actively sending information to the process is using signals. &lt;br /&gt;
&lt;br /&gt;
But this model of OS to process communication is insufficient for middleware systems in carrier grade system, where the OS needs more fine grained control over the processes it creates and manages them over time. So we have two possible approaches in as far as the OS to process communication models are concerned in carrier grade system :&lt;br /&gt;
* Write an OS from scratch, which will periodically invoke specific set of callbacks in the context of processes that it creates, to manage the component. or&lt;br /&gt;
* Create a wrapper over a normal application and make the application register some callbacks when initializing, which is called by the SAFplus Platform middleware to manage the application. This approach requires some work from applications side like providing those callbacks and registering them etc.&lt;br /&gt;
&lt;br /&gt;
The OpenClovis SAFplus Platform follows the second approach and this process of &amp;quot;wrapping the component and it registering the callbacks which will be invoked by the middleware&amp;quot; is called '''Eonization'''. So the life cycle of a typical application will be :&lt;br /&gt;
* Register the callbacks with the SAFplus Platform.&lt;br /&gt;
* The callbacks will be invoked asynchronously by the SAFplus Platform, to manage the application.&lt;br /&gt;
&lt;br /&gt;
The above model is similar to the life cycle of an X window client application, which registers set of callbacks to be invoked whenever there is a key press event or button press event etc. and the X server asynchronously invoking the corresponding callback in the context of the X window client application.&lt;br /&gt;
&lt;br /&gt;
It is important to realize that this eonization provided by the OpenClovis EO infrastructure is much more general than one required to support programming models such as SAF programming model. Not only does it support AMF managing the component through invoking callbacks for a particular component, it allows any component to invoke callbacks provided by any other component, thus allowing for a much more powerful and generic programming model.&lt;br /&gt;
&lt;br /&gt;
===Steps involved in developing application components===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;[[File:OpenClovis_Note.png]]Using the OpenClovis IDE to build a model and generate the corresponding code automates the steps outlined in this section. For more information regarding the OpenClovis IDE see the ''OpenClovis Sample Application Tutorial'' and the ''OpenClovis IDE User Guide''. &lt;br /&gt;
* [[#Step 1: Defining the Skeleton of a Component | Step 1: Defining the Skeleton of a Component]] &amp;lt;br&amp;gt;Define the skeleton of a component and describe its lifecycle functions and interface functions. Assign a unique IOC communication port to the component that identifies the execution object.&lt;br /&gt;
* [[#Step 2: Defining clEoBasicLibs | Step 2: Defining &amp;lt;code&amp;gt;clEoBasicLibs&amp;lt;/code&amp;gt;]] &amp;lt;br&amp;gt;Define the set of OpenClovis SAFplus Platform libraries required by the component.&lt;br /&gt;
* [[#Step 3: Initializing the CPM Library | Step 3: Initializing the CPM Library]] &amp;lt;br&amp;gt;Initialize the CPM client library. &lt;br /&gt;
* [[#Step 4: Registering the CPM | Step 4: Registering the CPM]] &amp;lt;br&amp;gt;Register the component with CPM infrastructure.&lt;br /&gt;
* [[#Step 5: Un-registering the CPM Library | Step 5: Un-registering the CPM Library]] &amp;lt;br&amp;gt;Un-register the application from CPM Infrastructure, on exit of the application.&lt;br /&gt;
* [[#Step 6: Finalizing the CPM Library | Step 6: Finalizing the CPM Library]] &amp;lt;br&amp;gt;Finalize the CPM client library when the component exits.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Step 1: Defining the Skeleton of a Component&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
'''Step 1: Defining the Skeleton of a Component'''&lt;br /&gt;
&lt;br /&gt;
Using OpenClovis IDE, define a structure with the name as  &amp;lt;code&amp;gt;'''clEoConfig'''&amp;lt;/code&amp;gt; with the following fields initialized appropriately:&lt;br /&gt;
* Component lifecycle management parameters&lt;br /&gt;
* Number of worker threads&lt;br /&gt;
* Unique communication port Id associated with the component for communication within the SAFplus Platform infrastructure.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# define COMP_EO_NUM_THREAD 3&lt;br /&gt;
# define COMP_IOC_PORT 0&lt;br /&gt;
&lt;br /&gt;
ClEoConfigT clEoConfig = {&lt;br /&gt;
    COMP_EO_NAME,                 /* EO Name */&lt;br /&gt;
    COMP_EO_THREAD_PRIORITY,      /* EO Thread Priority */&lt;br /&gt;
    COMP_EO_NUM_THREAD,           /* No of EO thread needed */&lt;br /&gt;
    COMP_IOC_PORT,                /* Required IOC Port */&lt;br /&gt;
    COMP_EO_USER_CLIENT_ID,       /* Client table ID*/&lt;br /&gt;
    COMP_EO_USE_THREAD_MODEL,     /* Whether to use main thread for EO&lt;br /&gt;
                                   * receive or not */&lt;br /&gt;
    clCompAppInitialize,          /* Function callback to initialize the&lt;br /&gt;
                                   * application */&lt;br /&gt;
    clCompAppFinalize,            /* Function callback to terminate the&lt;br /&gt;
                                   * application */&lt;br /&gt;
    clCompAppStateChange,         /* Function callback to change the&lt;br /&gt;
                                   * application state */&lt;br /&gt;
    clCompAppHealthCheck,       /* Function callback to check the&lt;br /&gt;
                                 * application health */&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where,&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;'''COMP_EO_NAME'''&amp;lt;/code&amp;gt; is the name of the component, also called as the Execution Object (EO).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;'''COMP_EO_THREAD_PRIORITY'''&amp;lt;/code&amp;gt;  is the priority of the EO thread.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;'''COMP_EO_NUM_THREAD'''&amp;lt;/code&amp;gt; is the count of worker threads for RMD message processing. This must be greater than or equal to 1. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;'''COMP_IOC_PORT'''&amp;lt;/code&amp;gt;  is the unique IOC communication port associated with every component.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;'''COMP_EO_USER_CLIENT_ID'''&amp;lt;/code&amp;gt; is the maximum number of clients that can exist for a given component. The default value that can be used for this is &amp;lt;code&amp;gt;COMP_EO_USER_CLIENT_ID_START&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;'''COMP_EO_USE_THREAD_MODEL'''&amp;lt;/code&amp;gt; indicates whether the application should block the main thread or not.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;'''clCompAppInitialize'''&amp;lt;/code&amp;gt; is invoked by the OpenClovis SAFplus Platform infrastructure when an eonized application is started. It is similar to the main() function of a typical C program. The application should do all its application specific initialization in this function. For SA-aware components, after the application has done its initialization, it informs AMF that it is ready to provide services using &amp;lt;code&amp;gt;clCpmComponentRegister&amp;lt;/code&amp;gt; API. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;'''clCompAppFinalize'''&amp;lt;/code&amp;gt; is being deprecated and must be NULL.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;'''clCompAppStateChange'''&amp;lt;/code&amp;gt; is called whenever the application state needs to be changed to  &amp;lt;code&amp;gt;SUSPEND&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;RESUME&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;'''clCompAppHealthCheck'''&amp;lt;/code&amp;gt; is called periodically by Component Manager to check the health of an eonized application, if the heart beating is enabled. In response to this callback, the application is supposed to check if it is in a state of providing service and if so provide appropriate feedback to CPM saying so.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{internal-begin}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id='Illustration of the usage of application type'&amp;gt;&amp;lt;/span&amp;gt;[[File:SDK_UsageofApplicationType_70.png|frame|center| '''Illustration of the usage of application type''' ]]&lt;br /&gt;
&lt;br /&gt;
{{internal-end}}&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Note.png]]The application must consider the following while defining the  &amp;lt;code&amp;gt;'''clEoConfig'''&amp;lt;/code&amp;gt; structure:&lt;br /&gt;
* If you select  &amp;lt;code&amp;gt;'''COMP_EO_USE_THREAD_MODEL'''&amp;lt;/code&amp;gt;  as  &amp;lt;code&amp;gt;'''CL_EO_USE_THREAD_FOR_RECV'''&amp;lt;/code&amp;gt;, the main thread  '''must not be'''  blocked in the  &amp;lt;code&amp;gt;'''clCompAppInitialize'''&amp;lt;/code&amp;gt;. It must return after the library is initialized. Later, the main thread will be used for RMD message receive function.&lt;br /&gt;
* If you select  &amp;lt;code&amp;gt;'''COMP_EO_USE_THREAD_MODEL'''&amp;lt;/code&amp;gt; as  &amp;lt;code&amp;gt;'''CL_EO_USE_THREAD_FOR_APP'''&amp;lt;/code&amp;gt;, the main thread  '''must be'''  blocked in the  &amp;lt;code&amp;gt;'''ClEoAppCreateCallbackT'''&amp;lt;/code&amp;gt;  or used by the application. It must return only when the  &amp;lt;code&amp;gt;'''ClCpmTerminateCallbackT'''&amp;lt;/code&amp;gt; is called.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Step 2: Defining clEoBasicLibs&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
'''Step 2: Defining &amp;lt;code&amp;gt;clEoBasicLibs&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
This structure contains the basic OpenClovis SAFplus Platform libraries required by the component. The first six libraries must always be set to  &amp;lt;code&amp;gt;'''CL_TRUE'''&amp;lt;/code&amp;gt; ; the remaining can be made &amp;lt;code&amp;gt; '''CL_TRUE'''&amp;lt;/code&amp;gt; only if the corresponding services are required by the application. If set to  &amp;lt;code&amp;gt;'''CL_TRUE'''&amp;lt;/code&amp;gt;, the corresponding libraries will automatically get initialized during component initialization.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClUint8T clEoBasicLibs[] = {&lt;br /&gt;
    CL_TRUE,      /* OSAL */&lt;br /&gt;
    CL_TRUE,      /* Timer */&lt;br /&gt;
    CL_TRUE,      /* Buffer */&lt;br /&gt;
    CL_TRUE,      /* IOC */&lt;br /&gt;
    CL_TRUE,      /* RMD */&lt;br /&gt;
    CL_TRUE,      /* EO */&lt;br /&gt;
    CL_TRUE,      /* OM */&lt;br /&gt;
    CL_FALSE,     /* HAL */&lt;br /&gt;
    CL_FALSE,     /* DBAL */&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step 2.1: Defining &amp;lt;code&amp;gt;clEoClientLibs&amp;lt;/code&amp;gt;''' &lt;br /&gt;
&lt;br /&gt;
This structure contains a list of client libraries which the components can initialize if they need the corresponding service within the SAFplus Platform infrastructure. All the values in this structure are optional. If set to  &amp;lt;code&amp;gt;'''CL_TRUE'''&amp;lt;/code&amp;gt;, the corresponding libraries will automatically get initialized during component initialization.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClUint8T clEoClientLibs[] = {&lt;br /&gt;
    CL_TRUE,       /* Clovis Object Registry */&lt;br /&gt;
    CL_TRUE,       /* Chassis Manager */&lt;br /&gt;
    CL_TRUE,       /* Name Service*/&lt;br /&gt;
    CL_TRUE,       /* Log Service*/&lt;br /&gt;
    CL_FALSE,      /* Trace Service */&lt;br /&gt;
    CL_FALSE,      /* Diagnostic Manager */&lt;br /&gt;
    CL_TRUE,       /* Transaction Manager */&lt;br /&gt;
    CL_FALSE,      /* NA */&lt;br /&gt;
    CL_TRUE,       /* Provisioning Library*/&lt;br /&gt;
    CL_TRUE,       /* Alarm Manager */&lt;br /&gt;
    CL_TRUE,       /* Debug Service*/&lt;br /&gt;
    CL_FALSE       /* 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;
When this is defined, the application is eonized. During startup, the stubs generated by OpenClovis IDE does all the necessary things as defined in the above structures.&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Note.png]]OpenClovis SAFplus Platform libraries linked to the user application require three structures to be defined, otherwise, it will lead to compilation failure.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Step 3: Initializing the CPM Library&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
'''Step 3: Initializing the CPM Library'''&lt;br /&gt;
&lt;br /&gt;
From  &amp;lt;code&amp;gt;'''clCompAppInitialize'''&amp;lt;/code&amp;gt; callback, you need to initialize the CPM library by calling the  &amp;lt;code&amp;gt;'''clCpmClientInitialize'''&amp;lt;/code&amp;gt;  and provide a structure for callback, defined as  &amp;lt;code&amp;gt;'''ClCpmCallbacksT'''&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;'''clCpmApi.h'''&amp;lt;/code&amp;gt; file.&lt;br /&gt;
* &amp;lt;code&amp;gt;'''ClCpmHealthCheckCallbackT'''&amp;lt;/code&amp;gt; callback: This callback is not implemented by OpenClovis SAFplus Platform for the current release. &lt;br /&gt;
* &amp;lt;code&amp;gt;'''ClCpmTerminateCallbackT'''&amp;lt;/code&amp;gt; callback: This is called when the application requires to be terminated. In this function callback, the application will clean up its acquired resources.&lt;br /&gt;
* &amp;lt;code&amp;gt;'''ClCpmCSISetCallbackT'''&amp;lt;/code&amp;gt; callback: This is called when AMF assigns the workload to the application.  &lt;br /&gt;
* &amp;lt;code&amp;gt;'''ClCpmCSIRmvCallbackT'''&amp;lt;/code&amp;gt; callback: This is called when AMF removes the workload from the application.&lt;br /&gt;
* &amp;lt;code&amp;gt;'''ClCpmProtectionGroupTrackCallbackT'''&amp;lt;/code&amp;gt; callback: This is called when there is a change in the status of the protection group of a particular CSI. The application tracks the status of the CSI using  &amp;lt;code&amp;gt;'''clCpmProtectionGroupTrack'''&amp;lt;/code&amp;gt; API. &lt;br /&gt;
* &amp;lt;code&amp;gt;'''ClCpmProxiedComponentInstantiateCallbackT'''&amp;lt;/code&amp;gt; callback: This is called when the proxy component instantiates one or more of its proxied components. &lt;br /&gt;
* &amp;lt;code&amp;gt;'''ClCpmProxiedComponentCleanupCallbackT'''&amp;lt;/code&amp;gt; callback: This is called when the proxy component clean up one or more of its proxied components.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Step 4: Registering the CPM&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
'''Step 4: Registering the CPM'''&lt;br /&gt;
&lt;br /&gt;
From  &amp;lt;code&amp;gt;'''clCompAppInitialize'''&amp;lt;/code&amp;gt; callback, you need to register the component by invoking  &amp;lt;code&amp;gt;'''clCpmComponentRegister'''&amp;lt;/code&amp;gt; API. The component must be registered only when it is ready to provide the services. After the component is registered, it can either provide some specific service or use the services provided by other components. When AMF decides to terminate the component, it calls the  &amp;lt;code&amp;gt;'''ClCpmTerminateCallbackT'''&amp;lt;/code&amp;gt; callback provided by the application. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Step 5: Un-registering the CPM Library&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
'''Step 5: Un-registering the CPM Library'''&lt;br /&gt;
&lt;br /&gt;
From  &amp;lt;code&amp;gt;'''ClCpmTerminateCallbackT'''&amp;lt;/code&amp;gt; callback, you need to un-register the component by invoking  &amp;lt;code&amp;gt;'''clCpmComponentUnregister'''&amp;lt;/code&amp;gt; API. The component is un-registered when the component is no longer providing the services. You can cleanup all the associated resources.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Step 6: Finalizing the CPM Library&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
'''Step 6: Finalizing the CPM Library'''&lt;br /&gt;
&lt;br /&gt;
From  &amp;lt;code&amp;gt;'''ClCpmTerminateCallbackT'''&amp;lt;/code&amp;gt; callback, you need to finalize CPM library by calling the  &amp;lt;code&amp;gt;'''clCpmClientFinalize'''&amp;lt;/code&amp;gt; API.&lt;br /&gt;
&lt;br /&gt;
===Component Characteristics===&lt;br /&gt;
&lt;br /&gt;
An application component in OpenClovis SAFplus Platform infrastructure has the following characteristics:&lt;br /&gt;
* Each component has an associated lifecycle and registers the initialization and termination functions with OpenClovis SAFplus Platform infrastructure.&lt;br /&gt;
* Each component has a communication port called the IOC port assigned by OpenClovis SAFplus Platform infrastructure to communicate with other components including Event, Checkpoint, Component Manager and so on. IOC manages the IOC port and implements the actual mechanism of sending and receiving messages.&lt;br /&gt;
* Each component installs the services into the function table indexed by the service id through the  &amp;lt;code&amp;gt;'''clEoClientInstall'''&amp;lt;/code&amp;gt; API. This function table is contained in the client table identified by the client id namely, &amp;lt;code&amp;gt;'''CL_EO_NATIVE_COMPONENT_TABLE_ID'''&amp;lt;/code&amp;gt; . To use any service of the component, you must use the RMD number that uniquely identifies the service. &lt;br /&gt;
* Each component is associated with one or more worker threads. Every message intended to be delivered to a component, is set in a queue by IOC on the corresponding port. This message is then picked up by the receiver thread in EO and queued in the EO Job Queue. One of the worker threads picks up the message, decodes the RMD number, and executes the appropriate interface function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id='A Typical Component in OpenClovis SAFplus Platform Environment'&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:SDK_ComponentRealization.png|frame|center| '''A Typical Component in OpenClovis SAFplus Platform Environment''' ]]&lt;br /&gt;
&lt;br /&gt;
Figure [[#A Typical Component in OpenClovis SAFplus Platform Environment | A Typical Component in OpenClovis SAFplus Platform Environment]]  explains the elements of OpenClovis SAFplus Platform component. &lt;br /&gt;
&lt;br /&gt;
OpenClovis SAFplus Platform component comprises the following:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The function  &amp;lt;code&amp;gt;'''cbfn3'''&amp;lt;/code&amp;gt; is a callback function that represents the lifecycle function of the component. The lifecycle functions are registered with distributed infrastructure of OpenClovis SAFplus Platform and helps to initialize, finalize, and check the status of the component. These functions facilitate CPM to manage the lifecycle of the component.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;The functions  &amp;lt;code&amp;gt;'''fn1'''&amp;lt;/code&amp;gt; and  &amp;lt;code&amp;gt;'''fn2'''&amp;lt;/code&amp;gt;  are the component interface functions with a unique identifier. These functions are called the service interface of the component and they represent the services that the components can provide.&lt;br /&gt;
&amp;lt;br&amp;gt;[[File:OpenClovis_Note.png]]The function  &amp;lt;code&amp;gt;'''fn3'''&amp;lt;/code&amp;gt;  is a service interface of the CPM component.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; &amp;lt;code&amp;gt;'''App2'''&amp;lt;/code&amp;gt; can make calls to  &amp;lt;code&amp;gt;'''fn1'''&amp;lt;/code&amp;gt; and  &amp;lt;code&amp;gt;'''fn2'''&amp;lt;/code&amp;gt;, component interface function of  &amp;lt;code&amp;gt;'''App1'''&amp;lt;/code&amp;gt;  using RMD of OpenClovis SAFplus Platform distributed infrastructure. The functions  &amp;lt;code&amp;gt;'''fn1'''&amp;lt;/code&amp;gt; and  &amp;lt;code&amp;gt;'''fn2'''&amp;lt;/code&amp;gt;  are depicted as  &amp;lt;code&amp;gt;'''rfn1'''&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;'''rfn2'''&amp;lt;/code&amp;gt; respectively in Figure [[#A Typical Component in OpenClovis SAFplus Platform Environment | A Typical Component in OpenClovis SAFplus Platform Environment]].&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The CPM server periodically performs a health check on the component and remotely invokes the CPM client service functionality using RMD. This functionality in turn invokes the health check up callback, illustrated as  &amp;lt;code&amp;gt;'''cbfn3'''&amp;lt;/code&amp;gt;  in Figure [[#A Typical Component in OpenClovis SAFplus Platform Environment | A Typical Component in OpenClovis SAFplus Platform Environment]], of the component and returns the status to the CPM server.&lt;br /&gt;
&lt;br /&gt;
===Component Initialization===&lt;br /&gt;
&lt;br /&gt;
OpenClovis SAFplus Platform provides a set of libraries that must be initialized for application manageability, high availability, and pre-defined main function for easy usability.&lt;br /&gt;
&lt;br /&gt;
The following are the consequences when a component application is initialized:&lt;br /&gt;
#It initializes the basic OpenClovis SAFplus Platform libraries to provide operating system or architecture-independent execution context for the component. It also installs the signal handler to handle all the signals that causes the process termination [for example SIGSEGV, SIGFBP, SIGILL, and so on]. Whenever a signal is generated, signal handler receives the stack trace and signal-related information. The stack trace and the signal information are then moved into the shared memory.&lt;br /&gt;
#It creates the communication link. &lt;br /&gt;
#It initializes the client libraries so that the component can use the functionality provided by other components of OpenClovis SAFplus Platform. For example, Event, Provisioning and so on.&lt;br /&gt;
#It passes the control to the initialization callback function provided in the  &amp;lt;code&amp;gt;'''clEoConfig'''&amp;lt;/code&amp;gt; structure, where it can implement the specific functionalities exposed by the application.&lt;br /&gt;
#If the application holds the main thread, the execution continues with the application. Otherwise, after the initialization callback returns, the main thread waits in a loop to accept messages.&lt;br /&gt;
#When OpenClovis SAFplus Platform requires to shutdown a component, based on the policy or during node shutdown,  &amp;lt;code&amp;gt;'''ClCpmTerminateCallbackT'''&amp;lt;/code&amp;gt; callback is invoked, which requires to follow the steps explained above.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id='Component Initialization sequence diagram'&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:SDK_ComponentInitialization.png|frame|center| '''Component Initialization sequence diagram''' ]]&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Note.png]]If you create new threads or tasks, and send messages from the thread context, then  &amp;lt;code&amp;gt;'''clEoMyEoObjectSet()'''&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;'''clEoMyEoIocPortSet()'''&amp;lt;/code&amp;gt; must be in the new thread context to set the environment for communication purpose. If not, every RMD returns a failure.&lt;br /&gt;
&lt;br /&gt;
===Using Availability Management Framework (AMF)===&lt;br /&gt;
&lt;br /&gt;
Applications can be made highly available by providing certain callbacks specific to AMF. AMF requires applications to provide callbacks for lifecycle operations, work assignment operations, and protect group related operations (optional). AMF decides to instantiate and assign workload to a component. The components can be instantiated by calling the &amp;lt;code&amp;gt;'''clCompAppInitialize'''&amp;lt;/code&amp;gt; callback of the component. This callback is an indication to the component to start the process.&lt;br /&gt;
&lt;br /&gt;
After the component completes the start process and is ready to receive the work assignments, it informs the AMF framework by invoking the AMF  &amp;lt;code&amp;gt;'''clCpmComponentRegister'''&amp;lt;/code&amp;gt; API.&lt;br /&gt;
&lt;br /&gt;
Registration process is an indication for AMF that the component have been successfully started and can be assigned work by AMF. On receiving the register callback AMF assigns workload to the component with appropriate high availability state using the CSI set callback API registered in the callback function list using  &amp;lt;code&amp;gt;'''clCpmClientInitialize'''&amp;lt;/code&amp;gt; API. &lt;br /&gt;
&lt;br /&gt;
The CSI set API informs the component that a given CSI (workload) have been assigned to the component. The CSI contains information about the name-value pairs and HA state assigned to the component. The name value pairs are the names and values that a component requires to start serving the workloads. For example, a name-value pair can be a configuration filename and its path or location of checkpointed data. The high availability state is assigned by the AMF to the component, for example, ACTIVE or STANDBY. The ACTIVE HA state is an indication that the component will be active for the given CSI. The STANDBY high availability state indicates that the component must prepare itself to takeover in case of failures of the ACTIVE component. &lt;br /&gt;
&lt;br /&gt;
After receiving the CSI set request, the component informs the AMF framework after it is completes the processing required for serving the CSI. This response is an indication for the AMF that the component has successfully received the CSI request and is ready to serve the CSI. &lt;br /&gt;
&lt;br /&gt;
HA state can have the following values:&lt;br /&gt;
* '''Active''' - This means the component is ready to serve the CSI.&lt;br /&gt;
* '''Standby''' - This means that component is on standby for the CSI.&lt;br /&gt;
* '''Quiescing''' - This means the component must finish the existing operations and must not take any new assignment. After it has completed serving the existing request, it informs the AMF framework by calling &amp;lt;code&amp;gt;'''Quiescing'''&amp;lt;/code&amp;gt; complete API. This is an indication to AMF that the component will not take any new assignment for the CSI and the AMF framework can remove the CSI assignments from this component and send it to other components.&lt;br /&gt;
&lt;br /&gt;
AMF framework can call the CSI remove callback to remove the CSI assignments from the component. Component's response to this API is an indication for AMF to assign the CSI to other component.&lt;br /&gt;
&lt;br /&gt;
AMF also provides API for interested component to track the status of protection group. Protection group comprises all the components that are assigned HA state (Active or Standby) for the CSI. Protection group tracks API allows the interested component to register with the framework indicating the CSI for which it is interested. The AMF framework informs the component whenever there is a change in the protection group by calling the protection group callback.&lt;br /&gt;
&lt;br /&gt;
Proxied components can interact with the AMF framework through a proxy component. Proxy component is an SA-aware component that can communicate with the AMF framework directly. The calls to proxied component pass through the proxy component. All the lifecycle operations, workload operations for proxied component are carried through the proxy component.&lt;br /&gt;
&lt;br /&gt;
===Characteristics of a Sample Application===&lt;br /&gt;
&lt;br /&gt;
The sample application depicts an application to generate Global Sequence Numbers. The following are the characteristics of this component:&lt;br /&gt;
* &amp;lt;code&amp;gt;'''clCompAppInitialize'''&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;'''clCompAppFinalize'''&amp;lt;/code&amp;gt;, and  &amp;lt;code&amp;gt;'''clCompAppStateChange'''&amp;lt;/code&amp;gt;  are the lifecycle related functions.&lt;br /&gt;
* &amp;lt;code&amp;gt;'''clCompAppHealthCheck'''&amp;lt;/code&amp;gt; is the functionality related to High Availability.&lt;br /&gt;
&lt;br /&gt;
===Sample Code for developing an application component===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
---------------------------------------------------------------&lt;br /&gt;
clCompAppMain.h&lt;br /&gt;
---------------------------------------------------------------&lt;br /&gt;
#ifndef CL_COMP_APP_MAIN&lt;br /&gt;
# define CL_COMP_APP_MAIN&lt;br /&gt;
# include &amp;lt;clCompCfg.h&amp;gt;&lt;br /&gt;
# ifndef COMP_NAME&lt;br /&gt;
# error &amp;quot;COMP_NAME is not defined. Bad or missing ./clCompCfg.h&amp;quot;&lt;br /&gt;
# endif&lt;br /&gt;
ClRcT clCompAppTerminate&lt;br /&gt;
			              (ClInvocationT invocation, &lt;br /&gt;
	               const ClNameT *compName);&lt;br /&gt;
ClRcT 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;
ClRcT clCompAppAMFCSIRemove&lt;br /&gt;
               (ClInvocationT invocation, &lt;br /&gt;
	                const ClNameT *compName,&lt;br /&gt;
                const ClNameT *csiName, &lt;br /&gt;
                ClAmsCSIFlagsT csiFlags);&lt;br /&gt;
ClRcT clCompAppInitialize&lt;br /&gt;
	                (ClUint32T argc, &lt;br /&gt;
                 ClCharT *argv[]);&lt;br /&gt;
ClRcT clCompAppFinalize();&lt;br /&gt;
ClRcT clCompAppStateChange&lt;br /&gt;
                (ClEoStateT eoState);&lt;br /&gt;
ClRcT clCompAppHealthCheck&lt;br /&gt;
                (ClEoSchedFeedBackT *schFeedback);&lt;br /&gt;
#endif&lt;br /&gt;
---------------------------------------------------------------&lt;br /&gt;
clCompAppMain.c&lt;br /&gt;
---------------------------------------------------------------&lt;br /&gt;
#include &amp;lt;clCommon.h&amp;gt;&lt;br /&gt;
#include &amp;lt;clOsalApi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;clIocServices.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;clRmdApi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;clDebugApi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;clOmApi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;clOampRtApi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;clProvApi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;clAlarmApi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;clEoApi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;clCpmApi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;clIdlApi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;quot;./clCompAppMain.h&amp;quot;&lt;br /&gt;
#include &amp;quot;clCompA.h&amp;quot;&lt;br /&gt;
#if HAS_EO_SERVICES&lt;br /&gt;
extern ClRcT idlClientInstall(void);&lt;br /&gt;
#endif&lt;br /&gt;
ClCpmHandleT cpmHandle;&lt;br /&gt;
ClRcT clCompAppTerminate(ClInvocationT invocation, const ClNameT *compName)&lt;br /&gt;
{&lt;br /&gt;
    ClRcT rc;&lt;br /&gt;
&lt;br /&gt;
    COMPA_DBG_PRINT((&amp;quot;Inside %s \n&amp;quot;, __FUNCTION__));&lt;br /&gt;
    /*&lt;br /&gt;
     Do the App Finalization &lt;br /&gt;
     */&lt;br /&gt;
    clAppFinalize();&lt;br /&gt;
    COMPA_DBG_PRINT((&amp;quot;Unregister with CPM before Exit .................%s\n&amp;quot;,&lt;br /&gt;
                     compName-&amp;gt;value));&lt;br /&gt;
    rc = clCpmComponentUnregister(cpmHandle, compName, NULL);&lt;br /&gt;
    COMPA_DBG_PRINT((&amp;quot;Finalize before Exit ................. %s\n&amp;quot;,&lt;br /&gt;
                     compName-&amp;gt;value));&lt;br /&gt;
    rc = clCpmClientFinalize(cpmHandle);&lt;br /&gt;
    clCpmResponse(cpmHandle, invocation, CL_OK);&lt;br /&gt;
    return CL_OK;&lt;br /&gt;
}&lt;br /&gt;
ClRcT clCompAppAMFCSISet(ClInvocationT invocation, const ClNameT *compName,&lt;br /&gt;
                         ClAmsHAStateT haState,&lt;br /&gt;
                         ClAmsCSIDescriptorT csiDescriptor)&lt;br /&gt;
{&lt;br /&gt;
    ClRcT rc = CL_OK;&lt;br /&gt;
    COMPA_DBG_PRINT((&amp;quot;Inside Function %s \n&amp;quot;, __FUNCTION__));&lt;br /&gt;
    if (haState == CL_AMS_HA_STATE_QUIESCING)&lt;br /&gt;
    {&lt;br /&gt;
        /*&lt;br /&gt;
         TODO make the quiescing complete call after the work assigned is&lt;br /&gt;
         done &lt;br /&gt;
         */&lt;br /&gt;
        rc = clAppSetQuiescingState(invocation, compName, csiDescriptor);&lt;br /&gt;
        COMPA_DBG_PRINT((&amp;quot;######## before clCpmCSIQuiescingComplete for &amp;quot;&lt;br /&gt;
                         &amp;quot;%s ########\n&amp;quot;, COMP_EO_NAME));&lt;br /&gt;
        clCpmCSIQuiescingComplete(cpmHandle, invocation, rc);&lt;br /&gt;
    }&lt;br /&gt;
    else if (haState == CL_AMS_HA_STATE_ACTIVE)&lt;br /&gt;
    {&lt;br /&gt;
        rc = clAppSetActiveState(invocation, compName, csiDescriptor);&lt;br /&gt;
        COMPA_DBG_PRINT((&amp;quot;######## before clCpmResponse(ACTIVE) for &amp;quot;&lt;br /&gt;
                         &amp;quot;%s########\n&amp;quot;, COMP_EO_NAME));&lt;br /&gt;
        clCpmResponse(cpmHandle, invocation, rc);&lt;br /&gt;
    }&lt;br /&gt;
    else if (haState == CL_AMS_HA_STATE_STANDBY)&lt;br /&gt;
    {&lt;br /&gt;
        rc = clAppSetStandbyState(invocation, compName, csiDescriptor);&lt;br /&gt;
        COMPA_DBG_PRINT((&amp;quot;######## before clCpmResponse(STANDBY) for &amp;quot;&lt;br /&gt;
                         &amp;quot;%s########\n&amp;quot;, COMP_EO_NAME));&lt;br /&gt;
        clCpmResponse(cpmHandle, invocation, rc);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        COMPA_DBG_PRINT((&amp;quot;######## before clCpmResponse(%d) for %s########\n&amp;quot;,&lt;br /&gt;
                         haState, COMP_EO_NAME));&lt;br /&gt;
        clCpmResponse(cpmHandle, invocation, CL_OK);&lt;br /&gt;
    }&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        COMPA_DBG_PRINT((&amp;quot;clCompAppAMFCSISet failed with %d for %s\n&amp;quot;, rc,&lt;br /&gt;
                         COMP_EO_NAME));&lt;br /&gt;
    }&lt;br /&gt;
    return CL_OK;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ClRcT clCompAppAMFCSIRemove(ClInvocationT invocation, const ClNameT *compName,&lt;br /&gt;
                            const ClNameT *csiName, ClAmsCSIFlagsT csiFlags)&lt;br /&gt;
{&lt;br /&gt;
    ClRcT rc = CL_OK;&lt;br /&gt;
    COMPA_DBG_PRINT((&amp;quot;Inside Function %s \n&amp;quot;, __FUNCTION__));&lt;br /&gt;
    /*&lt;br /&gt;
     TODO stop the work assigned before making the response done &lt;br /&gt;
     */&lt;br /&gt;
    rc = clAppCSIRemove(invocation, compName, csiName, csiFlags);&lt;br /&gt;
    clCpmResponse(cpmHandle, invocation, rc);&lt;br /&gt;
    return CL_OK;&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
Service Initialization:&lt;br /&gt;
  1. Initialize your counter and create mutex.&lt;br /&gt;
  2. Register Name and generate Logical Address&lt;br /&gt;
  3 Initialize Checkpoint Service&lt;br /&gt;
*/&lt;br /&gt;
ClRcT clAppInitialize(ClCpmHandleT cpmHandle)&lt;br /&gt;
{&lt;br /&gt;
    ClRcT rc = CL_OK;&lt;br /&gt;
    ClNameSvcRegisterT nameRegInfo = { {0} };&lt;br /&gt;
    ClEoExecutionObjT *pEoObj = NULL;&lt;br /&gt;
    ClNameT compName = { 0 };&lt;br /&gt;
    clLogWrite(CL_LOG_HANDLE_APP,CL_LOG_DEBUG,COMP_A_SERVICE_NAME,&lt;br /&gt;
    CL_COMPA_LOG_0_INIT_ENTER);&lt;br /&gt;
    gAppGlobal.version.releaseCode = 'B';&lt;br /&gt;
    gAppGlobal.version.majorVersion = 0x01;&lt;br /&gt;
    gAppGlobal.version.minorVersion = 0x01;&lt;br /&gt;
    gAppGlobal.ckptName.length = sizeof(CKPT_NAME);&lt;br /&gt;
    strncpy(gAppGlobal.ckptName.value, CKPT_NAME, strlen(CKPT_NAME));&lt;br /&gt;
    gAppGlobal.cpmHandle = cpmHandle;&lt;br /&gt;
    gAppGlobal.ckptHdl = -1;&lt;br /&gt;
    /*&lt;br /&gt;
     counter is initialized here &lt;br /&gt;
     */&lt;br /&gt;
    gAppGlobal.count = 0;&lt;br /&gt;
    rc = clOsalMutexCreate(&amp;amp;gAppGlobal.mutex);&lt;br /&gt;
    if (rc != CL_OK)&lt;br /&gt;
    {&lt;br /&gt;
        COMPA_DBG_PRINT((&amp;quot;Failure in mutex create [0x %x]&amp;quot;, rc));&lt;br /&gt;
        clLogWrite(CL_LOG_HANDLE_APP,CL_LOG_ERROR,COMP_A_SERVICE_NAME,&lt;br /&gt;
                CL_COMPA_LOG_1_MUTEX_CREATE_FAILED, rc);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
    /* register your name with Name Service and get the logical address */&lt;br /&gt;
    rc = clCpmComponentNameGet(gAppGlobal.cpmHandle, &amp;amp;compName);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        COMPA_DBG_PRINT((&amp;quot;Failure in component name get [0x %x]&amp;quot;, rc));&lt;br /&gt;
        clLogWrite(CL_LOG_HANDLE_APP,CL_LOG_ERROR,COMP_A_SERVICE_NAME,&lt;br /&gt;
                CL_COMPA_LOG_1_NAME_GET_FAILED, rc);&lt;br /&gt;
        goto mutexCleanup;&lt;br /&gt;
    }&lt;br /&gt;
    rc = clCpmComponentIdGet(gAppGlobal.cpmHandle, &amp;amp;compName,&lt;br /&gt;
                             &amp;amp;gAppGlobal.compId);&lt;br /&gt;
    if (CL_OK != rc)&lt;br /&gt;
    {&lt;br /&gt;
        COMPA_DBG_PRINT((&amp;quot;Failed to get the component ID  [0x %x]&amp;quot;, rc));&lt;br /&gt;
        clLogWrite(CL_LOG_HANDLE_APP,CL_LOG_ERROR,COMP_A_SERVICE_NAME,&lt;br /&gt;
                CL_COMPA_LOG_1_ID_GET_FAILED, rc);&lt;br /&gt;
        goto mutexCleanup;&lt;br /&gt;
    }&lt;br /&gt;
    nameRegInfo.name.length = strlen(COMP_A_SERVICE_NAME);&lt;br /&gt;
    strcpy(nameRegInfo.name.value, COMP_A_SERVICE_NAME);&lt;br /&gt;
    nameRegInfo.compId = gAppGlobal.compId;&lt;br /&gt;
    nameRegInfo.priority = CL_NS_PRIORITY_HIGH;&lt;br /&gt;
    nameRegInfo.attrCount = 0;&lt;br /&gt;
    gAppGlobal.nameObjRef = CL_NS_GET_OBJ_REF;&lt;br /&gt;
    rc = clNameRegister(gAppGlobal.nameCntxId, &amp;amp;nameRegInfo,&lt;br /&gt;
                        &amp;amp;(gAppGlobal.nameObjRef));&lt;br /&gt;
    if (rc != CL_OK)&lt;br /&gt;
    {&lt;br /&gt;
        COMPA_DBG_PRINT((&amp;quot;Failed to register with name [0x %x]&amp;quot;, rc));&lt;br /&gt;
        clLogWrite(CL_LOG_HANDLE_APP,CL_LOG_ERROR,COMP_A_SERVICE_NAME,&lt;br /&gt;
                CL_COMPA_LOG_1_NAME_REGISTER_FAILED, rc);&lt;br /&gt;
        goto mutexCleanup;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        clLogWrite(CL_LOG_HANDLE_APP,CL_LOG_DEBUG,COMP_A_SERVICE_NAME,               &lt;br /&gt;
                   CL_COMPA_LOG_0_NAME_REGISTERED);&lt;br /&gt;
    }&lt;br /&gt;
    /*&lt;br /&gt;
     Initialize the Checkpoint Service &lt;br /&gt;
     */&lt;br /&gt;
    rc = clCkptInitialize(&amp;amp;gAppGlobal.ckptSvcHdl, NULL, &amp;amp;gAppGlobal.version);&lt;br /&gt;
    if (rc != CL_OK)&lt;br /&gt;
    {&lt;br /&gt;
        COMPA_DBG_PRINT((&amp;quot;Failed in checkpoint initialize rc [0x %x]&amp;quot;, rc));&lt;br /&gt;
        clLogWrite(CL_LOG_HANDLE_APP,CL_LOG_ERROR,COMP_A_SERVICE_NAME,&lt;br /&gt;
                CL_COMPA_LOG_1_CKPT_INIT_FAILED, rc);&lt;br /&gt;
        goto nameCleanup;&lt;br /&gt;
    }&lt;br /&gt;
    rc = clEoMyEoObjectGet(&amp;amp;pEoObj);&lt;br /&gt;
    if (rc != CL_OK)&lt;br /&gt;
    {&lt;br /&gt;
        COMPA_DBG_PRINT((&amp;quot;Failed to get the EoObject rc [0x %x]&amp;quot;, rc));&lt;br /&gt;
        goto ckptCleanup;&lt;br /&gt;
    }&lt;br /&gt;
    gAppGlobal.pEoObj = pEoObj;&lt;br /&gt;
    rc = compADebugRegister(gAppGlobal.pEoObj);&lt;br /&gt;
    if (rc != CL_OK)&lt;br /&gt;
    {&lt;br /&gt;
        COMPA_DBG_PRINT((&amp;quot;Failed to register with debug rc[0x %x]&amp;quot;, rc));&lt;br /&gt;
        goto ckptCleanup;&lt;br /&gt;
    }&lt;br /&gt;
    COMPA_DBG_PRINT((&amp;quot;Sucessfully completed initialization\n&amp;quot;));&lt;br /&gt;
    clLogWrite(CL_LOG_HANDLE_APP,CL_LOG_DEBUG,COMP_A_SERVICE_NAME,&lt;br /&gt;
            CL_COMPA_LOG_0_INIT_DONE, rc);&lt;br /&gt;
    return CL_OK;&lt;br /&gt;
  ckptCleanup:&lt;br /&gt;
    clCkptFinalize(gAppGlobal.ckptSvcHdl);&lt;br /&gt;
  nameCleanup:&lt;br /&gt;
    clNameComponentDeregister(gAppGlobal.compId);&lt;br /&gt;
  mutexCleanup:&lt;br /&gt;
    clOsalMutexDelete(gAppGlobal.mutex);&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
ClRcT clCompAppInitialize(ClUint32T argc, ClCharT *argv[])&lt;br /&gt;
{&lt;br /&gt;
    ClNameT appName;&lt;br /&gt;
    ClCpmCallbacksT callbacks;&lt;br /&gt;
    ClVersionT version;&lt;br /&gt;
    ClIocPortT iocPort;&lt;br /&gt;
    ClRcT rc = CL_OK;&lt;br /&gt;
    /*&lt;br /&gt;
     Do the App intialization &lt;br /&gt;
    */&lt;br /&gt;
    /*&lt;br /&gt;
     Do the CPM client init/Register &lt;br /&gt;
    */&lt;br /&gt;
    version.releaseCode = 'B';&lt;br /&gt;
    version.majorVersion = 01;&lt;br /&gt;
    version.minorVersion = 01;&lt;br /&gt;
    callbacks.appHealthCheck = NULL;&lt;br /&gt;
    callbacks.appTerminate = clCompAppTerminate;&lt;br /&gt;
    callbacks.appCSISet = clCompAppAMFCSISet;&lt;br /&gt;
    callbacks.appCSIRmv = clCompAppAMFCSIRemove;&lt;br /&gt;
    callbacks.appProtectionGroupTrack = NULL;&lt;br /&gt;
    callbacks.appProxiedComponentInstantiate = NULL;&lt;br /&gt;
    callbacks.appProxiedComponentCleanup = NULL;&lt;br /&gt;
    clEoMyEoIocPortGet(&amp;amp;iocPort);&lt;br /&gt;
    COMPA_DBG_PRINT((&amp;quot;Application Address 0x%x Port %x\n&amp;quot;,&lt;br /&gt;
                     clIocLocalAddressGet(), iocPort));&lt;br /&gt;
    rc = clCpmClientInitialize(&amp;amp;cpmHandle, &amp;amp;callbacks, &amp;amp;version);&lt;br /&gt;
    COMPA_DBG_PRINT((&amp;quot;After clCpmClientInitialize %d\t %x\n&amp;quot;, cpmHandle, rc));&lt;br /&gt;
#if HAS_EO_SERVICES&lt;br /&gt;
    idlClientInstall();&lt;br /&gt;
#endif&lt;br /&gt;
    /*&lt;br /&gt;
     Block and use the main thread if required other wise return &lt;br /&gt;
     */&lt;br /&gt;
    /*&lt;br /&gt;
     TODO: Application code should come here&lt;br /&gt;
     */&lt;br /&gt;
    clAppInitialize(cpmHandle);&lt;br /&gt;
    /*&lt;br /&gt;
     if main thread usage policy == CL_EO_USE_THREAD_FOR_APP return from this &lt;br /&gt;
     function only after app finishes&lt;br /&gt;
     */&lt;br /&gt;
    /*&lt;br /&gt;
     if main thread usage policy == CL_EO_USE_THREAD_FOR_RECV return from&lt;br /&gt;
     this function immediately after doing some application initialize stuff&lt;br /&gt;
     */&lt;br /&gt;
    rc = clCpmComponentNameGet(cpmHandle, &amp;amp;appName);&lt;br /&gt;
    COMPA_DBG_PRINT((&amp;quot;After clCpmComponentNameGet %d\t %s\n&amp;quot;, cpmHandle,&lt;br /&gt;
                     appName.value));&lt;br /&gt;
    rc = clCpmComponentRegister(cpmHandle, &amp;amp;appName, NULL);&lt;br /&gt;
    COMPA_DBG_PRINT((&amp;quot;After clCpmClientRegister %x\n&amp;quot;, rc));&lt;br /&gt;
    return CL_OK;&lt;br /&gt;
}&lt;br /&gt;
ClRcT clCompAppFinalize()&lt;br /&gt;
{&lt;br /&gt;
    return CL_OK;&lt;br /&gt;
}&lt;br /&gt;
ClRcT clCompAppStateChange(ClEoStateT eoState)&lt;br /&gt;
{&lt;br /&gt;
    /*&lt;br /&gt;
     Application state change &lt;br /&gt;
    */&lt;br /&gt;
    return CL_OK;&lt;br /&gt;
}&lt;br /&gt;
ClRcT clCompAppHealthCheck(ClEoSchedFeedBackT *schFeedback)&lt;br /&gt;
{&lt;br /&gt;
    /*&lt;br /&gt;
     Modify following as per App requirement&lt;br /&gt;
    */&lt;br /&gt;
    schFeedback-&amp;gt;freq = CL_EO_BUSY_POLL;&lt;br /&gt;
    schFeedback-&amp;gt;status = CL_CPM_EO_ALIVE;&lt;br /&gt;
    return CL_OK;&lt;br /&gt;
}&lt;br /&gt;
ClEoConfigT clEoConfig = {&lt;br /&gt;
    COMP_EO_NAME,               /* EO Name */&lt;br /&gt;
    COMP_EO_THREAD_PRIORITY,    /* EO Thread Priority */&lt;br /&gt;
    COMP_EO_NUM_THREAD,         /* No of EO thread needed */&lt;br /&gt;
    COMP_IOC_PORT,              /* Required Ioc Port */&lt;br /&gt;
    COMP_EO_USER_CLIENT_ID,&lt;br /&gt;
    COMP_EO_USE_THREAD_MODEL,   /* Whether to use main thread for&lt;br /&gt;
                                   eo Recv or not */&lt;br /&gt;
    clCompAppInitialize,        /* Function CallBack to initialize &lt;br /&gt;
                                   the Application */&lt;br /&gt;
    clCompAppFinalize,          /* Function Callback to Terminate &lt;br /&gt;
                                   the Application */&lt;br /&gt;
    clCompAppStateChange,       /* Function Callback to change the&lt;br /&gt;
                                   Application state */&lt;br /&gt;
    clCompAppHealthCheck,       /* Function Callback to change the&lt;br /&gt;
                                   Application state */&lt;br /&gt;
};&lt;br /&gt;
/*&lt;br /&gt;
 You may force default libraries here by using CL_TRUE or CL_FALSE or use&lt;br /&gt;
 appropriate configuration generated by ClovisWorks in ./clCompAppMain.h The &lt;br /&gt;
 first 6 basic libraries are mandatory. &lt;br /&gt;
*/&lt;br /&gt;
ClUint8T clEoBasicLibs[] = {&lt;br /&gt;
    COMP_EO_BASICLIB_OSAL,      /* osal */&lt;br /&gt;
    COMP_EO_BASICLIB_TIMER,     /* timer */&lt;br /&gt;
    COMP_EO_BASICLIB_BUFFER,    /* buffer */&lt;br /&gt;
    COMP_EO_BASICLIB_IOC,       /* ioc */&lt;br /&gt;
    COMP_EO_BASICLIB_RMD,       /* rmd */&lt;br /&gt;
    COMP_EO_BASICLIB_EO,        /* eo */&lt;br /&gt;
    COMP_EO_BASICLIB_OM,        /* om */&lt;br /&gt;
    COMP_EO_BASICLIB_HAL,       /* hal */&lt;br /&gt;
    COMP_EO_BASICLIB_DBAL,      /* dbal */&lt;br /&gt;
};&lt;br /&gt;
ClUint8T clEoClientLibs[] = {&lt;br /&gt;
    COMP_EO_CLIENTLIB_COR,      /* cor */    &lt;br /&gt;
    COMP_EO_CLIENTLIB_CM,       /* cm */&lt;br /&gt;
    COMP_EO_CLIENTLIB_NAME,     /* name */&lt;br /&gt;
    COMP_EO_CLIENTLIB_LOG,      /* log */&lt;br /&gt;
    COMP_EO_CLIENTLIB_TRACE,    /* trace */&lt;br /&gt;
    COMP_EO_CLIENTLIB_DIAG,     /* diag */&lt;br /&gt;
    COMP_EO_CLIENTLIB_TXN,      /* txn */&lt;br /&gt;
    CL_FALSE,                   /* NA */&lt;br /&gt;
    COMP_EO_CLIENTLIB_PROV,     /* Prov */&lt;br /&gt;
    COMP_EO_CLIENTLIB_ALARM,    /* alarm */&lt;br /&gt;
    COMP_EO_CLIENTLIB_DEBUG,    /* debug */&lt;br /&gt;
    COMP_EO_CLIENTLIB_GMS       /* gms */&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
                    #########&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/sdkguide/compconfig</id>
		<title>Doc:latest/sdkguide/compconfig</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/sdkguide/compconfig"/>
				<updated>2010-08-27T03:52:05Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==OpenClovis SAFplus Platform Component Configuration==&lt;br /&gt;
&lt;br /&gt;
Certain Components are allowed to be configured, to provide the flexibility of configuring OpenClovis SAFplus Platform to suit your requirements. OpenClovis SAFplus Platform can be customized and configured to execute on target platforms and support your application software.This chapter provides you the configuration details of OpenClovis SAFplus Platform components. &lt;br /&gt;
&lt;br /&gt;
'''Key Topics:''' &lt;br /&gt;
* [[#Configuring Execution Object (EO) | Configuring Execution Object (EO)]] &lt;br /&gt;
* [[#Configuring Memory | Configuring Memory]] &lt;br /&gt;
* [[#Configuring Remote Method Dispatch (RMD) | Configuring Remote Method Dispatch (RMD)]] &lt;br /&gt;
* [[#Configuring Clovis Object Registry (COR) | Configuring Clovis Object Registry (COR)]] &lt;br /&gt;
* [[#Configuring Log Service | Configuring Log Service]] &lt;br /&gt;
* [[#Configuring Group Membership Service (GMS) | Configuring Group Membership Service (GMS)]] &lt;br /&gt;
* [[#Configuring Name Service | Configuring Name Service]] &lt;br /&gt;
* [[#Configuring Database Abstraction Layer (DBAL) | Database Abstraction Layer (DBAL)]] &lt;br /&gt;
&lt;br /&gt;
===Configuring Execution Object (EO)===&lt;br /&gt;
&lt;br /&gt;
The following parameters are located in &amp;lt;code&amp;gt;'''&amp;lt;project_area&amp;gt;/&amp;lt;model&amp;gt;/src/app/clCompCfg.h '''&amp;lt;/code&amp;gt; file. This file is generated through OpenClovis IDE.&lt;br /&gt;
&lt;br /&gt;
EO comprises the following configurable parameters while declaring the &amp;lt;code&amp;gt;clEoConfigT&amp;lt;/code&amp;gt; structure: &lt;br /&gt;
&amp;lt;br&amp;gt;'''COMP_EO_NAME''' &lt;br /&gt;
&lt;br /&gt;
This attribute defines the name of the EO.&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Format - To configure this parameter, set EO &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; field of the &amp;lt;code&amp;gt;ClEoConfigT&amp;lt;/code&amp;gt; to the name of the EO.&lt;br /&gt;
&amp;lt;br&amp;gt;For example,&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ClEoConfigT clEoConfig;&lt;br /&gt;
clEoConfig.name = &amp;quot;UserEO&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Range - You can provide any string as the EO name that can be up to  &amp;lt;code&amp;gt;CL_EO_MAX_NAME_LEN&amp;lt;/code&amp;gt; characters long.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''COMP_EO_THREAD_PRIORITY''' &lt;br /&gt;
&lt;br /&gt;
This attribute defines the EO thread priority.&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Format - To configure this parameter, &amp;lt;code&amp;gt;pri&amp;lt;/code&amp;gt; field of the &amp;lt;code&amp;gt;ClEoConfigT&amp;lt;/code&amp;gt; to the required priority.&lt;br /&gt;
&amp;lt;br&amp;gt;For example,&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
clEoConfig.pri = CL_OSAL_THREAD_PRI_MEDIUM &lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Range - You can define the priority to have the following values:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
CL_OSAL_THREAD_PRI_HIGH&lt;br /&gt;
CL_OSAL_THREAD_PRI_MEDIUM&lt;br /&gt;
CL_OSAL_THREAD_PRI_LOW&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Default =  &amp;lt;code&amp;gt;CL_OSAL_THREAD_PRI_MEDIUM&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
[[File:OpenClovis_Note.png]]This parameter must not be modified. This parameter has no affect in the current implementation.&lt;br /&gt;
&lt;br /&gt;
'''COMP_EO_NUM_THREAD''' &lt;br /&gt;
&lt;br /&gt;
This attribute defines the number of EO worker threads.&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Format - To configure this parameter, set &amp;lt;code&amp;gt;noOfThreads&amp;lt;/code&amp;gt; field of the &amp;lt;code&amp;gt;ClEoConfigT&amp;lt;/code&amp;gt; to the required number of RMD threads.&lt;br /&gt;
For example,&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
clEoConfig.noofThreads = 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Range - You can define the values in the following range:&lt;br /&gt;
*Minimum = 2&lt;br /&gt;
*Maximum = 2^32 -1 &lt;br /&gt;
*Default = 2&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''COMP_IOC_PORT''' &lt;br /&gt;
&lt;br /&gt;
This attribute defines the requested IOC communication port.&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Format - To configure this parameter, set &amp;lt;code&amp;gt;reqIocPort&amp;lt;/code&amp;gt; field of the &amp;lt;code&amp;gt;ClEoConfigT&amp;lt;/code&amp;gt; to the required IOC port. If 0 is specified as a port then the new port number is automatically assigned by the IOC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Range - You can define the values in the following range:&lt;br /&gt;
*Minimum = &amp;lt;code&amp;gt;CL_IOC_USER_APP_WELLKNOWN_PORTS_START&amp;lt;/code&amp;gt;&lt;br /&gt;
*Maximum = &amp;lt;code&amp;gt;CL_IOC_USER_APP_WELLKNOWN_PORTS_END&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
If the application wants a communication port well know to other processes in the system and also which will not change on restart of the process, then it should be got as shown below.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
clEoConfig.reqIocPort = CL_IOC_USER_APP_WELLKNOWN_PORTS_START + &lt;br /&gt;
                        &amp;lt;app_specific_unique_number&amp;gt;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the apllication wants the IOC to assign a communication port to it, which can change on every time the process is restarted, then 0 should be passed in &amp;lt;code&amp;gt;reqIocPort&amp;lt;/code&amp;gt; field.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
clEoConfig.reqIocPort = 0;&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;
''' COMP_EO_USER_CLIENT_ID '''&lt;br /&gt;
&lt;br /&gt;
This attribute defines the maximum number of EO clients that are initialized by the EO. This is used to allocate space needed to install the client tables. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Format - To configure this parameter, set &amp;lt;code&amp;gt;maxNoClients&amp;lt;/code&amp;gt; field of the &amp;lt;code&amp;gt;ClEoConfigT&amp;lt;/code&amp;gt; to the required value. The default value  &amp;lt;code&amp;gt;CL_EO_USER_CLIENT_ID_START&amp;lt;/code&amp;gt;  allocates enough space to accommodate the OpenClovis SAFplus Platform services. &lt;br /&gt;
If you want to initialize additional clients, you must specify this parameter as:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
clEoConfig.maxNoClients = CL_EO_USER_CLIENT_ID_START + n&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
where &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; is the number of additional clients.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Range - You can define the values in the following range:&lt;br /&gt;
*Minimum = &amp;lt;code&amp;gt;CL_EO_USER_CLIENT_ID_START&amp;lt;/code&amp;gt;&lt;br /&gt;
*Maximum = 2^32 -1 &lt;br /&gt;
*Default = &amp;lt;code&amp;gt;CL_EO_USER_CLIENT_ID_START&amp;lt;/code&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''' COMP_EO_USE_THREAD_MODEL '''&lt;br /&gt;
&lt;br /&gt;
This attribute defines whether the application needs the main thread or not. For more details on this parameter, refer to Figure [[Doc:Sdkguide/infrastructure#Illustration of the usage of application type|Illustration of the usage of application type]].&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Format - To configure this parameter, set &amp;lt;code&amp;gt;appType&amp;lt;/code&amp;gt; field of the  &amp;lt;code&amp;gt;ClEoConfigT&amp;lt;/code&amp;gt;  to either &amp;lt;code&amp;gt;CL_EO_USE_THREAD_FOR_RECV&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;CL_EO_USE_THREAD_FOR_APP&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;For example,&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
clEoConfig.appType = CL_EO_USE_THREAD_FOR_RECV&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Range - You can define the value of this parameter as either &amp;lt;code&amp;gt;CL_EO_USE_THREAD_FOR_RECV&amp;lt;/code&amp;gt; or  &amp;lt;code&amp;gt;CL_EO_USE_THREAD_FOR_APP&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Configuring Memory===&lt;br /&gt;
&lt;br /&gt;
This section provides information about configuring the memory profiles and specify the total memory space and the watermarks for the total memory consumption for each component instance.&lt;br /&gt;
&lt;br /&gt;
====Heap and Buffer Memory Profiles====&lt;br /&gt;
&lt;br /&gt;
The following are the configurable parameters for heap and buffer memory profiles located in  &amp;lt;code&amp;gt;&amp;lt;project_area&amp;gt;/&amp;lt;model&amp;gt;/src/config/clEoDefinitions.xml&amp;lt;/code&amp;gt; file. This file is generated through OpenClovis IDE.&lt;br /&gt;
&lt;br /&gt;
'''heapConfig name''' &lt;br /&gt;
&lt;br /&gt;
This is the name for the heap memory profile. &lt;br /&gt;
&lt;br /&gt;
'''bufferConfig name''' &lt;br /&gt;
&lt;br /&gt;
This is the name for the buffer memory profile. &lt;br /&gt;
&lt;br /&gt;
'''mode''' &lt;br /&gt;
&lt;br /&gt;
This indicates the type of the heap allocation mode. The values that can be provided are:&lt;br /&gt;
* '''NM''': This is the Native C Mode. In this mode, all requests are served by calling the C library memory allocation interface.&lt;br /&gt;
* '''PAM''': This is the Pre Allocated Mode. It is the OpenClovis provided implementation of the memory management library. A large chunk of the memory is pre-allocated during component initialization. The memory space is divided into pools of diverse memory chunks and serves run-time dynamic memory allocation requests.&lt;br /&gt;
* '''CM''': This is the Custom Mode. You can plug-in customized memory management library calls.&lt;br /&gt;
&lt;br /&gt;
'''lazyMode''' &lt;br /&gt;
&lt;br /&gt;
You can configure the pool in lazy mode for total memory consumption. Set the value to true or false.&lt;br /&gt;
&lt;br /&gt;
When a pool exhausts its current allocation, it can still grow provided the dynamic memory space or the pool upper limit is not reached. It expands or grows by the increment size specified for the pool. In Lazy Mode, the incremented pool does not initialize until an allocation is made from that pool. In normal mode, the incremented pool initializes as soon as it is acquired by the memory management library.&lt;br /&gt;
&lt;br /&gt;
The following parameters can be configured for a heap and buffer memory pools. The values are expressed in bytes.&lt;br /&gt;
* '''chunkSize''' = Maximum size of one allocation from the pool.&lt;br /&gt;
* '''initialSize''' = Initial pool size for this pool.&lt;br /&gt;
* '''incrementSize''' = When the pool usage exceeds the initial size, the pool size grows by the increment size, unless the max limit is already reached or the total dynamic memory space is reached.&lt;br /&gt;
* '''maxSize''' = Maximum pool size for this pool.&lt;br /&gt;
&lt;br /&gt;
====Memory Configuration Profiles====&lt;br /&gt;
&lt;br /&gt;
The following are the configurable parameters for memory configuration profiles located in &amp;lt;code&amp;gt;&amp;lt;project_area&amp;gt;/&amp;lt;model&amp;gt;/src/config/clEoDefinitions.xml&amp;lt;/code&amp;gt;  file. This file is generated through OpenClovis IDE. These parameters are used to set the total memory usage space and the watermarks on the total memory consumption for each component instance.&lt;br /&gt;
&lt;br /&gt;
'''memoryConfig name''' &lt;br /&gt;
&lt;br /&gt;
This is name for the memory profile. &lt;br /&gt;
&lt;br /&gt;
'''processUpperLimit''' &lt;br /&gt;
&lt;br /&gt;
This is the upper limit for the total memory consumption. The value is expressed in bytes. The dynamic memory allocation cannot exceed this limit.&lt;br /&gt;
&lt;br /&gt;
Three levels of watermark are provided high, medium, and low. For each level of watermark, the following attributes can be configured:&lt;br /&gt;
&lt;br /&gt;
* '''lowLimit''' = Memory limit value for downward crossing in percentage.&lt;br /&gt;
* '''highLimit''' = Memory limit value for upward crossing in percentage.&lt;br /&gt;
For each watermark the following set of actions can be set to true or false:&lt;br /&gt;
* '''event enable''' = If the lowLimit value or highLimit value is reached, an event is generated.&lt;br /&gt;
* '''notification enable''' = If the lowLimit value or highLimit value is reached, a notification is generated.&lt;br /&gt;
* '''log enable''' = If the lowLimit value or highLimit value is reached, a log is generated.&lt;br /&gt;
* '''custom enable''' = If the lowLimit value or highLimit value is reached, userdefined custom function is called.&lt;br /&gt;
&lt;br /&gt;
====Assigning Memory Profiles====&lt;br /&gt;
&lt;br /&gt;
Memory profiles are assigned to components in the clEoConfig.xml file located in &amp;lt;code&amp;gt;&amp;lt;project_area&amp;gt;/&amp;lt;model&amp;gt;/src/config/clEoConfig.xml&amp;lt;/code&amp;gt; in the source code or in &amp;lt;code&amp;gt;$(ASP_DIR)/etc&amp;lt;/code&amp;gt; on the target.  This file is generated by the OpenClovis IDE, and so these values are better modified through the IDE.&lt;br /&gt;
&lt;br /&gt;
The file contains one XML tag per component of the following format:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot; align = &amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;eoConfig name=&amp;quot;LOG&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;eoMemConfig heapConfig=&amp;quot;Default&amp;quot; bufferConfig=&amp;quot;Default&amp;quot; memoryConfig=&amp;quot;Default&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;eoIocConfig/&amp;gt;&lt;br /&gt;
&amp;lt;/eoConfig&amp;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;quot;eoConfig&amp;quot; tag delimits all configuration for one component and has one field:&lt;br /&gt;
&lt;br /&gt;
* '''name''': This is the name of the SAFplus Platform component or user application. &lt;br /&gt;
&lt;br /&gt;
The &amp;quot;eoMemConfig&amp;quot; tag specifies memory profiles by name through 3 fields:&lt;br /&gt;
&lt;br /&gt;
* '''heapConfig''': This is the heap memory profile that is assigned to the SAFplus Platform component or user application. &lt;br /&gt;
&lt;br /&gt;
* '''bufferConfig''': This is the buffer memory profile that is assigned to the SAFplus Platform component or user application. &lt;br /&gt;
&lt;br /&gt;
* '''memConfig''': This is the memory configuration profile that is assigned to the SAFplus Platform component or user application.&lt;br /&gt;
&lt;br /&gt;
===Configuring Remote Method Dispatch (RMD)===&lt;br /&gt;
&lt;br /&gt;
RMD comprises only one configurable parameter: &lt;br /&gt;
&lt;br /&gt;
'''gClRmdMaxRetries''' &lt;br /&gt;
&lt;br /&gt;
This parameter allows you to define the default value for maximum number of retries for calling a remote function.&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Format - The constant  &amp;lt;code&amp;gt;gClRmdMaxRetries&amp;lt;/code&amp;gt; must be defined in the &amp;lt;code&amp;gt;clASPCfg.c&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&amp;lt;br&amp;gt;For example:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
#define gClRmdMaxRetries 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Range - You can define the maximum retries in the following range:&lt;br /&gt;
*Minimum = 0&lt;br /&gt;
*Maximum = 2^32-1&lt;br /&gt;
*Default = 8&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Configuring Clovis Object Registry (COR)===&lt;br /&gt;
&lt;br /&gt;
The configuration information for COR is generated by IDE in the &amp;lt;code&amp;gt;clCorConfig.xml&amp;lt;/code&amp;gt; file. There are two configuration parameters for COR. First is the corOHMask and the other one is corSaveOption. Both of these are described below:&lt;br /&gt;
&lt;br /&gt;
====COR object handle Mask (corOHMask)====&lt;br /&gt;
&lt;br /&gt;
This is the COR Object Handle mask used to get the compressed version of the MOID of a MO object. The MOID comprises pairs of &amp;lt;code&amp;gt;{class Id, Instance Id}&amp;lt;/code&amp;gt; traversed from root to the object.&lt;br /&gt;
 &lt;br /&gt;
Storing the MOID for each object can be expensive since class Id and Instance Id both take four bytes each. Looking at the tree hierarchy there can be very few nodes at the top, which may not need full eight bytes of memory space. So, to store the MOID efficiently the MOID is compressed and stored in object handle. By specifying the mask, you will know the maximum number of classes and instances that you have at each level of Instance Tree starting from Root. &lt;br /&gt;
&lt;br /&gt;
The number of entries in the OH mask are always even. It contains pair of values for every level, where first one denotes the maximum number classes at any level and second one denoting the maximum number of instances that can be created for that class at that level. This maximum number in both the cases is calculated by ((2^number) -1 ). Also the number of pairs in the OH mask shows the depth of the object tree allowed for this information model.&lt;br /&gt;
&lt;br /&gt;
Suppose the OH mask is {a, b, c , d}, then we can make out following things from it :&lt;br /&gt;
# There can be only two level of object tree possible from this.&lt;br /&gt;
# At first level there can be (2^a)-1 classes can be created and each class can have (2^b)-1 instances. Similarly for the second level (2^c)-1 classes can be present and each class can have (2^d)-1 instances.&lt;br /&gt;
&lt;br /&gt;
Few important things about OH mask :&lt;br /&gt;
* The number of pairs in the OH mask can go upto only 20 level as the MOID can only access an object tree of depth 20. &lt;br /&gt;
* The total of all the values in the OH mask should not exceed 48. This magic number comes from the number of bits used in the structure ClCorObjectHandleT for storing the object handle. The number of bits  that are used in this structure to store the classId and instance Id information is 48.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Format - Following is an example of &amp;lt;code&amp;gt;corOHMask&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
corOHMask={4, 8, 4, 8, 4, 8, 4, 8}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Here you can tell that at level 0 (The level after root), there can be maximum of (2^4)-1 = 15 classes and (2^ 8)-1 = 255 instances per class. &lt;br /&gt;
&amp;lt;br&amp;gt;[[File:OpenClovis_Note.png]]This parameter should not changed manually as this is generated by the IDE during modeling time. Any manual change should be done at your discretion.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====COR Repository Save Option (corSaveOption)====&lt;br /&gt;
&lt;br /&gt;
This is the COR persistency option. This can take two values :&lt;br /&gt;
* '''CL_COR_DELTA_SAVE''' : which signifies that the all the delta changes in the COR repository during runtime should be persisted. These information will be restored by COR once it is restarted. &lt;br /&gt;
* '''CL_COR_NO_SAVE''' : This option tells COR that the information need not be persisted at runtime nor restored at  restart.&lt;br /&gt;
&lt;br /&gt;
===Configuring Log Service===&lt;br /&gt;
&lt;br /&gt;
The configuration information for Log Service is generated by IDE in the [[clLog.xml]] file. The configuration of log service has been split into three sections. There are as follows.&lt;br /&gt;
* [[#Log service common config parameters|Log service common config parameters]]&lt;br /&gt;
* [[#Log service perennial stream config parameters|Log service perennial stream config parameters]]&lt;br /&gt;
* [[#Log service precreated stream config parameters|Log service precreated stream config parameters]]&lt;br /&gt;
&lt;br /&gt;
An example &amp;lt;code&amp;gt;clLog.xml&amp;lt;/code&amp;gt; file generated by IDE is shown in chapter ''XML Representation of the Model'' of ''OpenClovis IDE User Guide''.&lt;br /&gt;
&lt;br /&gt;
====Log service common config parameters====&lt;br /&gt;
&lt;br /&gt;
These values are specific and common to log services running on the cluster. The following are the configurable parameters of the Log service. &lt;br /&gt;
&lt;br /&gt;
'''maximumStream''': The value of this tag specifies the maximum number of streams can be created at log service which is running on the local node. This number is configurable by the user (developer, tester or system administrator) based on the memory availability of the system.&lt;br /&gt;
&lt;br /&gt;
'''maximumComponents''': The value of this tag specifies the maximum number of components(loggers) can be at the cluster. This number is configurable by the user.&lt;br /&gt;
&lt;br /&gt;
'''maximumSharedMemoryPages''': The value of this tag specifies the maximum number of shared memory should be allocated for new stream. This is basically talking about the size of the shared memory. This should be configurable by keeping mind the size of the record and flush frequency.&lt;br /&gt;
&lt;br /&gt;
'''maximumRecordsInPacket''': The value of this tag specifies the maximum number records can be flushed from log server to the file. At any point of time, these many records will be multicasted by log service to the file owners.&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Note.png]] These above values should not be changed at run time.&lt;br /&gt;
&lt;br /&gt;
====Log service perennial stream config parameters====&lt;br /&gt;
&lt;br /&gt;
When the log server comes up with SAFplus Platform, two default perennial streams will be created and predefined handles will be&lt;br /&gt;
populated. Any SAFplus Platform component/application can use this default streams for logging. These two streams are local streams. &lt;br /&gt;
&lt;br /&gt;
'''fileName''': &lt;br /&gt;
The value of this tag specifies the name of the file should be created for this perennial streams. Any valid file names are configurable by the user. &lt;br /&gt;
&lt;br /&gt;
'''fileLocation''': &lt;br /&gt;
The value of this tag specifies the log file location. Format of this filelocation is &amp;lt;nodname&amp;gt;:&amp;lt;path&amp;gt;, where node name is name of the node instance in which file will be created under the path directory. If path is start with '/'&lt;br /&gt;
then log service treats the path as absolute path, else this file location is prepended with the environment variable  &amp;lt;code&amp;gt;ASP_DIR&amp;lt;/code&amp;gt;. The directory is created by the Log Server if it does not exist. This name is configurable by the user.&lt;br /&gt;
&lt;br /&gt;
* If nodename is '*' &amp;lt;star&amp;gt; , then the file will be created where the system controller active is running. &lt;br /&gt;
* If nodename is '.' &amp;lt;dot&amp;gt;, then the file will be created in the local node.&lt;br /&gt;
&lt;br /&gt;
'''fileUnitSize''': &lt;br /&gt;
The value of this tag specifies the size of the log file in bytes. When the file size is reached its specified limit, the given file full action will be applied on the file. &lt;br /&gt;
&lt;br /&gt;
'''record size''':&lt;br /&gt;
The value of this tag specifies the size of the record (single log message) in bytes.&lt;br /&gt;
&lt;br /&gt;
'''fileFullAction''':&lt;br /&gt;
The value of this tag specifies the action should be taken when the file reaches its specified limit. It can take one of the following values&lt;br /&gt;
* HALT&lt;br /&gt;
* WRAP&lt;br /&gt;
* ROTATE&lt;br /&gt;
&lt;br /&gt;
'''maximumFilesRotated''':&lt;br /&gt;
The value of this tag specifies the maximum number of files will be created, in case the file full action is ROTATE.&lt;br /&gt;
If the file full action is HALT or WRAP, then this value has to be set to 0.&lt;br /&gt;
&lt;br /&gt;
'''flushFreq''': &lt;br /&gt;
The value of the tag specifies number of Log Records after which the Log Stream must be flushed. This is the maximum number of records on a node which are still not persisted at any given point in time. Log Service make best effort to ensure that no more than flushFreq no of records will be lost if a node fails. A value of zero indicates that this field is ignored and Log Records are flushed based on flushInterval. At least one of flushFreq and flushInterval must be non-zero for a Log Stream. &lt;br /&gt;
&lt;br /&gt;
'''flushInterval''':&lt;br /&gt;
The value of the tag specifies time in nanoseconds after which the Log Stream must be flushed. This is the maximum time a Log Records can stay in a Log Stream un-persisted. Log Service guarantees that Log Records generated at least this much time before a node failure will not be lost on a node failure. A value of zero indicates that this field is ignored and Log Records are flushed based on flushFreq. At least one of flushFreq and flushInterval must be non-zero for a Log Stream. This field will be ignored by default. If the user configures lockMode is mutex, then this field will be considered.&lt;br /&gt;
&lt;br /&gt;
====Log service precreated stream config parameters====&lt;br /&gt;
&lt;br /&gt;
When the log server comes up with SAFplus Platform, these given precreated streams will be created and handles will not be known to the user. Any SAFplus Platform component/application can open this stream and use it. If the stream is configured as GLOBAL streams then the same configuration should be available on all the nodes in the cluster.&lt;br /&gt;
&lt;br /&gt;
'''streamName''': This value of the tag specifies the name of the precreated stream. This can be any valid name.&lt;br /&gt;
&lt;br /&gt;
'''streamScope''': This value of the tag specifies the scope of the precreated stream. One of the following varibale will be a valid value for this tag.&lt;br /&gt;
* LOCAL&lt;br /&gt;
* GLOBAL&lt;br /&gt;
&lt;br /&gt;
'''fileName''' : The value of this tag specifies the name of the file should be created for this perennial streams. Any valid file names are configurable by the user. &lt;br /&gt;
&lt;br /&gt;
'''fileLocation''' : The value of this tag specifies the log file location. Format of this filelocation is &amp;lt;nodname&amp;gt;:&amp;lt;path&amp;gt;, where node name is name of the node instance in which file will be created under the path directory. If path is start with '/' then log service treats the path as absolute path, else this file location is prepended with the environment variable  &amp;lt;code&amp;gt;ASP_DIR&amp;lt;/code&amp;gt;. The directory is created by the Log Server if it does not exist. This name is configurable by the user.&lt;br /&gt;
* If nodename is '*' &amp;lt;star&amp;gt; , then the file will be created where the system controller active is running. &lt;br /&gt;
* If nodename is '.' &amp;lt;dot&amp;gt;, then the file will be created in the local node.&lt;br /&gt;
&lt;br /&gt;
'''fileUnitSize''' : The value of this tag specifies the size of the log file in bytes. When the file size is reached its specified limit, the given file full action will be applied on the file. &lt;br /&gt;
&lt;br /&gt;
'''record size''': The value of this tag specifies the size of the record (single log message) in bytes.&lt;br /&gt;
&lt;br /&gt;
'''fileFullAction''': The value of this tag specifies the action should be taken when the file reaches its specified limit. It can take one of the following values&lt;br /&gt;
* HALT&lt;br /&gt;
* WRAP&lt;br /&gt;
* ROTATE&lt;br /&gt;
&lt;br /&gt;
'''maximumFilesRotated''': The value of this tag specifies the maximum number of files will be created, in case the file full action is ROTATE. If the file full action is HALT or WRAP, then this value has to be set to 0.&lt;br /&gt;
&lt;br /&gt;
'''flushFreq''': The value of the tag specifies number of Log Records after which the Log Stream must be flushed. This is the maximum number of records on a node which are still not persisted at any given point in time. Log Service make best effort to ensure that no more than flushFreq no of records will be lost if a node fails. A value of zero indicates that this field is ignored and Log Records are flushed based on flushInterval. At least one of flushFreq and flushInterval must be non-zero for a Log Stream. &lt;br /&gt;
&lt;br /&gt;
'''flushInterval''': The value of the tag specifies time in nanoseconds after which the Log Stream must be flushed. This is the maximum time a Log Records can stay in a Log Stream un-persisted. Log Service guarantees that Log Records generated at least this much time before a node failure will not be lost on a node failure. A value of zero indicates that this field is ignored and Log Records are flushed based on flushFreq. At least one of flushFreq and flushInterval must be non-zero for a Log Stream. This field will be ignored by default. If the user configures lockMode is mutex, then this field will be considered.&lt;br /&gt;
&lt;br /&gt;
===Configuring Group Membership Service (GMS)===&lt;br /&gt;
&lt;br /&gt;
The following parameters are located in &amp;lt;code&amp;gt;&amp;lt;project_area&amp;gt;/&amp;lt;model&amp;gt;/src/config/clGmsConfig.xml&amp;lt;/code&amp;gt; file. &lt;br /&gt;
&lt;br /&gt;
The following are the configurable parameters of GMS service:&lt;br /&gt;
* '''clusterName''': Name of the cluster&lt;br /&gt;
* '''linkName''': Name of the Link to be used. For example, eth0, eth1, eth2 and so on.&lt;br /&gt;
* '''multicastAddress''': Multicast IP address used by GMS to exchange multicast messages with its peer GMS servers.&lt;br /&gt;
* '''multicastPort''': Port on which GMS server binds and listens to the multicast messages from its peer GMS servers&lt;br /&gt;
* '''maxNoOfGroups''': Maximum number of groups to allow in the cluster. Min = 0, Max = 256, Default = 10.&lt;br /&gt;
* '''openAisLoggingOption''': This options controls the log output from OpenAis software used by GMS. This tag can take the value 'file', 'stderr', 'syslog' and 'none'. The default value is 'none'. Note that this option is useful while debugging issues with GMS. Also note that, if the option is 'syslog', then local5 channel is used. So user needs to configure this channel in syslog.conf. And if the option is set to 'file', then a log file with name 'OpenAis.log' is created under &amp;lt;code&amp;gt;$ASP_LOGDIR &amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note 1:''' Please note that the value of multicastAddress and multicastPort parameters should be same across all the nodes in a cluster.&lt;br /&gt;
&lt;br /&gt;
'''Note 2:''' GMS runs on top of IP multicast. It uses the multicast address and the multicast port number specified in the configuration given above and forms a multicast group. This way it knows when a new member joins a group and leaves a group. Please note that multicast has certain dependencies such as the firewall should be disabled on the machine using &amp;quot;iptables -F&amp;quot; command, etc.&lt;br /&gt;
&lt;br /&gt;
===Configuring Name Service===&lt;br /&gt;
&lt;br /&gt;
The following configurable parameters of Name Service are located in &amp;lt;code&amp;gt;&amp;lt;project_area&amp;gt;/&amp;lt;model&amp;gt;/src/config/clASPCfg.c&amp;lt;/code&amp;gt; file. &lt;br /&gt;
&lt;br /&gt;
'''gClnsMaxNoEntries''' &lt;br /&gt;
&lt;br /&gt;
This attribute provides the maximum number of entries that can be registered in a given context.&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Format - The constant &amp;lt;code&amp;gt;gClnsMaxNoEntries&amp;lt;/code&amp;gt; must be defined in the  &amp;lt;code&amp;gt;clASPCfg.c&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&amp;lt;br&amp;gt;For example&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
#define gClnsMaxNoEntries 256 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Range - Default value is 256. You can define any value between integers 1 to 2^32-1&lt;br /&gt;
*Minimum = 1&lt;br /&gt;
*Maximum = 2^32-1&lt;br /&gt;
*Default = 256&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''gClnsMaxNoGlobalContexts''' &lt;br /&gt;
&lt;br /&gt;
This attribute provides the maximum number of user-defined global contexts you can create.&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Format - The constant &amp;lt;code&amp;gt;gClnsMaxNoGlobalContexts&amp;lt;/code&amp;gt; must be defined in the &amp;lt;code&amp;gt;clASPCfg.c&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&amp;lt;br&amp;gt;For example&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
#define gClnsMaxNoGlobalContexts 10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Range - Default value is 10. You can define any value between integers 0 to 2^32-1&lt;br /&gt;
*Minimum = 0&lt;br /&gt;
*Maximum = 2^32-1&lt;br /&gt;
*Default = 10&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''gClnsMaxNoLocalContexts''' &lt;br /&gt;
&lt;br /&gt;
This attribute provides the maximum number of user-defined local contexts that you can create.&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Format - The constant &amp;lt;code&amp;gt;gClnsMaxNoLocalContexts&amp;lt;/code&amp;gt; must be defined in the &amp;lt;code&amp;gt;clASPCfg.c&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&amp;lt;br&amp;gt;For example&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
#define gClnsMaxNoLocalContexts 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Range - Default value is 2. You can define any value between integers 0 to 2^32-1&lt;br /&gt;
*Minimum = 0&lt;br /&gt;
*Maximum = 2^32-1&lt;br /&gt;
*Default = 2&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Configuring Database Abstraction Layer (DBAL)===&lt;br /&gt;
&lt;br /&gt;
The configuration parameters for Dbal is located in &lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;project_area&amp;gt;/&amp;lt;model&amp;gt;/src/config/clDbalConfig.xml&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
The various database engines supported by Dbal are listed in this file. &lt;br /&gt;
These engines are configured within set of &amp;lt;code&amp;gt;&amp;lt;Engine&amp;gt; .. &amp;lt;/Engine&amp;gt;&amp;lt;/code&amp;gt; tags. &lt;br /&gt;
By default the 'SQLite' DB Engine is configured to be used. If the user &lt;br /&gt;
wants to use some other engines, then he needs to comment this engine &lt;br /&gt;
and enable the other.&lt;br /&gt;
&lt;br /&gt;
For eg: by default the IDE generated &amp;lt;code&amp;gt;clDbalConfig.xml&amp;lt;/code&amp;gt; file will look like:&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&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;|clDbalConfig.xml &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  &amp;lt;Dbal&amp;gt;&lt;br /&gt;
     &amp;lt;!--Engine&amp;gt;&lt;br /&gt;
        &amp;lt;FileName&amp;gt;libClGDBM.so&amp;lt;/FileName&amp;gt;&lt;br /&gt;
        &amp;lt;Type&amp;gt;GDBM&amp;lt;/Type&amp;gt;&lt;br /&gt;
     &amp;lt;/Engine--&amp;gt;  &lt;br /&gt;
     &amp;lt;!--Engine&amp;gt;&lt;br /&gt;
        &amp;lt;FileName&amp;gt;libClBerkeleyDB.so&amp;lt;/FileName&amp;gt;&lt;br /&gt;
        &amp;lt;Type&amp;gt;BerkeleyDB&amp;lt;/Type&amp;gt;&lt;br /&gt;
     &amp;lt;/Engine--&amp;gt;&lt;br /&gt;
     &amp;lt;Engine&amp;gt;&lt;br /&gt;
        &amp;lt;FileName&amp;gt;libClSQLiteDB.so&amp;lt;/FileName&amp;gt;&lt;br /&gt;
        &amp;lt;Type&amp;gt;SQLiteDB&amp;lt;/Type&amp;gt;&lt;br /&gt;
     &amp;lt;/Engine&amp;gt;&lt;br /&gt;
  &amp;lt;/Dbal&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If the user needs to use Berkeley DB instead of SQLite, then he has to &lt;br /&gt;
do the change like below:&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&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;|clDbalConfig.xml &lt;br /&gt;
 |-&lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  &amp;lt;Dbal&amp;gt;&lt;br /&gt;
     &amp;lt;!--Engine&amp;gt;&lt;br /&gt;
        &amp;lt;FileName&amp;gt;libClGDBM.so&amp;lt;/FileName&amp;gt;&lt;br /&gt;
        &amp;lt;Type&amp;gt;GDBM&amp;lt;/Type&amp;gt;&lt;br /&gt;
     &amp;lt;/Engine--&amp;gt;  &lt;br /&gt;
     &amp;lt;Engine&amp;gt;&lt;br /&gt;
        &amp;lt;FileName&amp;gt;libClBerkeleyDB.so&amp;lt;/FileName&amp;gt;&lt;br /&gt;
        &amp;lt;Type&amp;gt;BerkeleyDB&amp;lt;/Type&amp;gt;&lt;br /&gt;
     &amp;lt;/Engine&amp;gt;&lt;br /&gt;
     &amp;lt;!--Engine&amp;gt;&lt;br /&gt;
        &amp;lt;FileName&amp;gt;libClSQLiteDB.so&amp;lt;/FileName&amp;gt;&lt;br /&gt;
        &amp;lt;Type&amp;gt;SQLiteDB&amp;lt;/Type&amp;gt;&lt;br /&gt;
     &amp;lt;/Engine--&amp;gt;&lt;br /&gt;
  &amp;lt;/Dbal&amp;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;
'''Usage of environment variable ASP_DB_SYNC :'''&lt;br /&gt;
&lt;br /&gt;
ASP_DB_SYNC environment variable may be used to open all the DBs in synchronous or asynchronous mode depending on its value.&lt;br /&gt;
To open all the DBs in synchronous mode set ASP_DB_SYNC to TRUE and FALSE for asynchronous mode. If this variable is set then&lt;br /&gt;
it overrides the DBAL open flag CL_DB_SYNC (please refer the &amp;lt;i&amp;gt;OpenClovis API Recerence Guide&amp;lt;/i&amp;gt; for usage of CL_DB_SYNC flag).&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/sdkguide/lifecycle</id>
		<title>Doc:latest/sdkguide/lifecycle</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/sdkguide/lifecycle"/>
				<updated>2010-08-27T03:51:12Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=='''Development Lifecycle Topics'''==&lt;br /&gt;
&lt;br /&gt;
This chapter covers some key aspects of using the OpenClovis SDK in the various phases in the system development lifecycle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{internal-begin}}&lt;br /&gt;
&lt;br /&gt;
'''THIS CHAPTER IS WORK IN PROGRESS. THE FOLLOWING TOPICS WILL BE COVERED:'''&lt;br /&gt;
&lt;br /&gt;
'''Key Topics:''' &lt;br /&gt;
* '''Installing the SDK'''&lt;br /&gt;
** link to Installation Guide&lt;br /&gt;
* '''Creating a new Project Area'''&lt;br /&gt;
** link to SDK User Guide (/build#Creating_a_Project_Area)&lt;br /&gt;
* '''Creating a new OpenClovis SAFplus Platform Project'''&lt;br /&gt;
** link to Sample App Tutorial (#Creating_the_Sample_Project) and IDE User Guide (#Creating_OpenClovis_IDE_Project)&lt;br /&gt;
* '''Defining the System Model using the OpenClovis IDE'''&lt;br /&gt;
** link to Sample App Tutorial and IDE User Guide&lt;br /&gt;
* '''Generating the source code skeleton and the run-time configuration files'''&lt;br /&gt;
** link to IDE User Guide (#Generating_Source_Code)&lt;br /&gt;
* '''Refining the System Model and re-generating the files'''&lt;br /&gt;
** link to IDE User Guide (#Generating_Source_Code)&lt;br /&gt;
* '''Working with the generated source code'''&lt;br /&gt;
** link to SDK User Guide (/compdev#Steps_involved_in_developing_application_components)&lt;br /&gt;
* '''Developing green-field applications based on SAFplus'''&lt;br /&gt;
** no document to link to&lt;br /&gt;
* '''Integrating legacy applications with the generated code skeleton'''&lt;br /&gt;
** no document to link to&lt;br /&gt;
* '''Adding diagnostics/debug hooks to access application internals from SAFplus Platform console'''&lt;br /&gt;
** link to SDK User Guide (/debugging)&lt;br /&gt;
* '''Configuring the project for build, including local build or cross-build'''&lt;br /&gt;
** link to IDE User Guide (#Building_the_Project) for UI based&lt;br /&gt;
** link to SDK User Guide (/build#Configuring_and_Building_the_Model) for command line&lt;br /&gt;
* '''Building the binary images'''&lt;br /&gt;
** link to IDE User Guide (#Building_the_Project) for UI based&lt;br /&gt;
** no document to link to for command line configuration&lt;br /&gt;
* '''Building the binary images for a heterogeneous target cluster'''&lt;br /&gt;
** no document to link to&lt;br /&gt;
* '''Cross-building binaries using OpenClovis-provided toolchains'''&lt;br /&gt;
** no document to link to&lt;br /&gt;
* '''Generating new toolchains for Wind River PNE LE based targets'''&lt;br /&gt;
** no document to link to&lt;br /&gt;
* '''Packaging and deploying the binary images to the target nodes'''&lt;br /&gt;
** link to IDE User Guide (#Making_Project_Images) for UI based&lt;br /&gt;
** link to SDK User Guide (/deploy#Deploying_and_Running_OpenClovis_ASP_on_a_Target_System) for command line&lt;br /&gt;
* '''Managing the life-cycle of SAFplus Platform on the target nodes'''&lt;br /&gt;
** no document to link to&lt;br /&gt;
* '''Setting up SAFplus Platform to be started and stopped automatically when the OS boots and shuts down on the target'''&lt;br /&gt;
** no document to link to&lt;br /&gt;
* '''Accessing SAFplus Platform status and vital information on the live targets'''&lt;br /&gt;
** no document to link to (is there a debug CLI or aspinfo user guide?)&lt;br /&gt;
* '''Managing the life-cycle of SAFplus-based components on the targets'''&lt;br /&gt;
** no document to link to&lt;br /&gt;
* '''Collecting and interpreting log files generated from SAFplus Platform on the target, online and offline'''&lt;br /&gt;
** link to Log Tool User Guide&lt;br /&gt;
* '''Connecting to the target from an SNMP browser to access managed object information'''&lt;br /&gt;
** no document to link to&lt;br /&gt;
&lt;br /&gt;
'''AT THIS TIME NOT ALL THE ABOVE INFORMATION IS COVERED IN THIS DOCUMENT YET. WHAT IS COVERED BELOW MAY NOT BE ORGANIZED ACCORDING TO THE LAYOUT OUTLINED ABOVE.'''&lt;br /&gt;
&lt;br /&gt;
{{internal-end}}&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/sdkguide/platform</id>
		<title>Doc:latest/sdkguide/platform</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/sdkguide/platform"/>
				<updated>2010-08-27T03:49:56Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Hardware Platform Support==&lt;br /&gt;
&lt;br /&gt;
The features described in the previous chapters can provide complete service without any assumption on or any special integration with the underlying hardware.&lt;br /&gt;
For example, fault detection and service recovery works without direct tie between SAFplus Platform and the hardware.&lt;br /&gt;
This ensures that SAFplus Platform and SAFplus-based systems are portable across a wide range of hardware, from a cluster of desktop PCs, rack mount servers, to carrier grade, chassis based systems and virtual hosts.&lt;br /&gt;
However, additional communication between the software and the underlying hardware platform can further ''enhance'' some key characteristics of the system.&lt;br /&gt;
&lt;br /&gt;
Modern hardware platforms provide a set of control and monitoring access for the software running on them.&lt;br /&gt;
Such platforms are often referred to as &amp;quot;managed hardware platforms.&amp;quot;&lt;br /&gt;
Tapping into these interfaces can provide additional features or can strengthen the characteristics of existing features of a carrier grade middleware such as SAFplus Platform.&lt;br /&gt;
&lt;br /&gt;
In order to exploit the advantages of managed hardware platforms OpenClovis provides additional Platform Support Packages (PSPs).&lt;br /&gt;
The PSP realizes a direct interface between SAFplus Platform and the underlying hardware platform, using an open, standards-based API, the Hardware Platform Interface (HPI) defined by the Service Availability Forum.&lt;br /&gt;
This solution preserves the hardware agnostic nature of SAFplus Platform.&lt;br /&gt;
&lt;br /&gt;
The specific benefits of the PSP, and its realization are described in this chapter.&lt;br /&gt;
&lt;br /&gt;
===Benefits of the Platform Support Package===&lt;br /&gt;
&lt;br /&gt;
The PSP provides the following additional main benefits compared to running SAFplus Platform on an &amp;quot;unmanaged&amp;quot; hardware platform:&lt;br /&gt;
* Early detection of hardware anomalies and faults can be fed into the HA decision process&lt;br /&gt;
* Service impacting faults can trigger immediate service failover from the impacted hardware. Since these anomalies are often precursors of impending hardware failures, yet the hardware may be still operational, the handling of these events provides a chance to ''gracefully'' fail over the software service, thus minimizing service impact.&lt;br /&gt;
* Minor hardware events (no direct threat to service) can be routed to Fault Manager, which allows customized event handlers to deal with the problem&lt;br /&gt;
* Dependency relationships between various hardware components can be described using dependency tables&lt;br /&gt;
* SAFplus Platform is notified in case of hot-swapping or hot removal of blades, allowing the SAFplus Platform Availability Manager Framework (AMF) to fail over all services from the to-be-removed blade before the blade is powered off&lt;br /&gt;
&lt;br /&gt;
In addition to the above main benefits, a few add-on tools, scripts are also included in the PSP:&lt;br /&gt;
* &amp;lt;code&amp;gt;bladeinfo&amp;lt;/code&amp;gt; utility - this command line program provides an easy access to vital information about the host FRU. When executed on an IPMI-enabled FRU (as part of the OpenClovis SAFplus Platform installation), it can display the following information: IPMI address, logical slot, physical slot, slot type, board/product manufacturer, board/product name, product part number, board/product serial number. This information can be readily used in other scripts to make decisions based on such information. Examples of such use are:&lt;br /&gt;
** Physical slot based IP addresses&lt;br /&gt;
** Blade model based role selection&lt;br /&gt;
** Unique blade identifier based on serial number&lt;br /&gt;
* &amp;lt;code&amp;gt;lifesignal&amp;lt;/code&amp;gt; utility (for AdvancedTCA blades only) - a small program that can control LED 2 on an AdvancedTCA blade to show vital status information about an SAFplus-based node running on the blade. Different color and timing patterns identify different states.&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Note.png]] Both &amp;lt;code&amp;gt;bladeinfo&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;lifesignal&amp;lt;/code&amp;gt; require local IPMI driver on the node. In addition, bladeinfo requires IPMI over RMCP access to the shelf manager in order to determine the physical slot. This requires knowledge of the IP address of the shelf manager card and may also require username and password (depending on the shelf manager's configuration).&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Note.png]] PSPs are available only for commercially licensed version of the OpenClovis SDK, and are not available for a GPL-licensed SDK.&lt;br /&gt;
&lt;br /&gt;
For all supported hardware platforms, OpenClovis conducts a series of integration tests to verify correct operation.&lt;br /&gt;
As there are slight variations in how chassis from different vendors work, sometimes small adjustments are needed in the software.&lt;br /&gt;
At the time of the release of OpenClovis SDK 3.0, a single Platform Support Package, called &amp;quot;OpenClovis Common PSP&amp;quot; contains all such adjustments.&lt;br /&gt;
For the list of hardware platforms supported by the Common PSP, please turn to the ''OpenClovis Release Notes''.&lt;br /&gt;
&lt;br /&gt;
As OpenClovis integrates with additional platforms over time, additional changes/extensions may be packaged into separate, platform specific PSPs.&lt;br /&gt;
&lt;br /&gt;
===How to Work With PSPs===&lt;br /&gt;
&lt;br /&gt;
The following topics are covered here:&lt;br /&gt;
* [[#How to install PSP(s)|How to install PSP(s)]]&lt;br /&gt;
* [[#How to build SAFplus Platform to include platform management|How to build SAFplus Platform to include platform management]]&lt;br /&gt;
* [[#What to expect when running SAFplus Platform on the target|What to expect when running SAFplus Platform on the target]]&lt;br /&gt;
&lt;br /&gt;
====How to install PSP(s)====&lt;br /&gt;
&lt;br /&gt;
As noted above, PSPs are offered only for commercially licensed version of OpenClovis SDK.&lt;br /&gt;
PSPs are packaged separately and need to be installed separately on the development host.&lt;br /&gt;
&lt;br /&gt;
The installation process is as follows:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; (Prerequisite) Complete the OpenClovis SDK installation as directed in the ''OpenClovis Installation Guide''&lt;br /&gt;
&amp;lt;li&amp;gt; Fetch/download the OpenClovis Common PSP (file name is &amp;lt;code&amp;gt;openclovis-sdk-3.0*-psp-common*.tar.gz&amp;lt;/code&amp;gt;) and optionally the MD5 signature file (&amp;lt;code&amp;gt;openclovis-sdk-3.0*-psp-common*.md5&amp;lt;/code&amp;gt;) into an arbitrary directory&lt;br /&gt;
&amp;lt;li&amp;gt; File integrity can be verified by running &amp;lt;code&amp;gt;md5sum&amp;lt;/code&amp;gt; on the .tar.gz file and comparing its output with the content of the .md5 file.&lt;br /&gt;
This step is optional. Example:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
md5sum -c openclovis-sdk-3.0-psp-common.md5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
This should report OK.&lt;br /&gt;
&amp;lt;li&amp;gt; Untar the .tar.gz file by running (example):&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
tar xmf openclovis-sdk-3.0-psp-common.tar.gz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
This will create a subdirectory called &amp;lt;code&amp;gt;openclovis-sdk-3.0-psp-common&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;li&amp;gt; Enter the newly created subdirectory and initiate installation. '''If you installed the OpenClovis SDK as &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;, you will need to install the PSP also as &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;.'''&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cd openclovis-sdk-3.0-psp-common&lt;br /&gt;
./install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Follow the install script directions to complete the installation. The install script will prompt for the SDK installation root directory. By default this will be the place where you last installed SAFplus Platform using the same user account that you are using now. Therefore, in most cases the default can be accepted. Otherwise, please specify the proper location.&lt;br /&gt;
If all went well, the install script will report &amp;lt;code&amp;gt;installation completed&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Additional steps=====&lt;br /&gt;
&lt;br /&gt;
For SAFplus Platform to communicate with the hardware, it needs to be built with using the proper HPI client library for the given hardware platform. The Common PSP supports the following HPI client libraries:&lt;br /&gt;
* Radisys &amp;lt;code&amp;gt;libhcl&amp;lt;/code&amp;gt; (version 1.1 or 1.4.4) used for Radisys Promentum-6000 and 6010 AdvancedTCA chassis&lt;br /&gt;
* OpenHPI daemon and client libraries (version 2.8.0 and above) used for chassis that utilize the Pigeon Point Systems (PPS) Shmm 500 shelf manager module (Sentry). The OpenClovis Common PSP has been tested with both the open source version as well as the PPS-provided commercial version of OpenHPI.&lt;br /&gt;
&lt;br /&gt;
If you intend to use the open-source version of OpenHPI, no additional special installation steps are necessary as it is installed by default during the SDK installation.&lt;br /&gt;
&lt;br /&gt;
If you intend to use Pigeon Point System's OpenHPI package, please follow these steps:&lt;br /&gt;
# Consult with your Pigeon Point Systems representative or your chassis vendor to obtain the source package of Pigeon Point OpenHPI&lt;br /&gt;
# If your target OS is Wind River PNE LE 1.4, please follow the instructions in the SDK Guide, Section &amp;quot;Building SAFplus Platform and SAFplus Platform Based Systems&amp;quot;, Sub-section &amp;quot;Using OpenClovis SDK with Wind River Workbench&amp;quot; to generate a cross-build toolchain which integrates the Pigeon Point OpenHPI.&lt;br /&gt;
# For any other target OS, please contact an OpenClovis field engineer for further support.&lt;br /&gt;
&lt;br /&gt;
If you intend to use the Radisys libhcl client, please follow these steps:&lt;br /&gt;
# Make sure you have the &amp;lt;code&amp;gt;libhcl&amp;lt;/code&amp;gt; software package (named as &amp;lt;code&amp;gt;libhcl-1.4.4.tar.gz&amp;lt;/code&amp;gt; or similar). If you do not have it, consult with your Radisys representative to obtain the package.&lt;br /&gt;
# If your target OS is Wind River PNE LE 1.4, please follow the instructions in the SDK User Guide, Section &amp;quot;Building SAFplus Platform and SAFplus Platform Based Systems&amp;quot;, Sub-section &amp;quot;Using OpenClovis SDK with Wind River Workbench&amp;quot; to generate a cross-build toolchain which integrates the &amp;lt;code&amp;gt;libhcl&amp;lt;/code&amp;gt; library.&lt;br /&gt;
# For any other target OS, please contact an OpenClovis field engineer for further support.&lt;br /&gt;
&lt;br /&gt;
==== How to build SAFplus Platform to include platform management====&lt;br /&gt;
&lt;br /&gt;
The PSP installation by itself does not make subsequent builds to include platform support. When configuring SAFplus Platform, you need to '''explicitly''' request the build to include platform support.&lt;br /&gt;
Once your project is configured to use platform management, all subsequent builds will create and package the additional binaries.&lt;br /&gt;
&lt;br /&gt;
Configuring SAFplus Platform to use platform management can be done either from the IDE or from the command line:&lt;br /&gt;
# From the IDE, use the '''Project &amp;gt; Build Project''' menu to bring up the '''Build Configuration''' dialog, enable &amp;quot;Include Chassis Manager for HPI Access&amp;quot; option and select the proper HPI client library type. Click OK. All subsequent builds will contain platform support. For further details, check the ''OpenClovis IDE User Guide'', Section &amp;quot;Building the Project.&amp;quot;&lt;br /&gt;
# Alternatively, the same can be achieved from the command line. Go to the top level directory of your project area, and re-issue the &amp;lt;code&amp;gt;configure&amp;lt;/code&amp;gt; step, this time with using the &amp;lt;code&amp;gt;--with-cm-build[=mode]&amp;lt;/code&amp;gt; option, where &amp;lt;code&amp;gt;mode&amp;lt;/code&amp;gt; is either &amp;lt;code&amp;gt;openhpi&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;libhcl&amp;lt;/code&amp;gt;. If the mode is omitted, it defaults to openhpi. For more information, check Section [[Doc:sdkguide/build#Building SAFplus Platform and SAFplus-based Systems|Building SAFplus Platform and SAFplus-based Systems]].&lt;br /&gt;
&lt;br /&gt;
Next, during the packaging step you need to specify a few additional information, such as IP address of the shelf manager and (for Pigeon Point based hardware platforms) the user credentials to access the shelf manager.&lt;br /&gt;
This can be done either from the IDE or from the command line:&lt;br /&gt;
# For the IDE based process, check the &amp;quot;Making Project Images&amp;quot; in the ''OpenClovis IDE User Guide''. Please note that for Radisys chassis using the libhcl client library only the shelf manager's IP address needs to be provided, the remaining three fields (Module IP, Username, and Password) should be left blank. For platforms using the openhpi libraries all four fields need to be provided. The last three fields must correspond to a valid user account defined on the shelf manager. The user account must have Administrator privileges. Note: do not use the &amp;quot;openhpi&amp;quot; user account, as that disables the default hot-swap operation of the shelf manager. Once the IDE dialog is properly completed, the IDE will generate/update the &amp;lt;code&amp;gt;target.conf&amp;lt;/code&amp;gt; configuration file under the model's &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; subdirectory and will complete the packaging with the correct information.&lt;br /&gt;
# Alternatively, the same result can be achieved by editing the corresponding four fields in the &amp;lt;code&amp;gt;target.conf&amp;lt;/code&amp;gt; configuration file mentioned above with a text editor. Once the values are specified in target.conf, any subsequent &amp;lt;code&amp;gt;make images&amp;lt;/code&amp;gt; operation will correctly embed this information to the run-time images.&lt;br /&gt;
&lt;br /&gt;
For those who are interested in the details, the &amp;lt;code&amp;gt;make images&amp;lt;/code&amp;gt; step uses the platform management settings from the &amp;lt;code&amp;gt;target.conf&amp;lt;/code&amp;gt; file in two ways:&lt;br /&gt;
* For openhpi based systems, it generates the proper &amp;lt;code&amp;gt;openhpi.conf&amp;lt;/code&amp;gt; file as part of the target image&lt;br /&gt;
* For libhcl based systems, it properly defines the &amp;lt;code&amp;gt;SAHPI_UNSPECIFIED_DOMAIN_ID&amp;lt;/code&amp;gt; environment variable which is used to convey the IP address of the shelf manager to the libhcl client library.&lt;br /&gt;
&lt;br /&gt;
====What to expect when running SAFplus Platform on the target====&lt;br /&gt;
&lt;br /&gt;
The active presence of the Platform Support Package will result in the following new behavior (compared to a system with no PSP):&lt;br /&gt;
* On each system controller node an additional middleware component, the Chassis Manager (CM, processo &amp;lt;code&amp;gt;asp_cm&amp;lt;/code&amp;gt;) will be installed and started when SAFplus Platform starts.&lt;br /&gt;
* The booting time of CM depends on the underlying shelf manager technology. On some shelves the HPI discovery time can take significant amount of time (20-40 seconds). CM will wait till the discovery completes before it send its readiness signal to the availability manager. Consequently the boot time of SAFplus Platform may be longer.&lt;br /&gt;
* A major or critical HPI event on a server FRU (that runs SAFplus Platform) will trigger SAFplus Platform to preventively remove all service assignments from the problematic FRU. In case the HPI event is de-asserted later, the services will be re-assigned to the recovered FRU. (Indirect FRU dependencies can be modeled during design time by extending the FRU dependency table used by CM.)&lt;br /&gt;
* Upon an extraction request event (triggered either by manually opening the ejection latches/levers of an AdvatncedTCA blade or other FRU, or requesting such event via the shelf manager or HPI interface), CM will notify AMF about such event, and AMF will immediately remove the services from the given FRU. In case of redundant setup, the services will be switched over to other FRUs. Then, SAFplus Platform will allow normal OS shutdown to take place. Upon completion of the OS shutdown process, the blade will be powered down as usual, hence reaching the deactivated state, allowing the removal of the FRU. Please note that once the shutdown process is started, closing the latch will not reverse the process: the blade will be inactivated. Once the inactive state is reached, the FRU can be freely removed or it can be re-activated by opening and closing the latches.&lt;br /&gt;
* If a minor HPI event is detected by CM, it will be processed using customized callback functions, if provided. Callback functions can be specific to FRU types and instances. The default behavior is to ignore all minor events.&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/sdkguide/basicinfrastructure</id>
		<title>Doc:latest/sdkguide/basicinfrastructure</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/sdkguide/basicinfrastructure"/>
				<updated>2010-08-27T03:48:10Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=='''Basic Infrastructure'''==&lt;br /&gt;
&lt;br /&gt;
It is well known that the standard C library contains deficiencies in scope, simply because it has not been updated to reflect modern programming needs.  For example, while it does encapsulate standard operating services such as disk and terminal IO, it does not capture operating system services such as threads, and timers.  It also does not provide a standard set of container data structures, like linked lists and hash tables.  Additionally, various operating systems sometimes differ in their support for these newer services; to support multiple operating systems a compatibility layer must be written.  Finally, certain operating system services are not sufficient for modern use or not sufficent for use within a clustered environment -- for example, the standard Unix timer allows only a single timer per process (we allow thousands), and the logging service has only minimal cluster support (we provide a fully cluster-aware logging system).&lt;br /&gt;
&lt;br /&gt;
The Basic Infrastructure addresses these deficiencies by providing libraries that supply additional functionality, address insufficient APIs, and provide a compatibility layer.  Additionally, the Basic Infrastructure handles the operational details of running within the OpenClovis distributed computing environment.  These essential services, memory and data management are used by all the OpenClovis software and utilities. Customer applications are also welcome to use these APIs to take advantage of this infrastructure.&lt;br /&gt;
&lt;br /&gt;
===Components of Basic Infrastructure===&lt;br /&gt;
&lt;br /&gt;
'''Basic Services''':&lt;br /&gt;
* [[#Execution Object (EO) | Execution Object (EO)]] &lt;br /&gt;
* [[#Log Service | Log Service]] &lt;br /&gt;
* [[#Operating System Abstraction Layer (OSAL) | Operating System Abstraction Layer (OSAL)]] &lt;br /&gt;
* [[#Timer Library | Timer Library]] &lt;br /&gt;
* [[#SAFplus Platform Console | SAFplus Platform Console]]&lt;br /&gt;
* [[#Rule-Based Engine (RBE) | Rule-Based Engine (RBE)]] &lt;br /&gt;
&lt;br /&gt;
'''Memory Management''':&lt;br /&gt;
* [[#Containers | Containers]] &lt;br /&gt;
* [[#Circular List | Circular List]] &lt;br /&gt;
* [[#Queue Library | Queue Library]] &lt;br /&gt;
* [[#Buffer Manager Library | Buffer Manager Library]] &lt;br /&gt;
* [[#Heap Memory | Heap Memory]] &lt;br /&gt;
&lt;br /&gt;
'''Data Management''':&lt;br /&gt;
* [[#Database Abstraction Layer (DBAL) | Database Abstraction Layer (DBAL)]] &lt;br /&gt;
&lt;br /&gt;
====Log Service====&lt;br /&gt;
&lt;br /&gt;
SAFplus Platform Log Service provides the facility of recording the information about various events of applications. Any application/SAFplus Platform component in the cluster can use the Log Service to record the information. Log Service persist the information recorded by its clients so that it is available for consumption at later points in time also. The consumer may be an offline consumer, consuming the information at some later point in time, or an online consumer, consuming the information as soon as it is generated. Log Service does not interpret the information recorded by its clients. It treats the information as octet stream and does not apply any semantic meaning to it.&lt;br /&gt;
&lt;br /&gt;
'''Features'''&lt;br /&gt;
 &lt;br /&gt;
* SAFplus/Log service provides high performance, low overhead logging.&lt;br /&gt;
* SAFplus/Log service supports ASCII, binary and Tag-Length-Value (TLV) logging.&lt;br /&gt;
* It provides support for LOCAL/GLOBAL streams.&lt;br /&gt;
* Log-levels can be changed during the operation.&lt;br /&gt;
* Redundancy support during failover and switch over.&lt;br /&gt;
&lt;br /&gt;
=====Logging Types=====&lt;br /&gt;
&lt;br /&gt;
There are three different kind of logging modes are supported by SAFplus/Log Service. They are as follows Binary logging, TLV logging and ASCII logging. During logging message&lt;br /&gt;
msgId field of clLogWriteAsync() API will identify what kind of record is being logged. This msgId is typically an identifier for a string message which the viewer is aware of through off-line mechanism. Rest of the arguments of this function are interpreted by the viewer based on this identifier. By default, SAFplus Platform components log their messages as ASCII logging by using clLog() macro which intern puts the messages into predefined SYS stream using CL_LOG_HANDLE_SYS as handle. &lt;br /&gt;
&lt;br /&gt;
*'''ASCII Logging'''&lt;br /&gt;
There are two ways application can do ASCII logging. The first method is by calling clLogWriteAsync() with msgId field as CL_LOG_MSGID_PRINTF_FMT, the second way is by calling clAppLog() macro.&lt;br /&gt;
  &lt;br /&gt;
*'''Binary Logging'''&lt;br /&gt;
Binary logging should be done through clLogWriteAsync() API with msgId field as CL_LOG_MSGID_BUFFER. &lt;br /&gt;
&lt;br /&gt;
*'''TLV(Tag-Length-Value) Logging'''&lt;br /&gt;
TLV logging should be done through clLogWriteAsync() API with user defined msgIds other than CL_LOG_MSGID_BUFFER and CL_LOG_MSGID_PRINTF_FMT.&lt;br /&gt;
&lt;br /&gt;
=====Log Service Entities=====&lt;br /&gt;
&lt;br /&gt;
*'''Log Record''': One unit of information related to an event. This is an ordered set of information. Log Record has two parts - header and user data. Header contains meta-information regarding the event and data part contains the actual information. All information related to one event is stored as one unit. This unit is known as Log Record. &lt;br /&gt;
&lt;br /&gt;
*'''Log Stream''': Log Records are grouped together based on certain client defined theme. This group is called Log Stream. These Log Streams can be shared by various components of an application or of different applications. The theme and the users of a Log Stream are defined by the application.&lt;br /&gt;
 &lt;br /&gt;
*'''Log File''': One of the destination for Log Stream and persistent store for Log Records. A collection of Log Streams can flow into one Log File for the ease of management of data.&lt;br /&gt;
&lt;br /&gt;
*'''Log Stream Attributes''': Each Log Stream is characterized by a set of attributes. These attributes are specified at the time of creation of the Stream and can not be modified during the lifetime of that Stream. The attributes include the file name and the location of the file where the Stream should be persisted, size of each record in the Log Stream, maximum number of records that can be stored in one physical file, action to be taken when the file becomes full, whether the file has a backup copy and the frequency at which the Log Records must be flushed. These attributes are specified through ClLogStreamAttributesT structure.&lt;br /&gt;
&lt;br /&gt;
*'''GLOBAL Log Stream''': All global streams will have unique name within the cluster with stream scope of CL_LOG_STREAM_GLOBAL. A global stream is accessible throughout the cluster irrespective of where it is created. &lt;br /&gt;
&lt;br /&gt;
*'''LOCAL Log Stream''': All local streams will have unique name within the node with stream scope of CL_LOG_STREAM_LOCAL. A local stream is restricted to local node.&lt;br /&gt;
&lt;br /&gt;
=====Log Record Format=====&lt;br /&gt;
&lt;br /&gt;
SAFplus/Log service follows two different record formats. Those are binary record format&lt;br /&gt;
and ASCII record format. &lt;br /&gt;
&lt;br /&gt;
'''Binary Record Format'''&lt;br /&gt;
&lt;br /&gt;
Binary record format is described as below. &lt;br /&gt;
&lt;br /&gt;
* Byte 0 of Log Record has 3 fields&lt;br /&gt;
** Bit 0 denotes endianess(Bit value 1 denotes little endian)&lt;br /&gt;
** Bit 1 denotes Header extension bit, currently unused&lt;br /&gt;
** Bit 2 - Bit 3 are currently unused&lt;br /&gt;
** Bit 4 - Bit 7 denotes record format version, currently 0&lt;br /&gt;
* Byte 1 denotes severity with which the Log Record is logged&lt;br /&gt;
* Byte 2 - Byte 3 denotes StreamId of Log Stream to which the Log Record belongs&lt;br /&gt;
* Byte 4 - Byte 7 denotes ClientId of the component logging the record&lt;br /&gt;
* Byte 8 - Byte 9 denotes ServiceId of the component logging the record&lt;br /&gt;
* Byte 10 - Byte 17 denotes timestamp of the Log Record&lt;br /&gt;
* Byte 18 - Byte 19 denotes messageId of the message that follows it &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id='Binary Record Format'&amp;gt;&amp;lt;/span&amp;gt;[[File:SDK_logrecord.png|frame|center|'''Binary Record Format''']]&lt;br /&gt;
&lt;br /&gt;
Each log record contains a bit specifying the endianness of the format in which&lt;br /&gt;
the log record is stored. This is the 0th bit of the 0th byte. If the bit is &lt;br /&gt;
set then the log record format is stored in little endian format otherwise on &lt;br /&gt;
big endian.&lt;br /&gt;
&lt;br /&gt;
First Byte that we put in configuration file, filename_&amp;lt;creationTime&amp;gt;.cfg, &lt;br /&gt;
denotes the endianess of machine on which the File Handler is running. &lt;br /&gt;
Again, value of 1 denotes little endian machine.&lt;br /&gt;
&lt;br /&gt;
'''ASCII Record Format'''&lt;br /&gt;
&lt;br /&gt;
The ASCII record format contains only the log message. The content and format&lt;br /&gt;
of the log message is left to the caller. In order to create coherent and&lt;br /&gt;
consistent log records, the caller should define a consistent style and&lt;br /&gt;
insert all desired meta data into each log record. These may include&lt;br /&gt;
timestamp, severity, source process, etc. For convenience, OpenClovis provides&lt;br /&gt;
a macro, clAppLog(), which takes care of consistent formatting by&lt;br /&gt;
automatically inserting the following information into each log record:&lt;br /&gt;
* timestamp&lt;br /&gt;
* node name&lt;br /&gt;
* process pid number&lt;br /&gt;
* program (EO) name&lt;br /&gt;
* message number&lt;br /&gt;
* file name and line number (conditional)&lt;br /&gt;
&lt;br /&gt;
In addition, the following structured information must be provided by the&lt;br /&gt;
user as macro arguments:&lt;br /&gt;
* area name&lt;br /&gt;
* context name&lt;br /&gt;
* severity&lt;br /&gt;
* actual log message&lt;br /&gt;
&lt;br /&gt;
=====Viewing Log Records of Different Types=====&lt;br /&gt;
&lt;br /&gt;
'''ASCII log records'''&lt;br /&gt;
&lt;br /&gt;
To view an ASCII log file simply open them with your favorite editor.&lt;br /&gt;
&lt;br /&gt;
'''Binary log records and TLV(Tag-Length-Value) records'''&lt;br /&gt;
&lt;br /&gt;
To view these two types of records OpenClovis provides following log viewing tools :&lt;br /&gt;
#Online log viewer ('asp_binlogviewer' present in $ASP_BINDIR directory)&lt;br /&gt;
#Offline log viewer ('cl-log-viewer' present in &amp;lt;installation_directory&amp;gt;/sdk-3.0/bin directory)&lt;br /&gt;
&lt;br /&gt;
If the log file contains the log records of TLV type then user need to provide the TLV mapping file which contains user defined message id to actual log message mapping. Following is a sample TLV map file which contains message id to TLV message mapping. TLV File content should be in following format, where &amp;lt;code&amp;gt;&amp;lt;space&amp;gt;&amp;lt;/code&amp;gt; is a single space.:&lt;br /&gt;
&lt;br /&gt;
 Message_ID&amp;lt;space&amp;gt;Message containing %TLV&lt;br /&gt;
&lt;br /&gt;
All the %TLV are replaced by their corresponding values from log record's tag, length, value information for that message id. Following are the sample content of a TLV map file &amp;lt;code&amp;gt;tlvmap.txt&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 5 Component %TLV was unble to start on node %TLV&lt;br /&gt;
 6 State Change: Entity [%TLV] Operational State (%TLV -&amp;gt; %TLV) AMF (%TLV)&lt;br /&gt;
 7 Registering Component %TLV via eoPort %TLV&lt;br /&gt;
 8 Extending %TLV byte pool of %TLV chunkSize&lt;br /&gt;
&lt;br /&gt;
For detailed usage of log view tools, please refer to ''OpenClovis Log Tool User Guide''.&lt;br /&gt;
&lt;br /&gt;
=====Log File and Its Characteristics=====&lt;br /&gt;
&lt;br /&gt;
Multiple Log Streams may be persisted in one Log File. Local and Global streams can be mixed together in one Log File. But, in such a case, all the stream attributes other than flushFreq and flushInterval must be same.&lt;br /&gt;
Log File is a logical concept and it is a collection of physical files. Each such physical file is called a Log File Unit. In case the action on Log File being full is specified as CL_LOG_FILE_FULL_ACTION_HALT or CL_LOG_FILE_FULL_ACTION_WRAP, the Log File consists of only one Log File Unit, whereas if the action is CL_LOG_FILE_FULL_ACTION_ROTATE, one Log File contains multiple Log File Units. Each Log File Unit is of same size specified as fileUnitSize in Log Stream Creation attributes. Maximum number of Log File Units in a Log File is governed by maxFilesRotated attribute of Log Stream. The Log File Unit names follow the following pattern: fileName_&amp;lt;creationTime&amp;gt;, where fileName is a stream attribute and &amp;lt;creationTime&amp;gt; is the wall clock time at which this Log File Unit is created, this time is in ISO 8601 format. One more file per Log File is generated with the name filename_&amp;lt;creationTime&amp;gt;.cfg to store the metadata of Log Streams being persisted in the Log File. This file contains attributes of the Log Streams going in this file and streamId to streamName mapping&lt;br /&gt;
&lt;br /&gt;
=====Log Service Configuration=====&lt;br /&gt;
&lt;br /&gt;
The common log service parameters, and the configuration parameters of the perennial and precreated log streams are described in section [[Doc:sdkguide/compconfig|OpenClovis SAFplus Platform Component Configuration]].&lt;br /&gt;
&lt;br /&gt;
=====Controlling Logging Behavior from the Applications=====&lt;br /&gt;
&lt;br /&gt;
To change the default log level set the environment variable &amp;quot;CL_LOG_SEVERITY&amp;quot; to one of the following values:&lt;br /&gt;
&lt;br /&gt;
* EMERGENCY&lt;br /&gt;
: system is unusable&lt;br /&gt;
* ALERT&lt;br /&gt;
: action must be taken immediately&lt;br /&gt;
* CRITICAL&lt;br /&gt;
: critical conditions&lt;br /&gt;
* ERROR&lt;br /&gt;
: error conditions&lt;br /&gt;
* WARN&lt;br /&gt;
: warning conditions&lt;br /&gt;
* NOTICE&lt;br /&gt;
: normal but significant condition&lt;br /&gt;
* INFO&lt;br /&gt;
: informational messages&lt;br /&gt;
* DEBUG&lt;br /&gt;
: debug-level messages&lt;br /&gt;
* TRACE&lt;br /&gt;
: Information about entering and leaving functions and libraries.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The meaning of each level is the same as the standard syslog levels (RFC 3164), with the addition of TRACE.&lt;br /&gt;
&lt;br /&gt;
A log will be printed if it is more severe or equal in severity to the level set in CL_LOG_SEVERITY.  Additionally, if the log level is set to DEBUG, then all log messages will also contain the file and line number of the statement that generated the log.  If this environment variable is not set, &amp;quot;NOTICE&amp;quot; is used.  Logs that are less severe than NOTICE (INFO, DEBUG, TRACE) may impact system performance. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 export CL_LOG_SEVERITY=DEBUG&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To add or remove time stamps form logs use the 'CL_LOG_TIME_ENABLE' variable.  Time stamps are enabled by default.  Example:&lt;br /&gt;
 export CL_LOG_TIME_ENABLE=0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Info.png]] For further information on the Log Service and its APIs, please refer to the Log Service section of the ''OpenClovis API Reference Guide''.&lt;br /&gt;
&lt;br /&gt;
=====Advanced Filtering Techniques of ASCII Log Files=====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Setting the log level to DEBUG or TRACE can generate too many irrelevant logs to easily debug a problem, and may impact system performance.  To solve this problem a more sophisticated rule based filtering system is available.  To use this system, create a file called &amp;quot;/tmp/logfilter.txt&amp;quot; (located in the /tmp directory so it will not be removed if you delete and redeploy SAFplus Platform).  &lt;br /&gt;
&lt;br /&gt;
This file must contain filter rules, 1 per line.  The format of a rule is as follows:&lt;br /&gt;
(''NodeName'':''ProgramName''.''AreaName''.''ContextName'')[''FileName'']=''Severity''&lt;br /&gt;
&lt;br /&gt;
''NodeName''&lt;br /&gt;
: The name of the node as specified in the IDE (it also is used as the name of the deployment .tgz file) &lt;br /&gt;
&lt;br /&gt;
''ProgramName''&lt;br /&gt;
: The name of the program as specified in the IDE&lt;br /&gt;
&lt;br /&gt;
''AreaName''&lt;br /&gt;
: This arbitrary string is passed as a parameter to the clAppLog function, and is meant to correspond to some aspect of the software organization&lt;br /&gt;
&lt;br /&gt;
''ContextName''&lt;br /&gt;
: This arbitrary string is passed as a parameter to the clAppLog function, and is meant to correspond to the software library&lt;br /&gt;
&lt;br /&gt;
''FileName''&lt;br /&gt;
: The source file that generated the log&lt;br /&gt;
&lt;br /&gt;
''Severity''&lt;br /&gt;
: The log severity (values defined above) to use as the cutoff for all matching logs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note that the asterisk &amp;quot;*&amp;quot; character may be used in any of these fields to match all possibilities.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following is an example of a filter file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
#this file containes set of rules to filter out debug messages&lt;br /&gt;
#while bring up SAFplus Platform. User can add as many rules as they want. &lt;br /&gt;
#Rules will be considered as OR.&lt;br /&gt;
&lt;br /&gt;
#SYNTAX for the follows&lt;br /&gt;
#(NodeName:ServerName.AreaName.ContextName)[fileName]=Severity&lt;br /&gt;
&lt;br /&gt;
#The following are the set of rules. &lt;br /&gt;
&lt;br /&gt;
#For all the messages from SysCtrl0 , set the severity level to ERROR.&lt;br /&gt;
(SysCtrl0:*.*.*)[*]=ERROR&lt;br /&gt;
&lt;br /&gt;
#For all the message from logServer, set the severity level to INFO.&lt;br /&gt;
(*:LOG.*.*)[*]=INFO&lt;br /&gt;
&lt;br /&gt;
#For all the message from ckpt AREA name, set the severity level to NOTICE.&lt;br /&gt;
(*:*.CKP.*)[*]=NOTICE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operating System Abstraction Layer (OSAL)====&lt;br /&gt;
&lt;br /&gt;
The OpenClovis Operating System Abstraction Layer (OSAL) provides a standard interface to commonly used operating system functions. The OSAL layer supports target operating systems like most varieties of Linux. &lt;br /&gt;
&lt;br /&gt;
'''Features''' &lt;br /&gt;
&lt;br /&gt;
* Easily adaptable to any proprietary target operating system.&lt;br /&gt;
&lt;br /&gt;
'''How it works''' &lt;br /&gt;
&lt;br /&gt;
All OpenClovis SAFplus Platform components are developed based on OSAL that provides an OS agnostic function to all system calls, such as process and thread management functions. Internally, OSAL maps such functions to the respective equivalent system calls provided by the underlying OS. This allows OpenClovis SAFplus Platform as well as all OpenClovis SAFplus-based applications to be ported to new operating systems with no modifications.&lt;br /&gt;
&lt;br /&gt;
OpenClovis SAFplus Platform is delivered with a Posix-compliant adaptation module that allows it to operate to any Posix-compliant system, such as Linux and most UNIX systems.&lt;br /&gt;
&lt;br /&gt;
OSAL is currently designed as a standalone library with trivial dependencies on the Util and Debug OpenClovis SAFplus Platform components for debugging and logging.&lt;br /&gt;
&lt;br /&gt;
The full OSAL API documentation is located in the ''OpenClovis API Reference Guide'', included in your SAFplus Platform documentation package.&lt;br /&gt;
&lt;br /&gt;
==== Task Pool and Job Queue====&lt;br /&gt;
&lt;br /&gt;
A Task pool is a manager of a set of threads that provides a simple facility for deferring jobs to tasks in the pool and has the ability to automatically create/delete tasks when needed. Task Pools can be created using clTaskPoolCreate/clTaskPoolRun.  &lt;br /&gt;
&lt;br /&gt;
Taskpool could be stopped with clTaskPoolStop and deleted with clTaskPoolDelete.&lt;br /&gt;
&lt;br /&gt;
Taskpools could be also monitored externally by another guy to check for deadlocks with the job threads with clTaskPoolMonitorStart providing a monitorThreshold and a monitorCallback thats invoked whenever any thread in the taskpool is blocked on a job callback for more than configured threshold. The callback is invoked with the ThreadID, interval at which the thread was blocked and the max. allowed threshold for the task pool configured.&lt;br /&gt;
&lt;br /&gt;
A job queue is a list of &amp;quot;work items&amp;quot; (a function pointer and argument) that is attached to a task pool.  Tasks in the pool automatically consume and execute any jobs that are placed on the queue.  The flexibility and power is increased through clJobQueueInit with a task pool max threads limit (non-zero). Jobs are be pushed through clJobQueuePush API that takes a job handler(function pointer) and a job argument.  This job is then run in the context of a task pool thread.&lt;br /&gt;
&lt;br /&gt;
Job/Taskpool processing could be stalled through clJobQueueQuiesce/clTaskPoolQuiesce and only taskpools could be resumed with clTaskPoolResume. Job queues created are deleted with clJobQueueDelete.&lt;br /&gt;
&lt;br /&gt;
Please see the API documentation for more details.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Timer Library====&lt;br /&gt;
&lt;br /&gt;
The OpenClovis Timer Library enables you to create multiple timers to execute application specific functionality after certain intervals. It performs the following functions:&lt;br /&gt;
* Creates multiple timers.&lt;br /&gt;
* Specifies a time-out value for each timer.&lt;br /&gt;
* Creates one-shot or repetitive timers.&lt;br /&gt;
* Specifies an application specific function that should be executed every time the timer fires or expires.&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Note.png]]The operating systems such as Linux or BSD supports limited number of timers that can be created in an application. However, an application such as OSPF and BGP requires a lot of timers at various points during its execution of the application.&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Info.png]] For further information on the Timer Library and its APIs, please refer to the Timer section of the ''OpenClovis API Reference Guide''.&lt;br /&gt;
&lt;br /&gt;
====SAFplus Platform Console====&lt;br /&gt;
&lt;br /&gt;
The OpenClovis SAFplus Platform Console is a simple command line interface (CLI) that provides diagnostic access to all system components (including OpenClovis SAFplus Platform service components, and eonized customer applications), irrespective of the location (node) where the component runs.  This CLI is designed to assist the application developers and field engineers in testing and debugging applications, and so is also called the &amp;quot;Debug CLI&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The CLI infrastructure routes the commands to the respective component which processes the commands and provides responses to the user.  OpenClovis SAFplus Platform service components provide custom commands so that functionality specific to that service component can be accessed.&lt;br /&gt;
&lt;br /&gt;
'''Features'''&lt;br /&gt;
 &lt;br /&gt;
* Using CLI commands, you can view or manipulate the data managed by OpenClovis SAFplus Platform components. &lt;br /&gt;
* SAFplus Platform Console can be used for eonized customer applications. The framework ensures that the application is accessible from the central CLI server.  Customer applications add custom commands and functionality by &amp;quot;registering&amp;quot; commands and function handlers into the SAFplus Platform Console through APIs defined in the &amp;quot;Debug&amp;quot; library.&lt;br /&gt;
* SAFplus Platform Console allows examination of information stored in the COR database, without the need to write custom handlers.&lt;br /&gt;
* SAFplus Platform Console provides a centralized access to all OpenClovis SAFplus Platform components and eonized applications. Using custom CLI commands a wide variety of services and features can be exposed to the CLI framework, which allows sophisticated, multi-component tests orchestrated through this interface.&lt;br /&gt;
&lt;br /&gt;
Specific information is located in the ''OpenClovis SAFplus Platform Console Reference Guide'' provided with your OpenClovis SDK documentation set.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Rule-Based Engine (RBE)====&lt;br /&gt;
&lt;br /&gt;
The OpenClovis Rule-Based Engine (RBE) provides a mechanism to create rules to be applied to the system instance data, based on simple expressions. &lt;br /&gt;
&lt;br /&gt;
An expression consists of a mask and a value. These expressions are evaluated on user data and generate a Boolean value for the decision process. &lt;br /&gt;
&lt;br /&gt;
For instance, RBE is used by the Event Service to support filter-based subscriptions. The event is published with a pattern that is matched against the filter provided by the subscribers. Only those subscribers that match successfully are notified. The RBE library provides simple bit-based matching based on the flags specified.&lt;br /&gt;
&lt;br /&gt;
====Containers====&lt;br /&gt;
&lt;br /&gt;
The OpenClovis Container Library provides basic data management facilities by means of container abstraction. It provides a common interface for all Container types. &lt;br /&gt;
&lt;br /&gt;
It supports three types of containers listed as follows:&lt;br /&gt;
* Doubly linked list&lt;br /&gt;
* Hashtable (supports open-hashing)&lt;br /&gt;
* Red-Black trees (balanced binary tree)&lt;br /&gt;
&lt;br /&gt;
====Circular List====&lt;br /&gt;
&lt;br /&gt;
The OpenClovis Circular List provides implementation of circular linked list and supports addition, deletion, and retrieval of node and walks through the list. &lt;br /&gt;
&lt;br /&gt;
====Queue Library====&lt;br /&gt;
&lt;br /&gt;
The OpenClovis Queue Library provides implementation for an ordered list. It supports enqueuing, dequeuing, and retrieval of a node and walk through the queue.&lt;br /&gt;
&lt;br /&gt;
====Buffer Manager Library====&lt;br /&gt;
&lt;br /&gt;
The OpenClovis Buffer Manager Library is designed to provide an efficient method of user-space buffer and memory management to increase the performance of communication-intensive OpenClovis SAFplus Platform components and user applications. It contains elastic buffers that expand based on application memory requirement.&lt;br /&gt;
&lt;br /&gt;
====Heap Memory====&lt;br /&gt;
&lt;br /&gt;
Heap memory is used for dynamic memory allocation. Memory is allocated from a large pool of unused memory area called the heap. The size of the memory allocation can be determined at run-time.  The OpenClovis heap memory subsystem allows the components to be configured with allocation limits so that a process with a memory leak will not consume resources needed by other processes.  Additionally allocation alarms can be configured so that the operator can be notified of imminent memory exhaustion and appropriate action be taken.&lt;br /&gt;
&lt;br /&gt;
For information about configuring these limits and alarms see [[Doc:sdk_3.1/sdkguide/compconfig | OpenClovis SAFplus Platform Component Configuration]].&lt;br /&gt;
&lt;br /&gt;
====Database Abstraction Layer (DBAL)====&lt;br /&gt;
&lt;br /&gt;
The OpenClovis Database Abstraction Layer (DBAL) provides a standard interface for any OpenClovis SAFplus Platform infrastructure component or application to interface with databases.&lt;br /&gt;
&lt;br /&gt;
'''Features'''&lt;br /&gt;
&lt;br /&gt;
* DBAL currently supports:&lt;br /&gt;
** the SQLite database&lt;br /&gt;
** the GNU Database Manager (GDBM).&lt;br /&gt;
** the Oracle Berkeley DB&lt;br /&gt;
&lt;br /&gt;
'''How it Works''' &lt;br /&gt;
&lt;br /&gt;
The primary user of this interface is the COR component which can write or read its object repository to and from a database for either persistent storage or offline processing. DBAL is also a standalone library with no dependencies on any other OpenClovis SAFplus Platform components.&lt;br /&gt;
&lt;br /&gt;
For information about selecting a database engine see [[Doc:sdk_3.1/sdkguide/compconfig | Configuring Database Abstraction Layer (DBAL)]].&lt;br /&gt;
&lt;br /&gt;
====Execution Object (EO)====&lt;br /&gt;
&lt;br /&gt;
=====Introduction=====&lt;br /&gt;
&lt;br /&gt;
Before understanding the concept of an execution object, we need to understand the concept of execution entity in general. The execution entity itself is an abstraction model and the execution object is an implementation of that model in the SAFplus Platform environment.&lt;br /&gt;
&lt;br /&gt;
=====Execution Entity=====&lt;br /&gt;
&lt;br /&gt;
An execution entity is a form of a process, a task or a thread that contains a set of data and an execution context. Any form of interaction in a networked environment involves execution entities and so the concept of execution entities is not specific to the carrier grade middleware like OpenClovis SAFplus Platform. However, from pragmatic point of view, the execution entities running in a distributed system like OpenClovis SAFplus Platform environment are not very effective if they do not have the facility of external communication and thereby not capable of interacting with other execution entities. As the execution entities are distributed in nature, they need a common mechanism to facilitate the communication between them. &lt;br /&gt;
&lt;br /&gt;
The execution entity mainly consists of:&lt;br /&gt;
* Attributes and methods to manage the entity. &lt;br /&gt;
* A mechanism to communicate with external execution entities. &lt;br /&gt;
* Implementation of the entity specific to its responsibilities.&lt;br /&gt;
&lt;br /&gt;
=====Execution Object - Execution entity of OpenClovis SAFplus Platform environment=====&lt;br /&gt;
&lt;br /&gt;
OpenClovis Inc. provides the first two functionalities encapsulated within the '''Execution Object (EO)'''. The Execution Object comprises all the common attributes and methods used to represent the execution entity in the system. The communication with the external entities is provided by creating a background thread that receives the messages on behalf of the execution entity. These messages are decoded and the corresponding methods within the execution entity are invoked. Execution Object (EO) encapsulates each distinct SAFplus-aware software component and provides an execution environment for the components. It provides a uniform interface between the software component and the rest of the system components. The interfaces fall into the following two categories:&lt;br /&gt;
* '''Management Interface''': This interface is used to control and configure the software components. &lt;br /&gt;
* '''Service Interface''': This interface allows software components to expose component specific functionalities.&lt;br /&gt;
&lt;br /&gt;
OpenClovis EO infrastructure is the user space client library and the server infrastructure that enables these capabilities. When this infrastructure is linked into an application, it takes over the application's main function and creates communication links back to the middleware, executing application specific state changes at the behest of the middleware. This model requires some help from the application, which must be written to support multiple threads as well as an asynchronous flow.&lt;br /&gt;
&lt;br /&gt;
Both management and service interfaces provided by an EO are exposed using RMD APIs. In fact, the terms &amp;quot;management&amp;quot; and &amp;quot;service&amp;quot; interface are only conventions used to indicate whether the function is exposed or not in the context of a particular EO. For e.g. the service provided by an EO can be a management interface to another EO, if the latter EO manages the first EO. Managing can be as simple as invoking any method in the context of EO in order to carry out some action on EO like for e.g. checking if the EO is capable of providing service. The messages received at the EO are processed by the worker threads which finally invoke the proper functions in the context of the EO.&lt;br /&gt;
&lt;br /&gt;
The application components encapsulated by EO communicate with other components using other OpenClovis communication infrastructure components such as Event Manager (EM), Remote Method Dispatch (RMD), Transparent Inter Process Communication (TIPC), and Name Service.&lt;br /&gt;
&lt;br /&gt;
=====Execution Object - Thread/task pooling=====&lt;br /&gt;
&lt;br /&gt;
Note: OpenClovis uses the terms task and thread interchangeably&lt;br /&gt;
&lt;br /&gt;
We have a taskpool per ioc/tipc priority per EO. The taskpool is attached to a per EO job queue and is configured in code to have taskpools with a thread limit. (This configuration is not allowed as of now through IDE).&lt;br /&gt;
&lt;br /&gt;
Whenever an incoming request comes into EO via ioc/tipc receive, the priority of the header is mapped to the appropriate job queue before getting pushed into that job queue. And then the job is picked up by the taskpool that schedules an idle thread of the taskpool to process the job (or creates a new one if within the limit) and the job handler is then subsequently invoked in the context of the thread.&lt;br /&gt;
&lt;br /&gt;
EO job queues are monitored for blocked threads and will log an entry to our log file whenever a possible deadlock or threadblock is detected.&lt;br /&gt;
&lt;br /&gt;
The taskpool APIs can be used independently by applications.  For more information please see the [[Doc:latest/sdkguide/basicinfrastructure#Task_Pool_and_Job_Queue|Task Pool and Job Queue]] sections under [[Doc:latest/sdkguide/basicinfrastructure | Basic Infrastructure]]&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/sdkguide/cominfrastructure</id>
		<title>Doc:latest/sdkguide/cominfrastructure</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/sdkguide/cominfrastructure"/>
				<updated>2010-08-27T03:47:07Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=='''Communication Infrastructure'''==&lt;br /&gt;
&lt;br /&gt;
Intracluster Communications is a critical element in any tightly coupled distributed system, and is very different from standard TCP client/server communications paradigms.  OpenClovis provides several communications facilities that are used by the SAFplus Platform framework and that should be used by customer software.  OpenClovis provides an abstraction for simple low-latency LAN based direct message passing called IOC, and provides an implementation of the same over TIPC - the standard Linux inter-cluster low-latency communications mechanism.  All OpenClovis services use IOC to communicate with peers except for GMS (Group management) which uses IP multicast.  Therefore, a customer can port the entire SAFplus Platform to another messaging system simply by implementing the IOC interfaces.&lt;br /&gt;
&lt;br /&gt;
These communications services are available on every SAFplus Platform node and are automatically integrated into EO-inized applications.  They allow any component to directly communicate with any other component running on any node and allow components to be identified (addressed) either by location or by an arbitrary name (location transparent addressing).  These &amp;quot;arbitrary names&amp;quot; can be move from component to component as need or failures dictate.  The communications system also automatically provides component and node failure notifications via a heartbeat mechanism.&lt;br /&gt;
&lt;br /&gt;
Higher level communications abstractions and tools such as events, remote procedure calls, and endian translation are also supported.&lt;br /&gt;
&lt;br /&gt;
Components of Communication Infrastructure:&lt;br /&gt;
* [[#Event Service | Event Service]]&lt;br /&gt;
: Publish/Subscribe multipoint communications model.&lt;br /&gt;
* [[#Intelligent Object Communication (IOC)| IOC]]&lt;br /&gt;
: Low level messaging abstraction layer&lt;br /&gt;
* [[#Name Service | Name Service]]&lt;br /&gt;
: Identify nodes via names instead of physical addresses. Names can be transferred between nodes to implement failover.&lt;br /&gt;
* [[#Remote Method Dispatch (RMD)| Remote Method Dispatch (RMD)]]&lt;br /&gt;
: Call functions on other nodes&lt;br /&gt;
* [[#Interface Definition Language (IDL) | Interface Definition Language (IDL)]]&lt;br /&gt;
: Abstract definition language that can be used in mixed-endian environments to allow data do be automatically swapped.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id='FigCommunicationInfrastructure'&amp;gt;&amp;lt;/span&amp;gt;[[File:SDK_ComInfrastructure2.png|center|frame|'''Communication Infrastructure''']]&lt;br /&gt;
&lt;br /&gt;
===Event Service===&lt;br /&gt;
&lt;br /&gt;
====Overview====&lt;br /&gt;
&lt;br /&gt;
The Event Service is a publish/subscribe multipoint-to-multipoint communication mechanism that is based on the concept of event channels, where a publisher communicates asynchronously via with one or more subscribers over a channel. The publishers and subscribers are unaware of each others existence.&lt;br /&gt;
&lt;br /&gt;
====Terms, Definitions====&lt;br /&gt;
&lt;br /&gt;
* '''Event''': Any data that needs to be communicated to interested parties in a system is called an event.  This data typically describes an action that was taken or a problem that was detected.&lt;br /&gt;
* '''Subscribers''': Entities interested in listening to an event&lt;br /&gt;
* '''Publishers''': Entities that generate the event. An entity can be both a publisher and a subscriber&lt;br /&gt;
* '''Event Channel''': A global or local communication channel that allows communication between publishers and subscribers.  By sending events in channels, all events do not need to go to all Subscribers.&lt;br /&gt;
* '''Event Data''': Zero or more bytes of payload associated with an event&lt;br /&gt;
* '''Event Attributes''': The publisher can associate a set of attributes with the each event such as the event pattern, publisher name, publish time, retention time, priority, etc.&lt;br /&gt;
* '''Event Pattern''': The attribute which describes type of an event and categorizes it. This is used for filtering events.&lt;br /&gt;
* '''Event Filter''': The subscribers use filters based on the patterns exposed by the publisher to choose the events of interest, ignoring the rest.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Features====&lt;br /&gt;
&lt;br /&gt;
* SAF compliant implementation&lt;br /&gt;
* The publisher and the subscriber can be:&lt;br /&gt;
** In the same process address space&lt;br /&gt;
** Distributed across multiple processes on the same CPU/board&lt;br /&gt;
** Distributed across multiple processes on various CPU/boards&lt;br /&gt;
* Event Channels can be local or global&lt;br /&gt;
** Local channels for SAFplus Platform node internal events&lt;br /&gt;
** Global channels for SAFplus Platform cluster wide events&lt;br /&gt;
* Multiple subscribers and publishers can open the same channel&lt;br /&gt;
* Events are delivered in strict order of generation&lt;br /&gt;
* Guaranteed delivery&lt;br /&gt;
* At most once delivery&lt;br /&gt;
* Events can have &lt;br /&gt;
** Any payload associated with them&lt;br /&gt;
** Pattern defining the type of the event&lt;br /&gt;
** A specified priority&lt;br /&gt;
** A retention time for which the event is to be held before discarding&lt;br /&gt;
* Events published on a channel can be subscribed to, based on a filter that matches the event pattern&lt;br /&gt;
* Debug support by monitoring and logging&lt;br /&gt;
** Controlled at run time&lt;br /&gt;
&lt;br /&gt;
====Architecture====&lt;br /&gt;
&amp;lt;span id='Event Service Architecture'&amp;gt;&amp;lt;/span&amp;gt;[[File:SDK_EMArchitecture.png|center|frame|'''Event Service Architecture''']]&lt;br /&gt;
&lt;br /&gt;
The Event Service is based on RMD and IOC.  It involves the communication between publishers and subscribers without requiring either side to explicitly &amp;quot;identify&amp;quot; the other side.    That is, the publisher does not need to know who the subscribers are and vice versa.  This is accomplished via an abstraction called an event channel.  All events published to a channel go to all subscribers of the channel.  To handle node specific events efficiently, a channel is categorized as local and global. The local channel is limited to a single node while a global channel spans across the nodes in the cluster.  This feature is an extension to the SA Forum (SAF) event system where there is no such distinction and all channels are inherently global. An event published on a global channel requires a network broadcast while a local event does not use the network and is therefore very efficient.&lt;br /&gt;
&lt;br /&gt;
====Flow====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id='Event Service Flow'&amp;gt;&amp;lt;/span&amp;gt;[[File:SDK_EMFlow.png|center|frame|'''Event Service Flow''']]&lt;br /&gt;
&lt;br /&gt;
To use the Event Service an understanding has to be established between the publisher and the subscriber. The type of the payload that shall be exchanged should be known to both and also if any pattern is used by the publisher it has to be made known to the subscriber.&lt;br /&gt;
&lt;br /&gt;
Both the subscriber and publisher are required to do a Event Client Library initialize to use the Event Service. Both then open the channel, subscriber with the subscriber flag and publisher with publish flag. To both publish and subscribe to a channel, set both flags. This means that the subscriber and publisher can be the same entity.  However, for the purposes of clarity in this description the logical separation of &amp;quot;subscriber&amp;quot; and &amp;quot;publisher&amp;quot; will be maintained.  &lt;br /&gt;
&lt;br /&gt;
The subscriber than subscribes to a particular event using a filter that will match specific event patterns that interests that subscriber. The publisher on the other hand will allocate an event and set it's attributes. It optionally sets the pattern to categorize the event. This pattern is matched against the filter supplied by the subscriber. The publisher then publishes the event on the channel. If channel is global the event is sent to all the event servers on the cluster who in turn deliver the event to any subscribers on that node. If the channel is local the event is delivered to the subscribers who have subscribed to this event locally. The event is delivered only to those subscribers which have an appropriate filter.&lt;br /&gt;
&lt;br /&gt;
For further details on the usage of Event Service kindly refer to the OpenClovis API Reference Guide.&lt;br /&gt;
&lt;br /&gt;
===Transparent Inter Process Communication (TIPC)===&lt;br /&gt;
TIPC provides a good communication infrastructure for a distributed, location transparent, highly available applications. TIPC is a Linux kernel module; it is a part of the standard Linux kernel and is shipped with most of standard distributions of Linux. It supports both reliable and unreliable modes of communications, reliable being desired by most applications (even if the hardware is reliable, buffering issues can make the program-to-program communications unreliable). Since TIPC is a Linux kernel module and works directly over the Ethernet, any communication that uses TIPC will be very fast compared to other protocols. The TIPC kernel module provides a few important features like topology service, signaling link protocol, location transparent addressing. This section describes only the features of TIPC as used by SAFplus Platform, although SAFplus Platform programs are welcome to access the TIPC APIs directly to use other features.  For more details please refer to the tipc project located at http://tipc.sourceforge.net.&lt;br /&gt;
&lt;br /&gt;
From TIPC view point the network is organized into a 5-layer structure.&lt;br /&gt;
&lt;br /&gt;
* TIPC Network : This is the ensemble of all the computers interconnected via TIPC. This is a domain within which any computer can reach any other computer using the TIPC address.&lt;br /&gt;
* TIPC Zone : This is group of clusters is a zone.&lt;br /&gt;
* TIPC Cluster : A group of computers is called a cluster.&lt;br /&gt;
* TIPC Node : A node is a computer.&lt;br /&gt;
* TIPC Slave Node : It is same as a node, but will communicate with only one node in a cluster. This is unlike normal nodes which are connected to all the nodes in the cluster.&lt;br /&gt;
&lt;br /&gt;
TIPC does not use &amp;quot;normal&amp;quot; ethernet MAC addresses or IP addresses.  Instead it uses a &amp;quot;TIPC address&amp;quot; that is formed from these fields.  In general, this complexity is hidden from the SAFplus Platform programmer since addresses are automatically assigned.&lt;br /&gt;
&lt;br /&gt;
====TIPC features====&lt;br /&gt;
The list below describes some features of TIPC:&lt;br /&gt;
* Broadcast.&lt;br /&gt;
* Location Transparent Addressing.&lt;br /&gt;
* Topology Service.&lt;br /&gt;
* Link Level Protocol.&lt;br /&gt;
* Automatic Neighbor Detection.&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
TIPC supports unicast, multicast and broadcast modes of sending a packet. Depending on the intended mode the TIPC address has to be specified. The format of the address looks like (type, lower instance and upper instance).&lt;br /&gt;
* type : This is the port number of a component to which the packet is to be sent to.&lt;br /&gt;
* lower instance : This is the lowest address of the nodes to which the packet should go to.&lt;br /&gt;
* upper instance : It is the highest address of the nodes to which the packet should go to.&lt;br /&gt;
The lower instance and upper instance together form the range of address. If these 2 are same then the packet will be unicasted to that destination node. And if the the range covers all the nodes of a system then it is a broadcast packet and will be sent to all the nodes node in the system.&lt;br /&gt;
&lt;br /&gt;
====Location Transparent Addressing====&lt;br /&gt;
An application can be contacted without having the knowledge of its exact location. This is possible through Location Transparent Addressing. A highly available application in a system while providing service to many of its clients might suddenly go down due to this some kind of failure in the system. And the same application can come up on another node/machine with the same Location transparent address. This way the clients can still reach the server with the same address, which they used to contact previously.&lt;br /&gt;
&lt;br /&gt;
====Topology Service====&lt;br /&gt;
TIPC provides a mechanism of inquiring or subscribing for the availability of a address or range of addresses.&lt;br /&gt;
&lt;br /&gt;
===Intelligent Object Communication (IOC)===&lt;br /&gt;
&lt;br /&gt;
The Intelligent-Object-Communication(IOC) module of SAFplus Platform provides the basic communication infrastructure for an SAFplus Platform enabled system. The IOC is a compatibility layer on top of TIPC that will allow customers to port SAFplus Platform to other architectures.  Therefore, all SAFplus Platform components use the IOC APIs rather than TIPC APIs.  IOC exposes only the most essential TIPC features to make porting simpler.  IOC also abstracts and simplifies some of the legwork required to connect a node into the TIPC network. Customers are encouraged to use the IOC layer (or higher lever abstractions like event and RMD) to ensure portability in their applications, or may use TIPC directly.&lt;br /&gt;
&lt;br /&gt;
====IOC Architecture====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id='IOC Architecture'&amp;gt;&amp;lt;/span&amp;gt;[[File:SDK_IOCArchitecture.png|center|frame|'''IOC Architecture''']]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====IOC Features====&lt;br /&gt;
&lt;br /&gt;
* Reliable and Unreliable mode of communication.&lt;br /&gt;
* Broadcasting of messages.&lt;br /&gt;
* Multicasting of messages.&lt;br /&gt;
* Transparent/Logical Address to a component.&lt;br /&gt;
* An SAFplus Platform node arrival/departure notification.&lt;br /&gt;
* The arrival/departure notification of a component.&lt;br /&gt;
&lt;br /&gt;
=====Reliable and Unreliable mode of communication=====&lt;br /&gt;
The IOC with the help of TIPC allows the applications to create a reliable or an unreliable communication port. All the communication ports are connectionless ports. This helps to achieve a high speed data transfer.  Reliable communications are highly recommended and is the default used by OpenClovis SAFplus Platform.  It should be used even within an environment with extremely low message loss at the hardware level (such as an ATCA chassis) because message loss may also occur in the linux kernel or network switch due to transient spikes in bandwidth utilization.&lt;br /&gt;
&lt;br /&gt;
=====Broadcasting of messages=====&lt;br /&gt;
IOC supports the broadcasting of messages, qualified by destination port number. This means that a broadcast message sent from a component will reach all components on all nodes in the cluster that are listening to the communications port specified in the destination-address field of the message.&lt;br /&gt;
&lt;br /&gt;
=====Multicasting of messages=====&lt;br /&gt;
Multicasting is sending of a message to only a group of components. Any component may join the group by registering itself with IOC for a specific multicast address. Thereafter any message sent to that multicast address will reach all the registered components in the cluster.&lt;br /&gt;
&lt;br /&gt;
=====Location Transparent/Logical Address to a component=====&lt;br /&gt;
Transparent addressing support of IOC makes communication possible for an SAFplus Platform component with another another SAFplus Platform component without knowing the second one's physical address. Location Transparent addressing is commonly used in the case of redundant components that provide a single service.  If the service uses a Location Transparent address, clients do not need to discover what component is currently providing the service; a client simply addresses a message to the Location Transparent Address, and that message is automatically sent to the component that is currently &amp;quot;active&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
On the server side, it is the responsibility of the &amp;quot;active&amp;quot; component of the redundant pair to &amp;quot;register&amp;quot; with IOC for all messages sent to the Location Transparent Address.&lt;br /&gt;
&lt;br /&gt;
=====SAFplus Platform node arrival/departure Notification=====&lt;br /&gt;
In a cluster having many SAFplus Platform nodes in a system, some SAFplus Platform components might be interested in knowing when a node in the cluster arrives and when one leaves. This feature of IOC informs such an event to all the interested SAFplus Platform components in the whole SAFplus Platform system.  Components may use either a query or a callback based interface.&lt;br /&gt;
&lt;br /&gt;
=====The arrival/departure notification of a component=====&lt;br /&gt;
This feature of IOC helps the components which are interested in other components' health status. The IOC with the help of TIPC will come to know about every SAFplus Platform components health in a system and it conveys this to all the interested SAFplus Platform components though a query or callback interface.  Component arrival and departure is actually measured by when the component creates or removes its connection to TIPC, as opposed to when the process is created or deleted.  The OpenClovis EO infrastructure always creates a default connection upon successful initialization, so this measurement is actually more accurate than process monitoring.  A thread is automatically created in each process as part of the EO infrastructure to monitor all other components health status and to handle SAFplus Platform communications.&lt;br /&gt;
&lt;br /&gt;
===Interface Bonding===&lt;br /&gt;
&lt;br /&gt;
Any fully redundant solution requires physical redundancy of network links as well as node redundancy.  This link-level redundancy is particularly important between application peers (i.e. between nodes in the cluster) because if peer communications fail at the ethernet level than it is not possible to distinguish certain link failure modes from node failure modes.  In these cases each peer will assume that the other has failed, leading to a situation where all nodes assume the &amp;quot;active&amp;quot; role.  In the worst case, each &amp;quot;active&amp;quot; node will service requests and so the state on each node will diverge (in practice the nodes tend to interfere with eachother, by both claiming the same IP address for example, resulting in loss of service).  When the link failure is resolved, one of the 2 nodes will revert back to &amp;quot;standby&amp;quot; status, losing all state changes on that node.  The solution to this &amp;quot;catastrophic&amp;quot; failure mode is simply to have link redundancy so that no single failure will cause the system to enter this state.&lt;br /&gt;
&lt;br /&gt;
The simplest link redundancy solution can be implemented at the operating system layer and is called &amp;quot;interface bonding&amp;quot;.  In essence 2 &amp;quot;real&amp;quot; interfaces, say &amp;quot;eth0&amp;quot; and &amp;quot;eth1&amp;quot; are combined to form a single &amp;quot;virtual&amp;quot; interface called &amp;quot;bondN&amp;quot; (or &amp;quot;bond0&amp;quot; in this case) that behaves from the applications' perspective like a single physical interface.  Policies can be chosen as to how to distribute or route network traffic between these 2 interfaces.&lt;br /&gt;
&lt;br /&gt;
The OpenClovis SAFplus Platform can be configured to use a &amp;quot;bonded&amp;quot; interface for its communications in the exact same way as it is configured to use a different &amp;quot;real&amp;quot; interface (see the IDE user guide or XML configuration file formats for more information).  Customers may want to configure their &amp;quot;bonded&amp;quot; interface in different ways based on their particular solution.  Details describing how to enable bonding in operating system and OS distribution specific and is therefore beyond the scope of this document and the OpenClovis SAFplus Platform software.  However a bonding configuration that is considered the &amp;quot;best practice&amp;quot; for use with OpenClovis SAFplus Platform is described in the following sections.&lt;br /&gt;
&lt;br /&gt;
====Configuring the bonding====&lt;br /&gt;
The Interface Bonding is a Linux kernel module. To work with this the kernel should have been compiled with the &amp;quot;Bonding driver support&amp;quot; (for major distributions, this flag is often on by default). For more details on how to install bonding driver module into the kernel please refer to the &amp;quot;bonding.txt&amp;quot; in Linux Documentation's &amp;quot;networking&amp;quot; section.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Loading the kernel module&lt;br /&gt;
The following two lines are needed to be added to /etc/modprobe.conf or /etc/modules.conf&lt;br /&gt;
&lt;br /&gt;
    alias bond0 bonding&lt;br /&gt;
    options bond0 mode=active-backup arp_interval=100 \&lt;br /&gt;
                  arp_ip_target=192.168.0.1 max_bonds=1&lt;br /&gt;
&lt;br /&gt;
* mode : Specifies one of the bonding policies.&lt;br /&gt;
**active-backup : Only one slave in the bond is active. A different slave becomes active if, and only if, the active slave fails. The bond's MAC address is externally visible on only one port (network adapter) to avoid confusing the switch.  This mode provides fault tolerance.&lt;br /&gt;
* arp_interval : Specifies the ARP monitoring frequency in milli-seconds.&lt;br /&gt;
* arp_ip_target : Specifies the ip addresses to use when arp_interval is &amp;gt; 0. These are the targets of the ARP request sent to determine the health of the link to the targets. Specify these values in ddd.ddd.ddd.ddd format. Multiple ip addresses must be separated by a comma. At least one ip address needs to be given for ARP monitoring to work. The maximum number of targets that can be specified is set at 16.&lt;br /&gt;
* max_bonds : Specifies the number of bonding devices to create for this instance of the bonding driver.  E.g., if max_bonds is 3, and the bonding driver is not already loaded, then bond0, bond1 and bond2 will be created.  The default value is 1.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Use the standard distribution techniques to define the network interfaces. For example, on Red Hat distribution create an ifcfg-bond0 file in /etc/sysconfig/network-scripts directory that resembles the following :&lt;br /&gt;
&lt;br /&gt;
    DEVICE=bond0&lt;br /&gt;
    ONBOOT=yes&lt;br /&gt;
    BOOTPROTO=dhcp&lt;br /&gt;
    TYPE=Bonding&lt;br /&gt;
    USERCTL=no&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; All interfaces that are part of a bond should have SLAVE and MASTER definitions. For example, in the case of Red Hat, if you wish to make eth0 and eth1 a part of the bonding interface bond0, their config files (ifcfg-eth0 and ifcfg-eth1) should resemble the following:&lt;br /&gt;
&lt;br /&gt;
    DEVICE=eth0&lt;br /&gt;
    USERCTL=no&lt;br /&gt;
    ONBOOT=yes&lt;br /&gt;
    MASTER=bond0&lt;br /&gt;
    SLAVE=yes&lt;br /&gt;
    BOOTPROTO=none&lt;br /&gt;
&lt;br /&gt;
Use DEVICE=eth1 in the ifcfg-eth1 config file. If you configure a second bonding interface (bond1), use MASTER=bond1 in the config file to make the&lt;br /&gt;
network interface be a slave of bond1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Restart the networking subsystem or just bring up the bonding device if your administration tools allow it. Otherwise, reboot. On Red Hat distros you can issue 'ifup bond0' or '/etc/rc.d/init.d/network restart'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; The last step is to configure your model to use bonding.  This can be done in the IDE through the &amp;quot;SAFplus Platform Component Configuration.Boot Configuration.Group Membership Service.Link Name&amp;quot; field.  This default can also be overridden on a per-node basis through the &amp;quot;target.conf&amp;quot; file, LINK_&amp;lt;nodename&amp;gt; variable.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Name Service===&lt;br /&gt;
====Overview====&lt;br /&gt;
Naming Service is mechanism that allows an object to be referred by its &amp;quot;friendly&amp;quot; name rather than its &amp;quot;object(service) reference&amp;quot;. The &amp;quot;object reference&amp;quot; can be logical address, resource id, etc. and as far as Name Service is concerned, &amp;quot;object reference&amp;quot; is opaque. In other words, Naming service (NS) returns the logical address given the &amp;quot;friendly&amp;quot; name. Hence, Name Service  helps in providing location transparency.This &amp;quot;friendly&amp;quot; name is topology and location agnostic.&lt;br /&gt;
&lt;br /&gt;
====Basic concept====&lt;br /&gt;
&lt;br /&gt;
The name service maintains a mapping between objects and the object reference (logical address) associated with the object. Each object consists of an object name, an object type, and other object attributes.  The object names are typically strings and are only meaningful when considered along with the object type. Examples of object names are &amp;quot;print service&amp;quot;, &amp;quot;file service&amp;quot;, &amp;quot;user@hostname&amp;quot;, &amp;quot;function abc&amp;quot;, etc.  Examples of object types include services, nodes or any other user defined type. The object may have a number of attributes (limited by a configurable maximum number) attached to it.  An object attribute is itself a &amp;lt;attribute type, attribute value&amp;gt; pair, each of which is a string. Examples of object attributes are, &amp;lt;&amp;quot;version&amp;quot;, &amp;quot;2.5&amp;quot;&amp;gt;, &amp;lt;&amp;quot;status&amp;quot;, &amp;quot;active&amp;quot;&amp;gt; etc.&lt;br /&gt;
&lt;br /&gt;
The name service API provides methods to register/deregister object names, types, attributes and associated addresses.  A process may register multiple services with the same address or multiple processes may register the same service name and attributes. Some object names, attributes and addresses may also be 'statically' defined at start time.  It is the responsibility of the process that registers an object to remove it when the object is no longer valid. However in the case where a process undergoes an abnormal termination, the name service will automatically remove associated entries.  &lt;br /&gt;
&lt;br /&gt;
The name service provides the ability to query the name database in various ways.  Clients may query the name service to obtain the address and attributes of a object by giving the object name and type.  &amp;quot;Content-addressable&amp;quot; access is also provided.  In other words, clients may give attributes and ask for object names that satisfy those attributes.&lt;br /&gt;
&lt;br /&gt;
====Features====&lt;br /&gt;
* The name service maps &amp;quot;service names&amp;quot; to attributes, including addresses&lt;br /&gt;
* Service Providers register their &amp;quot;service name&amp;quot;, &amp;quot;address&amp;quot; and attributes with the Name Service&lt;br /&gt;
* Service Users query the Name Service to get information about a service&lt;br /&gt;
* Service users can communicate with service providers without knowing their logical address or physical location&lt;br /&gt;
* Multiple service providers can register the same name. The name service maintains a reference count for each &amp;quot;name&amp;quot; registered&lt;br /&gt;
* The name service subscribes to component failure notification from AMF. If a component dies, the reference count for the services it has registered is decremented.&lt;br /&gt;
* Supports context based naming to allow partitioning of the name space&lt;br /&gt;
** Local name spaces are local to the Name Server on a SAFplus Platform node&lt;br /&gt;
** Global Name Spaces are global to the SAFplus Platform cluster&lt;br /&gt;
** Name spaces are dynamically created at run time&lt;br /&gt;
* Supports three type of queries&lt;br /&gt;
** Query based on &amp;quot;Service Name&amp;quot;: Given a service name returns the address and service attributes&lt;br /&gt;
** Query based on &amp;quot;Service attributes&amp;quot;: Given service attributes, returns the Service Name and address&lt;br /&gt;
** Query based on &amp;quot;name space context&amp;quot;: Given a name space context, returns all names in that space&lt;br /&gt;
&lt;br /&gt;
====Subcomponents====&lt;br /&gt;
&lt;br /&gt;
Based on the responsibilities, the Name Service component can be further subdivided into following modules&lt;br /&gt;
&lt;br /&gt;
* '''Core Module'''&lt;br /&gt;
:Responsible for supporting the creation and deletion of user defined contexts and processing the requests for registration, deregistration. Also responsible for supporting the various NS related queries&lt;br /&gt;
&lt;br /&gt;
* '''Life cycle Management Module'''&lt;br /&gt;
:Responsible for initialization, finalization, restart and other management functionalities&lt;br /&gt;
&lt;br /&gt;
* '''Syncup Manager Module'''&lt;br /&gt;
:Responsible for NS DB synchronization and backing up of DB in persistent memory&lt;br /&gt;
&lt;br /&gt;
====Contexts and Scopes====&lt;br /&gt;
The name service supports different sets of name-to-object reference mappings(also referred to as &amp;quot;context&amp;quot;).  A particular &amp;quot;name&amp;quot; is unique in the context.  A process will specify the context and the scope of its service during registration with the name service.&lt;br /&gt;
&lt;br /&gt;
'''Context'''&lt;br /&gt;
&lt;br /&gt;
* '''User-defined set'''&lt;br /&gt;
Applications may choose to be a part of a specific set (or context). For that, first a context has to be created. For example, all the SAFplus Platform related services can be a part of a separate context.&lt;br /&gt;
&lt;br /&gt;
* '''Default set'''&lt;br /&gt;
Name Service supports a default context for services that don't form a part of any specific context.&lt;br /&gt;
&lt;br /&gt;
'''Scope'''&lt;br /&gt;
&lt;br /&gt;
* '''Node-local scope'''&lt;br /&gt;
The scope is local to the node.  That is, the service provider and the user should co-exist on the same blade.&lt;br /&gt;
&lt;br /&gt;
* '''Global or cluster-wide scope'''&lt;br /&gt;
The service is available to any user on any of the blades.&lt;br /&gt;
&lt;br /&gt;
====Registration and Deregistration====&lt;br /&gt;
As the name suggests, during registration, an entry (i.e mapping between &amp;quot;name&amp;quot; and logical address) for the component is added into the name service database and during deregistration the entry is deleted.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In a typical SAFplus Platform HA scenario, whenever a component comes up and ACTIVE HA state is assigned to it, it registers with the local name service giving a string name for the service, the logical address, context and scope (the application obtains the logical address by using CL_IOC_LOGICAL_ADDRESS_FORM). Next the entry is added to the local name service database. If the scope is cluster-wide, the local name service indirectly passes this information to the name service master. Based on the context, the name service master decides whether to store the entry in the default context or the given user defined context. The name service also stores the component identifier along with that entry so that the entry can be purged if the component dies.  &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Note that the Name Service does not care about the HA state assigned to the component.  On the one hand, this means that the component author must handle registration and deregistration when the service becomes active or standby.  On the other hand, this allows great flexibility since standby components can still register names.  The name service maintains reference count of instances providing a given service. Whenever a component registers with the name service, this reference count is incremented and whenever a component dies or deregisters, this reference count is decremented by the name service. If nobody is refering to a particular entry, then that entry will be deleted. Whenever a component goes down gracefully, it is the responsiblity of the component to delete the service which it registered.&lt;br /&gt;
&lt;br /&gt;
====Name Service entries====&lt;br /&gt;
The name service database contains the following entries Name to Logical Address mapping, CompId of the component hosting the service, Count of no. of instances for the given service, a set of user defined attributes - The attributes will be &amp;lt;attribute type, attribute value&amp;gt; pair, each of which is a string. Examples of object attributes are, &amp;lt;&amp;quot;version&amp;quot;, &amp;quot;2.5&amp;quot;&amp;gt;, &amp;lt;&amp;quot;status&amp;quot;, &amp;quot;active&amp;quot;&amp;gt; etc. The upper limit on no. of attributes is user configurable.&lt;br /&gt;
&lt;br /&gt;
====Querying Name Service====&lt;br /&gt;
Whenever a component wants to get the logical address of a service, it queries its local Name Server specifying the context. Context is needed because &amp;quot;name&amp;quot; is not unique across contexts i.e. Same &amp;quot;name&amp;quot; can map to different objects in different contexts. Local Name Server checks both the node-local and the cluster-wide entries.&lt;br /&gt;
The Name Service query is based on &amp;quot;Name&amp;quot;. If an application queries the local NS EO, and an entry is not found in local NS database (there is a chance that NS updation message did not reach the NS/L), the NS/L EO contacts the NS/M EO, which looks up its cluster-wide entries and gets the information. If the information is found, NS/L updates its local database as well.&lt;br /&gt;
&lt;br /&gt;
===Remote Method Dispatch (RMD)===&lt;br /&gt;
&lt;br /&gt;
====Overview====&lt;br /&gt;
&lt;br /&gt;
This service is generically known as RPC (Remote Procedure Calls).  In a system with a single address space, function calls made are local to the address space. However, in a distributed system, the services sought by a caller may not always be available locally, but at some remote node. Remote Method Dispatch or RMD facilitates calls to the remote callee and returns the results to the caller. From the point of view of the caller, and RMD call looks exactly like a local function call.  However, the function is actually executed on another node.  Details like what node provides the service, how to communicate with this node, and platform specifics like endianess is hidden from the caller.&lt;br /&gt;
&lt;br /&gt;
====Features====&lt;br /&gt;
&lt;br /&gt;
* Similar to RPC - Remote Procedure Call&lt;br /&gt;
* Enables you to make a function call in another process, irrespective of the location of the process&lt;br /&gt;
* Communication takes place over low latency IOC/TIPC layer&lt;br /&gt;
* Reliable communication (&amp;quot;at most once&amp;quot; semantics)&lt;br /&gt;
* Support both synchronous and asynchronous flavors&lt;br /&gt;
* IDL can be used to generate client/server stubs for user components (and is of course used internally for SAFplus Platform components)&lt;br /&gt;
* Platform agnostic - works across mixed endian and mixed mode (32 bit and 64 bit)&lt;br /&gt;
&lt;br /&gt;
====Types of RMD Calls====&lt;br /&gt;
&lt;br /&gt;
* Sync (with or without Response)&lt;br /&gt;
** This call will block until a response is received&lt;br /&gt;
** Reliable - function caller knows whether or not it succeeded when the call returns&lt;br /&gt;
* Async with Response&lt;br /&gt;
** This will initiate the function call and include a callback function to handle the response&lt;br /&gt;
** Reliable - function caller knows whether or not it succeeded via the callback&lt;br /&gt;
* Async without Response&lt;br /&gt;
** This sends NULL for callback function&lt;br /&gt;
** Not reliable&lt;br /&gt;
&lt;br /&gt;
====RMD Usage====&lt;br /&gt;
&lt;br /&gt;
From the caller's perspective, RMD usage is essentially a function call if IDL was used to generate the client/server stubs.  RMD functions can be defined, and code generated through the OpenClovis IDE; please refer to the ''OpenClovis IDE User's Guide'' chapter 'Defining IDL'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Underneath the IDL are calls to the RMD API which are rarely used directly but described here for completeness.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Irrespective of the type of the call the RMD API will require at least the following parameters:&lt;br /&gt;
* IOC address (destination address and port)&lt;br /&gt;
* Input message  (Input arguments to the call)&lt;br /&gt;
* Output message (The returned arguments)&lt;br /&gt;
* flags&lt;br /&gt;
* RMD options &lt;br /&gt;
&lt;br /&gt;
Additionally, in case of async call, a callback function and a cookie (piece of context data that is not used by RMD, but passed back to the callback) need to be passed. &lt;br /&gt;
&lt;br /&gt;
As illustrated in the diagram below the address comprises of the node address and port on which the application/service provider is listening. The user is also required to specify the service he wants executed via a RMD number which comprises of the Client ID and Service ID. The former helps identify which client service is sought - this could be the native table which consists of the services exposed by the application or any other client table installed by the libraries to which the application is linked. The service number is the index of the service that is desired.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id='RMD Addressing'&amp;gt;&amp;lt;/span&amp;gt;[[File:SDK_RMDAddressing.png|center|frame|'''RMD Addressing''']]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For further details on the RMD usage kindly refer ''OpenClovis API Reference Guide''.&lt;br /&gt;
&lt;br /&gt;
====RMD IDL====&lt;br /&gt;
&lt;br /&gt;
RMD is typically used via IDL so that the user is saved from the idiosyncrasies of the underlying architectures and such.&lt;br /&gt;
&lt;br /&gt;
* RMD IDL simplifies building of RMDs&lt;br /&gt;
** Generates server and client stubs&lt;br /&gt;
** Stubs do marshalling and un-marshalling of arguments making them platform agnostic&lt;br /&gt;
** Select appropriate semantics&lt;br /&gt;
** Takes care of endianness and mixed mode issues&lt;br /&gt;
** Uses XDR (see internet RFC1014) notation&lt;br /&gt;
* OpenClovis/IDE enables the generation of RMDs and linking them to a client EO&lt;br /&gt;
* Any function installed in an EO client can be called remotely&lt;br /&gt;
&lt;br /&gt;
====RMD/EO Interface====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id='EO Execution Interface'&amp;gt;&amp;lt;/span&amp;gt;[[File:SDK_RMD_EO_70.png|center|frame|'''EO Execution Interface''']]&lt;br /&gt;
&lt;br /&gt;
RMD and EO are tightly knit as can be observed in the illustration above. The service provider or server exposes a certain set of services by installing it in the EO. The client application interested in the service makes a RMD call to the server with the desired arguments. The node address specifies the node on which the server resides and the port identifies the server process. The RMD number specifies the service that needs to be executed of a particular client residing on the server. This request is sent across over TIPC/IOC layer to the server. The receiver thread of the server picks up this request and queues the same into the EO job queue and wakes up one of the worker threads to process the request. The worker thread checks the service requested and processes the request in the context of the server. The client is totally unaware where the service is processed. It could be in the same process address space, on a process on the same node or a process on a remote node.&lt;br /&gt;
&lt;br /&gt;
Please refer the Componentization section of this document for a better understanding.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Interface Definition Language (IDL)===&lt;br /&gt;
&lt;br /&gt;
The OpenClovis Interface Definition Language (IDL) is a library used by all EOs to communicate efficiently across nodes. Using IDL, OpenClovis SAFplus Platform services can communicates across mixed endian machines and mixed mode (32-bit and 64-bit architecture) setup. This it accomplishes by providing marshalling and unmarshalling functions for the various types of  arguments. Thus IDL in combination with RMD is used to provide a simple and efficient means of communication across EOs.&lt;br /&gt;
&lt;br /&gt;
====IDL Usage====&lt;br /&gt;
&lt;br /&gt;
The IDL generation is done through a script that takes 2 arguments: &lt;br /&gt;
* the xml file which provides a definition of the user's EO and relevant data structures&lt;br /&gt;
* a directory in which to generate the code&lt;br /&gt;
&lt;br /&gt;
It then generates client and server side code for the xml definition into the specified directory. The user then issues a top level build whereafter the server &amp;amp; client side libraries are generated. The user should link with the client side libraries and include the client and xdr headers in his code to make client calls. On the server side, the user is expected to provide actual function definitions corresponding to the service definitions present in the xml file. He is also expected to install the server stubs before using &amp;amp; uninstall them during termination using the install/uninstall functions provided on a per EO basis.&lt;br /&gt;
&lt;br /&gt;
Code is generated as follows:&lt;br /&gt;
* Top level makefile that recursively descends into client &amp;amp; server&lt;br /&gt;
* The directory xdr in which, a .c &amp;amp; .h is generated for every custom defined data structure in the xml.&lt;br /&gt;
For every struture,corresponding marshal.c and unmarshall.c files will be generated.&lt;br /&gt;
* client - a .c &amp;amp; .h is generated in this directory. They contain the definition and declaration respectively of the sync client, async client and the async callback for each EO service defined in the xml. It also contains a makefile that generates a library out of the files in this directory and the xdr directory.&lt;br /&gt;
* server - a .c &amp;amp; .h is generated in this directory. They contain the definition and declaration respectively of the server stub and the server function for each EO service defined in the xml. It also contains a makefile that generates a library out of the files in this directory and the xdr directory.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The generated code inside the target directory looks like the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id='Directory Structure of generated files'&amp;gt;&amp;lt;/span&amp;gt;[[File:SDK_IDL_DirectoryStructure_80.png|center|frame|'''Directory Structure of Generated Code''']]&lt;br /&gt;
&lt;br /&gt;
IDL translates the user's data structures passed through a function call to a message and vice versa. Therefore it requires the user to specify the function signatures. This is currently being done through xml. The user defines the EO through the xml along with the relevant data structures. The following section describes the xml definition in detail.&lt;br /&gt;
&lt;br /&gt;
====IDL Specification====&lt;br /&gt;
&lt;br /&gt;
The IDL script expects the EO interface definition from the user in XML format. &lt;br /&gt;
&lt;br /&gt;
=====User-Defined Types=====&lt;br /&gt;
The IDL uses XDR representation to store application data internally while transferring it to another EO. Therefore, IDL requires the application to specify the data structures that will be transferred through RMD so that it can generate XDR functions required to marshal/un-marshal these data structures. Marshalling is the process of converting the native data to XDR format and un-marshalling is retrieving the data back to native format. There can be three user-defined types: structures, unions and enumerations. These are explained below.&lt;br /&gt;
&lt;br /&gt;
======Enumerations======&lt;br /&gt;
Enumerations are like enums in C and are defined likewise.&lt;br /&gt;
&lt;br /&gt;
======Structures======&lt;br /&gt;
These are like structures in C. Therefore, every structure defined is composed of data members. There is a restriction that structures within the structures are not allowed to be defined. However, this restriction can be overcome by defining the two structures separately and embedding one inside another as a data member. Data members have the following attributes:&lt;br /&gt;
&lt;br /&gt;
'''name'''&lt;br /&gt;
This is the name of the data member and it is referred to within the structure by this name.&lt;br /&gt;
&lt;br /&gt;
'''type'''&lt;br /&gt;
This can be one of the pre-defined Clovis data types or a user-defined type. It is the user's&lt;br /&gt;
responsibility to make sure that there are no circular inclusions. Circular inclusions happen when two or more UDTs include each other in their respective definitions in such a way that it creates a cyclic dependency amongst all the involved UDTs. The supported pre-defined Clovis data types are ClInt8T, ClUint8T, ClInt16T, ClUint16T, ClInt64T, ClUint64T, ClInt32T , ClUint32T.&lt;br /&gt;
ClNameT and ClVersionT.&lt;br /&gt;
&lt;br /&gt;
======pointer======&lt;br /&gt;
This is an optional attribute. When this is enabled, it means that the data member is a pointer to the type specified. We cannot specify more than one level of indirection since it is necessary to specify the number of elements being pointed to for every level of indirection.&lt;br /&gt;
&lt;br /&gt;
======lengthVar======&lt;br /&gt;
This attribute should be specified only if the data member is a pointer type, which means that the pointer attribute is set to true. This attribute specifies which data member in the structure will contain the number of elements being pointed to. It is an optional attribute. When no such attribute is specified for a pointer type data member, it is assumed that a single element is being pointed to.&lt;br /&gt;
&lt;br /&gt;
======multiplicity======&lt;br /&gt;
This attribute is used to specify an array type of data member. The number of elements is specified through this attribute. This attribute must not be specified along with the pointer attribute. This is an optional attribute.&lt;br /&gt;
&lt;br /&gt;
======Unions======&lt;br /&gt;
These are defined similar to structures. The difference is in terms of the interpretation and generation.&lt;br /&gt;
&lt;br /&gt;
=====EO Interface=====&lt;br /&gt;
&lt;br /&gt;
The EO has multiple tables called Clients into which the exported interface functions are installed. The user has to specify which functions are installed in which tables and then give a declaration of the functions themselves. Thus, an EO interface definition consists of one or more clients:&lt;br /&gt;
&lt;br /&gt;
======Client======&lt;br /&gt;
A client has a Client-Id, which must either be a number or a constant. A client has multiple functions called Services. A Service has a name and zero or more Arguments. The Arguments to a Service are defined as follows:&lt;br /&gt;
&lt;br /&gt;
'''Handle'''&lt;br /&gt;
The handle is the first parameter to be passed to a call on the client side or the server side. It is initialized with the address of the destination EO, and parameters like timeout, retries and priority on the call. For more details on handles, please refer to the SISP API Reference Manual.&lt;br /&gt;
&lt;br /&gt;
'''Argument'''&lt;br /&gt;
An argument is similar to a data member, except for the following differences:&lt;br /&gt;
* It does not have a multiplicity&lt;br /&gt;
* It has an additional attribute where the user specifies if the argument is of type:&lt;br /&gt;
** [CL_IN]: argument is an input to the function.&lt;br /&gt;
** [C_inout]: argument is an input to the function and the function is expected to fill        it up and pass it back to the caller.&lt;br /&gt;
** [out]: the function is expected to fill the argument and pass it back to the            caller.&lt;br /&gt;
Since an inout or an out type of argument is supposed to be passed back to the user, it must always have the pointer attribute set to true.&lt;br /&gt;
&lt;br /&gt;
====XDR marshalling and unmarshalling====&lt;br /&gt;
&lt;br /&gt;
The IDL uses XDR to store data into a message. This is called marshalling of data. The reverse process i.e. Of retrieving data from the message into the native format is called unmarshalling of data. XDR stands for eXternal Data Representation Standard (described in RFC 1832). It is a means of storing data in a machine independent format. We will look at relevant sections of XDR in this section.&lt;br /&gt;
&lt;br /&gt;
Data structures:&lt;br /&gt;
IDL recognizes the following data structures:&lt;br /&gt;
* ClInt8T&lt;br /&gt;
* ClUint8T&lt;br /&gt;
* ClInt16T&lt;br /&gt;
* ClUint16T&lt;br /&gt;
* ClInt32T&lt;br /&gt;
* ClUint32T&lt;br /&gt;
* ClInt64T&lt;br /&gt;
* ClUint64T&lt;br /&gt;
* ClNameT&lt;br /&gt;
* ClVersionT&lt;br /&gt;
* struct formed from other data structures&lt;br /&gt;
* union formed from other data structures&lt;br /&gt;
* enum&lt;br /&gt;
&lt;br /&gt;
All data structures map to respective C structures except for 'union'.&lt;br /&gt;
In XDR, we need to know which member in a union is valid since it needs to be marshalled/unmarshalled. Therefore a union is implemented as a structure which aggregates the respective C-style union and a member called discriminant which takes appropriate values for every member of the C-style union.&lt;br /&gt;
&lt;br /&gt;
=====Marshalling=====&lt;br /&gt;
&lt;br /&gt;
In all of the marshalling algorithms, the message is written to only if non-zero. The message should be 0 if the veriable under consideration needs to be deleted. All data is converted to network byte order before writing to message.&lt;br /&gt;
&lt;br /&gt;
=====Unmarshalling=====&lt;br /&gt;
&lt;br /&gt;
In all of the unmarshalling algorithms, the message should always be non-zero. All data is converted to host order before reading from a message.&lt;br /&gt;
&lt;br /&gt;
====IDL Stubs====&lt;br /&gt;
&lt;br /&gt;
The IDL generates the following for every function installed in the EO interface:&lt;br /&gt;
* sync client stub&lt;br /&gt;
* async client stub&lt;br /&gt;
* server stub&lt;br /&gt;
* async callback&lt;br /&gt;
&lt;br /&gt;
In addition, it generates 2 functions to install and uninstall the server functions into the EO.&lt;br /&gt;
&lt;br /&gt;
A client function is defined by it's arguments.&lt;br /&gt;
&lt;br /&gt;
'''Arguments'''&lt;br /&gt;
Arguments or parameters are marshalled into a message which are passed to the server functions and vice versa. Therefore it is necessary to understand what type of arguments can be available and how the marshalling/unmashalling can be done. There are 2 orthogonal classifications of arguments.&lt;br /&gt;
&lt;br /&gt;
Classification based on direction of transfer:&lt;br /&gt;
* CL_IN - these are provided as an input to a function. In our case, they are sent to the server through input message&lt;br /&gt;
* CL_OUT - these are used to return results to the caller. In our case, these parameters are sent from the server to the client in the output message&lt;br /&gt;
* CL_INOUT - these act as both input as well as output arguments. Consequently in our case, they are sent in both directions.As of now we are not handling inout variables.&lt;br /&gt;
&lt;br /&gt;
Classification based on passing:&lt;br /&gt;
* By value - these are passed as a copy. The original variables are not modifiable.&lt;br /&gt;
* By reference - these are passed as address. Therefore the original variables are modifiable. Since IDL marshalls/unmarshalls the  These are further categorized as:&lt;br /&gt;
** without count - when pointers are passed without count, they are assumed to point to a single element&lt;br /&gt;
** with count - when a reference is passed with a count variable (an input basic type parameter), the count variable is assumed to contain the number of elements being pointed to.&lt;br /&gt;
&lt;br /&gt;
Thus an argument can be classified into one of the following categories:&lt;br /&gt;
* CL_IN, by value (CL_OUT type parameters return results to the callee, they always need to be passed by reference)&lt;br /&gt;
* CL_IN, by reference without count&lt;br /&gt;
* CL_IN, by reference with count&lt;br /&gt;
* CL_OUT, by reference without count&lt;br /&gt;
* CL_OUT, by reference with count&lt;br /&gt;
&lt;br /&gt;
=====IDL Sync Client Stub=====&lt;br /&gt;
&lt;br /&gt;
The IDL sync client stub is generated from the EO definition provided in the xml file. A stub is generated for every function installed in the EO clients. The first argument of the stub is always the handle which contains the RMD parameters and it needs to be pre-initialized. For more information on the handle, please refer to the API guide.&lt;br /&gt;
It has the same signature as is specified in the xml file.&lt;br /&gt;
&lt;br /&gt;
=====IDL Async Client Stub=====&lt;br /&gt;
&lt;br /&gt;
Same as the sync stub except that the RMD call is asynchronous. Additional arguments are supplied for this - the callback to be invoked on successful invocation and also the cookie to be passed as an argument to the callback.&lt;br /&gt;
&lt;br /&gt;
=====IDL Async Callback=====&lt;br /&gt;
&lt;br /&gt;
This is the function that is called when an async call is made and the context from the server returns. It is similar to the part of sync client stub which is present after the sync RMD call returns.&lt;br /&gt;
This function is invoked from the RMD's context.&lt;br /&gt;
&lt;br /&gt;
=====IDL Server Stub=====&lt;br /&gt;
&lt;br /&gt;
The IDL server stub is invoked by RMD server library in response to a request from the client. This stub gets installed in the EO's client tables.&lt;br /&gt;
This stub does the reverse of the sync client stub. It extracts the in  from the input message and calls the actual server function with these parameters. When the function returns, it packs the out parameters in a the output message and returns destroys the variables it created.&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/sdkguide/manageability</id>
		<title>Doc:latest/sdkguide/manageability</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/sdkguide/manageability"/>
				<updated>2010-08-27T03:46:16Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=='''System Management'''==&lt;br /&gt;
&lt;br /&gt;
OpenClovis SAFplus Platform provides a comprehensive platform and system management and component manageablity. It delivers a high degree of redundancy, delivering access to key services through highly-resilient traffic handling and system recovery mechanisms. The SAFplus Platform manageability infrastructure provides the capability for managing the resources in the system, reporting problems happening on those resource and provides infrastructure which can take customized action based on these problems.&lt;br /&gt;
&lt;br /&gt;
Manageability comprises the following components: &lt;br /&gt;
* [[#Clovis Object Repository (COR)|Clovis Object Repository (COR)]]&lt;br /&gt;
* [[#Alarm Manager (AM)|Alarm Manager (AM)]]&lt;br /&gt;
* [[#Fault Manager (FM)|Fault Manager (FM)]]&lt;br /&gt;
* [[#Transaction Manager (TM) | Transaction Manager (TM)]] &lt;br /&gt;
* [[#Provisioning Library|Provisioning Library]]&lt;br /&gt;
* [[#Mediation Library|Mediation Library]]&lt;br /&gt;
* [[#Simple Network Management Protocol (SNMP)|Simple Network Management Protocol (SNMP)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id='System Management in SAFplus'&amp;gt;&amp;lt;/span&amp;gt;[[File:SDK_SystemMngmtinSAFplus Platform.png|frame|center| '''System Management in SAFplus''' ]]&lt;br /&gt;
&lt;br /&gt;
This chapter provides information about the various components of mangeability, concepts of managed objects, and using subagents for custom MIBs. &lt;br /&gt;
&lt;br /&gt;
'''Key Topics:''' &lt;br /&gt;
* [[#Components of Manageability | Components of Manageability]] &lt;br /&gt;
* [[#Working with Clovis Object Repository (COR) | Working with Clovis Object Repository (COR)]] &lt;br /&gt;
* [[#Attributes of Managed Objects| Attributes of Managed Objects]] &lt;br /&gt;
* [[#Developing SNMP Subagent for Custom MIBs | Developing SNMP Subagent for Custom MIBs]] &lt;br /&gt;
* [[#SAFplus Platform Manageability End to End | SAFplus Platform Manageability End to End ]]&lt;br /&gt;
&lt;br /&gt;
===OpenClovis Information Model===&lt;br /&gt;
&lt;br /&gt;
OpenClovis Information Model is a hierarchical, object-oriented management information model that facilitates the abstraction of all physical and logical entities in a managed environment.&lt;br /&gt;
&lt;br /&gt;
'''Key Topics:''' &lt;br /&gt;
* [[#Introduction to the OpenClovis Information Model | Introduction to the OpenClovis Information Model]] &lt;br /&gt;
* [[#Building an Information Model Using the OpenClovis IDE | Building an Information Model Using the OpenClovis IDE]] &lt;br /&gt;
&lt;br /&gt;
For more information on Information Modeling, please refer to Distributed Management Task Force (DMTF) Common Information Model (CIM) available at http://www.dmtf.org.&lt;br /&gt;
&lt;br /&gt;
====Introduction to the OpenClovis Information Model====&lt;br /&gt;
&lt;br /&gt;
The OpenClovis Information Model is built on a generic framework that provides a unified view of hardware and software elements and the services provided by them. It helps you to define the interdependencies and relationships between the managed objects. It is a mechanism to capture the application models and integrate them with OpenClovis SAFplus Platform.&lt;br /&gt;
&lt;br /&gt;
To manage any hardware or software entity, it must be represented as a Resource in the Information Model.  Hardware entities include chassis, blade, interface port, logical port, logical connections such as ATM VPC, VLAN, and so on. Software entities includes software processes, operating system features or application protocols such as OSPF, SS7, and so on.&lt;br /&gt;
&lt;br /&gt;
The OpenClovis IDE helps you to build your Information Model using UML notation. This is accomplished through its editors, namely the Resource Editor and the Component Editor. For more information please refer to ''OpenClovis IDE User Guide''.&lt;br /&gt;
&lt;br /&gt;
The Information Model allows the definition of managed objects for an OpenClovis SAFplus-based system encapsulating chassis management, devices, alarms, faults, component states, and provisioned attributes of OpenClovis SAFplus Platform components and customer applications. The model provides support for SNMP MIB import as well as Object ID (OID) to Managed Object ID (MOID) mapping.&lt;br /&gt;
&lt;br /&gt;
====Building an Information Model Using the OpenClovis IDE====&lt;br /&gt;
&lt;br /&gt;
The OpenClovis IDE provides a graphical development environment for defining the SAFplus Platform model. Using the OpenClovis IDE you can design the model, generate/customize the code, and build the images for your target environment. Building the information model involves the following steps: &lt;br /&gt;
* Create a project using the OpenClovis IDE.&lt;br /&gt;
* Build the resource view in the Resource Editor. &lt;br /&gt;
* Define the hardware and software objects of the system and model them as Resources. &lt;br /&gt;
* Set the attributes for the resources.&lt;br /&gt;
* Create components to manage the resources using the Component Editor and then associate the components with the resources.&lt;br /&gt;
* Set the attributes for the components.&lt;br /&gt;
* Configure the build-time OpenClovis SAFplus Platform components and save the data as XML files.&lt;br /&gt;
* Generate the code representing the defined model.&lt;br /&gt;
* Compile the code.&lt;br /&gt;
* Create the binary deployment images.&lt;br /&gt;
&lt;br /&gt;
You can compile and link the code to the OpenClovis SAFplus Platform libraries to build the platform software customized for the target application. To get started using the OpenClovis IDE and build a sample model see the ''OpenClovis Sample Application Tutorial.''&lt;br /&gt;
&lt;br /&gt;
===Components of Manageability===&lt;br /&gt;
&lt;br /&gt;
====Clovis Object Repository (COR)====&lt;br /&gt;
&lt;br /&gt;
Clovis Object Repository (COR) is an in-memory, object-oriented distributed repository service enabled with system modeling constructs. It implements data management capabilities like meta-data management as well as data management. Meta-data is expressed as class creation, deletion, and attribute definitions.&lt;br /&gt;
&lt;br /&gt;
Data management capabilities include object creation, deletion, query, indexing, and distribution. COR also provides ability to implement services associated data definition using transaction, recovery, and so on. COR provides the ability for class inheritance and containment.&lt;br /&gt;
&lt;br /&gt;
The Clovis Object repository is updated in the active System Controller instance and an exact replica is maintained (synchronized) in the System Controller Standby to provide high availability. In addition COR provides persistence storage of the repository to provide HA across restart scenarios. It routes the management stations requests to the user component or the object implementer for updating the component managing the hardware or the software resource. The COR supports transient attribute. An object implementer keeps track of the latest value of this attribute. Any get operation from the north bound on this attribute will be routed to the primary OI and latest value will be returned.&lt;br /&gt;
&lt;br /&gt;
====Alarm Manager (AM)====&lt;br /&gt;
&lt;br /&gt;
The OpenClovis Alarm Manager (AM) provides an infrastructure for configuring and handling alarms. It provides support for alarm soaking, masking, alarm hierarchies, and correlation of the alarms before publishing. It stores the information for all the alarm being published untill it is cleared. The alarm client library attached to the component which is managing the alarm resource always sends the request to the alarm manager running on the local node for the processing.&lt;br /&gt;
&lt;br /&gt;
It provides the functionality of reporting the alarm from the south bound entity. It publishes events for all the alarms reported or cleared, so somebody interested in this can register for this subscription.&lt;br /&gt;
&lt;br /&gt;
====Fault Manager (FM)====&lt;br /&gt;
&lt;br /&gt;
The OpenClovis Fault Manager (FM) infrastructure provides a hierarchical scheme for managing faults in a system and initiating actions as configured during the design time. It can handle various user-defined run-time faults, including hardware and software faults and can prioritize faults to ensure that the critical faults are addressed before the normal or the low-priority faults. &lt;br /&gt;
&lt;br /&gt;
The alarms are notified by the Fault Manager client library to the Fault Manager server located on the same node. The actions to be taken on receiving a fault are controlled by the FM policy associated with the faults.&lt;br /&gt;
&lt;br /&gt;
====Transaction Manager (TM)====&lt;br /&gt;
&lt;br /&gt;
The OpenClovis Transaction Manager (TM) is an infrastructure service for providing the 2-phase commit transaction semantics. Along with this it provides two libraries the client library and the agent library. The client library is used to submit the transaction jobs and also the information about all the participating components. Any component that wishes to be a part of transactions can link with the agent library and act as a resource manager.&lt;br /&gt;
&lt;br /&gt;
'''Features''' &lt;br /&gt;
&lt;br /&gt;
* Supports re-startable transactions. For instance, if the Transaction Manager dies, all the pending transactions will be restarted when it is coming up again.&lt;br /&gt;
&lt;br /&gt;
'''How it works''' &lt;br /&gt;
&lt;br /&gt;
It tracks the participants and provides ACID semantics to ensure that all the participants are updated properly, or will rollback to previous state assuring data integrity despite component failures.&lt;br /&gt;
&lt;br /&gt;
====Provisioning Library====&lt;br /&gt;
&lt;br /&gt;
The OpenClovis Provisioning Library manages all aspects of the various hardware and software resources on the system.&lt;br /&gt;
&lt;br /&gt;
Provisioning Library:&lt;br /&gt;
* Is a client module that is automatically bound to every component that manages a hardware resource or a software resource.&lt;br /&gt;
* It keeps track of all the resources being managed which are modeled to be owned by the component. It also keep account for all the runtime creation or deletion of the resource to be managed.&lt;br /&gt;
* Propagates the attributes to the corresponding hardware resource, when it is set from the North bound.&lt;br /&gt;
* Fetches the value of the runtime attributes from the component when a get operation is done on it from the North bound.&lt;br /&gt;
&lt;br /&gt;
====Mediation Library====&lt;br /&gt;
&lt;br /&gt;
The OpenClovis Mediation Library acts like a gateway to the OpenClovis SAFplus Platform runtime environment on the system controller. It interacts with external management agents like SNMP, CLI, and OpenClovis SAFplus Platform components. &lt;br /&gt;
&lt;br /&gt;
The Mediation Library helps in translating the service requests from the management station into requests pertaining to OpenClovis SAFplus Platform runtime environment. The extensible plug-in architecture of Mediation Library allows the external management agents to control the configuration and operation of the various managed objects within the system.&lt;br /&gt;
&lt;br /&gt;
====Simple Network Management Protocol (SNMP)====&lt;br /&gt;
&lt;br /&gt;
The OpenClovis Simple Network Management Protocol (SNMP) sub-agent provides the flexibility to manage both platform and non-platform hardware, OpenClovis  Information Model, and the alarms present in the system. Using SNMP, you can manage the attributes of an MO that includes a get, set, or notification.&lt;br /&gt;
&lt;br /&gt;
===Working with Clovis Object Repository (COR)===&lt;br /&gt;
&lt;br /&gt;
This section provides information about the value addition that COR provides to an application, and outlines the concepts of managed objects, their related databases, and classes. The following topics are discussed in this section:&lt;br /&gt;
* [[#Terms and Definitions | Terms and Definitions]] &lt;br /&gt;
* [[#COR: Value-Addition to an Application | COR: Value-Addition to an Application]] &lt;br /&gt;
* [[#OpenClovis Information Model | OpenClovis Information Model]] &lt;br /&gt;
* [[#COR Architecture | COR Architecture]] &lt;br /&gt;
* [[#COR Functionality | COR Functionality]] &lt;br /&gt;
 &lt;br /&gt;
====Terms and Definitions====&lt;br /&gt;
&lt;br /&gt;
'''Class''' - An individual entity with attributes.&lt;br /&gt;
&amp;lt;br&amp;gt; '''MO''' - Managed Object provides an abstraction for the manageable properties of a resource in the system. MOs have attributes, support management operations, exhibit behavior and send notifications. Operations on an MO can be Create or Delete Instances; Get or Modify attributes; Action. Notifications emitted by an MO instance are instances that are created/deleted; report attribute change; class specific notification such as alarms.&lt;br /&gt;
&amp;lt;br&amp;gt; '''MO Class''' - Specifies the containment relationship between classes. For example: chassis/gigeblade/gigeport.&lt;br /&gt;
&amp;lt;br&amp;gt; '''MO Class Tree''' - Hierarchical representation of the containment relationship between MO classes.&lt;br /&gt;
&amp;lt;br&amp;gt; '''MOId''' - Unique Identifier of an instance of MO class. It is a hierarchical containment of a resource. MOs have these unique MOIds associated with them within the system. MOIds can be used as the address for MOs. For example: Chassis 0/Gigeblade 1/ Gigeport 2.&lt;br /&gt;
&amp;lt;br&amp;gt; '''MO Instance''' - Instantiation of MO class. For example, Gigeport 3 is an instance of Gigeport class.&lt;br /&gt;
&amp;lt;br&amp;gt; '''MO Instance Tree''' - Collection of MO instances with containment relationship specified. For example, in a chassis based system, an instance of a port could be: Chassis (0)/Blade (3)/Port (2).&lt;br /&gt;
&amp;lt;br&amp;gt; '''MSO''' - Encapsulates the attributes of a Managed Object specific to the particular service they are associated with. (For example, Alarm severity is an attribute related to the alarm service; it is a part of the Alarm MSO associated with any MO desiring an alarm service).&lt;br /&gt;
&lt;br /&gt;
====COR: Value-Addition to an Application====&lt;br /&gt;
&lt;br /&gt;
Almost every telecommunication or data communication system has a managed object database, which captures data pertaining to the system as captured in the information model. Following are the different features provided by COR:&lt;br /&gt;
* '''Creation of classes -''' A class is a blueprint of an object. It defines the different attributes of an object. COR provides a capability to inherit one class from another. The inherited class inherits all the attributes of parent class.&lt;br /&gt;
* '''Definition of attributes in a class -'''  A class when created is an empty class, meaning that it does not contain any attributes other than those defined for the parent. COR supports addition of attributes into classes through APIs.&lt;br /&gt;
* '''Creation of MO classes -''' The MO classes when created, defines hierarchy (invariably a physical containment hierarchy) between different classes. The MO class hierarchy is blueprint of Object Tree. This is one way by which a Telecommunication Equipment Vendor enforces a hierarchy in which object can be created by system developer.&lt;br /&gt;
* '''Creation and deletion of Objects -''' The Objects can be created in a hierarchical fashion as per blueprint defined by MO class tree. COR provides ability to create/delete objects.&lt;br /&gt;
* '''Set and Get operation support -'''The values of the attributes which were modeled as part of the managed resource class can be changed at runtime using set operation after objects of these managed object are created. The latest values of these attributes can be fetched from COR using the get operations. Both these operations support single and bulk semantics.&lt;br /&gt;
* '''Object Tree Walk -'''The object tree can be navigated using the features provided in the COR. This walk can be restricted to a particular subtree starting from a defined root.&lt;br /&gt;
* '''Distribution of COR repository''' - The COR repository are replicated on the two system controller cards. Exact replica of runtime data and metadata is maintained on both the cards. In case of failure of one card, the data can be obtained from another card.&lt;br /&gt;
* '''Transaction Support''' - COR provides an ability to invoke the Managed Service Providers when a data managed by the Object implementer is changed. This is done through transaction mechanism. The transaction mechanism also ensures atomicity and consistency of an operation. A transaction is started for object creation/deletion and attribute set operation started by a user.&lt;br /&gt;
* '''Notification Support''' - COR provides support for subscription of notification after completion of transaction. A notification is published for object creation/deletion as well as for setting an attribute of an object.&lt;br /&gt;
&lt;br /&gt;
The following diagram depicts the relationship between COR classes, MO classes, and COR objects:&lt;br /&gt;
&amp;lt;span id='Classes, MO Classes, and Objects'&amp;gt;&amp;lt;/span&amp;gt;[[File:SDK_ClassesMOClassesObjects.png|frame|center| '''Classes, MO Classes, and Objects''' ]]&lt;br /&gt;
&lt;br /&gt;
The object creation is performed in three steps. The first two steps are hidden from the user as the information model created using IDE is read by COR at the startup. All the defined classes and MO class tree will be created during this time. The object creation will start only after these two steps are done. A brief description of these three steps is as follows:&lt;br /&gt;
# '''Create COR class''' - The COR class is created and attributes are added to it. The class represents a resource in a system.&lt;br /&gt;
# '''Create MO classes''' - MO classes are nothing but COR classes arranged in hierarchy. These first two steps define model of a system. These first two steps are performed by COR as a part of Information Model development. A COR class defined in the first step above can be used for multiple MO classes, for example STS1 class can be used for Sonet STS1 as well as DS3 STS1. You need not define a separate COR class for them since attributes of both the STS1 MO classes are the same. An MO class is identified by MO class path which in a string format appears as follows: \chassisMO\SonetBladeMO\SonetPortMO for a sonet port.&lt;br /&gt;
# '''Create objects''' - Objects are created when the system starts running (either during boot-up or dynamically, by the System Developer using a management agent (such as SNMP/TL1 CLI). The objects can be created only according to the blueprint defined in steps 1 and 2 above. For example, the system developer can not create DS3 port under a Sonet card since it is not according to the blueprint.&lt;br /&gt;
&lt;br /&gt;
====COR and OpenClovis Information Model====&lt;br /&gt;
&lt;br /&gt;
This section describes the OpenClovis Information Model and how COR is used to capture the Information Model. The following section describes a two-step approach towards defining the OpenClovis information model:&lt;br /&gt;
# Metamodel Definition  - Metamodel is a language for specifying an information model. It is the responsibility of OpenClovis SAFplus Platform to define metamodel.&lt;br /&gt;
# Defining System Model - Using the defined metamodel, the systems vendors define an information model. &lt;br /&gt;
&lt;br /&gt;
=====Metamodel Definition=====&lt;br /&gt;
&lt;br /&gt;
A metamodel defines language for specifying an information model. The following section describes OpenClovis SAFplus Platform's Metamodel and defines different metaobjects used in the metamodel. Example of different metaobjects used in metamodel are class, attributes, relationships, and so on.&lt;br /&gt;
&lt;br /&gt;
The following UML diagram captures OpenClovis SAFplus Platform's metamodel:&lt;br /&gt;
&amp;lt;span id='OpenClovis SAFplus Platform's Metamodel'&amp;gt;&amp;lt;/span&amp;gt;[[File:SDK_SAFplus Platform'sMetaModel.png|frame|center| '''OpenClovis SAFplus Platform's Metamodel''' ]]&lt;br /&gt;
&lt;br /&gt;
The left hand side model, as demarcated by blue line, represents the physical view or management view of the system. The right hand side of the model represents logical view. The physical view defines attributes for hardware and software resources contained in the system and the logical view defines metaclasses. &lt;br /&gt;
&lt;br /&gt;
All the metaclasses below the red line are base classes. These classes will not change as we go forward. The classes above red line are specialization of the base classes defined below the red line. &lt;br /&gt;
&lt;br /&gt;
Different relationships exist between metaclasses defined in both the physical view and logical view. These relationships are defined using standard UML notations.&lt;br /&gt;
&lt;br /&gt;
'''Example:'''  Defining System Model&lt;br /&gt;
&lt;br /&gt;
Figure [[#Instance of OpenClovis SAFplus Platform's Metamodel | Instance of OpenClovis SAFplus Platform's Metamodel]]  illustrates an example for OpenClovis SAFplus Platform's Metamodel.&lt;br /&gt;
&amp;lt;span id='Instance of OpenClovis SAFplus Platform's Metamodel'&amp;gt;&amp;lt;/span&amp;gt;[[File:SDK_InstanceofSAFplus Platform'sMetaModel.png|frame|center| '''Instance of OpenClovis SAFplus Platform's Metamodel''' ]]&lt;br /&gt;
&lt;br /&gt;
The data present in the information model is captured in COR. The output of information model is captured as user configuration. The information model translates in the COR MO class tree. In the information model as defined above two COR MO class trees shall be generated, one for resources and other for classes. The classes can be captured in the table format. COR provides utility functions to read the table and create COR classes as well as MO classes from it.&lt;br /&gt;
&lt;br /&gt;
====COR Architecture====&lt;br /&gt;
&lt;br /&gt;
COR runs on two redundant system controller cards. This section talks about the network model for COR and provides details of COR subcomponents. Figure [[#COR Network Model | COR Network Model]]  illustrates the COR network model:&lt;br /&gt;
&amp;lt;span id='COR Network Model'&amp;gt;&amp;lt;/span&amp;gt;[[File:SDK_CORNetworkModel.png|frame|center| '''COR Network Model''' ]]&lt;br /&gt;
&lt;br /&gt;
Although distributed databases are complex as opposed to centralized databases, they provide some very important advantages, if implemented, such as: &lt;br /&gt;
* '''Performance''' - A proper distribution criterion can ensure that the data is close to the location where it is frequently accessed from.&lt;br /&gt;
* '''High Availability of Data'''  - In distributed database, cache of an object can be maintained at multiple locations, making the data available in spite of failure of a location.&lt;br /&gt;
&lt;br /&gt;
COR provides High Availability of data by means of making a replica of it on two redundant controller cards.&lt;br /&gt;
&lt;br /&gt;
====COR Functionality====&lt;br /&gt;
COR provides the following functionalities:&lt;br /&gt;
# MO Class Creation.&lt;br /&gt;
# MO Instance Tree creation and Navigation&lt;br /&gt;
# Atomic Object Manipulation&lt;br /&gt;
# Notification Services&lt;br /&gt;
# Object Ownership Services &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; '''MO Class Tree Navigation''': Given a class, assigns an API.&lt;br /&gt;
&amp;lt;br&amp;gt; '''Atomic Object Manipulation''': Provides APIs to create multiple objects. Either the operation suceeds or fails. Manipulation includes creation / deletion / modification. For example: In an output, multiple objects can be specified to be created. COR ensures that either all are created or deleted.&lt;br /&gt;
Ownership provides component to be owner of an object. An owner of an object participates in the object manipulation operation. The owner provides the three functions:&lt;br /&gt;
&amp;lt;br&amp;gt; '''Validate''': Output is validated by the object owner. If the validation fails, object manipulation on the whole fails.&lt;br /&gt;
&amp;lt;br&amp;gt; '''Rollback''': If validation fails, the object owner needs to roll back its state information.&lt;br /&gt;
&amp;lt;br&amp;gt; '''Commit''': The object owner accepts the creation only if Y is provided in the validate phase. For example: If MTU size of Gigeport is set, then the object owner of gigeport will set the MTU size in the gigeport hardware during the Commit phase.&lt;br /&gt;
&amp;lt;br&amp;gt; '''Notification''': After COR issues notification, this notification is subscribed by components.&lt;br /&gt;
&lt;br /&gt;
====Node Independent Managed Objects====&lt;br /&gt;
&lt;br /&gt;
In a distributed communication system, multiple applications running across multiple nodes can share MOs. Such MOs are not specifically bound to any blade or a node. They are owned by one application but the application is implemented by a pair of ACTIVE and STANDBY SUs and their software components running on different nodes. The MO can be accessed from the north-bound interface irrespective of the location of its owner application. In case of failover, the STANDBY registers the MO without affecting the north-bound interface.&lt;br /&gt;
&lt;br /&gt;
OpenClovis IDE enables you to define MOs in OpenClovis MIB that are not related to any physical entity in the system. These MOs reside in a logical hierarchy tree attached directly to the root MO. For example, two gigE ports are defined in the Resource Editor of IDE with 1+1 redundancy model. These ports are associated with same OI as they collectively provide the gigE service that contains its own MO. This is a logical MO and is blade independent. The configuration of this MO is applied to both the ports.&lt;br /&gt;
&lt;br /&gt;
===Attributes of Managed Objects===&lt;br /&gt;
&lt;br /&gt;
Clovis Object Registry (COR) is a repository of Managed Objects representing the network element resources in a system. COR provides functions that enable read operation on the Managed Objects. These functions are used to access the values of the attributes of an object known by its MoID. Once an application discovers the object hierarchy, it can use this interface to retrieve the attribute values. &lt;br /&gt;
&lt;br /&gt;
'''Definitions'''&lt;br /&gt;
&lt;br /&gt;
* '''Management Station ''': This is used to view the current status of the managed entity or change its state. This can be any management process for example it can be a SNMP MIB browser, a CLI, web-based application etc. &lt;br /&gt;
* '''The Object Implementer (OI)''': It is a software component which owns the managed resource. There can be multiple OIs for a managed object but out of all of them there can be only one OI which will act as a primary OI. The get request from the management stations lands in the COR and then it contacts the OI(s) of a managed resource. The primary OI holds the latest value of a runtime attribute. For the configuration attribute there are corresponding attributes present at all the OIs. So when any set request is send by north bound, all the OIs are contacted to update their corresponding attribute.&lt;br /&gt;
* There are two types of attributes that can be part of a managed resource, one is called configuration and other is runtime or transient attribute. There are certain properties of these attributes called as attribute-flag which are as follows:&lt;br /&gt;
** '''Cached''' - The attribute which is stored in COR. The latest value of cached attribute is always obtained from COR. &lt;br /&gt;
** '''Persistent''' - This property of the attribute gives that the attribute value should be stored in a presistent Db file and should be restored in case of restart. Only a cached attribute can be persistent. &lt;br /&gt;
** '''Writable''' - An attribute which can be changed at runtime is called writable. This shows that it can be settable from the north bound. A initialized attribute is always non-writable.&lt;br /&gt;
** '''Initialized''' - A key attribute of a class has this property. This attribute is for example a index attribute which can be used to identify a row in a snmp table. The value of this attribute should be supplied while creating the object of this class. These attributes are non-writable at runtime.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Types of Attributes====&lt;br /&gt;
&lt;br /&gt;
The different types of attributes of an object are:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;'''Configuration Attribute''' - A configuration attribute is used to store the configuration information about the managed resource. For example the maximum memory size can be a configuration attribute of a process resource. These attributes are always cached and persistent. These attribute are always writable to the north bound unless it is marked as initialized, as a initialized or a key attribute should not be modified at runtime.&lt;br /&gt;
&amp;lt;li&amp;gt;'''Runtime Attribute''' - This attribute is the property of the managed resource that keeps changing so only the primary object implementer (OI) of this resource manages its latest value. For example - If a component is managing a process running in the system, then information about the current memory used by a process is known only to the component. These attributes are not writable from management station. There is a slight variation of the runtime attribute when it is very slow changing for example - The number of days a process has run. These kind of attributes can be cached in the COR. Whenever it changes, the primary OI can set this attribute. So a runtime attribute is cached or non-cached in COR based on its nature. It can be persistent only when it is cached.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:OpenClovis_Note.png]]The runtime cached attribute is writable only from the primary OI. It is non-writable to the north bound agent.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A managed resource can contain both configuration attribute and runtime attribute based on the requirement. The configuration attribute will be used to store the configuration information. The runtime attribute is the transient property of the managed resource. Normally its value is maintained by the primary OI. But if it is a very slow changing one, it should be stored in COR which is updated time to time in COR by the primary OI.&lt;br /&gt;
&lt;br /&gt;
====Implementation of Configuration and Runtime Attributes====&lt;br /&gt;
&lt;br /&gt;
For example, COR has objects for every process running in the system. Each process has various attributes associated with it, such as name, process Id, memory usage, maximum memory size, maximum number of open files and so on. Whenever a process starts, COR creates an object of type process with specific attributes. The objects represented in COR are identified by their MoID. You must specify the MoID of an object to perform get and set operations it. When a user queries for a list of all the processes running in the system, COR returns the MoIDs for them based on the number of instances of process managed resources created. The northbound interface creates a table with the MoIDs of all the process.&lt;br /&gt;
&lt;br /&gt;
Now suppose multiple processes are running on a node. Each process occupies some memory that changes during runtime. These processes are treated as managed resources in COR. The management stations can monitor these processes and send requests to know the memory usage of every process at a given time. Since the memory occupied by these processes varies at runtime, this data should not be stored in COR. This attribute is a candidate of being a runtime attribute of the process MO class.&lt;br /&gt;
&lt;br /&gt;
If a transient property of the managed resource changes very slowly then that attribute can be cached in COR. For example the number of hours a process has run. If needed this attribute can also be persistent in COR. The primary OI of the managed resource has to update its value in COR whenever it changes.&lt;br /&gt;
&lt;br /&gt;
The configuration attribute is the placeholder for the configuration information of the managed object. It is always cached in COR. It can be persistent in COR if required. For example, If the component wants to manage a process running in a system which has an attribute which gives the maximum number of open files it can have, then it can be made as a configuration attribute for the process managed resource.&lt;br /&gt;
&lt;br /&gt;
====Importance of OI for attribute types====&lt;br /&gt;
&lt;br /&gt;
A managed object can contain both configuration and runtime attributes. A managed object is managed by the object implementer. These are hidden from the management station. Whenever a request is sent from the north bound interface of a management station, the COR takes care of routing the request to the respective OI(s) of the managed object.&lt;br /&gt;
&lt;br /&gt;
The Object Implementer will be involved while doing get operation on a runtime attribute or while performing a set operation on a configuration attribute.&lt;br /&gt;
&lt;br /&gt;
When a read operation is done on a runtime or transient attribute, a particular OI is contacted to get the value of the attribute. The OI that provides the runtime value of an attribute is the primary OI.&lt;br /&gt;
&lt;br /&gt;
For example in a 2N Redundancy model, one process acts as the ACTIVE and the other as the STANDBY. When you perform a get operation, since the ACTIVE process provides the requested value, so it is the primary OI.&lt;br /&gt;
&lt;br /&gt;
For a configuration attribute of a managed resource in COR, there is a corresponding attribute present in the OI. For any set operation, all the OIs should be contacted inorder to facilitate the modification of their attribute. The request from the north bound first land in COR. It takes care of routing these requests to all the OIs where they can update the respective data bases. Also this set operation updates the value of configuration attribute in COR. So it always has the latest value of a configuration attribute.&lt;br /&gt;
&lt;br /&gt;
The user can specify a particular OI to act as the Primary OI for a managed resource. Setting a OI as the Primary OI involves some restrictions. Please refer the documentation of the API clCorPrimaryOISet in the API reference guide for more information.&lt;br /&gt;
&lt;br /&gt;
====Retrieving Values of Attributes====&lt;br /&gt;
&lt;br /&gt;
The COR provides the mechanism to get the value of the multiple runtime and configuration attributes in one request. This can be done using the bundle get feature of COR.&lt;br /&gt;
&lt;br /&gt;
You can retrieve the value of a runtime attribute of an object at a given time in order to know the value of the transient state of the managed resource. For example, to know the memory usage of a process, you must communicate with the process that implements the object (OI). &lt;br /&gt;
&lt;br /&gt;
A runtime attribute can be stored at the OI if its frequency of change is high. In this case the Primary Object Implementer (OI) is a process that is responsible for providing the value of non-cached runtime attributes. When you query for memory usage of a process, COR communicates with its primary OI to retrieve the information as shown in Figure [[#Accessing MO Attributes | Accessing MO Attributes]]. Depending on the frequency of update, the information returned can contains an earlier value. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;[[File:OpenClovis_Note.png]]Only one Primary OI exists for a particular object in the system.&lt;br /&gt;
&amp;lt;span id='Accessing MO Attributes'&amp;gt;&amp;lt;/span&amp;gt;[[File:SDK_AccessingMOAttributes.png|frame|center|'''Accessing MO Attributes''']]&lt;br /&gt;
&lt;br /&gt;
In the other case, if the frequency of change for a runtime attribute is very low, then it can be cached in COR. So COR itself can provide its latest value in the case of a get operation. The primary OI has to set the latest value of this attribute in COR whenever it is changing.&lt;br /&gt;
&lt;br /&gt;
The COR always stores the latest value of the configuration attribute. So in case of a get operation on this attribute, the COR gives its value.&lt;br /&gt;
&lt;br /&gt;
====Setting Values of Attributes====&lt;br /&gt;
&lt;br /&gt;
You can set the values of configuration attributes from the northbound interface. SAFplus Platform provides an efficient way of performing and managing set operations on a large number of attributes. The set on the runtime attribute is not allowed from the north bound.&lt;br /&gt;
&lt;br /&gt;
Similarly, you can set the values of a common attribute that is shared among multiple processes running in the system, for example the max limit of memory of all processes. A common attribute is not contained in a particular object but is centralized in one object only. Such attributes are shared by all the process running in the system. &lt;br /&gt;
&lt;br /&gt;
When you modify a configuration attribute of a shared managed resource, all the OIs associated with the process are invoked where they can do the respective changes to their attribute. For example : if the configuration attribute corresponding to the maximum limit of memory in the &amp;quot;process&amp;quot; managed resource is changed and if it is being managed by multiple Object implementers, then COR will route the request to each of the OI where they can change the corresponding parameter for the process they are managing.&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Note.png]]When a set operation is performed on more than one process simultaneously, multiple OIs are invoked whereas in a get operation, only one OI is invoked.&lt;br /&gt;
&lt;br /&gt;
====Storing Values of Attributes====&lt;br /&gt;
&lt;br /&gt;
The management station that send requests from the northbound interface are unaware of the OI. It communicates with COR to retrieve any information. If the attribute is configured as cached, the information is contained within the object. If the attribute is configured as persistent, the information is stored in a file system or a permanent storage disk. The persistent attributes are always cached. &lt;br /&gt;
&lt;br /&gt;
By default, the transient attributes are neither cached nor persistent, since COR does not contain its values. But it can be configured as cached if its value does not change frequently. The OI updates COR only when the value changes to reduce network traffic. If the runtime attribute is cached, the value of the attribute is saved in COR since it changes only periodically. For example, you want to know for how many hours a process is run. So, the information is updated once in every hour. If the cached runtime attribute is not persistent, COR does not save the data.&lt;br /&gt;
&lt;br /&gt;
The configuration attributes are always cached in COR. These attributes are always persistent.&lt;br /&gt;
&lt;br /&gt;
====Raising Alarms====&lt;br /&gt;
&lt;br /&gt;
You can configure the process and get the value of runtime attributes from the northbound interface. A process can have its memory limits as high, medium and low. When the memory of a process exceeds its max limit, you can configure your application to raise alarms. An alarm is a communication medium from the OI to the northbound if an unexpected behavior is observed or a fault condition occurs. Currently, the northbound is a &amp;quot;pull&amp;quot; model as it is not informed about any value unless it sends a get request.&lt;br /&gt;
&lt;br /&gt;
====Types of Process Classes====&lt;br /&gt;
&lt;br /&gt;
The following are the two types of process classes:&lt;br /&gt;
* provClass&lt;br /&gt;
* alarmClass&lt;br /&gt;
&lt;br /&gt;
You must specify the service Id to access a process class. You can define the service Id of a class to assign it as either a provClass or an alarmClass type. The provClass contains both configuration and runtime attributes. &lt;br /&gt;
&lt;br /&gt;
A node can have multiple process classes running on it. These classes contain various attributes. The hierarchy from the node to the attribute is represented by a MO class path. A process running in a system is uniquely identified by its MoId, that is, &amp;lt;code&amp;gt;&amp;lt;node_name&amp;gt;.&amp;lt;node_instance&amp;gt;/&amp;lt;process_name&amp;gt;.&amp;lt;process_instance&amp;gt;&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
You must specify the MoID of the object from the northbound interface to communicate with COR and retrieve or modify its value. The northbound interface is exposed to different management stations such as CLI, SNMP, XML and so on. The requests from the northbound interface are passed through a Mediation Layer before it reaches COR. The Mediation Layer translates the requests sent through the MIB table from the northbound interface into COR understandable format as shown in Figure [[#Accessing MO Attributes | Accessing MO Attributes]]. &lt;br /&gt;
&lt;br /&gt;
To access a particular attribute, you must specify the MoId, the ServiceId and the attributeId. Generally, the configuration from the northbound interface is performed as a bulk operation. When a set operation is performed, OI communicates with the COR. You can provide a transactionId to apply all the configuration changes in bulk and save them in COR in one transaction. This reduces the frequency of communication between COR Server running on the System Controller node and COR client running on worker blades. &lt;br /&gt;
&lt;br /&gt;
For example, you want to change an attribute, such as the max memory limit of all the processes running on a node. An attribute can be in the form of an array and can be updated after a certain index. If a get is performed on the transients attribute, and the primary OI is not available for a few attributes, it returns only those attributes that are associated with Primary OI. &lt;br /&gt;
&lt;br /&gt;
For example, an object contains memory configuration of all the processes running on a node. When a process is started, it reads the object in COR and applies its respective configuration. So every process knows the objects that it belongs to and becomes the OI of that object.&lt;br /&gt;
&lt;br /&gt;
===Provisioning OI Callbacks===&lt;br /&gt;
&lt;br /&gt;
This section will describe the flow of OI callbacks which will get called whenever the managed resources are modified in COR and also during OI initialization if the resources are already present in COR.&lt;br /&gt;
&lt;br /&gt;
====Flow of OI callbacks when the resource is modified in COR====&lt;br /&gt;
&lt;br /&gt;
When the resource managed by a OI is modified in COR, a transaction is getting initiated and all the OIs managing that resource will be involved in the transaction. The diagrams will show the flow by which the OI's callbacks will get called.&lt;br /&gt;
&lt;br /&gt;
=====Flow Diagrams=====&lt;br /&gt;
&lt;br /&gt;
These diagrams will show the flow for the following cases :&lt;br /&gt;
&lt;br /&gt;
*'''Case 1 :''' If the transaction contains CREATE jobs.&lt;br /&gt;
*'''Case 2 :''' If the transaction contains multiple SET jobs for different MOs.&lt;br /&gt;
*'''Case 3 :''' If the transaction contains DELETE jobs.&lt;br /&gt;
*'''Case 4 :''' If the transaction contains READ jobs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''CASE 1 :''' The Transaction contains CREATE jobs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File: ProvCallbacksFig_1_1.png|frame|center|'''Transaction which contains CREATE jobs''']]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Txn Cycle :''' TXN START -&amp;gt; VALIDATE -&amp;gt; ROLLBACK -&amp;gt; TXN END&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File: ProvCallbacksFig_1_2.png|frame|center|'''Flow of OI callbacks for ROLLBACK for CASE 1''']]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Txn Cycle :''' TXN START -&amp;gt; VALIDATE -&amp;gt; UPDATE -&amp;gt; TXN END&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File: ProvCallbacksFig_1_3.png|frame|center|'''Flow of OI callbacks for UPDATE for CASE 1''']]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''CASE 2 :''' Transaction contains multiple SETs for different MOs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File: ProvCallbacksFig_2_1.png|frame|center|'''Transaction which contains SET jobs for different MOs''']]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Txn Cycle :''' TXN START -&amp;gt; VALIDATE -&amp;gt; ROLLBACK -&amp;gt; TXN END&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File: ProvCallbacksFig_2_2.png|frame|center|'''Flow of OI callbacks for ROLLBACK for CASE 2''']]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Txn Cycle :''' TXN START -&amp;gt; VALIDATE -&amp;gt; UPDATE -&amp;gt; TXN END&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File: ProvCallbacksFig_2_3.png|frame|center|'''Flow of OI callbacks for UPDATE for CASE 2''']]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''CASE 3 :''' Transaction contains a DELETE jobs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File: ProvCallbacksFig_3_1.png|frame|center|'''Transaction which contains DELETE jobs''']]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Txn Cycle :''' TXN START -&amp;gt; VALIDATE -&amp;gt; ROLLBACK -&amp;gt; TXN END&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File: ProvCallbacksFig_3_2.png|frame|center|'''Flow of OI callbacks for ROLLBACK for CASE 3''']]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Txn Cycle :''' TXN START -&amp;gt; VALIDATE -&amp;gt; UPDATE -&amp;gt; TXN END&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File: ProvCallbacksFig_3_3.png|frame|center|'''Flow of OI callbacks for UPDATE for CASE 3''']]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''CASE 4 :''' Transaction contains READ jobs for a MO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File: ProvCallbacksFig_4_1.png|frame|center|'''Transaction which contains READ jobs for a MO''']]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Txn Phase :''' READ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File: ProvCallbacksFig_4_2.png|frame|center|'''Flow of OI callbacks for READ for CASE 4''']]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Flow of OI callbacks when it is coming up====&lt;br /&gt;
&lt;br /&gt;
Pre-provisioning is done when the application is coming up. Prov will read the MOs in COR for which the application is interested and call the application's callbacks, so that it can know the current values of the Objects in COR.&lt;br /&gt;
&lt;br /&gt;
The below diagrams will show the flow by which the application's callbacks will be called during pre-provisioning.&lt;br /&gt;
&lt;br /&gt;
For example if there are two objects \A:0 and \B:0 present in COR which contains the following attributes. &lt;br /&gt;
&lt;br /&gt;
[[File: ProvCallbacksFig_5_1.png|frame|center|'''COR objects for which a OI is interested''']]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
then the pre-provisioning will be done in the following manner.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Flow Diagram=====&lt;br /&gt;
&lt;br /&gt;
[[File: ProvCallbacksFig_5_2.png|frame|center|'''Flow of OI callbacks during pre-provisioning''']]&lt;br /&gt;
&lt;br /&gt;
===Developing SNMP Subagent for Custom MIBs===&lt;br /&gt;
&lt;br /&gt;
A Management Information Base (MIB) is a type of database used to manage entities in a communications network. It comprises a collection of objects in a (virtual) database which are used to manage entities (such as routers and switches) in a network. A MIB defines the attributes/information of resources, but is only a schema of information. This schema is populated to create a custom MIB.&lt;br /&gt;
&lt;br /&gt;
A SNMP subagent is a process that handles all set/get operations for the MIB.  The subagent registers with the SNMP daemon to inform it that all operations for that MIB should be passed on to the subagent.  Typically, a SNMP command would come from a monitoring or management station to the SNMP daemon. The daemon then passes on the command to the subagent.  The subagent communicates to COR through a mediation library to set or retrieve the values in COR, and returns the result via the SNMP daemon.&lt;br /&gt;
&lt;br /&gt;
With OpenClovis 3.0, the SNMP subagent can now be automatically generated.  This section will walk you through the steps to configure and generate the subagent. The OpenClovis IDE is capable of fully generating an SNMP subagent from a MIB or set of MIBs.  &lt;br /&gt;
&lt;br /&gt;
====Importing a MIB====&lt;br /&gt;
&lt;br /&gt;
From the menu, select '''Clovis -&amp;gt; Importing Mib Objects ...'''. Click on the '''Load''' button to browse to the location of your MIB file.  Once the MIB has been loaded, click on the MIB entry in upper box, and its associated MIB objects will appear in the lower box. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id='Selecting_MIB_Objects'&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:SDK_SNMP_SelectMibs-fig1.png|frame|center| '''Selecting MIB Objects''']]&lt;br /&gt;
&lt;br /&gt;
In the example shown in Figure [[#Selecting_MIB_Objects|Selecting MIB Objects]], DEMO-MIB has three different objects.  One is a set of scalars, the other a table, and the last is a trap.  Select the MIB objects you want to import into your model, and then click on the '''Import''' button.  &lt;br /&gt;
&lt;br /&gt;
If you are importing objects from multiple MIBs, load all the MIB files.  Then for each MIB, you will need to select the MIB from the upper box, and highlight each MIB object from the lower box and import it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id='Resource_Editor_with_MIB_Objects'&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:SDK_SNMP_ResourceEditorWithMibObjects-fig2.png|frame|center| '''Resource Editor with MIB Objects''']]&lt;br /&gt;
&lt;br /&gt;
When finished, you should see in the resource editor, something similar to Figure [[#Resource_Editor_with_MIB_Objects| Resource Editor with MIB Objects]]. You may have noted that three MIB objects were listed in the DEMO-MIB example, but only two are present in the resource editor.  The third object was a trap, which gets imported as an alarm.&lt;br /&gt;
&lt;br /&gt;
In the example shown, there is now an MO called demoStatusTable.  In reality, this only represents one row of a table.  To increase the maximum number of rows in the table, double click on the table.  Under the '''Resource''' options, increase the number of '''Maximum Instances''' to match your needs.  In this example shown in Figure below, there are a maximum of 10 rows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id='Select_Maximum_Instances'&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:SDK_SNMP_MaxInstances-fig3.png|frame|center| '''Select Maximum Instances''']]&lt;br /&gt;
&lt;br /&gt;
====SNMP Traps====&lt;br /&gt;
&lt;br /&gt;
As mentioned earlier, the trap was imported as an alarm.  To adjust the type and severity of an imported alarm, from the menu select '''Clovis -&amp;gt; Alarm Profile ...'''.  See Chapter ''Defining Alarm Profiles'' of the ''OpenClovis IDE User Guide'' for further information on the configuration of alarms.&lt;br /&gt;
&lt;br /&gt;
When your alarm is appropriately configured, you can associate it with a resource.  Double-click on the resource you wish to have this alarm. Under '''alarmManagement''', click on the '''Enable''' checkbox.  Then under '''Associate Alarms''', highlight the alarm(s) and click on the '''Add''' button.  See Figures [[#Alarm_Management|Alarm Management]] and [[#Associate_Alarms|Associate Alarms]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id='Alarm_Management'&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:SDK_SNMP_AlarmManagement-fig4.png|frame|center| '''Alarm Management''']]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id='Associate_Alarms'&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:SDK_SNMP_AlarmManagement-fig5.png|frame|center| '''Associate Alarms''']]&lt;br /&gt;
&lt;br /&gt;
====Configuring the Subagent====&lt;br /&gt;
&lt;br /&gt;
The SNMP subagent is a SA Aware Component.  To configure a component to be a subagent, you need to do the following steps.  First, double-click on the component to see the properties, and set '''Is SNMP Sub-Agent''' to '''true''' as shown in Figure [[#SNMP_Component_Properties|SNMP Component Properties]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id='SNMP_Component_Properties'&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:SDK_SNMP_SnmpComponentProperties-fig6.png|frame|center| '''SNMP Component Properties''']]&lt;br /&gt;
&lt;br /&gt;
Next, right-click on the component and select '''Sub-Agent Properties''' from the pop up menu. Here there are two fields that need to be filled out.  See Figure below. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id='SubAgent_Properties'&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:SDK_SNMP_SubAgentProperties-fig7.png|frame|center| '''SubAgent Properties''']]&lt;br /&gt;
&lt;br /&gt;
The first field will set SNMP's MIBDIRS environment variable necessary during the the subagent code generation.  This is a colon ':' separated value containing all the directories to look for MIB files in.  For this to work properly, you will need to make sure that net-snmp's &amp;lt;code&amp;gt;mibs&amp;lt;/code&amp;gt; directory is included, which would be in your clovis installation directory.  If you installed the Clovis software in the default location, it would be &amp;lt;code&amp;gt;/opt/clovis/buildtools/local/share/snmp/mibs&amp;lt;/code&amp;gt;.    &lt;br /&gt;
&lt;br /&gt;
The second field would be the top level node name for your MIB.  If you just have one MIB, this would be the MODULE-IDENTITY name in your MIB file.  If you have several MIB files, it would be the MODULE-IDENTITY of the top layer in your MIB tree.&lt;br /&gt;
&lt;br /&gt;
=== SAFplus Platform Manageability End to End===&lt;br /&gt;
&lt;br /&gt;
The SAFplus Platform components which are used for providing the manageability infrastructure are as follows:&lt;br /&gt;
* Clovis Object Repository&lt;br /&gt;
* SNMP sub agent&lt;br /&gt;
* Mediation library&lt;br /&gt;
* Provisioning library&lt;br /&gt;
* Alarm Management&lt;br /&gt;
* Fault Management &lt;br /&gt;
&lt;br /&gt;
This section describes about how these components interact to provide the resource management and fault reporting capability to the SAFplus Platform middleware.	&lt;br /&gt;
&lt;br /&gt;
==== North bound Requests ====&lt;br /&gt;
The management station requests - walk, set or get operations - are handled by the SAFplus Platform middleware using some of the above mentioned components. These operations can be done from the management station on one table or it can span multiple tables. Each table represent one managed entity in COR. The rows of the table maps to different instances of the resource. Each column of the table denotes different attributes of the resource. All this information are stored in COR. When the GET, SET or a WALK request reaches SNMP sub-agent, it is translated by the mediation library into a COR request and sent to it. This data is also cached in the sub-agent which is retrieved from COR based on the expiration of caching frequency time period.&lt;br /&gt;
&lt;br /&gt;
The SET and GET operation can be done in a singular or a bulk manner. The bulk set operation is done using the transaction. The SET operation is validated with all the object implementers of the managed resource and only when all of them agrees to the change, then only it is updated otherwise the rollback is done on all of them. The Get operation can be done for configuration and transient attributes. For configuration information only COR is contacted but for transient attribute the primary OI is contacted to get its latest value.&lt;br /&gt;
&lt;br /&gt;
The diagram below shows the SNMP request being processed by the SAFplus Platform. The request is first received by the SNMP sub-agent. This request is then translated into a COR based request by the mediation library and sent to it for processing. Based on the type of request, COR processes it locally or sends it to the Object implementers. If it is a SET request, COR sends the request to the Object implementers where provisioning library attached to it does the job of validating the request and then updating it on their end. If it is a GET request or WALK request on a transient attribute, it is sent to the Primary Object Implementer to get the latest value of this attribute. If it is a get request or a walk on a cached attribute, the COR will process it locally and send the response.  &lt;br /&gt;
&amp;lt;span id='SNMP SET/GET/WALK request processing in SAFplus'&amp;gt;&amp;lt;/span&amp;gt;[[File:snmp-set-get-request.png|frame|center| '''SNMP SET/GET/WALK request processing in SAFplus''' ]]&lt;br /&gt;
&lt;br /&gt;
==== Reporting failures in the system via alarms ====&lt;br /&gt;
The asynchronous events happening in the system are reported as alarms. These alarms can be modeled as traps in the MIB. This MIB cab be imported using IDE which will take care of configuring the alarms. So whenever these alarms occur in the system, they are reported as traps to the north bound interface.&lt;br /&gt;
&lt;br /&gt;
All the alarms modeled in the system can be configured to be raised by some application using the IDE.  So a component can be assigned the task of raising these alarms based on certain conditions. When these alarms are published, the mediation library along with the SNMP-subagent takes care of sending these configured alarms as traps to the north bound entity. The COR server stores the latest information about the alarm.&lt;br /&gt;
&lt;br /&gt;
The diagram below shows the trap reporting feature of SAFplus Platform. A component with the alarm client library and having alarm configured through IDE, can raise the alarm. This component can run on any node. In the figure it is shown as a part of payload node. The SNMP sub-agent can be part of any node. In the diagram it is shown as part of controller node. Once the alarm is raised, the alarm server publishes the event. The mediation library attached to the SNMP sub-agent listens for this event. It verifies whether the alarm raised is configured to be raised as trap. If it is so, then it forwards the request to the SNMP sub-agent which takes care of reporting this alarm as trap to the north bound management station. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id='SNMP Trap reporting using SAFplus'&amp;gt;&amp;lt;/span&amp;gt;[[File:SDK_SendingTraps.png|frame|center| '''SNMP Trap reporting using SAFplus''' ]]&lt;br /&gt;
&lt;br /&gt;
==== Fault reporting and repair action ====&lt;br /&gt;
&lt;br /&gt;
The fault management feature of the manageability infrastructure allows the application to take customized action when the faults occur in the system. There are two kinds for fault handling supported by the Fault Manager which are described below.&lt;br /&gt;
*'''Fault Reporting'''&lt;br /&gt;
The fault reporting is done for non-service impacting alarms. The non-service impacting alarm are the one with severity less then major that is minor, warning and indeterminate. For each alarm category and severity combination, there are five escalation levels defined. For each escalation level there can be a callback associated and inside that user defined action can be taken. The fault manager calls the callback based on the category + severity + escalation level. The callback on the level one is called if the fault occur for the first time. The fault level is escalated, when the frequency of fault is more than the probation period. Both the callbacks and the probation period are configurable through IDE.&lt;br /&gt;
* '''Fault Repair'''&lt;br /&gt;
The fault repair can be done by the application which wants to trigger an action based on the service impacting problem happening on the managed resource. The managed resource on which repair action need to be done are modeled with an alarm MSO. Whenever a problem is detected on such resource, an alarm is reported to the alarm server.  The alarm handle obtained after alarm raised or the alarm handle obtained in the alarm event delivery is used in the repair action. This is necessary as fault repair action is done only on the service impacting alarms. The fault manager on receiving the repair action request calls the callback assigned to the resource.  This callback function is generated by the IDE for every resource having alarm MSO.&lt;br /&gt;
&lt;br /&gt;
The figure shows the fault reporting and repair action feature of the SAFplus Platform. Whenever an alarm is raised in the system, the Alarm Server decides whether it should be reported as fault or not. Only the non-service impacting alarms are reported as fault. So for all these alarms, it contacts Fault Manager which takes care of calling the registered callbacks. The figure also describes the fault repair actions feature. The component doing the repair action should have the alarm handle corresponding the alarm raised. The alarm repair action should be done for service impacting alarms. So a component raising this alarm or listening for the alarm events, can trigger the repair action. In the diagram the &amp;quot;Fault Mgmt App&amp;quot; shows as alarm reporter as well alarm listener. There can be two different applications doing this job. So a component doing fault repair action can be the one which reports the alarm or the one which listens for the alarm notifications.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id='Fault handling using SAFplus'&amp;gt;&amp;lt;/span&amp;gt;[[File:SDK_FaultReporting.png|frame|center| '''Fault handling using SAFplus''' ]]&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/sdkguide/highavailability</id>
		<title>Doc:latest/sdkguide/highavailability</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/sdkguide/highavailability"/>
				<updated>2010-08-27T03:44:26Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=='''High Availability'''==&lt;br /&gt;
&lt;br /&gt;
High Availability (HA) is used when referring to a system that is capable of providing service &amp;quot;most of the time.&amp;quot;&lt;br /&gt;
High availability can be achieved by combining many different design concepts and system characteristics, including hardware and software level redundancy, fault detection capabilities, component failover, fault isolation, fault recovery, alarm notification, and so on. This chapter provides a short introduction to the key concepts, and presents the relevant features and services of ''OpenClovis SAFplus''. &lt;br /&gt;
&lt;br /&gt;
'''Key Topics:''' &lt;br /&gt;
* [[#HA Concepts, Terms, and Definitions | HA Concepts, Terms, and Definitions]] &lt;br /&gt;
* [[#SAFplus Platform Features for High Availability | SAFplus Platform Features for High Availability]] &lt;br /&gt;
* [[#Availability Management Framework (AMF) | Availability Management Framework (AMF)]] &lt;br /&gt;
* [[#Fault Detection and Handling | Fault Detection and Handling]] &lt;br /&gt;
* [[#Checkpointing Service (CPS) | Checkpointing Service (CPS)]] &lt;br /&gt;
* [[#Group Membership Service (GMS) | Group Membership Service (GMS)]] &lt;br /&gt;
* [[#Typical Usage of High Availability | Typical Usage of High Availability]] &lt;br /&gt;
&lt;br /&gt;
===HA Concepts, Terms, and Definitions===&lt;br /&gt;
&lt;br /&gt;
Availability is a measure of the probability that a service is available for use at any given instant. It allows service failure, with the assumption that the service restoration is imminent. The key to high availability is to continue the service without significant interruption.&lt;br /&gt;
&lt;br /&gt;
The quantitative definition of ''availability'' is:&lt;br /&gt;
&lt;br /&gt;
 Availability = MBTF/(MBTF+MTTR)= 0.9xxx&lt;br /&gt;
&lt;br /&gt;
where MTBF is the mean time between failures, and MTTR is the mean time to repair. In layman terms, &amp;lt;code&amp;gt;Availability&amp;lt;/code&amp;gt; is simply the percentage uptime of the system, that is, the percentage of time the system is providing the given service. As this number is typically always below but very close to 1.0 in a highly available system (e.g., 0.999), it is often expressed in terms of &amp;quot;N-nines&amp;quot;. The table below illustrates the downtime of systems with various &amp;quot;N-nines&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Table_SysReq_DevHost&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&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; | '''Availability and Downtime '''&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot; width=&amp;quot;250&amp;quot;| Availability&lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot;| Downtime&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
two-nines (99%)&lt;br /&gt;
|&lt;br /&gt;
~3.7 days/year (~14 min/day)&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
three-nines (99.9%)&lt;br /&gt;
|&lt;br /&gt;
~ 8.75 hr/year&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
four nines (99.99%)&lt;br /&gt;
|&lt;br /&gt;
~ 1 hr/year&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
five nines (99.999%)&lt;br /&gt;
|&lt;br /&gt;
~ 5.25 min/year&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The five key system characteristics contributing to HA are:&lt;br /&gt;
* '''Failure detection''': how reliably and quickly can failure be detected&lt;br /&gt;
* '''Failure notification''': how reliably and quickly can the information of the failure be passed to an authority that can decide how to handle the failure&lt;br /&gt;
* '''Response time''': how long it takes for the failure handling authority to process the information about the failure and come to a decision on how to best handle the failure&lt;br /&gt;
* '''Repair/replacement time''': how long it takes to repair or replace the failed component&lt;br /&gt;
* '''Recovery/restart/reboot time''': how long it takes to restore the original system state and hence restore the service.&lt;br /&gt;
&lt;br /&gt;
Each of the above five system characteristics directly contribute to the downtime after a failure, and hence to the ''availability'' of the system. However, a few design concepts can greatly reduce many of these times and even eliminate the affect of some. These are:&lt;br /&gt;
&lt;br /&gt;
* '''Redundant components with failover capabilities''': In a system where the same service can be provided by two or more identical redundant components, the service can be quickly recovered before the failed component is actually repaired or restarted, by switching the service over to a healthy component. This effectively eliminates the repair/replacement time from contributing to the ''availability''. It replaces with a new characteristics, however: the '''failover time'''. Redundancy can be provided at various levels:&lt;br /&gt;
** Hardware (e.g., redundant hardware elements in an AdvancedTCA chassis&lt;br /&gt;
** Software (e.g., standby software components)&lt;br /&gt;
* '''Automated failure detection, response, and reconfiguration''' By fully automating the entire event flow from fault detection to recovery (and thereby excluding human intervention from the picture), the remaining four factors can be greatly reduced. In modern systems, such as built on OpenClovis SAFplus Platform, the service can be recovered by means of component failover within tens of milliseconds from the time the failure occurred.&lt;br /&gt;
&lt;br /&gt;
OpenClovis SAFplus Platform provides infrastructure for the end-to-end life-cycle of failure handling, including failure detection, to policy-based recovery decision making, through failover and fault repair operations. However, for custom software applications to be able to quickly fail over without major disturbance to the rest of the system, the applications themselves need to exhibit some special characteristics. These include:&lt;br /&gt;
* capability to move state data and context among redundant components&lt;br /&gt;
* move the service from one component to another in a way that the failover is transparent to the rest of the system&lt;br /&gt;
&lt;br /&gt;
In addition to the above mentioned end-to-end failure handling, OpenClovis SAFplus Platform provides additional services to allow application programmers to implement the above characteristics. These include checkpoint service (to save, pass, and restore system state) and location-transparent addressing (to hide the failover from other components).&lt;br /&gt;
&lt;br /&gt;
Redundant components providing the same service can be arranged in many relationships. The most common arrangements are:&lt;br /&gt;
* 2N (1+1) redundancy: for every active component there is exactly one standby component&lt;br /&gt;
* M+N redundancy: for every M active components there are N standby components, any of which is ready to take over the service from any of the active components. (Note that 1+1 is merely a special, but most common, case of M+N.)&lt;br /&gt;
Additional models, such as N-Way and N-Way-Active, are also often used. See a more authoritative description in the ''Application Interface Specification (AIS)'' from the SA Forum.&lt;br /&gt;
&lt;br /&gt;
Before describing the individual models it may be useful to describe the SA Forum HA model and its associated terminology.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id='SAF_HA_Model'&amp;gt;&amp;lt;/span&amp;gt;[[File:SDK_SAF_HA_Model.png|center|frame|'''SA Forum HA Model''']]&lt;br /&gt;
&lt;br /&gt;
The SAF concepts introduced in the figure can be explained as follows:&lt;br /&gt;
&lt;br /&gt;
* '''Component''': It is the smallest logical entity on which AMF performs error detection, isolation, recovery, and repair. A component is a single process or multiple processes that AMF manages based on its configured attributes. A component is further classified depending on whether it is an SA-aware or a non SA-aware, whether it is pre-instantiable or not and whether it is a proxy for other components or can be proxied by other components. &amp;lt;br&amp;gt;A component is a hardware or a software entity or a combination of both. A hardware component is a blade, a standalone PC, a PMC or any entity that can be considered as one distinct unit for the purpose of error isolation, recovery and repair. A software component is realized as a process, a thread, or a collection of processes. Hardware entities are typically viewed as either non-preinstantiable, non-proxied components or proxied components. They are not directly controlled by the HA infrastructure. All interactions with them must go through a software proxy component, which can be directly controlled by the HA infrastructure.&lt;br /&gt;
* '''Component Service Instance (CSI)''': It represents a unit of workload that is assigned to a component. Each CSI has a set of attributes that characterizes the workload assigned to the component. These attributes are not used by AMF and are passed to the components. &lt;br /&gt;
* '''Service Instance (SI)''': It is an aggregation of various CSIs that can be assigned to the components in the SU. These CSIs can be ranked in order or priority. &lt;br /&gt;
* '''Service Unit (SU)''': It is an aggregation of one or more components that are managed together to provide a service. Redundancy is provided to the SU as a whole. This implies that all the processes that are clubbed together with an SU will switchover or failover as a unit.&lt;br /&gt;
* '''Service Group (SG)''': It is a collection of service units (SUs) of the same type that collectively provide service availability for one or more service instances. A redundancy model associated with the service group defines how the service units in the group are used to provide service availability. An SG is defined at run-time and is dynamically populated with the required SUs.&lt;br /&gt;
* '''Node''': A logical representation of a physical node that houses Service Units and components.&lt;br /&gt;
* '''Cluster''': It comprises the entire system containing multiple nodes.&lt;br /&gt;
&lt;br /&gt;
OpenClovis SAFplus Platform provides a SA Forum compliant implementation of the 2N and M+N redundancy models. These two models can be used to provide Active/Active and N Way Active functionality if desired as well. &lt;br /&gt;
&amp;lt;span id='SAF_Compliant_Redundancy_Models'&amp;gt;&amp;lt;/span&amp;gt;[[File:Ha_models.png|center|frame|'''SA Forum Compliant Redundancy Models''']]&lt;br /&gt;
&lt;br /&gt;
The figure shows a SA Forum compliant 1:1 and 2:1 redundancy model applied to a Cluster of Nodes. A ''Service Engine'' is interchangeable with  Node in this dicusssion.&lt;br /&gt;
&lt;br /&gt;
===SAFplus Platform Features for High Availability===&lt;br /&gt;
&lt;br /&gt;
OpenClovis SAFplus Platform includes a powerful set of integrated High Availability services that are used to manage resource failures without interrupting services. High Availability of services provide software exception handling and recovery mechanisms. OpenClovis SAFplus Platform services can identify their failure modes and can implement system-defined mechanisms. The following features are supported by SAFplus Platform: &lt;br /&gt;
&lt;br /&gt;
====SA Forum Compliant Model and AMF APIs====&lt;br /&gt;
Availability Management Framework (AMF) closely follows the SA Forum AMF specification.&lt;br /&gt;
&lt;br /&gt;
====Creation of HA Models====&lt;br /&gt;
HA Model definitions and their instantiations are defined prior to runtime. The HA Models can be specified during the modelling phase, where the graphical IDE provides convenient UML based icons to specify the HA model desired (including the desired availability model of every service group (SG) in the system and the required actions for every component on their failures) and all the corresponding fault escalation and recovery policies. This is then converted into a set of ''XML'' configuration files that define the type and instance information. The ''XML'' files can be modified as well prior to starting SAFplus Platform.&lt;br /&gt;
&lt;br /&gt;
====Redundancy Models Supported====&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;'''2N (or 1:1) Redundancy Model''': OpenClovis SAFplus Platform provides a SAF compliant implementation of the 2N redundancy model. 2N redundancy model allows N number of Service Groups, each with up to one active and one standby Service Unit (SU) and with arbitrary number of spares. Active components provide service, standbys are prepared to take over the service in case of a component failure. Active and standby components may reside either on the same node or on different nodes. Standbys for multiple actives can reside on the same node. Active and standby can share states using checkpointing (hot/warm standby).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;The traditional rendition of this redundancy model is described in the Figure [[#SAF_Compliant_Redundancy_Models | SA Forum Compliant Redundancy Models ]]. Another feature availbale to the system designer is the concept of ''Spare SUs'' that enables design of robust 1:1 protection scheme as described below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id='1_1_Redundancy_with_Spare_SU'&amp;gt;&amp;lt;/span&amp;gt;[[File:Ha_spare.png|center|frame|'''1:1 Redundancy with Spare SU''']]&lt;br /&gt;
&lt;br /&gt;
A ''Spare SU'' is not activated or given a workload assignment when the Active SU and Standby SU are operational. However if the Active or Standby SU fail, for instance if the Node housing the Active SU becomes inoperational, the Standby SU is made Active and the ''Spare SU'' is promoted to Standby Role. If the failed SU is brought back into service, either automatically by the HA infrastructure or manually through administrative interface, it assumes the ''Spare SU'' role.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;'''M+N Redundancy Model''': The ''Spare SU'' concept holds true for the M+N redundancy as well. The variations of M+N supported and tested for by OpenClovis are N:1, N:N and M:N, for instance 3:1 ( 3 Active and 1 Standby), 3:2 (3 Active and 2 standby) 3:3 (3 Active and 3 Standby).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;'''Active/Active''': The ''N Way Active'' redundancy model of which ''Active/Active'' is a subset is not explicitly supported by OpenClovis SAFplus Platform, however, this can be achieved effectively in the following manner:&lt;br /&gt;
&lt;br /&gt;
[[File:Active_active.png|center|frame|'''Using 1:1 redundancy to achieve Active/Active redundancy''']]&lt;br /&gt;
&lt;br /&gt;
In the figure above is shown two SGs each identical in definition, but reversed in the order of Active and Standby SUs. When a SU is made Active it is assigned a Component Service Instance (CSI) which defines its work assignment, so that in this example each SU will be given 1/2 (or whatever fraction desired) of the total workload. In the above Figure if the there is a Node 2 fails or the Active SU in Node 2 fails, then Node 1 takes on the entire workload.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Node Type Distinctions====&lt;br /&gt;
&lt;br /&gt;
An OpenClovis cluster has two classes of nodes:&lt;br /&gt;
# System Controller&lt;br /&gt;
# Payload (Worker) Node&lt;br /&gt;
&lt;br /&gt;
Only System Controller nodes are allowed to take part in leader election, so that one is elected master, and the other is elected deputy.  System Controller nodes can run user applications just like any other node in the cluster. In addition there are certain processes that only run on the System Controller, they are:&lt;br /&gt;
# Availability Management Framework (AMF): The availability Management Framework is a single ''Linux'' process but contains two distinct logical components. On a Payload Blade the AMS component is inactive and CPM component takes on the CPM-L flavor, however the same physical program runs on both node class types. &lt;br /&gt;
#* Availability Management Service (AMS): SAF compliant implementation of AMF, that takes care of implementing the policy based HA logic, for instance failover policy. The logic here needs a global view of the cluster in order to make decisions and so by its very nature must be centralized.&lt;br /&gt;
#* Component Manager Global (CPM-G): The Component Manager controls the lifecyle and monitors all SAFplus Platform components including SAFplus Platform servers. There are Component Managers running on Payload Blades (CPM-L) as well, the difference between the CMP-L and CPM-G is that CPM-L acts under the control of CPM-G. &lt;br /&gt;
# Clovis Object Repository (COR): This is SAF IMM aligned object repository that is centralized to the active and standby System Controllers. The major reason for keeping this central was due to performance considerations when compared to a distributed Object Repository. It should be pointed out here, that access to COR is distributed so that COR clients on any node in the cluster make the same API calls to access COR.&lt;br /&gt;
# Platform Support Package (PSP): PSP is integrated with SAF compliant HPI implementations like OpenHPI to communicate with the Shelf Manager of an ATCA chassis to provide platform management. The PSP is an optional package and is tuned to particular ATCA or proprietary chassis.&lt;br /&gt;
&lt;br /&gt;
====Fault Management====&lt;br /&gt;
This includes Fault Removal and Failure Forecasting. The system helps in Fault Detection, Fault Isolation, Fault Recovery, Fault Repair, Fault Notification, and Prediction.&lt;br /&gt;
&lt;br /&gt;
====Checkpointing Service====&lt;br /&gt;
The Checkpointing Service allows the applications to save their internal state, and retrieve it later. This enables quick restart. Alternatively, the state is retrieved by standby components for very quick failovers.&lt;br /&gt;
&lt;br /&gt;
===Availability Management Framework (AMF)===&lt;br /&gt;
&lt;br /&gt;
The Availability Management Framework (AMF) functions are collectively&lt;br /&gt;
implemented in the Availability Management Service (AMS) and the Component&lt;br /&gt;
Manager (CPM) software components.&lt;br /&gt;
&lt;br /&gt;
AMS is the primary decision making entity in the system with respect to service availability.&lt;br /&gt;
&lt;br /&gt;
The CPM is the operational manager entity and is responsible for managing the various components through their life cycle, based on the configured policy as well as directions from AMS.&lt;br /&gt;
&lt;br /&gt;
AMS and CPM together maintain a view of the system model that describes the various software and hardware components in the system, their attributes, dependencies on each other, rules for grouping them together for providing services availability, current state and policies to be applied in the event of failure.&lt;br /&gt;
&lt;br /&gt;
====CPM-AMS interaction====&lt;br /&gt;
&lt;br /&gt;
In SAFplus Platform world, the Availability Management Framework is implemented as two&lt;br /&gt;
entities Availability Management Service (AMS) and Component Manager (CPM). Even&lt;br /&gt;
though both the entities are in the same process, there is a very clear separation of functionalities between AMS and CPM.&lt;br /&gt;
&lt;br /&gt;
# AMS is a 'server library' that maintains the (configuration and status) information about the whole cluster, knows the policies that has been configured for different entities, the recovery (or repair) actions to be taken in case of an application failure, based on both the configured policies as well as the current cluster system state. AMS deals only with application components.&lt;br /&gt;
# CPM is an operational entity which simply carries out the commands given by the AMS. However, CPM does manage the complete life cycle of the SAFplus Platform components. The recovery policy for the SAFplus Platform components is unlike AMS, very primitive. If an SAFplus Platform component fails, it will be simply restarted. There is a limit to these restart attempts however, after which the node will be shutdown.&lt;br /&gt;
&lt;br /&gt;
====Summary of interactions between AMS and CPM====&lt;br /&gt;
&lt;br /&gt;
#AMS to CPM :&lt;br /&gt;
## Call to CPM for managing the life cycle of the component.&lt;br /&gt;
## Call to CPM for assigning (and removing) work to the component.&lt;br /&gt;
## Informing CPM that some node for whom the shutdown request has come can (or cannot) be shutdown.&lt;br /&gt;
## Informing CPM when taking node level recovery actions. (Node failfast and node failover.)&lt;br /&gt;
#CPM to AMS :&lt;br /&gt;
## Responding to AMS the success/failure of component life cycle or work assignment/removal request.&lt;br /&gt;
## Reporting fault on the component, whenever a failure on that component is detected.&lt;br /&gt;
## Querying AMS about the HA state of the component.&lt;br /&gt;
## Informing to AMS that node is joining the cluster and is ready to provide service.&lt;br /&gt;
## Informing to AMS that some node wants to leave the cluster and so if it is permitted for the node to be shutdown, switchover all the components and do the shutdown.&lt;br /&gt;
## Informing to AMS that some node has exited ungracefully and hence do the failover the components without actually trying to contact the failed node.&lt;br /&gt;
## Informing to AMS about availability/unavailability of some of the SAFplus Platform components.&lt;br /&gt;
&lt;br /&gt;
====Architecture of the CPM====&lt;br /&gt;
&lt;br /&gt;
In an SAFplus Platform cluster, there is a CPM running on every node, managing the components on that node. This is in contrast to the AMS, which will be brought into life by CPM only if that node happens to be a system controller.&lt;br /&gt;
&lt;br /&gt;
Based on whether AMS is initialized by CPM or not there are two types of CPM:&lt;br /&gt;
# Local Component Manager. This is also called \b CPM/L (L standing for the local). The node (or blade) where CPM/L is running is called &amp;lt;b&amp;gt; Worker Blade.&amp;lt;/b&amp;gt; The word &amp;lt;b&amp;gt; Worker Node &amp;lt;/b&amp;gt; also means the same thing.&lt;br /&gt;
# Global Component Manager. This is also called \b CPM/G (G standing for the global). The node (or blade) where CPM/G is running is called &amp;lt;b&amp;gt;System Controller Blade &amp;lt;/b&amp;gt; or simply &amp;lt;b&amp;gt; System Controller &amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The terms CPM/G and System Controller, CPM/L and Worker Blade (Worker Node) are used interchangeably, sometimes referring to the CPM running on the node as an entity and sometimes referring to the node itself where the particular type of CPM is running.&lt;br /&gt;
 &lt;br /&gt;
The differences between CPM/G and CPM/L are :&lt;br /&gt;
&lt;br /&gt;
# The AMS will be running only on System Controller node. The system controller node where AMS is running in active mode is said to have and Active HA state. Similarly the system controller where the AMS is running in standby mode is said to have Standby HA state. There will be no AMS running on a Worker Node however and so worker node does not have any HA state associated with it.&lt;br /&gt;
# The CPM/G(Both active and standby) maintains the information about all the nodes (but not the components in those nodes) in the cluster and does the heart beating of all the nodes which are up and running. The CPM/L does not maintain any such information.&lt;br /&gt;
# The active CPM/G or active system controller blade is the one where all the HA related activities take place. It is the place to where all the triggers about various events happening in the cluster (e.g. node failure, user component failure, node is ready to provide service etc) will go either directly or indirectly and the corresponding actions are taken.&lt;br /&gt;
# On ungraceful termination of any node, CPM/G will publish an event providing information about the failed node.&lt;br /&gt;
# The active CPM/G acts as an intermediate entity between AMS and real world. It is the one which brings AMS to life and keeps it informed about the events which are going on in the cluster such as :&lt;br /&gt;
## Node is joining because it is ready to provide service.&lt;br /&gt;
## Node is leaving because shutdown was issued on the node.&lt;br /&gt;
## Node has left the cluster, because it was killed or crashed for some reason (e.g. communication failure, kernel panic etc)&lt;br /&gt;
# The active CPM/G is the one which actually carries out various operations specified by the AMS in reaction to the various events&lt;br /&gt;
&lt;br /&gt;
The commonalities between CPM/G and CPM/L are :&lt;br /&gt;
&lt;br /&gt;
# Both types of CPM manage life cycle of the SAFplus Platform components on the local node.&lt;br /&gt;
# Heart beating of the components. Both types of the CPMs do heart beating of the local components and take the following actions :&lt;br /&gt;
## If the heart beat loss was for an SAFplus Platform component, then the CPM will restart it. But if this failure happens more than certain number of times within a particular time window, then the node will be shutdown gracefully.&lt;br /&gt;
## If the heart beat loss was for an user defined component, then the CPM will report the failure to AMS via clCpmComponentFailureReport() API.&lt;br /&gt;
# On death of any component whether SAFplus Platform or user defined, CPM will publish an event using event management API, providing information about the failed component.&lt;br /&gt;
&lt;br /&gt;
The OpenClovis Availability Management Framework (AMF) is a software entity that is primarily responsible for service recovery. It provides a framework for high availability of applications in a system by coordinating with the redundant resources. &lt;br /&gt;
&lt;br /&gt;
It executes pre-configured recovery actions on failure of the application and ensures that no loss of service occurs when components are removed from services either due to component failure or any administrative actions. It also escalates the faults to larger scope as per the pre-configured escalation rules. &lt;br /&gt;
&lt;br /&gt;
AMF is built with the close association of two OpenClovis SAFplus Platform components, the Component Manager (CPM) and the Availability Management Service (AMS). These two components work together as defined by the Service Availability Forum. AMS is the primary decision making entity towards service availability in the system. CPM is the operational manager and is responsible for actually managing the various components through their lifecycle, depending on the configured policies.&lt;br /&gt;
&lt;br /&gt;
====Functions of AMF====&lt;br /&gt;
&lt;br /&gt;
The main functions provided by AMF are:&lt;br /&gt;
* It maintains the view of one logical cluster that comprises several cluster nodes. These nodes host various resources in a distributed computing environment that describes the software and hardware components of the system. &lt;br /&gt;
* It stores information about attributes of the resources, their dependencies, rules for grouping them together for providing services, their current state, and the set of policies to apply on failures. &lt;br /&gt;
* Using OpenClovis IDE, you can configure the desired availability policies with AMF on how to recover in case of failure of a service.&lt;br /&gt;
* AMF handles fault detection, fault isolation, and redundancy wherein constant health monitoring of the components is performed. Fault Manager handles fault recovery and repair actions.&lt;br /&gt;
&lt;br /&gt;
====Classification of Components====&lt;br /&gt;
&lt;br /&gt;
High availability components can be classified based on:&lt;br /&gt;
* Integration mechanism with AMF&lt;br /&gt;
* Run-time characteristics&lt;br /&gt;
&lt;br /&gt;
=====Classification Based on Integration Mechanism with AMF=====&lt;br /&gt;
&lt;br /&gt;
Depending on the type of integration with AMF, the components are: &lt;br /&gt;
&lt;br /&gt;
'''SA-Aware Components''' &lt;br /&gt;
&amp;lt;br&amp;gt;SA-Aware components contains processes linked to AMF library. The process of registering the component is called  '''Registered Process''' with AMF. AMF utilizes this process to handle callbacks.&lt;br /&gt;
&lt;br /&gt;
'''Non-SA-Aware Components''' &lt;br /&gt;
&amp;lt;br&amp;gt;There is no registered process for non-SA-aware components. Non-SA-aware components uses proxy components to register with AMF. All the available processes are application processes. Examples of non-SA-aware components are scripts for applications, hardware specific resources, and so on.  &lt;br /&gt;
&lt;br /&gt;
'''Proxy component''' &lt;br /&gt;
&amp;lt;br&amp;gt;All SA-aware components need to be directly registered with AMF. The proxy component can act as the proxy between AMF and the non-SA-aware components. Proxy component registers the non-SA-aware components to AMF, whenever AMF needs to perform an operation on proxied component, it will be achieved through a proxy component. These type of components should have a Managed EO. SA-aware component which does not proxy any proxied component are called as non-proxy component. The Availability Management Framework uses the callback functions for managing the proxied components registered by a proxy component to control the proxy component and the proxied components for which the proxy component mediates. &lt;br /&gt;
&lt;br /&gt;
'''Proxied Component''' &lt;br /&gt;
&amp;lt;br&amp;gt;There are components, which do not directly register with the AMF, called as non-SA-aware component. These type of components are proxied by a SA-aware component and are called as proxied components. This maps to a component that does not have any Managed EO. For example, hardware and legacy applications. &lt;br /&gt;
&lt;br /&gt;
'''Proxy-Proxied Relationship''' &lt;br /&gt;
&amp;lt;br&amp;gt;Proxy-Proxied Relationship is a function that facilitates a non-SA-aware Component to be managed by OpenClovis SAFplus Platform. In OpenClovis IDE, create a non-SA-aware component by selecting the non SAF Component (proxied) component from the palette in the Component Editor. The non-SA-aware component is called as the proxied component and the SA-aware component is called the proxy component. The AMF manages the proxied component indirectly via proxy component, by invoking callbacks for the proxied in the context of its managing proxy. An indirect process registration occurs between the non-SA-aware component and AMF if using proxy-proxied relationship. The proxy component is the mediator between the AMF and the proxied component, there must be sufficient logic in the proxy component to mediate the communication between the two entities.&lt;br /&gt;
&lt;br /&gt;
The proxy-proxied relationship is modeled in IDE by creating a SA-aware component and then a non-SA-aware component, which are linked by using the auto relation  relationship and provides a proxy-proxied relationship between the two components. A proxy component can proxy any number of proxied components and the AMF defines the logic for assigning CSI workloads on those proxied components. The proxied component does not have any EO properties settings in the IDE. Since SAFplus/AMF does not have a direct control on the non-SA-aware component, and eonization is not taking place there, generally a non-SA-aware component will be a legacy application that needs to be managed by SAFplus Platform. &lt;br /&gt;
* A proxy-proxied relationship can span across different Nodes/SUs/SGs in the Component Editor. &lt;br /&gt;
* A directory is not created for a proxied component in &amp;lt;code&amp;gt;&amp;lt;project_area&amp;gt;/&amp;lt;model&amp;gt;/src/app&amp;lt;/code&amp;gt;, also the binary is not generated from SAFplus Platform compilation. The application is an external entity. It is linked using the relationship between the proxy and the proxied component. &lt;br /&gt;
* The redundancy model of the proxy component can be different from that of its proxied components. &lt;br /&gt;
* AMF does not consider the failure of the proxied component to be the failure of the proxy component. Similarly, the failure of the proxy component does not indicate a failure of the proxied components.&lt;br /&gt;
&lt;br /&gt;
=====Classification Based on Run-time Characteristics=====&lt;br /&gt;
&lt;br /&gt;
Depending on the run-time characteristics, the components are classified as: &lt;br /&gt;
&lt;br /&gt;
'''Pre-Instantiable Components'''&lt;br /&gt;
&amp;lt;br&amp;gt;These components have the ability to stay idle after getting instantiated. They only start to provide a particular service(s) when instructed to do so by AMF. All SA-Aware components have to be preinstantiable. &lt;br /&gt;
&lt;br /&gt;
'''Non-Pre-Instantiable Components'''&lt;br /&gt;
&amp;lt;br&amp;gt;These components start providing service as soon as they get instantiated. These type of components cannot be instantiated as a spare unit. While instantiating a SU or assigning SI to an SU, AMF looks at the component type. The proxy component is responsible for conveying requests made by the AMF to its proxied components. When the proxy component registers with AMF, it decides the proxied components that a proxy component is responsible for based on configuration and other factors like availability of components in the cluster. AMF conveys this decision to the proxy component by assigning it a workload in the form of a Component Service Instance (CSI).&lt;br /&gt;
* A single proxy component can mediate between AMF and the multiple proxied components.&lt;br /&gt;
* The redundancy model of the proxy component can be different from that of its proxied components.&lt;br /&gt;
* The Availability Management Framework does not consider the failure of the proxied component to be the failure of the proxy component. Similarly, the failure of the proxy component does not indicate a failure of the proxied components.&lt;br /&gt;
&lt;br /&gt;
====About Availability Management Service (AMS)====&lt;br /&gt;
&lt;br /&gt;
Availability Management Service (AMS) comes with a default set of policies on how to recover a service. These include restart or switchover of services to a standby. The following are the functions of AMS:&lt;br /&gt;
* '''Defining System Model''' - You can define a system model in an xml file and feed it to AMS. This includes configuration of AMS entities, attributes and relationships between the entities. Configuration is statically read at startup time, however, the AMS code can accept new configuration at run-time. The association and containment relationship can be configured and used by AMS.&lt;br /&gt;
* '''Service Unit and Component Lifecycle Management''' - AMS can start and stop the appropriate number of service units as per the rules configured with their service groups. AMS can be configured to retry starting and terminating a component as many times as required before declaring the instantiation or the termination as failed. If a component fails to terminate properly, it is cleaned up as per its configuration.&lt;br /&gt;
* '''Service Group Management''' - AMS supports the following redundancy models:&lt;br /&gt;
** 2N redundancy model&lt;br /&gt;
** M+N redundancy model&lt;br /&gt;
** No redundancy model&lt;br /&gt;
* '''Best Possible Assignment at Boot-time''' - During the system boot-up, the SUs take time to instantiate. If AMS starts assigning SIs to them immediately, the initial assignment of SIs to SUs will not match the required ranking. AMS, therefore, waits for a configurable period of time for an SG to stabilize at boot time before assigning SIs to SUs. Multiple SIs can be assigned to an SU.&lt;br /&gt;
* '''CSI Assignment''' - Multiple CSIs can be assigned to a component based on the components capability. If there are multiple components in an SU that support the same CSI types, the assignment is based on the rank of components in the SU. It requires the ordered list container functions, otherwise the first suitable component found in the list is assigned.&lt;br /&gt;
* '''Node Management''' - Using AMS, you can join the nodes or leave the cluster at any given time.&lt;br /&gt;
* '''Administrative Control''' - AMS provides you with the administrative rights to control the entities using SAFplus Platform Console commands. You can perform various functions on these entities, such as lock, unlock, shutdown, restart, and repair.&lt;br /&gt;
* '''Fault Recovery''' - Faults can be reported on the components as well as the nodes. These faults are handled based on the following rules:&lt;br /&gt;
** Default recovery policy configured for the component to restart the component or the SU, and to cause a failover of the SU or the node.&lt;br /&gt;
** The number of components in an SU that fail after a certain time interval can cause an escalation to restart the SU.&lt;br /&gt;
** The number of SUs in an SG that fail after a certain time interval can cause an escalation to restart the node.&lt;br /&gt;
** The number of node wide SUs that fail after a certain time interval can cause an escalation to failover of the node.&lt;br /&gt;
* '''Faults at Node''' - The faults occurring at a node result in a failover of all the SUs on the node.&lt;br /&gt;
* '''AMF Client API''' - Clients can register with the AMF and CSIs can be assigned to or removed from them using the AMF client API.&lt;br /&gt;
&lt;br /&gt;
====About Component Manager (CPM)====&lt;br /&gt;
&lt;br /&gt;
The CPM is an operational manager entity, responsible for managing the various Service Units and components through their lifecycle, based on configured policy and instructions from the AMS.The following are the functions of CPM:&lt;br /&gt;
* '''Hierarchical Component Management''': SAFplus Platform deploys node-local Component Managers (CPM/L) as well as a Global Component Manager (CPM/G) supervising the entire system. The latter, typically is located on the system controller card and can have a standby on a standby system controller card. The CPM/Ls are responsible to provide boot management and basic lifecycle management for all components running at the node. CPM/G coordinates the entire system by talking to all CPM/Ls.&lt;br /&gt;
* '''Boot Management''': SAFplus Platform provides fine-grained control over booting a node and starting SAFplus Platform components and other applications. A deployment configuration file, an XML file generated by IDE, describes all software entities to be started on the node.&lt;br /&gt;
* '''Basic Component Lifecycle Management''': CPM provides basic component lifecycle management, including health monitoring of each component.&lt;br /&gt;
* '''Component Health Monitoring''': CPM monitors the health of every local component and can automatically detect the failure of a component. In addition, a component can self-declare a failure to CPM. In addition, CPM/G conducts periodic health check of every CPM/L in the system. CPM/L also pro-actively notifies CPM/G on a failure of any of the local components.&lt;br /&gt;
* '''Failure Event Generation''': All component failures detected by CPM are posted to a dedicated event channel to which any component in the system can subscribe.&lt;br /&gt;
* '''Automatic Logging of Health State Changes''': CPM/L can automatically log any changes to the state of any of the supervised components.&lt;br /&gt;
&lt;br /&gt;
===Fault Detection and Handling===&lt;br /&gt;
&lt;br /&gt;
====Software Fault Detection====&lt;br /&gt;
&lt;br /&gt;
Software failure detection is done actively and passively. For passive monitoring OpenClovis SAFplus Platform leverages the high performance features of TIPC to detect socket bind and release events and notify other components of this fact.  For details on TIPC capabilities please refer to TIPC documentation that can be downloaded from tipc.sourceforge.net.&lt;br /&gt;
&lt;br /&gt;
=====Passive Software Failure Detection=====&lt;br /&gt;
&lt;br /&gt;
[[File:Software_monitoring.png|center|frame|'''Passive software monitoring in OpenClovis SAFplus''']]&lt;br /&gt;
&lt;br /&gt;
Each SAFplus Platform Component has a dedicated IOC port (translates to a TIPC socket) associated with it, and remains open for the life of this component. All internal communication and control over this Component is performed via this port and is transparent to the user. Building upon this fact a Component arriving will result in a ''TIPC socket bind'' event and a Component departing will result in a ''TIPC socket release'' event.&lt;br /&gt;
&lt;br /&gt;
TIPC allows any process to subscribe to these events on a cluster wide basis, and &lt;br /&gt;
on each Node an SAFplus Platform ''Node Rep'' thread subscribes to ''TIPC Socket Bind'' and ''TIPC Socket Release'' events for all SAFplus Platform components local to this Node. If a Component departs this fact is broadcast to all the other components in this Node, and multicasts a message to all the peer ''Node Reps'' on other Nodes. The ''Component Manager Global'' (CPM/G) registers this fact on the System Controller and takes appropriate recovery and repair action.&lt;br /&gt;
&lt;br /&gt;
=====Passive Node Departure Detection=====&lt;br /&gt;
The architecture for detecting component arrival and departure is also used to detect Node arrival and departure, since the ''Node Reps'' on each Node open a dedicated IOC port to communicate with each other. The departure of the ''Node Rep'' will be received by all ''Node Reps'' in the system and is broadcast as a ''Node Departure'' event locally. Since the ''Node Rep'' is a thread within the ''AMF'' Server as described earlier, it effectively represents the Node.&lt;br /&gt;
&lt;br /&gt;
=====Active Software Failure Detection=====&lt;br /&gt;
Each SAFplus Platform Component has a heartbeat callback that is invoked periodically to check on the health of the Component. This heartbeat interval can be temporarily disabled or scaled back when a Component is under heavy load conditions.&lt;br /&gt;
&lt;br /&gt;
The purpose of this heartbeat is to enable the Component to perform an internal audit and report back success or failure. If a failure is reported the AMF can take appropriate recovery and repair action as the policy for the Component.&lt;br /&gt;
&lt;br /&gt;
====Hardware Fault Detection====&lt;br /&gt;
In an ATCA environemnt OpenCLovis SAFplus Platform relies on the Shelf Manager and the HPI interface to obtain information related to&lt;br /&gt;
* Hot Swap Events: In this case the AMF takes control of the card from the shelf manager and performs a Node Switchover so that all services are migrated to the standby card. After this all SAFplus Platform Services on the Node are shut down and contol returned to the Shelf Manager to power down the card.&lt;br /&gt;
* Alarms related to hardware failure: If the alarm is service affecting, then a Node failover action is performed migrating all services running on the affected card to a standby, after which all SAFplus Platform Services on the Node are shut down. Not all hardware is monitored by HPI, and in this user monitoring Components can use the SAFplus Platform Alarm infrastructure to raise a critical alarm to migrate service from the failing hardware to a standby.&lt;br /&gt;
&lt;br /&gt;
In case of application where the HPI interface is not used, however there is some mechanism to &lt;br /&gt;
* Detect Hot Swap Events&lt;br /&gt;
* Monitor hardware via diagnostic software and raise an Event if a fault is detected.&lt;br /&gt;
&lt;br /&gt;
=====Managed Hot Swap Events=====&lt;br /&gt;
It is assumed here that a SAFplus Platform user component will receive the ''Hot Swap Event''. Once it receives this event it perform a Node ''shutdown'' of the affected Node resulting in the graceful removal of service on the affected Node and a switchover to standby. All SAFplus Platform Service on the Node will then be shut down. Please refer to the section related to AMF Administrative API for more details.&lt;br /&gt;
&lt;br /&gt;
=====Diagnostics Driven Fault Event=====&lt;br /&gt;
[[File:SDK_Diagnostic_alarm.png|center|frame|'''Basic mechanism to tie in diagnostic fault events to AMF''']]&lt;br /&gt;
&lt;br /&gt;
The Figure illustrates a solution by which the application that does hardware diagnostics can tie into the OpenClovis SAFplus Platform Alarm infrastructure to force a Node ''failover'' if a service affecting hardware fault is detected.&lt;br /&gt;
&lt;br /&gt;
====Fault Escalation====&lt;br /&gt;
OpenClovis AMF provides an extensive fault escalation policy that can be briefly described as follows&lt;br /&gt;
# Component &lt;br /&gt;
#* Specify number of restarts (N) within a given time period (T) before escalating to SU failure&lt;br /&gt;
# SU &lt;br /&gt;
#* Specify number of restarts (N) within a given time period (T) before escalating to SU failover&lt;br /&gt;
# Node &lt;br /&gt;
#* Specify maximum number of SU failovers that can occur within a given time period (T) before escalating to a Node failover&lt;br /&gt;
&lt;br /&gt;
In addtion you can specify that failure of any Component should result in any of the following actions:&lt;br /&gt;
# Component restart&lt;br /&gt;
# Component failover (SU failover)&lt;br /&gt;
# Node switchover&lt;br /&gt;
# Node failover&lt;br /&gt;
# Node restart&lt;br /&gt;
&lt;br /&gt;
====Fault Repair====&lt;br /&gt;
The user can specify the following policies for repair action that should be performed by the AMF on failure. This include&lt;br /&gt;
# Component restart&lt;br /&gt;
# SU restart&lt;br /&gt;
# Auto repair on SU failover. All components in the failed SU will be restarted.&lt;br /&gt;
&lt;br /&gt;
In addition custom repair action can be performed using the Fault Management infrastructure. The user can associate a callback API that will be invoked after AMF performs the default repair action.&lt;br /&gt;
&lt;br /&gt;
====Adminstrative Control====&lt;br /&gt;
Please look in the section detailing the AMF Adminsitrative Interface for details on this subject.&lt;br /&gt;
&lt;br /&gt;
===Checkpointing Service (CPS)===&lt;br /&gt;
&lt;br /&gt;
The OpenClovis Checkpointing Service (CPS) is a high availability infrastructure component that provides synchronization of run-time data and context to ensure a seamless failover or switchover of applications. &lt;br /&gt;
&lt;br /&gt;
====Features of CPS====&lt;br /&gt;
&lt;br /&gt;
Checkpointing Service provides the following features:&lt;br /&gt;
* It allows the application to store its internal state and retrieve the information immediately, at regular intervals or in case of failover, or switchover. &lt;br /&gt;
* It provides a facility for processes to record checkpoint data incrementally, which can be used to protect an application against failures. When recovering from failover or switchover situations, the checkpoint data can be retrieved, and execution can be resumed by restoring the checkpointed state recorded before the failure.&lt;br /&gt;
* It supports non-transparent mode of checkpointing where an application needs to trigger the checkpoint write and checkpoint read.&lt;br /&gt;
&lt;br /&gt;
A given process can use one or several checkpoints to save its state. To avoid the accumulation of unused checkpoints in the system, checkpoints have retention duration. When a checkpoint has not been opened by any process for the retention duration, the CPS automatically deletes the checkpoint. If a process terminates abnormally, the CPS automatically closes all of its open checkpoints.&lt;br /&gt;
&lt;br /&gt;
====Entities of Checkpointing Service====&lt;br /&gt;
&lt;br /&gt;
The main entities of Checkpointing Service are:&lt;br /&gt;
* '''Checkpoints''': Checkpoints are cluster-wide entities that are designated by unique names.&lt;br /&gt;
* '''Sections''': Each checkpoint is structured to hold up to a maximum number of sections. The maximum number of sections is specified when the checkpoint is created. For more details, refer to  &amp;lt;code&amp;gt;'''clCkptCheckpointOpen'''&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;'''clCkptCheckpointOpenAsync'''&amp;lt;/code&amp;gt;  API functions in the ''OpenClovis API Reference Guide''.&lt;br /&gt;
* '''Checkpoint Replica''': A copy of the data that is stored in a checkpoint is called a checkpoint replica or a replica. It is stored in RAM File System (RAMFS) instead of a disk for performance reasons. A given checkpoint may have several checkpoint replicas (or copies) that reside on different nodes. A checkpoint can be replicated immediately on a different blade and can be stored indefinitely or consumed immediately.&lt;br /&gt;
* '''Checkpoint Data Access''':  A process can use the handle that the Checkpoint Service returned at open time to perform read and write operation. It can access various portions of different sections within a checkpoint simultaneously.&lt;br /&gt;
&lt;br /&gt;
====Architecture====&lt;br /&gt;
OpenClovis SAFplus Platform provides a high performance distributed  checkpoint service, with Checkpoint Servers resident on each Node in the Cluster.  The basic architecture of the Checkpoint Service can be described as shown below:&lt;br /&gt;
&lt;br /&gt;
[[File:Ckpt_arch.png|center|frame|'''Checkpoint Service Architecture''']]&lt;br /&gt;
&lt;br /&gt;
The Checkpoint Servers essentially behave as peers, except that the Servers on the System Controllers maintain the Global Checkpoint database. This database consists of the the metadata describing each checkpoint, so as to ensure that each checkpoint created in the cluster is unique. In addition the Server on the System Controller is also responsible for ensuring that there is at least one replica for each checkpoint in the system, so that loss of a Node does not mean that checkpoint data is lost too.&lt;br /&gt;
&lt;br /&gt;
Each checkpoint server maintains a local Checkpoint database as well. This database contains the actual checkpointed data, and the location of all replicas of this checkpoint in the cluster. It is the responsibility of the Checkpoint Server to update all replicas in the system.&lt;br /&gt;
&lt;br /&gt;
====Checkpoint Types====&lt;br /&gt;
&lt;br /&gt;
OpenClovis SAFplus Platform provides support for two kinds of checkpoints:&lt;br /&gt;
&lt;br /&gt;
* '''File based Checkpoints''': Slower in performance since the checkpoint is stored in persistent storage. However checkpoints can survive Node restarts, as well as component failovers and component restarts. This is an enhancement to SAF requirements.&lt;br /&gt;
* '''Server based Checkpoints''': Higher performance, supports failover and Component restarts.&lt;br /&gt;
&lt;br /&gt;
The rest of this section will deal with Server Based Checkpoints. Server based checkpoints provide support for synchronous and asynchronous checkpoints. The attributes defining a checkpoint are described at creation time.&lt;br /&gt;
&lt;br /&gt;
* '''Synchronous Checkpoints''': A checkpoint write here ensures that all replicas of the checkpoint are updated before returning control back to the writer.&lt;br /&gt;
* '''Asynchronous Checkpoints''': In this case after the active replica is updated, an asynchronous update message is sent to all other replicas in the cluster. The location of the active replica can be controlled by specifying that the asynchronous checkpoint created is:&lt;br /&gt;
** '''Collocated''': In the case the active replica is local to checkpoint writer.&lt;br /&gt;
** '''Non-collocated''': The checkpoint server determines the Node on which to place the active checkpoint based on load balancing considerations.&lt;br /&gt;
&lt;br /&gt;
[[File:ckpt.png|center|frame|'''Illustration of a checkpoint''']]&lt;br /&gt;
&lt;br /&gt;
A checkpoint consists of multiple sections, where each section can be of arbitrary size. Testing is being performed for checkpoints upto 10,000 sections each of 10,000 bytes for a total checkpoint size of 100 Megabytes&lt;br /&gt;
&lt;br /&gt;
====Flexibility of Checkpointing Updates====&lt;br /&gt;
&lt;br /&gt;
Requirements regarding the consistency of the various replicas associated to a given checkpoint can have negative effects on the performance of checkpoint write operations. To provide flexibility with Checkpoint Service, strong atomicity and strong ordering semantics are not required. In particular, if two processes perform a concurrent write to the same portion of a checkpoint, no global ordering of replica updates is ensured. After both write operations complete successfully, some replicas may contain data written by one process while other replicas contain data written by the other processes.&lt;br /&gt;
&lt;br /&gt;
To accommodate different trade-offs between checkpoint update performance and replica consistency, different options are provided when a checkpoint is created. These options are:&lt;br /&gt;
* '''Synchronous Update''': The write and overwrite calls and calls for the creation and deletion of a section return only when all checkpoint replicas have been updated.&lt;br /&gt;
* '''Asynchronous Update''': The write and overwrite calls as well as calls for the creation and deletion of a section return immediately when the active checkpoint replica has been updated. Other replicas are updated asynchronously. At any time, there is at most one active replica.&lt;br /&gt;
&lt;br /&gt;
====Collocated and Non-Collocated Checkpoints====&lt;br /&gt;
&lt;br /&gt;
Management of replicas for Collocated and Non-Collocated Checkpoints.&lt;br /&gt;
* '''Collocated Checkpoints''': When using a checkpoint with the asynchronous update option, optimal performance for updating the checkpoint is achieved when the active replica is located on the same node as the process accessing the checkpoint. However, because the process accessing the checkpoint can change depending on the role assigned by the Availability Management Framework, optimal performance can be achieved only if the application informs the Checkpoint Service about which replica should be active at a particular time. This can be performed for checkpoints having the collocated attribute. Such a checkpoint is referred as a collocated checkpoint.&lt;br /&gt;
* '''Non-Collocated Checkpoints''': Checkpoints created without the collocated attribute are called non-collocated checkpoints. The management of replicas of non-collocated checkpoints and whether they are active or not is mainly the duty of the Checkpoint Service. The processes using the Checkpoint Service are not aware of the location of the active replicas. &lt;br /&gt;
&lt;br /&gt;
The Checkpoint Service may create replicas other than the ones that may be created when opening a checkpoint. This can be useful to enhance the availability of checkpoints. For example, if there are at a certain point in time two replicas, and the node hosting one of these replicas is administratively taken out of service, the Checkpoint Service may allocate another replica on another node while this node is not available. &lt;br /&gt;
&lt;br /&gt;
'''Persistence of Checkpoints''' &lt;br /&gt;
&amp;lt;br&amp;gt;As mentioned earlier, Checkpoint Service stores checkpoint data in the RAMFS of the nodes. Irrespective of the retention time, a checkpoint and its sections do not exist if the Checkpoint Service stops running on all nodes hosting replicas for this checkpoint. This can be caused by administrative actions or node failures. &lt;br /&gt;
&lt;br /&gt;
'''Prerequisites for Persistence of Checkpoints''' &lt;br /&gt;
* The checkpoint data is not persistent across node reboots.&lt;br /&gt;
* If a checkpoint is stored in a persistent store such as hard disk or flash drive, it is the system integrators responsibility to ensure that the data is deleted before starting CPS.&lt;br /&gt;
&lt;br /&gt;
====Hot Standby Support====&lt;br /&gt;
&lt;br /&gt;
One of the limitation of SAF checkpoints is the absence of a notification to the reader or consumer of a checkpoint, when the data within the checkpoint has been updated. If the designer wants to implement true hot standby capability, it is upto the designer to either poll the checkpoint periodically or establish some other means of communication with the active Component to know when the checkpoint has been updated.&lt;br /&gt;
&lt;br /&gt;
To remedy this situation OpenClovis Checkpoint Service allows applications to register with the Checkpoint Server for notifications related to any checkpoint of interest.  During the registration the application specifies a callback API, which gets invoked when a checkpoint has been updated. The callback contains the name of the checkpoint being updated and the contents of the checkpoint.&lt;br /&gt;
&lt;br /&gt;
===Group Membership Service (GMS)===&lt;br /&gt;
Group Membership Service (GMS) is OpenClovis SA Forum compliant Cluster Membership Service (CLM). In addition to providing cluster membership services, it also provides leader election services to elect Active System Controller and Deputy. It extends the SA Forum CLM by providing generalized group membership service, which enables software processes to form Groups.&lt;br /&gt;
&lt;br /&gt;
The OpenClovis Group Membership Service (GMS) provides following services:&lt;br /&gt;
&lt;br /&gt;
*'''CLM Functionality:''' GMS forms a cluster of nodes that have unique attributes like node name, node id, etc, and that are running SAFplus Platform. It does a leader election on the nodes in the cluster and elects a leader and a deputy node, which act as ''Active System Controller'' and ''Standby System Controller'' for the given SAFplus Platform cluster. It also provides functionality using which the user can keep track of the changes in the cluster such as node joins, node leaves and leadership changes. Any application or OpenClovis SAFplus Platform service can register with GMS to keep track of the changes in the cluster.&lt;br /&gt;
&lt;br /&gt;
*'''Multicast Group Functionality:''' GMS with Intelligent Object Communication (IOC) provides multicast messaging capability. GMS provides APIs for user applications to form a multicast group and use IOC multicast capabilities to send the messages to the registered users in a given multicast group. GMS also provides APIs to track the membership of each multicast group for member and non-member applications.&lt;br /&gt;
&lt;br /&gt;
The following sections describe how you can implement these features, it involves understanding the following services:&lt;br /&gt;
* [[#Group Management | Group Management ]]&lt;br /&gt;
* [[#Group Addressing and Multicasting using Intelligent Object Communication (IOC) | Group Addressing and Multicasting using Intelligent Object Communication (IOC) ]]&lt;br /&gt;
* [[#The Remote Method Dispatch (RMD) Advantage | The Remote Method Dispatch (RMD) Advantage ]]&lt;br /&gt;
&lt;br /&gt;
One of the guarantees given by GMS is a uniform view of the cluster to be given to each cluster member, for which it relies on the Totem protocol. The Totem protocol is a reliable and fault tolerant multicast protocol that deliver messages in total order, also referred to as atomic multicast. The protocol is designed to handle processor crash failure and network partitioning.&lt;br /&gt;
&lt;br /&gt;
A side effect of the multicast protocol is that all Nodes within a cluster have to be within a subnet. If you have Nodes in seprate subnets that have to be part of the same cluster the subnets can be bridged to form a ring if the router in between is configured with a  multicast protocol to forward packets from one subnet to other. &lt;br /&gt;
&lt;br /&gt;
The underlying Totem Protocol used by GMS is the same as that used by the openAIS CLM, and the author of this software has the following caveat for the use of packet forwarding between subnets: ''&amp;quot;The TTL of packets is set to zero.  I dont have a router setup to test openais in this configuration but it should work assuming the router offers low latency.  To ensure it working, the ttl of the packets would have to be increased and routing of multicast and udp unicast would have to be enabled on the router.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
====Group Management====&lt;br /&gt;
&lt;br /&gt;
Group Membership Service (GMS) exposes APIs that enable you to manage multicast groups. Group Management involves:&lt;br /&gt;
* Creating/Deleting Groups&lt;br /&gt;
* Joining Groups&lt;br /&gt;
* Tracking Groups&lt;br /&gt;
* Updating Groups&lt;br /&gt;
&lt;br /&gt;
'''Creating/Deleting Groups''' &lt;br /&gt;
&amp;lt;br&amp;gt;You can create a multicast group using the  &amp;lt;code&amp;gt;'''clGmsGroupCreate'''&amp;lt;/code&amp;gt; API. GMS generates and returns a unique group ID. Currently, all GMS groups are IOC multicast groups. GMS allocates a unique IOCMulticastAddress (MA) to each group. You can delete a group using the  &amp;lt;code&amp;gt;'''clGmsGroupDestroy'''&amp;lt;/code&amp;gt;  API.&lt;br /&gt;
&lt;br /&gt;
'''Joining Groups''' &lt;br /&gt;
&amp;lt;br&amp;gt;A user application or a node can join a multicast group using the  &amp;lt;code&amp;gt;'''clGmsGroupJoin'''&amp;lt;/code&amp;gt;  API. By joining a group, a node becomes a member of that group. Components running on different nodes can join a group. Each component is assigned a member ID based on their compId (component ID). A component can receive messages sent to a group, only if it is a member of that group.&lt;br /&gt;
&amp;lt;br&amp;gt;A component can leave the group using &amp;lt;code&amp;gt;'''clGmsGroupLeave'''&amp;lt;/code&amp;gt;  API. After the component leaves the group, GMS ensures that the component does not receive any messages sent to this group.&lt;br /&gt;
&lt;br /&gt;
'''Tracking Groups''' &lt;br /&gt;
&amp;lt;br&amp;gt;Group Membership Service provides processes to retrieve information about the group nodes and the group membership. The  &amp;lt;code&amp;gt;'''clGmsGroupTrack'''&amp;lt;/code&amp;gt;  API provides the capability to retrieve information regarding the status and the list of nodes within a group.&lt;br /&gt;
All members are informed whenever a member leaves or joins the group. A non-member can also keep track of the events in the group such as a node failure or a service failure.&lt;br /&gt;
&amp;lt;br&amp;gt;You can retrieve information about a group such as IOC MulticastAddress created by GMS, number of members in a group, and so on using  &amp;lt;code&amp;gt;'''clGmsGetGroupInfo'''&amp;lt;/code&amp;gt; API.&lt;br /&gt;
&lt;br /&gt;
'''Updating Groups''' &lt;br /&gt;
&amp;lt;br&amp;gt;If a component or a node fails, GMS deregisters that component or node from the IOCMulticastAddress group. It ensures that the failed components are removed from the group and communicates to all the other members about the status of the group.&lt;br /&gt;
&lt;br /&gt;
====Group Addressing and Multicasting using Intelligent Object Communication (IOC)====&lt;br /&gt;
&lt;br /&gt;
IOC provides the basic messaging and distribution mechanism to communicate between inter-node and intra-node components. If the destination address is a logical address, IOC sends the message to the corresponding physical address. If destination address is of a broadcast address type, IOC sends the message to all the existing nodes. &lt;br /&gt;
&lt;br /&gt;
IOC, with the TIPC Linux Kernel module also provides the multicast capability. Multicast is a technique of delivering information to a group of members simultaneously.&lt;br /&gt;
&lt;br /&gt;
An application wanting to start a group has to create and join the group using &amp;lt;code&amp;gt;'''clIocMulticastRegister'''&amp;lt;/code&amp;gt; API. For creating a multicast address the macro &amp;lt;code&amp;gt;'''CL_IOC_MULTICAST_ADDRESS_FORM'''&amp;lt;/code&amp;gt; should be used. Once the group is created, all the components, which are interested in joining the group can join the group using the same API mentioned above. When a component leaves a group, the IOC disassociates the member with the multicast/group address.&lt;br /&gt;
&lt;br /&gt;
Group members and non-members can send IOC multicast messages. A component can send a message to a group with destination address as group's multicast address in &amp;lt;code&amp;gt;'''clIocSend'''&amp;lt;/code&amp;gt; API. This is an asychronous API. On receiving a send request IOC checks the destination-address type and if it is a multicast-address then IOC using the TIPC Linux kernel module sends the message to all the member components of the group.&lt;br /&gt;
&lt;br /&gt;
=====Benefits=====&lt;br /&gt;
&lt;br /&gt;
IOC multicasting uses the broadcast capability of the underlying TIPC Linux kernel transport module and triggers a single message send that is sent to all the components in the group. This would help reduce the processing time as opposed to sending it to each component separately.&lt;br /&gt;
&lt;br /&gt;
A set of applications that need to share information with each other may form an IOC group and use this mechanism to convey the information. They can use GMS generic group membership to keep track of each other and use the GMS join/leave calls to manage the IOC group address. Any entity that is not a member of an IOC group can also use the IOC group address to communicate simultaneously to all members of that group.&lt;br /&gt;
&lt;br /&gt;
====The Remote Method Dispatch (RMD) Advantage====&lt;br /&gt;
&lt;br /&gt;
A broadcast message can be sent to a multicast group synchronously using the &amp;lt;code&amp;gt;'''clRmdWithMsg'''&amp;lt;/code&amp;gt; API that is part of the RMD library. This API takes the IOC address where the function is exposed as the parameter. RMD also ensures at-most-once delivery to all members of a multicast group. For detailed information about all the APIs and how to use them, refer to IOC, GMS, and RMD in ''OpenClovis API Reference Guide''.&lt;br /&gt;
&lt;br /&gt;
===Typical Usage of High Availability===&lt;br /&gt;
&lt;br /&gt;
Assuming the case of a 2N redundancy model, there are two service units running the same set of services, one of which is an Active system, and the other is the stand-by. AMS is responsible for switchover, and contains all the policies. CPM executes the commands that are provided by AMS. CPM checks the status of the service provider and informs the status of the provider to AMS. AMS takes a decision to either perform a switchover or a re-start of the service provider. CPS checkpoints the completion of an activity and starts the standby from the checkpointed state.&lt;br /&gt;
&lt;br /&gt;
====Logical Addressing and Location Transparency====&lt;br /&gt;
&lt;br /&gt;
The IOC Transparency Layer database is a hashtable that contains the logical addresses of the components received from the Name Server. The Name Server contains the mapping information of logical addresses to the physical addresses and the HA states of the components.&lt;br /&gt;
&lt;br /&gt;
The location transparency can be achieved as follows: &lt;br /&gt;
* The Transparency Layer database is synced up after every 5 seconds through an IOC broadcast to other nodes. It is also synced up when a new entry is either registered or deregistered in the Transparency Layer database. &lt;br /&gt;
* When the CSI is assigned to or removed from the component, the component informs the Transparency Layer about its HA state. &lt;br /&gt;
* When AMS assigns Active or Standby state to a component through CSI assignment, the component registers itself as active or standby for that logical address. AMS can perform a switchover or a failover of the Active component to a Standby and a new CSI is assigned to the standby but the CSI assigned earlier is not removed. The component must register itself as Active with the Transparency Layer in order to continue receiving messages. &lt;br /&gt;
* When a component is terminated or locked, AMS issues instructions for the removal of the CSI for the application. The component must deregister itself from the Transparency Layer for all logical addresses.&lt;br /&gt;
* When a message is sent, the Transparency Layer translates the logical address of the component to the physical address. Since the Transparency Layer is part of IOC, the translation is performed effectively. &lt;br /&gt;
&lt;br /&gt;
=====Usage Scenario=====&lt;br /&gt;
&lt;br /&gt;
Let us assume the following scenario to understand the concept of logical addressing. COMP A and COMP B are running on Node 1 and Node 2 respectively. COMP A is active and COMP B is standby component. The logical address and the physical address mappings of COMP A and COMP B on both the nodes is specified in Table [[#LogicaltoPhysicalAddressMapping|Logical to Physical Address Mapping]]. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;LogicaltoPhysicalAddressMapping&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;3&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | '''Logical to Physical Address Mapping'''&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot;| Nodes : Component : Logical Address&lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot;| Physical Address Mapping&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
'''Node 1''' : COMP A : 1&lt;br /&gt;
|&lt;br /&gt;
* [physical address of COMP A, hastate ACTIVE] &amp;lt;br&amp;gt;The physical address of COMP A is registered with Transparency Layer when COMP A is started on Node 1.&lt;br /&gt;
* [physical address of COMP B, hastate STANDBY] &amp;lt;br&amp;gt;This entry is synced up when COMP B is started on Node 2.&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
'''Node 2''' : COMP B : 1&lt;br /&gt;
|&lt;br /&gt;
* [physical address of COMP B, hastate STANDBY] &amp;lt;br&amp;gt;The physical address of COMP B is registered with Transparency Layer when COMP B is started on Node 2.&lt;br /&gt;
* [physical address of COMP A, hastate ACTIVE] &amp;lt;br&amp;gt;This entry is synced up on Node 1  by COMP A when COMP B is started on Node 2.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Thus, the logical address of both COMP A and COMP B are same. The physical address mappings along with HA state are synced up periodically. It is also synced up when the Transparency Layer is registered or deregistered, that is, during the state change of the component.&lt;br /&gt;
&lt;br /&gt;
When the active COMP A is terminated, it deregisters its correponding physical address mapping in the IOC Transpancy Layer database. This triggers the sync up of the Transparency Layer on the other nodes and deregisters the entry of COMP A. The logical address 1 obtained from Name Service maps to the physical address of standby COMP B running on Node 2.&lt;br /&gt;
&lt;br /&gt;
When AMS instantiates the standby COMP B and makes it as ACTIVE, the HA state of COMP B in IOC Transparency Layer database is changed from STANDBY to ACTIVE and the database is synced up as an IOC level broadcast in the cluster. The logical address 1 maps to the physical address of COMP B with ACTIVE HA state in the cluster.&lt;br /&gt;
&lt;br /&gt;
When COMP B is terminated, its physical address mapping is deregistered. Since the database is synced up, database consistency is maintained across all nodes. Hence, whenever any component in any node wants to reach COMP A, it requests the logical address of COMP A from the Name Server and sends message using the logical address to attain location transparency. &lt;br /&gt;
&lt;br /&gt;
The IOC Transparency Layer searches the database for mapping the logical address 1 of COMP A. This returns the ACTIVE physical address of COMP A which is used by the Transparency Layer to communicate with COMP A. Name Server assigns the logical address and IOC maps the logical address to the corresponding ACTIVE physical address through the Transparency Layer. The Transparency Layer is consistent across the cluster to manage the state change of the node or the component.&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/sdkguide/overview</id>
		<title>Doc:latest/sdkguide/overview</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/sdkguide/overview"/>
				<updated>2010-08-27T03:43:30Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=='''Overview'''==&lt;br /&gt;
&lt;br /&gt;
This chapter provides an introduction to OpenClovis SAFplus Platform and IDE, its key features, and the system architecture.&lt;br /&gt;
&lt;br /&gt;
OpenClovis SAFplus Platform and IDE provides a modular, cost-effective application for creating next-generation communication systems. OpenClovis SAFplus Platform and IDE is designed for solution integrators, Network Equipment Manufacturers (NEPs), and Telecommunication Equipment Manufacturers (TEMs) to facilitate the creation of a broad range of telecommunication devices, including routers, switches, media gateways, and wireless infrastructure nodes.&lt;br /&gt;
&lt;br /&gt;
OpenClovis fits seamlessly with various distributions of Linux and hardware platforms such as AdvancedTCA, BladeCenter T, and other off-the-shelf hardware.&lt;br /&gt;
&lt;br /&gt;
'''OpenClovis Application Service Platform (SAFplus Platform)''' is a middleware that offers a comprehensive set of modular, portable, reusable software components designed to provide system management and high availability functionality. The OpenClovis SAFplus Platform is the run-time part of the OpenClovis offering. It provides run-time services for your value add applications, offering a layered, hardware-platform independent application environment.&lt;br /&gt;
&lt;br /&gt;
'''OpenClovis Integrated Development Environment (IDE)''' is designed to simplify and accelerate the development of application service platforms for the telecommunication marketplace. Coupled with the OpenClovis SAFplus Platform, this intuitive software solution streamlines the process of specifying the information model, High Availability (HA) aspects and the communication infrastructure of a system. OpenClovis IDE stores all information describing a project in well defined XML files that can be modified by the user. Modeling of system resources and relationships are specified using a graphical UML editor.&lt;br /&gt;
&lt;br /&gt;
'''Key Topics:''' &lt;br /&gt;
* [[#Benefits of OpenClovis SAFplus Platform and IDE | Benefits of OpenClovis SAFplus Platform and IDE]] &lt;br /&gt;
* [[#Key Features of OpenClovis SAFplus Platform | Key Features of OpenClovis SAFplus]] &lt;br /&gt;
* [[#Key Features of OpenClovis IDE | Key Features of OpenClovis IDE]] &lt;br /&gt;
* [[#Supported Hardware and Operating Systems | Supported Hardware and Operating Systems]] &lt;br /&gt;
* [[#OpenClovis Architecture | OpenClovis Architecture]] &lt;br /&gt;
&lt;br /&gt;
===Benefits of OpenClovis SAFplus Platform and IDE===&lt;br /&gt;
&lt;br /&gt;
OpenClovis solution offers the following benefits to its customers&lt;br /&gt;
* Enhances developer productivity&lt;br /&gt;
* Reduces time-to-market&lt;br /&gt;
* Ensures reusability of core development efforts&lt;br /&gt;
* Offers platform-independent modeling and implementation&lt;br /&gt;
* Increases development process consistency&lt;br /&gt;
* Facilitates Platform component integration&lt;br /&gt;
* Minimizes software footprint for optimized performance&lt;br /&gt;
* Supports a broad range of industry standards such as, Advanced Telecom Computing Architecture (ATCA), Carrier Grade Linux (CGL), and SA Forum Application Interface Specification (AIS)&lt;br /&gt;
&lt;br /&gt;
===Key Features of OpenClovis SAFplus Platform===&lt;br /&gt;
&lt;br /&gt;
The following are the key features of OpenClovis SAFplus Platform:&lt;br /&gt;
* '''Distributed''': Most SAFplus Platform components are implemented in a distributed way, instantiated on every node, providing local access to system data and taking care of reliable and consistent data replication across all system nodes. &lt;br /&gt;
* '''Modular''': The SAFplus Platform infrastructure suite is implemented as many independent SAFplus Platform service components, realized as user space processes and/or client libraries. Only needed components are loaded on a given node, avoiding unnecessary resource tie-down.&lt;br /&gt;
* '''Open Architecture''': SAFplus Platform components communicate with each other using well-defined, documented APIs. This allows arbitrary user applications to tap into the wide range of basic and advanced infrastructure services provided by SAFplus Platform. It also enables the extension or replacement of selected SAFplus Platform components by other proprietary or 3rd-party components.&lt;br /&gt;
* '''Standards Compliant''': OpenClovis APIs comply to applicable, available industry standards such as SA Forum AIS and HPI APIs, and IETF protocols like SNMP.&lt;br /&gt;
* '''Scalable''': Automatic, adaptive data replication across nodes. Single-blade solutions to large systems of chassis and rack-mount servers.&lt;br /&gt;
* '''Dependable''': SAFplus Platform components are written to be robust and highly available. This is realized by state replication (checkpointing), automatic restart and fault recovery and support for multi-version interoperability. All this minimizes down-time and allows the SAFplus Platform layer to be operational through planned and unplanned down-time, eliminating service interrupts due to single points of failure.&lt;br /&gt;
* '''Extensible Infrastructure''': All SAFplus Platform components expose open APIs, allowing easy extension of SAFplus Platform functionality. Some components use plug-ins (dynamically loadable modules) that allow for easy extensibility during design and also after deployment.&lt;br /&gt;
* '''Flexible Application Adaptation''': The OpenClovis infrastructure provides a wide range of options for porting applications. Options range from:&lt;br /&gt;
** No adaptation that is, still utilizing platform management capabilities of SAFplus Platform.&lt;br /&gt;
** Non-intrusive application porting that is, non-intrusive EOnization which requires no or very minimal changes to the existing application.&lt;br /&gt;
** Porting to SAFplus-based application development, when the application directly exploits the services provided by SAFplus Platform using SAFplus Platform APIs. &lt;br /&gt;
* '''Configuration Flexibility''': Configuration and customization options are available throughout the product life-cycle, specifically at system modeling time, target image build-time, boot-time, and run-time. Configuration and customization options in the system modeling and target image build-time are available only to system designers, while the boot-time and run-time are exposed to the final user who deploys the SAFplus-based system. The deployment configuration files are XML based and the build-time configuration files are C header files. Both types of files are typically generated from OpenClovis IDE. &lt;br /&gt;
* '''Location Transparency''': SAFplus Platform provides a generic scheme for using distributed resources with location transparency. This is further supported by logical addresses supported by SAFplus Platform communication layer. Refer IOC and TIPC for more details.&lt;br /&gt;
* '''Service Concurrency''': SAFplus Platform components export resources that can be simultaneously accessed by multiple, distributed clients, yet maintaining the consistency of the shared resources.&lt;br /&gt;
* '''Portable''': SAFplus Platform is built on a set of adaptation and abstraction layers that minimizes its direct dependency on any given operating system, hardware, or database system. This allows easy porting of both SAFplus Platform and SAFplus-based applications to new platforms.&lt;br /&gt;
&lt;br /&gt;
===Key Features of OpenClovis IDE===&lt;br /&gt;
&lt;br /&gt;
The following are the key features of OpenClovis IDE:&lt;br /&gt;
* '''Eclipse based IDE for System and Information Modeling''': Powerful, Eclipse-based graphical user interface for system modeling, information modeling, and SAFplus-based product development.&lt;br /&gt;
* '''UML Based''': Model components and their relationship such as containment, aggregation, and inheritance, are edited using a graphical UML editor.&lt;br /&gt;
* '''Projects Based''': Modeling work files are organized into projects. Many model artifacts are reusable across projects.&lt;br /&gt;
* '''Integrate with other IDE Tools''': Due to its Eclipse based nature, IDE can be integrated with other Eclipse based IDEs.&lt;br /&gt;
&lt;br /&gt;
===Supported Hardware and Operating Systems===&lt;br /&gt;
&lt;br /&gt;
The ''OpenClovis SDK'' follows the conventions of embedded system development, where the development host (on which much of the software development happens) is different from the actual target host (where SAFplus Platform and SAFplus-based applications run). Therefore, the supported hardware and operating systems, and also the environmental requirements are treated separately in the following sections.&lt;br /&gt;
This distinction is not enforced, and the development host can be used also as a target host, or vice versa, as long as the same host satisfies both sets of requirements.&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Note.png]] Supported systems and system requirements are subject to change without notice. Please consult with the ''OpenClovis SDK Release Notes'' for the most up-to-date information on supported systems and their requirements.&lt;br /&gt;
&lt;br /&gt;
====Development Host====&lt;br /&gt;
&lt;br /&gt;
The OpenClovis SDK can be installed and is tested to work on the following systems:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Table_Supported_DevHost&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&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; | '''Supported Development Hosts'''&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Hardware&lt;br /&gt;
|&lt;br /&gt;
* Intel compatible PC (including CPUs with 64-bit extensions)&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Linux Distributions&lt;br /&gt;
|&lt;br /&gt;
* Red Hat Enterprise Linux 4&lt;br /&gt;
* Ubuntu 7.04, 7.10 Linux&lt;br /&gt;
* CentOS 4.x, 5.0&lt;br /&gt;
* Gentoo Linux&lt;br /&gt;
* Fedora Linux&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The system requirements for the development host are summarized in Table [[#Table_SysReq_DevHost|System Requirements for a Development Host]].&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Note.png]] During installation the OpenClovis SDK installer can reliably detect if any of the 3rd-party software packages listed below are not present on the development host or if their version do not satisfy the requirements. The installer will then install such packages onto the '''OpenClovis installation directory''', satisfying the SDK requirements, but without altering the system-installed software base on the development host. Refer to the ''OpenClovis Installation Guide'' for further information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Table_SysReq_DevHost&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&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; | '''System Requirements for a Development Host'''&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot; width=&amp;quot;150&amp;quot;| Requirement Type&lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot;| Requirements&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Hardware&lt;br /&gt;
|&lt;br /&gt;
* Intel Pentium II (or higher) or compatible AMD processors&lt;br /&gt;
* Hard Disk - 10 GB (minimum suggested)&lt;br /&gt;
* RAM - 512 MB (minimum suggested)&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Linux Distributions&lt;br /&gt;
|&lt;br /&gt;
* See ''Supported Development Hosts'' above&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;br&amp;gt;Third Party Packages &lt;br /&gt;
|&lt;br /&gt;
* glib-2.0 - 2.6.0&lt;br /&gt;
* glibc 2.3.2 or later&lt;br /&gt;
* gcc 3.2.3 or later&lt;br /&gt;
* beecrypt&lt;br /&gt;
* gdbm 1.8.0&lt;br /&gt;
* net-snmp 5.4&lt;br /&gt;
* openhpi 2.8.1&lt;br /&gt;
* openhpi-subagent 2.3.4&lt;br /&gt;
* Gtk&lt;br /&gt;
* Eclipse SDK 3.2.2&lt;br /&gt;
* EMF SDK 2.2.2&lt;br /&gt;
* GEF SDK 3.2.2&lt;br /&gt;
* JRE 1.5.0_03&lt;br /&gt;
* Python 2.4.1 or later&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Target Hosts====&lt;br /&gt;
&lt;br /&gt;
This section lists the supported (certified) target hardware and operating systems for target hosts to run ''OpenClovis SAFplus''. See Table [[#Table_SysReq_TargetPlatform|System Requirements for the Target Platform]] below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Table_SysReq_TargetPlatform&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&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; | '''System Requirements for the Target Platform''' &lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot; width=&amp;quot;150&amp;quot;| Requirement Type&lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot;| Requirements&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
CPU Types&lt;br /&gt;
|&lt;br /&gt;
* Intel x386 compatible processors: Pentium III, Pentium M, Pentium 4, Xeon, AMD Opteron, and AMD Athlon, including processors with AMD64 extensions&lt;br /&gt;
* PowerPC processors: PowerQuicc III, PowerPC G4&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Hardware platforms&lt;br /&gt;
|&lt;br /&gt;
*'''AdvancedTCA Chassis''' &lt;br /&gt;
** Blades: Intel MPCBL0001, Intel MPCBL0030, Intel MPCBL0040, Intel MPCBL0050&lt;br /&gt;
** PowerPC-based base cards and AMC SBCs&lt;br /&gt;
** Shelf Management: Pigeon Point ShMM500 or Radisys Promentum 2100/2210 switch/shelf manager cards&lt;br /&gt;
*'''Rack Mount Servers and Desktop PCs'''&lt;br /&gt;
** Any PC satisfying the CPU and OS requirements&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;br&amp;gt;Linux Distributions&lt;br /&gt;
|&lt;br /&gt;
* Wind-River PNE LE 1.2 (2.6.10 kernel)&lt;br /&gt;
* Wind-River PNE LE 1.3 (2.6.14 kernel)&lt;br /&gt;
* Wind-River PNE LE 1.4 (2.6.14 kernel)&lt;br /&gt;
* Red Hat Enterprise Linux 4.0 (2.6.9.5 kernel)&lt;br /&gt;
* Ubuntu 7.04 Linux (i386 and x86_64)&lt;br /&gt;
* CentOS 4.x, 5.0 (i386 and x86_64)&lt;br /&gt;
* Gentoo Linux (i386 and x86_64)&lt;br /&gt;
* Fedora Linux (i386 and x86_64)&lt;br /&gt;
* Yellow Dog Linux 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In case of AdvancedTCA platforms satisfying the above shelf manager requirements is used, OpenClovis SAFplus Platform can be strongly integrated with the shelf manager, providing additional features and benefits in the area of system management and high availability.&lt;br /&gt;
Customers wishing to utilize such platform support need to acquire the OpenClovis ''Base Platform Support Package'' for AdvancedTCA platforms.&lt;br /&gt;
The same benefit is not available for platforms with no shelf management capabilities (unmanaged platforms).&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Note.png]] Additional standardized or customer specific hardware platforms can be supported using custom PSPs. Please contact OpenClovis for further information.&lt;br /&gt;
&lt;br /&gt;
===OpenClovis Architecture===&lt;br /&gt;
&lt;br /&gt;
The OpenClovis architecture comprises an extensive set of high-quality, modular and reusable software components and tools that are standards based and hardware and operating system (OS) agnostic. The hardware and software components communicate with each other through APIs, client libraries, and user space processes.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;span id='OpenClovis Architecture'&amp;gt;&amp;lt;/span&amp;gt;[[File:SDK_architecture_50_updated.png|frame|center| '''OpenClovis Architecture''' ]]&lt;br /&gt;
&lt;br /&gt;
The comprehensive set of OpenClovis SAFplus Platform components can be broadly categorized into the following functional domains, as illustrated in Figure [[#Functional Scope of OpenClovis SAFplus Platform | Functional Scope of OpenClovis SAFplus]]:&lt;br /&gt;
* High Availability&lt;br /&gt;
* System Management&lt;br /&gt;
* Communication Infrastructure&lt;br /&gt;
* Basic Infrastructure&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id='Functional Scope of OpenClovis SAFplus'&amp;gt;&amp;lt;/span&amp;gt;[[File:SDK_FunctionalScopeofSAFplus Platform.png|frame|center| '''Functional Scope of OpenClovis SAFplus''' ]]&lt;br /&gt;
&lt;br /&gt;
====High Availability Domain====&lt;br /&gt;
&lt;br /&gt;
Ensuring high availability across the network is a key concern in mission-critical telecom environments. OpenClovis architecture delivers a high degree of redundancy, delivering access to key services via three highly-resilient traffic handling and system recovery mechanisms. &lt;br /&gt;
* Availability Management Framework (AMF) controls the active and standby availability states of components that are providing a given service, and supports automatic failover according to user-configured policies. AMF organizes redundant components in various configurations, such as 1:1 and N+M. &lt;br /&gt;
* Checkpointing Service delivers redundant component synchronization of run-time data and context to ensure smooth failover if a fault occurs. &lt;br /&gt;
* Group Membership Service assists applications and other OpenClovis components to define, form, manage and monitor service groups.&lt;br /&gt;
&lt;br /&gt;
Refer Chapter [[Doc:sdkguide/highavailability#High Availability | High Availability]]  for more information.&lt;br /&gt;
&lt;br /&gt;
====System Management Domain====&lt;br /&gt;
&lt;br /&gt;
Another aspect of achieving mission-critical availability is providing comprehensive software and hardware component manageability.&lt;br /&gt;
* Provisioning Manager is a client module that is automatically bound to every software component that manages a software and/or hardware resource. Provisioning attributes are created and deleted as components start and terminate service.&lt;br /&gt;
* Alarm Manager provides an infrastructure for configuring alarms, and defining the actions to be taken when an alarm is generated. &lt;br /&gt;
* Fault Manager offers a hierarchical system for managing both hardware and software faults. Faults can be prioritized to ensure they are responded to in the order of their importance, and associated actions can be specified.&lt;br /&gt;
* Component Manager monitors the health and controls the life-cycle of all active service components executing within the system.&lt;br /&gt;
* Chassis Manager supervises the components of a chassis field replaceable units (FRUs), such as blades, AMCs, and PMCs. Capable of detecting hot-swapped modules, the system is able to receive instructions from other system resources.&lt;br /&gt;
* Mediation Library provides a unified interface to the external management protocols and services (CLI, SNMP) to control the configuration and operation of all managed objects within the system. &lt;br /&gt;
* Clovis Object Registry (COR) is a distributed, object-oriented database that captures and stores data on system-managed objects and the relationships between them. COR also manages the object life-cycle, transactions on multiple objects, object change notifications, and object change propagation across all the various distributed MOs.&lt;br /&gt;
* Transaction Manager provides an infrastructure library that uses transaction semantics to manage distributed data, enabling components that need to participate in a transaction to act as a resource manager.&lt;br /&gt;
&lt;br /&gt;
Refer Chapter [[Doc:sdkguide/manageability#System Management | System Management]]  for more information.&lt;br /&gt;
&lt;br /&gt;
====Communication Infrastructure Domain====&lt;br /&gt;
&lt;br /&gt;
OpenClovis SAFplus Platform is capable of pulling a cluster of computers together into one homogeneous system. In order to achieve this, it relies on numerous communication services, which are implemented as part of SAFplus Platform. These services are also offered to the applications that are built on top of SAFplus Platform.&lt;br /&gt;
* Event Manager provides a flexible, scalable, distributed service infrastructure for event notification across multiple blades, following a publish-subscribe model, where the publishers of events are unaware of the subscribers, and vice versa. It maintains a copy of the local subscriber database for resilient system recovery in the event of a server failure.&lt;br /&gt;
* Name Service provides storage and look-up for one-to-one mappings between the name of a service and its object reference. It replicates the name database across all nodes to allow efficient, scalable lookups between applications and the local name server.&lt;br /&gt;
* Remote Method Dispatch (RMD) provides remote function call semantics across application processes and nodes. It allows both synchronous and asynchronous calls, the latter supporting asynchronous message passing programming models. In both cases, marshaling and unmarshaling of C-level user data is provided by an XDR (eXternal Data Representation) layer, which can be autogenerated from Interface Description Language (IDL) files. &lt;br /&gt;
* Intelligent Object Communication (IOC) provides efficient transport for communication between Clovis Objects. It supports both reliable and unreliable modes of communication. The IOC layer currently utilizes TIPC as the underlying communication protocol, but it can be ported to other low-level IPC services.&lt;br /&gt;
&lt;br /&gt;
Refer Chapter [[Doc:sdkguide/cominfrastructure#Communication Infrastructure | Communication Infrastructure]]  for more information.&lt;br /&gt;
&lt;br /&gt;
====Basic Infrastructure Domain====&lt;br /&gt;
&lt;br /&gt;
OpenClovis SAFplus Platform consists of (and builds upon) a large number of basic services, all of which are offered to user applications. Three categories of basic infrastructure services are:&lt;br /&gt;
* Basic Services include logging service, execution object wrapper, OS abstratction layer, handle management, SAFplus Platform debug console, and timer library&lt;br /&gt;
* Memory Management includes a feature-reach low-level heap manager, and several higher-level services such as buffer management, queue library, circular list library, and container library&lt;br /&gt;
* Data Management comprises the database abstraction layer (DBAL) that provides an implementation agnostic API to access various database managers to store and retrieve data.&lt;br /&gt;
&lt;br /&gt;
Refer Chapter [[Doc:sdkguide/basicinfrastructure#Basic Infrastructure | Basic Infrastructure]]  for more information.&lt;br /&gt;
&lt;br /&gt;
To summarize, OpenClovis SAFplus Platform provides an extensive set of high-quality, modular, portable, reusable software components that enable rapid integration of system management and high availability functionalities into next generation communication platforms. The use of these readily available components yields more controlled development risks, drastically reduced development time, and lower development costs.&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/sdkguide</id>
		<title>Doc:latest/sdkguide</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/sdkguide"/>
				<updated>2010-08-27T03:41:56Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Table of contents:&lt;br /&gt;
&lt;br /&gt;
* [[Doc:latest/sdkguide/preface | Preface ]]&lt;br /&gt;
* [[Doc:latest/sdkguide/overview | Overview ]]&lt;br /&gt;
* [[Doc:latest/sdkguide/highavailability | High Availability]]&lt;br /&gt;
* [[Doc:latest/sdkguide/manageability | System Management]]&lt;br /&gt;
* [[Doc:latest/sdkguide/cominfrastructure| Communication Infrastructure]]&lt;br /&gt;
* [[Doc:latest/sdkguide/basicinfrastructure| Basic Infrastructure]]&lt;br /&gt;
* [[Doc:latest/sdkguide/platform | Hardware Platform Support]]&lt;br /&gt;
* [[Doc:latest/sdkguide/lifecycle | Development Lifecycle with OpenClovis SDK]]&lt;br /&gt;
** [[Doc:latest/sdkguide/compconfig | OpenClovis SAFplus Platform Component Configuration]]&lt;br /&gt;
** [[Doc:latest/sdkguide/compdev | Developing Application Components in OpenClovis SAFplus Platform Environment]]&lt;br /&gt;
** [[Doc:latestsdkguide/debugging | Debugging EO Applications and SAFplus Platform Components]]&lt;br /&gt;
** [[Doc:latest/sdkguide/build | Building SAFplus Platform and SAFplus-based Systems]]&lt;br /&gt;
** [[Doc:latest/sdkguide/deploy | Deploying SAFplus Platform onto the Target]]&lt;br /&gt;
** [[Doc:latest/sdkguide/envvars | Runtime environmental variables exported by the OpenClovis SAFplus Platform environment]]&lt;br /&gt;
* [[Doc:latest/sdkguide/startermodels | &amp;quot;Starter&amp;quot; Models]]&lt;br /&gt;
* [[Doc:latest/sdkguide/commandref | Command Line and Environment Variable Reference ]]&lt;br /&gt;
* [[Doc:latest/sdkguide/knowledgebase | Knowledge Base (FAQ, Questions and Answers) ]]&lt;br /&gt;
* [[Doc:latest/sdkguide/troubleshooting | Troubleshooting ]]&lt;br /&gt;
&amp;lt;!--* [[Doc:latest/sdkguide/snmp | Managing OpenClovis SAFplus Platform Applications Using SNMP]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--* [[Doc:latest/sdkguide/snmpsubagent | Creating a SNMP Subagent]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--* [[Doc:latest/sdkguide/transportobject | App A: Writing Transport Objects]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--* [[Doc:latest/sdkguide/hal | App A: Extending HAL and Writing Custom DO]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--* [[Doc:latest/sdkguide/samplecode | App B: Sample Code Templates]]--&amp;gt;&lt;br /&gt;
* [[Doc:latest/sdkguide/glossary | Glossary of Terms]]&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/sdkguide/preface</id>
		<title>Doc:latest/sdkguide/preface</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/sdkguide/preface"/>
				<updated>2010-08-27T03:37:45Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=='''Preface'''==&lt;br /&gt;
&lt;br /&gt;
''OpenClovis Applications Service Platform (SAFplus Platform)'' is a modular, high-performance, scalable software platform (sometimes also referred to as ''middleware'') to facilitate the speedy development and run-time operation of highly-available and manageable communications systems.&lt;br /&gt;
SAFplus Platform has been primarily designed for complex, multi-processor, distributed systems, consisting of multiple processor cards or chassis, using heterogeneous CPU types and operating system versions.&lt;br /&gt;
SAFplus Platform has been fine-tuned for software applications that not only demand reliability and manageability, but also scalability and high performance.&lt;br /&gt;
&lt;br /&gt;
In a typical SAFplus-enabled communication device, SAFplus Platform resides on every (or most) processor entities that need to be involved in the manageability and configuration of the device, or which need to perform redundant services in order to provide high availability.&lt;br /&gt;
On each of such processors SAFplus Platform is present in the form of a few run-time processes (daemons), while application-specific components that need to use any of the SAFplus Platform services communicate with these daemons using SAFplus Platform client libraries.&lt;br /&gt;
For most SAFplus Platform services, the SAFplus Platform middleware takes care of all needed inter-processor communication and data replication among the various processor entities, effectively tying these into one seamless cluster, hiding the inter-processor aspects from the SAFplus-based custom applications.&lt;br /&gt;
&lt;br /&gt;
During development of an SAFplus-enabled communication system, system architects and software designers work with the ''OpenClovis Software Development Kit (SDK)''.&lt;br /&gt;
The SDK includes the ''OpenClovis Integrated Development Environment (IDE)'', a graphical user interface to define, model, and configure the system, as well as all the relevant source files, header files, run-time libraries, build tools that are needed to create, test, and debug the target system.&lt;br /&gt;
&lt;br /&gt;
With this product, OpenClovis provides Original Equipment Manufactures (OEMs), Telecommuncations Equipment Manufacturers (TEMs) with an efficient and cost-effective solution for creating highly available, manageable products with short time-to-market.&lt;br /&gt;
&lt;br /&gt;
This ''OpenClovis SDK User Guide'' provides system architects and software developers with further information about the OpenClovis SAFplus Platform and its companion SDK. It provides an overview of the SAFplus Platform architecture, the various SAFplus Platform components, and their interactions. This guide also helps you to understand how to work with the OpenClovis Software Development Kit (SDK) when modeling, configuring, building, and deploying SAFplus Platform and SAFplus Platform based applications on target systems.&lt;br /&gt;
&lt;br /&gt;
===Audience===&lt;br /&gt;
&lt;br /&gt;
''OpenClovis SDK User Guide'' is written for system architects, software designers, developers, and system integrators. To use this OpenClovis product, you must be aware of the fundamentals of operation, management, and configuration of telecommunication and networking systems. You must also be familiar with basic high availability concepts, C programming, UML notations, and have the basic knowledge of Linux.&lt;br /&gt;
&lt;br /&gt;
===Documentation Conventions===&lt;br /&gt;
&lt;br /&gt;
This user 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;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;3&amp;quot;&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot;| Notation &lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot;| Description&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:black&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.&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Cross reference&lt;br /&gt;
|&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 User Guide or a URL link.&lt;br /&gt;
A cross reference refers to a section name accesses the first page of that section.&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
'''Bold Text''' &lt;br /&gt;
|&lt;br /&gt;
Menu items and button names.&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
''Italic Text'' &lt;br /&gt;
|&lt;br /&gt;
Variables for which you enter values.&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;
===Document Organization===&lt;br /&gt;
&lt;br /&gt;
OpenClovis SDK User Guide is organized into various chapters to provide information on specific areas. The following table introduces the chapter names and a brief overview of the content.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;3&amp;quot;&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot;| Chapter &lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot;| Overview&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Chapter 1, Overview&lt;br /&gt;
|&lt;br /&gt;
This chapter helps you understand the conceptual information, advantages and key features of OpenClovis SAFplus Platform and IDE.&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Chapter 2, High Availability (HA)&lt;br /&gt;
|&lt;br /&gt;
This chapter provides an introduction to the basic concepts of HA and the relevant SAFplus Platform features and SAFplus Platform components, namely: Availability Management Framework (AMF), Checkpointing Service, and Group membership Service (GMS).&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Chapter 3, System Management&lt;br /&gt;
|&lt;br /&gt;
This chapter provides information about the various SAFplus Platform features and components for system management, such as: Clovis Object Registry (COR), Mediation Library, Transaction Service, Provisioning Library, Alarm Service, Chassis Management, and SNMP Sub-Agents&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Chapter 4, Communications Infrastructure&lt;br /&gt;
|&lt;br /&gt;
This chapter provides an overview of the features, services and relevant components of SAFplus Platform in the domain of inter-process and inter-processor data communication.&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Chapter 5, Basic Infrastructure&lt;br /&gt;
|&lt;br /&gt;
OpenClovis SAFplus Platform is built on a number of basic infrastructure elements, which are described in this chapter.&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Chapter 6, Hardware Platform Support&lt;br /&gt;
|&lt;br /&gt;
The specific benefits of the Platform Support Package, and its realization are described in this chapter.&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Chapter 7, Development Lifecycle and OpenClovis SDK&lt;br /&gt;
|&lt;br /&gt;
This chapter describes how the various SDK features fit in the workflow of a typical development life-cycle, and provides detailed information about the key phases, such as configuring, building, and deploying SAFplus-enabled systems.&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Chapter 8, &amp;quot;Starter&amp;quot; Models&lt;br /&gt;
|&lt;br /&gt;
This chapter summarizes the so-called starter models provided by OpenClovis to jump-start the development of your own application, as an alternative to starting from scratch.&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Appendix A, Glossary of Terms&lt;br /&gt;
|&lt;br /&gt;
This provides complete information about all the terms and definitions specific to OpenClovis SAFplus Platform and its components.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Related Documentation===&lt;br /&gt;
&lt;br /&gt;
For additional information about the OpenClovis SAFplus Platform, SDK, and IDE, please refer to the following companion documents:&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;
* '''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;
* '''OpenClovis Installation Guide''' provides the system requirements, installation procedure for OpenClovis SAFplus Platform, IDE, and the Evaluation System.&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;
* '''OpenClovis Evaluation System User Guide''' provides all the required information to configure and run the sample models packaged within the Evaluation System. This document also provides good understanding of OpenClovis SAFplus Platform's functionality. This is the natural follow on to the ''OpenClovis Sample Application Tutorial'' as it builds on the example created in that document. &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;
* '''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;
* '''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;
* '''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;
All the above document are available in both Portable Document Format (PDF) as well as a set of cross-referenced, browsable HTML pages. They can be found under the &amp;lt;code&amp;gt;/doc&amp;lt;/code&amp;gt; subdirectory of the installed SDK (under the &amp;lt;code&amp;gt;/pdf&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/html&amp;lt;/code&amp;gt; subdirectories, respectively). Please refer to the installation guide for further information.&lt;br /&gt;
&lt;br /&gt;
===OpenClovis Online Technical Support===&lt;br /&gt;
&lt;br /&gt;
OpenClovis customers and partners can register on our website 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: &lt;br /&gt;
http://www.openclovis.org/forum&lt;br /&gt;
&lt;br /&gt;
===Documentation Feedback===&lt;br /&gt;
&lt;br /&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: &lt;br /&gt;
support@openclovis.com  Post your feedback on documentation at: http://www.openclovis.org/forum&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/ideguide</id>
		<title>Doc:latest/ideguide</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/ideguide"/>
				<updated>2010-08-27T03:37:11Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Table of contents:&lt;br /&gt;
&lt;br /&gt;
* [[Doc:latest/sdkguide/preface | Preface ]]&lt;br /&gt;
* [[Doc:latest/sdkguide/overview | Overview ]]&lt;br /&gt;
* [[Doc:latest/sdkguide/highavailability | High Availability]]&lt;br /&gt;
* [[Doc:latest/sdkguide/manageability | System Management]]&lt;br /&gt;
* [[Doc:latest/sdkguide/cominfrastructure| Communication Infrastructure]]&lt;br /&gt;
* [[Doc:latest/sdkguide/basicinfrastructure| Basic Infrastructure]]&lt;br /&gt;
* [[Doc:latest/sdkguide/platform | Hardware Platform Support]]&lt;br /&gt;
* [[Doc:latest/sdkguide/lifecycle | Development Lifecycle with OpenClovis SDK]]&lt;br /&gt;
** [[Doc:latest/sdkguide/compconfig | OpenClovis SAFplus Platform Component Configuration]]&lt;br /&gt;
** [[Doc:latest/sdkguide/compdev | Developing Application Components in OpenClovis SAFplus Platform Environment]]&lt;br /&gt;
** [[Doc:latestsdkguide/debugging | Debugging EO Applications and SAFplus Platform Components]]&lt;br /&gt;
** [[Doc:latest/sdkguide/build | Building SAFplus Platform and SAFplus-based Systems]]&lt;br /&gt;
** [[Doc:latest/sdkguide/deploy | Deploying SAFplus Platform onto the Target]]&lt;br /&gt;
** [[Doc:latest/sdkguide/envvars | Runtime environmental variables exported by the OpenClovis SAFplus Platform environment]]&lt;br /&gt;
* [[Doc:latest/sdkguide/startermodels | &amp;quot;Starter&amp;quot; Models]]&lt;br /&gt;
* [[Doc:latest/sdkguide/commandref | Command Line and Environment Variable Reference ]]&lt;br /&gt;
* [[Doc:latest/sdkguide/knowledgebase | Knowledge Base (FAQ, Questions and Answers) ]]&lt;br /&gt;
* [[Doc:latest/sdkguide/troubleshooting | Troubleshooting ]]&lt;br /&gt;
&amp;lt;!--* [[Doc:latest/sdkguide/snmp | Managing OpenClovis SAFplus Platform Applications Using SNMP]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--* [[Doc:latest/sdkguide/snmpsubagent | Creating a SNMP Subagent]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--* [[Doc:latest/sdkguide/transportobject | App A: Writing Transport Objects]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--* [[Doc:latest/sdkguide/hal | App A: Extending HAL and Writing Custom DO]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--* [[Doc:latest/sdkguide/samplecode | App B: Sample Code Templates]]--&amp;gt;&lt;br /&gt;
* [[Doc:latest/sdkguide/glossary | Glossary of Terms]]&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/logtoolguide</id>
		<title>Doc:latest/logtoolguide</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/logtoolguide"/>
				<updated>2010-08-27T03:36:03Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=='''Preface'''==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; ''OpenClovis Log Tool User Guide''  provides information about the usage of OpenClovis Log Tool.&lt;br /&gt;
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. By analyzing this information, you can troubleshoot the errors. These log files are in raw format and hard to read. Log Tool allows you to format the files and filter them for the required entries. &lt;br /&gt;
&lt;br /&gt;
===Documentation Conventions===&lt;br /&gt;
&lt;br /&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;0&amp;quot; cellpadding=&amp;quot;3&amp;quot;&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot;| Notation &lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot;| Description&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|style=&amp;quot;color:black&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;
|&lt;br /&gt;
This font denotes various commands and their usage.&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Cross reference&lt;br /&gt;
|&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 User Guide or a URL link.&lt;br /&gt;
A cross reference refers to a section name accesses the first page of that section.&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
'''Bold Text''' &lt;br /&gt;
|&lt;br /&gt;
Menu items and button names.&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
''Italic Text'' &lt;br /&gt;
|&lt;br /&gt;
Variables for which you enter values.&lt;br /&gt;
|}&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;
===Document Organization===&lt;br /&gt;
&lt;br /&gt;
This guide is organized into various chapters to provide information on specific areas. The following table introduces the chapter names and a brief overview of the content. &lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;3&amp;quot;&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot;| Chapter &lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot;| Overview&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Preface&lt;br /&gt;
|&lt;br /&gt;
This chapter gives an introduction to OpenClovis Log Tool.&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Available Tools&lt;br /&gt;
|&lt;br /&gt;
This chapter helps you understand the conceptual information, advantages and key features of OpenClovis Log Tools. It provides information to access the available Log Tools, Command Line Log Tool and Offline GUI Log Tool.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Related Documents===&lt;br /&gt;
&lt;br /&gt;
For additional information about OpenClovis products, refer to the following guides:&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;
* '''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;
* '''OpenClovis Installation Guide''' provides the system requirements, installation procedure for OpenClovis SAFplus Platform, IDE, and the Evaluation System.&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;
* '''OpenClovis Evaluation System User Guide''' provides all the required information to configure and run the sample models packaged within the Evaluation System. This document also provides good understanding of OpenClovis SAFplus Platform's functionality. This is the natural follow on to the ''OpenClovis Sample Application Tutorial'' as it builds on the example created in that document. &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;
* '''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;
* '''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;
* '''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;
===OpenClovis Online Technical Support===&lt;br /&gt;
&lt;br /&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;
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;br /&gt;
&lt;br /&gt;
=='''Available Log Tools'''==&lt;br /&gt;
&lt;br /&gt;
Log files come in 2 flavors, binary and ASCII. ASCII files are easily viewable using standard Linux editors and tools (vi, emacs, tail, etc).  By default OpenClovis writes all of its logs in ASCII format.  However you may want to change this to binary format or create your own binary format logs.  For the binary format logs OpenClovis provides access using following tools :&lt;br /&gt;
* [[#Using Command Line Log Tool | Command Line Log Tool ]]&lt;br /&gt;
* [[#Using Offline GUI Log Tool | Offline GUI Log Tool ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Using Command Line Log Tool===&lt;br /&gt;
&lt;br /&gt;
The online log viewer is a command line utility which may be used to view the Log Records present in the binary log files. The online log viewer only works on binary log files. To view an ASCII log file simply open them with your favorite editor. &lt;br /&gt;
&lt;br /&gt;
The online log viewer displays the log records after some required conversion. It converts the Severity, StreamId, ComponentId to their corresponding names. This conversion is done using information present in metadata file (cfg file) corresponding to each log file. By default, the online log viewer displays the following fields of a log record:&lt;br /&gt;
# SeverityName &lt;br /&gt;
# StreamName &lt;br /&gt;
# ComponentName &lt;br /&gt;
# ServiceId &lt;br /&gt;
# MessageId &lt;br /&gt;
# TimeStamp &lt;br /&gt;
# Message&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Note.png]]Its very rare that log viewer does not find the stream id to stream name mapping in cfg file. If it does not then it would display the stream id in place of stream name. Same holds true for component id to component name mapping. In this situation it would not be possible to apply filter on that field.&lt;br /&gt;
&lt;br /&gt;
Online log viewer executable &amp;lt;code&amp;gt;'''asp_binlogviewer'''&amp;lt;/code&amp;gt; is deployed in &amp;lt;code&amp;gt;'''bin'''&amp;lt;/code&amp;gt; directory of the SAFplus Platform. This online log viewer may be used in following ways :&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; To view log records present in a log file (or a set of log files when multiple log files are present for a logical log file) in real time i.e. when logging is going on. In this case it seeks to the latest record and starts displaying the record from that point (which can even be the last record of the log file). As the Log Server writes, this Log Tool tails the files and prints it to the Console. It automatically detects file rollover and tails the new file.&lt;br /&gt;
&amp;lt;br&amp;gt;'''Usage''':&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
asp_binlogviewer -l &amp;lt;log_file_prefix&amp;gt; &lt;br /&gt;
                [-f &amp;lt;filter&amp;gt;] &lt;br /&gt;
                [-t &amp;lt;msg_id_map_file&amp;gt;] &lt;br /&gt;
                [-p &amp;lt;num_prev_recs&amp;gt;] &lt;br /&gt;
                [-c &amp;lt;column(s)&amp;gt;] &lt;br /&gt;
                [-a] [-h|--help]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;To convert a binary log file to its corresponding text file (this text file contains the log records in exactly the same format as it is displayed on the console) :&lt;br /&gt;
&amp;lt;br&amp;gt;'''Usage''': &lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
asp_binlogviewer -L &amp;lt;log_file_path&amp;gt; &lt;br /&gt;
                [-C &amp;lt;cfg_file_path&amp;gt;] &lt;br /&gt;
                [-t &amp;lt;msg_id_map_file&amp;gt;] &lt;br /&gt;
                [-h|--help]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
[[File:OpenClovis_Note.png]]User may convert a binary log file to its corresponding text file when logging is going on as well as when it has stopped.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Viewing log records in real time====&lt;br /&gt;
&lt;br /&gt;
=====Specify the location of log files=====&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt;: This is the mandatory option for viewing records in real time. &lt;br /&gt;
&lt;br /&gt;
It is used to specify the common prefix to log files (symbolic links to log files) on file system. &amp;lt;code&amp;gt;&amp;lt;log_file_prefix&amp;gt;&amp;lt;/code&amp;gt; is common prefix of log file names.&lt;br /&gt;
&lt;br /&gt;
'''Example''': &lt;br /&gt;
&amp;lt;br&amp;gt;The log files are &amp;lt;code&amp;gt;/tmp/logFile.0&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;/tmp/logFile.1&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/tmp/logFile.2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Usage''':&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ASP_BINDIR/asp_binlogviewer -l /tmp/logFile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Setting Filter on a header field=====&lt;br /&gt;
&lt;br /&gt;
*-f : User may specify filter on one of the header fields&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;filter&amp;gt;&amp;lt;/code&amp;gt; should be specified as:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;&amp;lt;header field&amp;gt;&amp;lt;comparision operator&amp;gt;&amp;lt;value&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''\&amp;lt;header field\&amp;gt; options:'''&lt;br /&gt;
&lt;br /&gt;
* s - SeverityName&lt;br /&gt;
* r - StreamName&lt;br /&gt;
* c - ComponentName&lt;br /&gt;
* v - ServiceId&lt;br /&gt;
* t - TimeStamp&lt;br /&gt;
* m - MessageId&lt;br /&gt;
&lt;br /&gt;
'''\&amp;lt;comparision operator\&amp;gt; options:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; Equal To&lt;br /&gt;
* &amp;lt;code&amp;gt;!=&amp;lt;/code&amp;gt; Not Equal To&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; Less Than&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;=&amp;lt;/code&amp;gt; Less Than and Equal To&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; Greater Than&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;gt;=&amp;lt;/code&amp;gt; Greater Than and Equal To&lt;br /&gt;
&lt;br /&gt;
'''Possible \&amp;lt;value\&amp;gt; in a filter:'''&lt;br /&gt;
&lt;br /&gt;
'value' should be: &lt;br /&gt;
&lt;br /&gt;
*String for following fields : SeverityName, StreamName, ComponentName &lt;br /&gt;
*HH:MM:SS for TimeStamp &lt;br /&gt;
*Integer for following fields : ServiceId, MessageId &lt;br /&gt;
 &lt;br /&gt;
'''Example''':&lt;br /&gt;
&amp;lt;br&amp;gt;Set filter on stream name (StreamName) 'CL_LOG_APPLICATION'	&lt;br /&gt;
&lt;br /&gt;
'''Usage''':&lt;br /&gt;
 $ASP_BINDIR/asp_binlogviewer -l &amp;lt;log_file_prefix&amp;gt;  -f &amp;quot;r=CL_LOG_APPLICATION&amp;quot;&lt;br /&gt;
&lt;br /&gt;
For time stamp having value greater than 4.30pm...	&lt;br /&gt;
&lt;br /&gt;
'''Usage''': &lt;br /&gt;
 $ASP_BINDIR/asp_binlogviewer -l &amp;lt;log_file_prefix&amp;gt;  -f &amp;quot;t&amp;gt;16:30:00&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=====Specify TLV mapping file=====&lt;br /&gt;
&lt;br /&gt;
*-t : This option is used when log files contain records of TLV (tag length value) format.&lt;br /&gt;
&lt;br /&gt;
Specify complete path to TLV mapping file. &lt;br /&gt;
&lt;br /&gt;
'''Example''': &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;tlvmap.txt&amp;lt;/code&amp;gt; contains the TLV mapping for log records of log file /tmp/sys.0&lt;br /&gt;
&lt;br /&gt;
'''Usage''': &lt;br /&gt;
 $ASP_BINDIR/asp_binlogviewer -l /tmp/sys -t tlvmap.txt&lt;br /&gt;
&lt;br /&gt;
Following is a sample TLV map file which contains message id to TLV message mapping. TLV File content should be in following format :&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 Message_ID&amp;lt;space&amp;gt;Message containing %TLV&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
where &amp;lt;code&amp;gt;&amp;lt;space&amp;gt;&amp;lt;/code&amp;gt; is a single space.&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Note.png]]All the %TLV are replaced by their corresponding values from log record's tag, length, value information for that message id.&lt;br /&gt;
&lt;br /&gt;
Following are the sample content of a TLV map file tlvmap.txt :&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 5 Component %TLV was unble to start on node %TLV&lt;br /&gt;
 6 State Change: Entity [%TLV] Operational State (%TLV -&amp;gt; %TLV) AMF (%TLV)&lt;br /&gt;
 7 Registering Component %TLV via eoPort %TLV&lt;br /&gt;
 8 Extending %TLV byte pool of %TLV chunkSize&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This file contains the message id to string mapping for TLV (tag lengh value) messages. '%TLV' of tlv strings are replaced by the corresponding value found in the log record.&lt;br /&gt;
&lt;br /&gt;
=====Display previous log records=====&lt;br /&gt;
&lt;br /&gt;
* -p: Display &amp;lt;code&amp;gt;&amp;lt;num_prev_recs&amp;gt;&amp;lt;/code&amp;gt; previous log records and exit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;num_prev_recs&amp;gt;&amp;lt;/code&amp;gt; is the number of previous log records to be displayed. If user specifies a number greater than the maximum log records or number of log records actually present in all the log files then entire log is displayed.&lt;br /&gt;
&lt;br /&gt;
'''Example''': &lt;br /&gt;
&amp;lt;br&amp;gt;View 10 previous records&lt;br /&gt;
&lt;br /&gt;
'''Usage''': &lt;br /&gt;
 $ASP_BINDIR/asp_binlogviewer -l &amp;lt;log_file_prefix&amp;gt; -p 10&lt;br /&gt;
&lt;br /&gt;
=====Display only selected fields of Log Record=====&lt;br /&gt;
&lt;br /&gt;
*-c : Display selected field(s) of Log Record&lt;br /&gt;
&lt;br /&gt;
User may choose to display only selected fields of log record. This can be achieved by using -c option where the numbers are separated by ',' .&lt;br /&gt;
&lt;br /&gt;
The default columns are :&lt;br /&gt;
# SeverityName &lt;br /&gt;
# StreamName &lt;br /&gt;
# ComponentName &lt;br /&gt;
# ServiceId &lt;br /&gt;
# MessageId &lt;br /&gt;
# TimeStamp &lt;br /&gt;
# Message&lt;br /&gt;
&lt;br /&gt;
'''Example''':&lt;br /&gt;
&amp;lt;br&amp;gt;Display only the following fields: StreamName, ServiceId, TimeStamp  &lt;br /&gt;
&lt;br /&gt;
'''Usage''': &lt;br /&gt;
 $ASP_BINDIR/asp_binlogviewer -l &amp;lt;log_file_prefix&amp;gt; -c 2,4,6&lt;br /&gt;
&lt;br /&gt;
=====Display records present in entire log file(s)=====&lt;br /&gt;
*-a : Display entire log and exit&lt;br /&gt;
&lt;br /&gt;
This option displays all the log records present in a log file or all log files when multiple log files are present for single logical file.&lt;br /&gt;
&lt;br /&gt;
'''Example''': &lt;br /&gt;
&amp;lt;br&amp;gt;Display all the log records which file &amp;lt;code&amp;gt;/tmp/sys.0&amp;lt;/code&amp;gt; contains&lt;br /&gt;
&lt;br /&gt;
'''Usage''': &lt;br /&gt;
 $ASP_BINDIR/asp_binlogviewer -l /tmp/sys -a&lt;br /&gt;
&lt;br /&gt;
====Convert a binary log file to text file====&lt;br /&gt;
&lt;br /&gt;
=====Specify complete path to log file=====&lt;br /&gt;
&lt;br /&gt;
* -L : &amp;lt;log_file_path&amp;gt; is complete path to a log file.&lt;br /&gt;
&lt;br /&gt;
* -C : &amp;lt;cfg_file_prefix&amp;gt; is prefix to cfg (metadata) file. This is an optional argument which is required when log file name and prefix of cfg file are different.&lt;br /&gt;
&lt;br /&gt;
* -t : If log file contains TLV messages then please specify TLV file path using this option.&lt;br /&gt;
&lt;br /&gt;
If log file is &amp;lt;code&amp;gt;/tmp/logFile&amp;lt;/code&amp;gt; the corresponding text file will be &amp;lt;code&amp;gt;/tmp/logFile.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Example''':&lt;br /&gt;
&amp;lt;br&amp;gt;When log file name and prefix of cfg files are the same (log file is &amp;lt;code&amp;gt;/tmp/sys_2007-04-18T18:58:36&amp;lt;/code&amp;gt; and cfg file is &amp;lt;code&amp;gt;/tmp/sys_2007-04-18T18:58:36.cfg&amp;lt;/code&amp;gt;) :&lt;br /&gt;
&lt;br /&gt;
'''Usage''': &lt;br /&gt;
 $ASP_BINDIR/asp_binlogviewer -L /tmp/sys_2007-04-18T18:58:36 &lt;br /&gt;
&lt;br /&gt;
'''Example''':&lt;br /&gt;
&amp;lt;br&amp;gt;When log file name and prefix of cfg files are different (log file is &amp;lt;code&amp;gt;/tmp/sys_2007-04-18T18:58:37&amp;lt;/code&amp;gt; and cfg file is &amp;lt;code&amp;gt;/tmp/sys_2007-04-18T18:58:36.cfg&amp;lt;/code&amp;gt;) :&lt;br /&gt;
&lt;br /&gt;
'''Usage''': &lt;br /&gt;
 $ASP_BINDIR/asp_binlogviewer -L /tmp/sys_2007-04-18T18:58:37 \&lt;br /&gt;
                              -C /tmp/sys_2007-04-18T18:58:36&lt;br /&gt;
&lt;br /&gt;
====For detailed help use --h or --help====&lt;br /&gt;
&lt;br /&gt;
*--help | -h : Display help and exit&lt;br /&gt;
&lt;br /&gt;
'''Usage''': &lt;br /&gt;
 $ASP_BINDIR/asp_binlogviewer -h&lt;br /&gt;
&lt;br /&gt;
 $ASP_BINDIR/asp_binlogviewer --help&lt;br /&gt;
&lt;br /&gt;
====Command line log tool Output Format====&lt;br /&gt;
&lt;br /&gt;
As the Log Server writes, this Log Tool tails the files and prints it to the Console. It automatically detects file rollover and tails the new file. &lt;br /&gt;
&lt;br /&gt;
The output is of the form: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
SEVERITY STREAMNAME COMPONENTNAME SERVICEID MESSAGEID TIMESTAMP MESSAGE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example,  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
DEBUG applogs cpmServer_SysController_1 10 0 {Mon Jan 22 17:41:08 2007} \&lt;br /&gt;
( 0x6d 0x53 0x27 0x2a 0x97 0x22 0x1e 0x34 )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
where, &lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;Debug&amp;lt;/code&amp;gt; is the Severity&lt;br /&gt;
*&amp;lt;code&amp;gt;applogs&amp;lt;/code&amp;gt; is the Stream Name&lt;br /&gt;
*&amp;lt;code&amp;gt;cpmServer_SysController_1&amp;lt;/code&amp;gt; is the Component Name&lt;br /&gt;
*&amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; is the Service ID&lt;br /&gt;
*&amp;lt;code&amp;gt;{Mon Jan 22 17:41:08 2007}&amp;lt;/code&amp;gt; is the Time Stamp&lt;br /&gt;
*&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is the Message ID which indicates that it is BUFFER type Binary Message. Message ID 1 is for ASCII message and it is not supported by log viewer, Message IDs other than 0 and 1 are of TLV type Binary Message.&lt;br /&gt;
*&amp;lt;code&amp;gt;( 0x6d 0x53 0x27 0x2a 0x97 0x22 0x1e 0x34 )&amp;lt;/code&amp;gt; This is the hex value of each message byte separated by a space.&lt;br /&gt;
*online log viewer doesn't interpret the message part in case of BUFFER type records, it simply prints each byte of the message.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Using Offline GUI Log Tool===&lt;br /&gt;
&lt;br /&gt;
OpenClovis Offline Log Tool is an interactive GUI utility that allows you to view log files in a readable format and provides support for navigation, filtering and sorting of the log records. The Offline Log Tool only works on binary log files. To view ASCII log file simply open them with your favorite editor.&lt;br /&gt;
&lt;br /&gt;
====Getting Started====&lt;br /&gt;
&lt;br /&gt;
This provides information to launch the GUI Log Tool and helps you familiarize with its features. &lt;br /&gt;
&lt;br /&gt;
=====How To Launch? =====&lt;br /&gt;
&lt;br /&gt;
The Log Tool is installed in the &amp;lt;code&amp;gt;'''&amp;lt;installation_directory&amp;gt;/sdk-3.0/bin'''&amp;lt;/code&amp;gt; directory during OpenClovis SDK installation.&lt;br /&gt;
&lt;br /&gt;
If you have created the symbolic links during OpenClovis SDK installation, execute the following command:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;# cl-log-viewer&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
If you have not created the symbolic links during OpenClovis SDK installation, go to the  &amp;lt;code&amp;gt;'''&amp;lt;installation_directory&amp;gt;/sdk-3.0/bin'''&amp;lt;/code&amp;gt;  directory and execute the following command:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;# cl-log-viewer&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Alternatively, you can go to the  &amp;lt;code&amp;gt;'''&amp;lt;installation_directory&amp;gt;/sdk-3.0/logviewer'''&amp;lt;/code&amp;gt;  directory and execute the following command:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;# ./logViewer.sh&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Using 'cl-log-viewer' approach to launch the Log Tool is encouraged.&lt;br /&gt;
&lt;br /&gt;
The '''Log Tool''' window is displayed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id='LogToolMainWindow'&amp;gt;&amp;lt;/span&amp;gt;[[File:LogTool_MainWindow.jpg|frame|center|'''Log Tool Main Window''']]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [[#Using Menus | Using Menus]] &lt;br /&gt;
* [[#Using Toolbar | Using Toolbar]]&lt;br /&gt;
&lt;br /&gt;
=====Using Menus=====&lt;br /&gt;
&lt;br /&gt;
Log Tool has the following three menus:&lt;br /&gt;
* '''File''' - The File menu has options that allow you to open a file, close the current open file, close all open files, and exit the tool.&lt;br /&gt;
* '''Tools''' - The Tools menu has options that allow you to create and save filters, access the saved filters, and configure settings for the filter location and the mapping file.&lt;br /&gt;
* '''Help''' - The Help menu provides information about the Log Tool.&lt;br /&gt;
&lt;br /&gt;
=====Using Toolbar=====&lt;br /&gt;
&lt;br /&gt;
The add-on icons for the Log Tool are as shown. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id='LogToolToolbar'&amp;gt;&amp;lt;/span&amp;gt;[[File:LogTool_ToolBar.jpg|frame|center| '''Log Tool Toolbar''']]&lt;br /&gt;
* '''Open Stream''' icon - Use this icon to open a Log file.&lt;br /&gt;
* '''Close Stream''' icon - Use this icon to close a Log file.&lt;br /&gt;
* '''Create Advanced Filter''' icon - Use this icon to create, apply, and save filters.&lt;br /&gt;
* '''Saved Filters''' - Use this icon to apply the saved filter to a set of records.&lt;br /&gt;
* '''Exit Log Tool''' - Use this icon to close the '''Log Tool''' window.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Viewing Log Files====&lt;br /&gt;
&lt;br /&gt;
This section provides information to open log files, use filters to customize views, configure the user directory, and mapping file locations. &lt;br /&gt;
&lt;br /&gt;
'''Key Topics''' :&lt;br /&gt;
* [[#Opening Log File | Opening Log File]] &lt;br /&gt;
* [[#Sorting Log Records | Sorting Log Records]] &lt;br /&gt;
* [[#Navigating Log Records | Navigating Log Records]] &lt;br /&gt;
&lt;br /&gt;
=====Opening Log File=====&lt;br /&gt;
&lt;br /&gt;
To open a Log file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;From the '''File''' menu, click '''Open''' or press '''Ctrl+O'''. The '''File Selection Dialog''' dialog box is displayed.&lt;br /&gt;
&amp;lt;span id='File Selection Dialog'&amp;gt;&amp;lt;/span&amp;gt;[[File:LogTool_FileSelectionDialog.jpg|frame|center|'''File Selection Dialog''']]&lt;br /&gt;
&amp;lt;li&amp;gt;Enter the following:&lt;br /&gt;
* '''Log File''' - Click '''Browse'''. The '''Select Log File''' dialog box is displayed. Specify the binary Log file that you need to view. The log file has the log records in the binary format. Click '''OK'''. The '''Select Log File'''  dialog box closes.&lt;br /&gt;
&amp;lt;span id='Select Log File'&amp;gt;&amp;lt;/span&amp;gt;[[File:LogTool_SelectLogFile.jpg|frame|center| '''Select Log File''' ]]&lt;br /&gt;
*  '''Config File'''  - Click  '''Browse'''. The  '''Select Config File'''  dialog box is displayed. Specify the configuration file that configuration data (such as record length, component ID mapping, and stream ID mapping) for the log file. Click  '''OK''' . The  '''Select Config File'''  dialog box closes.&lt;br /&gt;
&amp;lt;span id='Select Config File'&amp;gt;&amp;lt;/span&amp;gt;[[File:LogTool_SelectConfigFile.jpg|frame|center|'''Select Config File''']]&lt;br /&gt;
&amp;lt;li&amp;gt;In the '''File Selection Dialog''' dialog box, click '''OK'''. The selected Log file opens in the '''Log Tool'''  window. &lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Validations are performed to check if you have specified the correct files. If the files are not correct, the corresponding error message is displayed.&lt;br /&gt;
&amp;lt;span id='Opened Log File'&amp;gt;&amp;lt;/span&amp;gt;[[File:LogTool_OpenedLogFile.jpg|frame|center|'''Opened Log File''']]&lt;br /&gt;
&lt;br /&gt;
=====Sorting Log Records=====&lt;br /&gt;
&lt;br /&gt;
You can click each column header to sort the entries. Every time you click the column header, the direction of sorting changes. Sorting is applicable for the current batch of records only. &lt;br /&gt;
&lt;br /&gt;
=====Listing Log Records=====&lt;br /&gt;
&lt;br /&gt;
The following options are provided for listing Log Records:&lt;br /&gt;
* Click '''First''' to view the first batch of records.&lt;br /&gt;
* Click '''Next''' to view the next batch of records.&lt;br /&gt;
* Click '''Previous''' to view the previous batch of records.&lt;br /&gt;
* Click '''Last''' to view the last batch of records.&lt;br /&gt;
&lt;br /&gt;
====Using Filters====&lt;br /&gt;
&lt;br /&gt;
This chapter provides information on using basic filter, creating and saving filter and using saved filters.&lt;br /&gt;
&lt;br /&gt;
A typical log file generally contains large number of entries. When you need to troubleshoot a problem, only certain entries may be relevant. For example, you may need to view logs with severity level 3. You can use filters to view the log file based on certain criteria to create customized views. You can also save the filter criteria and use it at a later time.&lt;br /&gt;
&lt;br /&gt;
'''Key Topics''' :&lt;br /&gt;
* [[#Using Basic Filter | Using Basic Filter]] &lt;br /&gt;
* [[#Creating and Saving Filter | Creating and Saving Filter]] &lt;br /&gt;
* [[#Using Saved Filter | Using Saved Filter]] &lt;br /&gt;
&lt;br /&gt;
=====Using Basic Filter=====&lt;br /&gt;
&lt;br /&gt;
Basic filter comprises the drop-down lists available in the  '''Log Tool'''  window.&lt;br /&gt;
&lt;br /&gt;
To filter records using the basic filter:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;From the first drop-down list, select the filtering option. The options available are:&lt;br /&gt;
* Record Number&lt;br /&gt;
* Severity&lt;br /&gt;
* StreamId&lt;br /&gt;
* ComponentId&lt;br /&gt;
* ServiceId&lt;br /&gt;
* TimeStamp&lt;br /&gt;
* MessageId&lt;br /&gt;
* Message&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;From the second drop-down list, select the type of filtering. The options in this list is displayed based on your selection in the first drop-down list.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Based on these two selections, you can perform one of the following:&lt;br /&gt;
* In the text box, enter the filter criteria.&lt;br /&gt;
* In the value selector, specify a value. &lt;br /&gt;
&lt;br /&gt;
If you select '''TimeStamp''' as the filter type in the first drop-down list, you need to specify the date and the time as the values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Click '''Filter'''. The records are filtered and displayed based on the specified criteria. &lt;br /&gt;
Figure [[#Filtered List | Filtered List]] shows the records filtered based on Severity 2.&lt;br /&gt;
&amp;lt;span id='Filtered List'&amp;gt;&amp;lt;/span&amp;gt;[[File:LogTool_FilteredList.jpg|frame|center|'''Filtered List''']]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Click '''Clear''' to clear the applied filter and display the records from the start of the file.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following table provides information about the various filter options and the types:&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;center&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;3&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; | '''Filter Options and Types'''&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot;| Filter Option&lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot;| Filter Type&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|Message&lt;br /&gt;
|&lt;br /&gt;
* Is&lt;br /&gt;
* Is Not&lt;br /&gt;
* Contains&lt;br /&gt;
* Does Not Contain&lt;br /&gt;
* Starts With&lt;br /&gt;
* Does not start with&lt;br /&gt;
* Ends With&lt;br /&gt;
* Does not End With&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Severity&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
StreamId&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
ComponentId&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
ServiceId&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
TimeStamp&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Record Number&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
MessageId&lt;br /&gt;
|&lt;br /&gt;
* =&lt;br /&gt;
* &amp;lt;&lt;br /&gt;
* &amp;gt;&lt;br /&gt;
* &amp;lt;=&lt;br /&gt;
* &amp;gt;=&lt;br /&gt;
* Between&lt;br /&gt;
* Range&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Creating and Saving Filter=====&lt;br /&gt;
&lt;br /&gt;
You can create and save filters so that you can apply the saved filters to a set of records at a later time. &lt;br /&gt;
&lt;br /&gt;
To create a filter:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;From the '''Tools''' menu, click '''Advanced Filter''' or press '''Ctrl+F'''. The '''No previous Filter''' dialog box is displayed if you are creating a filter for the first time. Otherwise, the '''Advanced Filter''' window is displayed.&lt;br /&gt;
&amp;lt;span id='No previous Filter'&amp;gt;&amp;lt;/span&amp;gt;[[File:LogTool_NoPreviousFilter.jpg|frame|center|'''No Previous Filter''']]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Click '''OK'''. The '''Advanced Filter''' window is displayed.&lt;br /&gt;
&amp;lt;span id='Advanced Filter'&amp;gt;&amp;lt;/span&amp;gt;[[File:LogTool_AdvancedFilter.jpg|frame|center|'''Advanced Filter''']]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Enter the following information:&lt;br /&gt;
* '''Filter Name''': This is the name for the new filter.&lt;br /&gt;
* '''Filter Type''': Select the type of the filter. The available options are:&lt;br /&gt;
** AND - Select this option if you need all the criterion to be satisfied.&lt;br /&gt;
** OR - Select this option if at least one of the criteria has to be satisfied.&lt;br /&gt;
* Click '''Create Filter Criterion''' to specify the criterion in the drop-down lists. &lt;br /&gt;
* From the first drop-down list, select the filtering option.&lt;br /&gt;
* From the second drop-down list, select the type of filtering. The options in this list is displayed based on your selection in the first drop-down list.&lt;br /&gt;
* Based on these two selections, in the text box, enter the filter criteria or specify a value. If you select  '''TimeStamp''' as the filter type in the first drop-down list, you need to specify the date and the time as the values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Click '''Apply''' to apply the filter to the existing records.&lt;br /&gt;
&amp;lt;li&amp;gt;Click '''Save''' to save the filter.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Click '''Remove''' to remove a filter criteria.&lt;br /&gt;
&lt;br /&gt;
Click '''Cancel''' to cancel creating the filter.&lt;br /&gt;
&lt;br /&gt;
=====Using Saved Filter=====&lt;br /&gt;
&lt;br /&gt;
To use a saved filter:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;From the '''Tools''' menu, click '''Saved Filters''' or press '''Ctrl+S'''. The '''Saved Filter''' dialog box displays the list of saved filters. &amp;lt;span id='Saved Filters'&amp;gt;&amp;lt;/span&amp;gt;[[File:LogTool_SavedFilters.jpg|frame|center|Saved Filters]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Select the filter that you need to apply and click '''Apply'''. The selected filter is applied to the existing records.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;To add more filters, click '''Add'''. The '''Advanced Filter''' window is displayed. For information to create and save a filter, refer to the section [[#Creating and Saving Filter | Creating and Saving Filter]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;To remove a saved filter, select the filter and click '''Remove'''. The selected filter is removed from the list.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Click '''OK''' to close the '''Saved Filters''' dialog box.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Click '''Cancel''' to cancel the process of applying a saved filter.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Configuring User Directory and Mapping File Location====&lt;br /&gt;
&lt;br /&gt;
To configure the location for user-defined filters and mapping files:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;From the '''Tools''' menu, click '''Settings''' or press '''Ctrl+T'''. The '''Settings''' window is displayed.&lt;br /&gt;
&amp;lt;span id='Settings'&amp;gt;&amp;lt;/span&amp;gt;[[File:LogTool_ConfigureLocation.jpg|frame|center|'''Settings''']]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Enter the following information:&lt;br /&gt;
* '''User Directory''': This is the directory where the created filters are saved. This must be an existing directory.&lt;br /&gt;
* '''TLV Mapping File''': This is the directory where the mapping file for the MessageId is stored. A log file represents the MessageIds in a sequence of bytes. The mapping file contains the string representation for these MessageIds. If you specify a mapping file, then the corresponding string representation for the MessageId is displayed when you open the Log file using the Log Tool. If you do not specify the mapping file, then the MessageId is displayed as a sequence of bytes.&lt;br /&gt;
&amp;lt;li&amp;gt;Click '''Apply''' to apply the configured locations to the current open Log file.&lt;br /&gt;
&amp;lt;li&amp;gt;Click '''OK''' to save the settings.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Click '''Restore Defaults''' to restore the default locations.&lt;br /&gt;
&lt;br /&gt;
Click '''Cancel''' to cancel the settings.&lt;br /&gt;
&lt;br /&gt;
====Closing Log File(s)====&lt;br /&gt;
&lt;br /&gt;
To close a Log file, from the '''File''' menu, click '''Close''' or press '''Ctrl+C'''. The Log file that is currently open is closed.&lt;br /&gt;
&lt;br /&gt;
To close all open Log files, from the '''File''' menu, click '''Close All''' or press '''Ctrl+Shift+C'''. All Log files that are open are closed.&lt;br /&gt;
&lt;br /&gt;
====Exiting Log Tool====&lt;br /&gt;
&lt;br /&gt;
To exit from Log Tool, from the  '''File'''  menu, click  '''Exit''' tor press  '''Ctrl+X''' . The  '''Log Tool'''  window closes.&lt;/div&gt;</summary>
		<author><name>Senthilk</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-27T03:33:42Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &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-3.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-3.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>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/csasum</id>
		<title>Doc:latest/evalguide/csasum</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/csasum"/>
				<updated>2010-08-27T03:32:34Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Summary and Next Steps==&lt;br /&gt;
&lt;br /&gt;
This chapter has provided a number of sample applications that aimed to provide you with a better understanding of the OpenClovis SDK. To gain further information there are a number of documents you may wish to read. To gain further knowledge on the IDE and create a model read the ''OpenClovis Modeing Tutorial'' or for more in depth information on the SDK read the   ''OpenClovis SDK User Guide'' and ''OpenClovis API Reference Guide''.&lt;/div&gt;</summary>
		<author><name>Senthilk</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-27T03:31:49Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &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-3.1/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>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/csa113</id>
		<title>Doc:latest/evalguide/csa113</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/csa113"/>
				<updated>2010-08-27T03:30:00Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==csa113 Event Publication==&lt;br /&gt;
&lt;br /&gt;
===Objective===&lt;br /&gt;
&lt;br /&gt;
The objective is to learn how to write an event publishing application using Clovis' Event Manager API.&lt;br /&gt;
&lt;br /&gt;
===What You Will Learn===&lt;br /&gt;
&lt;br /&gt;
*You will learn how to publish events using Clovis' Event Manager API.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&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;
    clCompAppInitialize(&lt;br /&gt;
        ClUint32T argc,&lt;br /&gt;
        ClCharT *argv[])&lt;br /&gt;
    {&lt;br /&gt;
        ClNameT             appName;&lt;br /&gt;
        ClCpmCallbacksT     callbacks;&lt;br /&gt;
        ClVersionT          version;&lt;br /&gt;
        ClIocPortT          iocPort;&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;
        ClVersionT          evtVersion = CL_EVENT_VERSION;&lt;br /&gt;
        ClEventCallbacksT   evtCallbacks = { NULL, NULL };&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---END_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
        ...&lt;br /&gt;
&lt;br /&gt;
        if ( (rc = clCpmClientInitialize(&amp;amp;cpmHandle, &amp;amp;callbacks, &amp;amp;version)) ) &lt;br /&gt;
            goto errorexit;&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;
In the &amp;lt;code&amp;gt;clCompAppInitialize&amp;lt;/code&amp;gt; function of this example we again see a call to &amp;lt;code&amp;gt;clEventInitialize&amp;lt;/code&amp;gt;.  Most everything else in the appInitialize function is the same as before in csa112, except that both callback function pointers are specified as &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;.  This is because we neither open the event channel asynchronously, or subscribe to any events in this application. So there is no need to specify a callback to receive an event.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&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;
    clCompAppInitialize(&lt;br /&gt;
        ClUint32T argc,&lt;br /&gt;
        ClCharT *argv[])&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        ...&lt;br /&gt;
&lt;br /&gt;
        // Open an event chanel so that we can subscribe to events on that channel&lt;br /&gt;
        rc = clEventChannelOpen(evtHandle,&lt;br /&gt;
                &amp;amp;evtChannelName,&lt;br /&gt;
                (CL_EVENT_CHANNEL_PUBLISHER |&lt;br /&gt;
                 CL_EVENT_GLOBAL_CHANNEL |&lt;br /&gt;
                 CL_EVENT_CHANNEL_CREATE),&lt;br /&gt;
                (ClTimeT)CL_RMD_TIMEOUT_FOREVER,&lt;br /&gt;
                &amp;amp;evtChannelHandle);&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Here we open the event channel.  This is the same as in csa112 except that rather than opening as a SUBSCRIBER, we open as a &amp;lt;code&amp;gt;PUBLISHER&amp;lt;/code&amp;gt; (by specifying &amp;lt;code&amp;gt;CL_EVENT_CHANNEL_PUBLISHER&amp;lt;/code&amp;gt; flag)&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&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;
    clCompAppInitialize(&lt;br /&gt;
        ClUint32T argc,&lt;br /&gt;
        ClCharT *argv[])&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        ...&lt;br /&gt;
&lt;br /&gt;
        rc = clEventAllocate(evtChannelHandle, &amp;amp;eventHandle);&lt;br /&gt;
        if (rc != CL_OK)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_ERROR, &amp;quot;Failed to allocate event [0x%x]&amp;quot;,&lt;br /&gt;
                    rc);&lt;br /&gt;
            return rc;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        rc = clEventExtAttributesSet(eventHandle,&lt;br /&gt;
                EVENT_TYPE,&lt;br /&gt;
                1,&lt;br /&gt;
                0,&lt;br /&gt;
                &amp;amp;publisherName);&lt;br /&gt;
        if (rc != CL_OK)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_ERROR, &amp;quot;Failed to set event attributes [0x%x]&amp;quot;,&lt;br /&gt;
                    rc);&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 call to &amp;lt;code&amp;gt;clEventAllocate&amp;lt;/code&amp;gt; allocates an event header.  This header is identified by the event handle passed back to &amp;lt;code&amp;gt;gTestInfo.eventHandle&amp;lt;/code&amp;gt;.  The handle should be used any time the event header is to be used to manipulate the header, either by using &amp;lt;code&amp;gt;clEventExtAttributesSet&amp;lt;/code&amp;gt; (right below), or to send an event using the header as in &amp;lt;code&amp;gt;clEventPublish&amp;lt;/code&amp;gt;.  The call to &amp;lt;code&amp;gt;clEventExtAttributesSet&amp;lt;/code&amp;gt; defines the &amp;lt;code&amp;gt;EVENT_TYPE&amp;lt;/code&amp;gt; which is defined as 5432 in &amp;lt;code&amp;gt;common/common.h&amp;lt;/code&amp;gt; and is used in the event subscriber.  It also defines the priority to be 1 which is just below the highest priority of &amp;lt;code&amp;gt;CL_EVENT_HIGHEST_PRIORITY&amp;lt;/code&amp;gt; which is defined as 0 where &amp;lt;code&amp;gt;CL_EVENT_LOWEST_PRIORITY&amp;lt;/code&amp;gt; is defined as 3.  The retention time is specified as 0 since we don't want the event to be kept around if there is no subscriber to pick it up.  Finally the &amp;lt;code&amp;gt;publisherName&amp;lt;/code&amp;gt; is specified because it's required.  Our subscriber doesn't care who publishes the events it receives.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&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;
    clCompAppInitialize(&lt;br /&gt;
        ClUint32T argc,&lt;br /&gt;
        ClCharT *argv[])&lt;br /&gt;
    {&lt;br /&gt;
&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;
                csa113Comp_PublishEvent();&lt;br /&gt;
            }&lt;br /&gt;
            sleep(1);&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 is the main loop.  As long as the application is running and active we make a call to &amp;lt;code&amp;gt;csa113Comp_PublishEvent&amp;lt;/code&amp;gt;.  The work of the application takes place in &amp;lt;code&amp;gt;csa113Comp_PublishEvent&amp;lt;/code&amp;gt;, which is presented below.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&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;
    csa113Comp_PublishEvent()&lt;br /&gt;
    {&lt;br /&gt;
        ClRcT           rc              = CL_OK;&lt;br /&gt;
        ClEventIdT      eventId         = 0;&lt;br /&gt;
        static int      index           = 0;&lt;br /&gt;
        ClSizeT         data_len        = 0;&lt;br /&gt;
        char            *data           = 0;&lt;br /&gt;
        typedef void (*Generator)(char **, ClSizeT*);&lt;br /&gt;
    &lt;br /&gt;
        //&lt;br /&gt;
        // Note: to add a new generator, just define it above and then include&lt;br /&gt;
        // the new functions name in the generators list.&lt;br /&gt;
        // Next, maybe something that gets disk free info by way of getfsent&lt;br /&gt;
        // and statfs?&lt;br /&gt;
        static Generator generators[]   =&lt;br /&gt;
        { &lt;br /&gt;
            generate_time_of_day,&lt;br /&gt;
            generate_load_average&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        //&lt;br /&gt;
        // every time through increment index and then set index to&lt;br /&gt;
        // it's value modulo the number of entries in the generators&lt;br /&gt;
        // array.  This will cause us to cycle through the list of&lt;br /&gt;
        // generators as we're called to publish events.&lt;br /&gt;
        (*generators[index++])(&amp;amp;data, &amp;amp;data_len);&lt;br /&gt;
        index %= (int)(sizeof generators / sizeof generators[0]);&lt;br /&gt;
        if (data == 0 || data_len == 0)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_ERROR, &amp;quot;no event data generated&amp;quot;);&lt;br /&gt;
            return CL_ERR_NO_MEMORY;&lt;br /&gt;
        }&lt;br /&gt;
        clprintf(CL_LOG_SEV_NOTICE,&amp;quot;Publishing Event: %.*s&amp;quot;, (int)data_len, data);&lt;br /&gt;
        rc = clEventPublish(eventHandle, data, data_len, &amp;amp;eventId);&lt;br /&gt;
        clHeapFree(data);&lt;br /&gt;
&lt;br /&gt;
        return CL_OK;&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's code to call one of a list of generator functions.  The functions on the list, return a pointer and a length which are used to pass to &amp;lt;code&amp;gt;clEventPublish&amp;lt;/code&amp;gt;.  We pass the eventHandle  prepared earlier with &amp;lt;code&amp;gt;clEventAllocate&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;clEventExtAttributesSet&amp;lt;/code&amp;gt;.  Pass the pointer and the length that we get back from the generator function.  Those are used to package up the event data and send it to any subscribers.  We also pass the address of the &amp;lt;code&amp;gt;eventId&amp;lt;/code&amp;gt; local variable.  This is required so that the &amp;lt;code&amp;gt;clEventPublish&amp;lt;/code&amp;gt; function can return the event ID.  We don't need it, so we promptly drop it in the bit bucket.  Finally, we free the data that was allocated in the generator function and passed back as we no longer need it.&lt;br /&gt;
&lt;br /&gt;
===csa213 SA Forum Compliant Event Publication===&lt;br /&gt;
&lt;br /&gt;
This sample application demonstrates the usage of SA Forum Event Service. As mentioned previously, this sample application does not deviate functionally with csa113. The code differences are due to using SA Forum data types (structures) and APIs , as presented in the following two tables. (Note we have not repeated data types and APIs covered previously.)&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+align=&amp;quot;bottom&amp;quot;| '''SA Forum Data Types with the SAFplus Platform equivalent'''&lt;br /&gt;
|- style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
!SA Forum Data Types   &lt;br /&gt;
!OpenClovis Data Types&lt;br /&gt;
|-&lt;br /&gt;
|SaEvtHandleT&lt;br /&gt;
|ClEventHandleT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+align=&amp;quot;bottom&amp;quot;| '''SA Forum APIs with the SAFplus Platform equivalent'''&lt;br /&gt;
|- style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
!SA Forum APIs&lt;br /&gt;
!OpenClovis APIs&lt;br /&gt;
|-&lt;br /&gt;
|SaEvtEventAllocate&lt;br /&gt;
|ClEventAllocate&lt;br /&gt;
|-&lt;br /&gt;
|saEvtEventAttributesSet&lt;br /&gt;
|clEventExtAttributesSet&lt;br /&gt;
|-&lt;br /&gt;
|saEvtEventPublish&lt;br /&gt;
|clEventPublish&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===How to Run csa113 and What to Observe===&lt;br /&gt;
&lt;br /&gt;
In csa113 you will be observing an event publishing application. This will be far more interesting if you observe an event subscription application at the same time. For this we will use the example from csa112.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;First you should start up csa112 and put it in a LockAssignment state so that it can receive events.(Unlock csa212SGI0 instead of csa112SGI0 to run csa213).&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 csa112SGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsUnlock sg csa112SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the csa112 application log you should see:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&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/csa112CompI0Log.latest &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 22:50:34 2008   (SCNodeI0.24830 : csa112CompEO.---.---.00037 :   INFO)&lt;br /&gt;
 csa112: Instantiated as component instance csa112CompI0.&lt;br /&gt;
Mon Jul 14 22:50:34 2008   (SCNodeI0.24830 : csa112CompEO.---.---.00038 :   INFO)&lt;br /&gt;
 csa112CompI0: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 22:51:20 2008   (SCNodeI0.24830 : csa112CompEO.---.---.00041 :   INFO)&lt;br /&gt;
 Component [csa112CompI0] : PID [24830]. CSI Set Received&lt;br /&gt;
Mon Jul 14 22:51:20 2008   (SCNodeI0.24830 : csa112CompEO.---.---.00042 :   INFO)&lt;br /&gt;
    CSI Flags               : [Add One]&lt;br /&gt;
Mon Jul 14 22:51:20 2008   (SCNodeI0.24830 : csa112CompEO.---.---.00043 :   INFO)&lt;br /&gt;
    CSI Name                : [csa112CSII0]&lt;br /&gt;
Mon Jul 14 22:51:20 2008   (SCNodeI0.24830 : csa112CompEO.---.---.00044 :   INFO)&lt;br /&gt;
    Name Value Pairs        :&lt;br /&gt;
Mon Jul 14 22:51:20 2008   (SCNodeI0.24830 : csa112CompEO.---.---.00045 :   INFO)&lt;br /&gt;
    HA State                : [Active]&lt;br /&gt;
Mon Jul 14 22:51:20 2008   (SCNodeI0.24830 : csa112CompEO.---.---.00046 :   INFO)&lt;br /&gt;
    Active Descriptor       :&lt;br /&gt;
Mon Jul 14 22:51:20 2008   (SCNodeI0.24830 : csa112CompEO.---.---.00047 :   INFO)&lt;br /&gt;
      Transition Descriptor : [1]&lt;br /&gt;
Mon Jul 14 22:51:20 2008   (SCNodeI0.24830 : csa112CompEO.---.---.00048 :   INFO)&lt;br /&gt;
        Active Component    : [csa112CompI0]&lt;br /&gt;
Mon Jul 14 22:51:20 2008   (SCNodeI0.24830 : csa112CompEO.---.---.00049 :   INFO)&lt;br /&gt;
 csa112: ACTIVE state requested; activating service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
[[File:OpenClovis_Note.png]]When running model csa212 you will not see the output described above for the the amsLockAssignment and amsUnlock commands. Unlock csa212SGI0 instead of csa112SGI0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Now you can start up the event publishing application and put it in a LockAssignment state. (Unlock csa213SGI0 instead of csa113SGI0 to run csa213).&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa113SGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsUnlock sg csa113SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Putting csa113 into a LockAssignment state caused it to begin publishing events. Using &amp;lt;code&amp;gt;tail -f /root/asp/var/log/csa113CompI0Log.latest&amp;lt;/code&amp;gt; on the csa113 application log you can see the events being published.(Unlock csa213SGI0 instead of csa113SGI0 to run SAF version).&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&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/csa113CompI0Log.latest &lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 22:53:54 2008   (SCNodeI0.24890 : csa113CompEO.---.---.00028 :   INFO)&lt;br /&gt;
 Component [csa113CompI0] : PID [24890]. Initializing&lt;br /&gt;
Mon Jul 14 22:53:54 2008   (SCNodeI0.24890 : csa113CompEO.---.---.00029 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
Mon Jul 14 22:53:54 2008   (SCNodeI0.24890 : csa113CompEO.---.---.00030 :   INFO)&lt;br /&gt;
    IOC Port                : 0x81&lt;br /&gt;
Mon Jul 14 22:53:54 2008   (SCNodeI0.24890 : csa113CompEO.---.---.00037 :   INFO)&lt;br /&gt;
 Instantiated as component instance csa113CompI0.&lt;br /&gt;
Mon Jul 14 22:53:54 2008   (SCNodeI0.24890 : csa113CompEO.---.---.00038 :   INFO)&lt;br /&gt;
 csa113CompI0: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 22:53:59 2008   (SCNodeI0.24890 : csa113CompEO.---.---.00041 :   INFO)&lt;br /&gt;
 Component [csa113CompI0] : PID [24890]. CSI Set Received&lt;br /&gt;
Mon Jul 14 22:53:59 2008   (SCNodeI0.24890 : csa113CompEO.---.---.00042 :   INFO)&lt;br /&gt;
    CSI Flags               : [Add One]&lt;br /&gt;
Mon Jul 14 22:53:59 2008   (SCNodeI0.24890 : csa113CompEO.---.---.00043 :   INFO)&lt;br /&gt;
    CSI Name                : [csa113CSII0]&lt;br /&gt;
Mon Jul 14 22:53:59 2008   (SCNodeI0.24890 : csa113CompEO.---.---.00044 :   INFO)&lt;br /&gt;
    Name Value Pairs        :&lt;br /&gt;
Mon Jul 14 22:53:59 2008   (SCNodeI0.24890 : csa113CompEO.---.---.00045 :   INFO)&lt;br /&gt;
    HA State                : [Active]&lt;br /&gt;
Mon Jul 14 22:53:59 2008   (SCNodeI0.24890 : csa113CompEO.---.---.00046 :   INFO)&lt;br /&gt;
    Active Descriptor       :&lt;br /&gt;
Mon Jul 14 22:53:59 2008   (SCNodeI0.24890 : csa113CompEO.---.---.00047 :   INFO)&lt;br /&gt;
      Transition Descriptor : [1]&lt;br /&gt;
Mon Jul 14 22:53:59 2008   (SCNodeI0.24890 : csa113CompEO.---.---.00048 :   INFO)&lt;br /&gt;
        Active Component    : [csa113CompI0]&lt;br /&gt;
Mon Jul 14 22:53:59 2008   (SCNodeI0.24890 : csa113CompEO.---.---.00049 :   INFO)&lt;br /&gt;
 csa113: ACTIVE state requested; activating service&lt;br /&gt;
Mon Jul 14 22:53:59 2008   (SCNodeI0.24890 : csa113CompEO.---.---.00050 : NOTICE)&lt;br /&gt;
 Publishing Event: Mon Jul 14 22:53:59 2008&lt;br /&gt;
Mon Jul 14 22:54:00 2008   (SCNodeI0.24890 : csa113CompEO.---.---.00052 : NOTICE)&lt;br /&gt;
 Publishing Event: 0.05 0.07 0.03&lt;br /&gt;
Mon Jul 14 22:54:01 2008   (SCNodeI0.24890 : csa113CompEO.---.---.00054 : NOTICE)&lt;br /&gt;
 Publishing Event: Mon Jul 14 22:54:01 2008&lt;br /&gt;
Mon Jul 14 22:54:02 2008   (SCNodeI0.24890 : csa113CompEO.---.---.00056 : NOTICE)&lt;br /&gt;
 Publishing Event: 0.05 0.07 0.03&lt;br /&gt;
Mon Jul 14 22:54:03 2008   (SCNodeI0.24890 : csa113CompEO.---.---.00058 : NOTICE)&lt;br /&gt;
 Publishing Event: Mon Jul 14 22:54:03 2008&lt;br /&gt;
Mon Jul 14 22:54:04 2008   (SCNodeI0.24890 : csa113CompEO.---.---.00060 : NOTICE)&lt;br /&gt;
 Publishing Event: 0.05 0.07 0.03&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Since the event subscriber application is also running you can see the events that it is receiving in the csa112 application log file. Again using &amp;lt;code&amp;gt;tail -f /rootasp//var/log/csa112CompI0Log.latest&amp;lt;/code&amp;gt; you can see the following:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&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/csa112CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 22:53:59 2008   (SCNodeI0.24830 : csa112CompEO.---.---.00052 : NOTICE)&lt;br /&gt;
 We've got an event to receive&lt;br /&gt;
Mon Jul 14 22:53:59 2008   (SCNodeI0.24830 : csa112CompEO.---.---.00054 : NOTICE)&lt;br /&gt;
 received event: Mon Jul 14 22:53:59 2008&lt;br /&gt;
Mon Jul 14 22:54:00 2008   (SCNodeI0.24830 : csa112CompEO.---.---.00058 : NOTICE)&lt;br /&gt;
 We've got an event to receive&lt;br /&gt;
Mon Jul 14 22:54:00 2008   (SCNodeI0.24830 : csa112CompEO.---.---.00060 : NOTICE)&lt;br /&gt;
 received event: 0.05 0.07 0.03&lt;br /&gt;
Mon Jul 14 22:54:01 2008   (SCNodeI0.24830 : csa112CompEO.---.---.00064 : NOTICE)&lt;br /&gt;
 We've got an event to receive&lt;br /&gt;
Mon Jul 14 22:54:01 2008   (SCNodeI0.24830 : csa112CompEO.---.---.00066 : NOTICE)&lt;br /&gt;
 received event: Mon Jul 14 22:54:01 2008&lt;br /&gt;
Mon Jul 14 22:54:02 2008   (SCNodeI0.24830 : csa112CompEO.---.---.00070 : NOTICE)&lt;br /&gt;
 We've got an event to receive&lt;br /&gt;
Mon Jul 14 22:54:02 2008   (SCNodeI0.24830 : csa112CompEO.---.---.00072 : NOTICE)&lt;br /&gt;
 received event: 0.05 0.07 0.03&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 you can shut everything down in the usual manner. Note that you will be shutting down two service groups.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa113SGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa112SGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockInstantiation sg csa113SGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockInstantiation sg csa112SGI0&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 initialize the event manager subsystem as an event publisher.  We've seen:&lt;br /&gt;
*events flow from the event publisher to the subscriber.  &lt;br /&gt;
*how to format events and send them through the event manager subsystem&lt;br /&gt;
*For further reading, check the same sources as listed under the csa112 section.&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/csa112</id>
		<title>Doc:latest/evalguide/csa112</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/csa112"/>
				<updated>2010-08-27T03:29:16Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==csa112 Event Subscription==&lt;br /&gt;
&lt;br /&gt;
===Objective===&lt;br /&gt;
&lt;br /&gt;
The objective of csa112 is to learn how to use Clovis' event service to subscribe to events and to extract the relevant information from the events received by subscription.&lt;br /&gt;
&lt;br /&gt;
===What you will learn===&lt;br /&gt;
&lt;br /&gt;
You will learn &lt;br /&gt;
*how to initialize the event library&lt;br /&gt;
*how to subscribe to events&lt;br /&gt;
*how to receive events&lt;br /&gt;
*how to extract the event data&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&lt;br /&gt;
One difference to note between this application and previous ones is that this application will not have a main loop in &amp;lt;code&amp;gt;clCompAppInitialize&amp;lt;/code&amp;gt;.  Instead we will do our work in callback code.  This means that when we return from &amp;lt;code&amp;gt;clCompAppInitialize&amp;lt;/code&amp;gt; we won't exit the application.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&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;
    ClNameT    evtChannelName = {&lt;br /&gt;
                    sizeof EVENT_CHANNEL_NAME - 1,&lt;br /&gt;
                    EVENT_CHANNEL_NAME&lt;br /&gt;
           };&lt;br /&gt;
&lt;br /&gt;
    ClEventChannelHandleT   evtChannelHandle = CL_HANDLE_INVALID_VALUE;&lt;br /&gt;
    ClEventInitHandleT      evtHandle = CL_HANDLE_INVALID_VALUE;&lt;br /&gt;
&lt;br /&gt;
    static void&lt;br /&gt;
    csa112Comp_appEventCallback( ClEventSubscriptionIdT subscriptionId,&lt;br /&gt;
                                          ClEventHandleT eventHandle,&lt;br /&gt;
                                          ClSizeT eventDataSize);&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 define variables to hold the payload of our event. Note the initialization of the &amp;lt;code&amp;gt;evtChannelName&amp;lt;/code&amp;gt;.  The length is set to the length of the &amp;lt;code&amp;gt;EVENT_CHANNEL_NAME&amp;lt;/code&amp;gt; string WITHOUT including the &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; terminator.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&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;
    clCompAppInitialize(ClUint32T argc,ClCharT *argv[])&lt;br /&gt;
    {&lt;br /&gt;
        ....&lt;br /&gt;
&lt;br /&gt;
        ClEventCallbacksT   evtCallbacks = {&lt;br /&gt;
                           NULL,&lt;br /&gt;
                           csa112Comp_appEventCallback&lt;br /&gt;
                        };&lt;br /&gt;
&lt;br /&gt;
        ...&lt;br /&gt;
&lt;br /&gt;
        // publish our event callbacks&lt;br /&gt;
        rc = clEventInitialize(&amp;amp;evtHandle, &amp;amp;evtCallbacks, &amp;amp;evtVersion);&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;
We initialize the OpenClovis Event Manager with &amp;lt;code&amp;gt;clEventInitialize&amp;lt;/code&amp;gt;.  We pass the address of the variable where we want the event handle stored.  We pass the address of our event callback functions structure.  Note that the only event callback function that we specify is &amp;lt;code&amp;gt;csa112Comp_appEventCallback&amp;lt;/code&amp;gt;.  We do not specify the other callback which is the Asynchronous channel open callback.  We specify &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; for that field of &amp;lt;code&amp;gt;evtCallbacks&amp;lt;/code&amp;gt; because we don't open our event channel asynchronously.:&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&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;
    clCompAppInitialize(ClUint32T argc, ClCharT *argv[])&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        ....&lt;br /&gt;
&lt;br /&gt;
        // Open an event chanel so that we can subscribe to events on that channel&lt;br /&gt;
        rc = clEventChannelOpen(evtHandle,&lt;br /&gt;
                &amp;amp;evtChannelName,&lt;br /&gt;
                (CL_EVENT_CHANNEL_SUBSCRIBER |&lt;br /&gt;
                 CL_EVENT_GLOBAL_CHANNEL |&lt;br /&gt;
                 CL_EVENT_CHANNEL_CREATE),&lt;br /&gt;
                (ClTimeT)CL_RMD_TIMEOUT_FOREVER,&lt;br /&gt;
                &amp;amp;evtChannelHandle);&lt;br /&gt;
        if (rc != CL_OK)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_ERROR, &amp;quot;csa112\t:Failure opening event channel[0x%x]&amp;quot;,&lt;br /&gt;
                    rc);&lt;br /&gt;
            return rc;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        rc = clEventExtSubscribe(evtChannelHandle, EVENT_TYPE, 1, (void*)0);&lt;br /&gt;
        if (rc != CL_OK)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_ERROR, &amp;quot;Failed to subscribe to event channel [0x%x]&amp;quot;,&lt;br /&gt;
                    rc);&lt;br /&gt;
            return rc;&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 the above code we open the channel synchronously.  We pass the handle we got back from &amp;lt;code&amp;gt;clEventInitialize&amp;lt;/code&amp;gt;, the channel name we defined previously, flags that indicate this process is subscribing to the channel and it's a global channel, and that the channel should be created if it's not already there, a timeout value of &amp;quot;forever&amp;quot;, and the address of the location where the channel handle should be stored.  Then, we subscribe to a specific event stream on the event channel.  The &amp;lt;code&amp;gt;EVENT_TYPE&amp;lt;/code&amp;gt; constant is defined in &amp;lt;code&amp;gt;common/common.h&amp;lt;/code&amp;gt; as 5432.  This value is used by the event publisher when it sends events.  The constant 1 being passed simply identifies this specific subscription on this channel.  This value will be passed to our event delivery callback function.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&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 void&lt;br /&gt;
    csa112Comp_appEventCallback( ClEventSubscriptionIdT subscriptionId,&lt;br /&gt;
                                              ClEventHandleT eventHandle,&lt;br /&gt;
                                              ClSizeT eventDataSize)&lt;br /&gt;
    {&lt;br /&gt;
        ClRcT rc = CL_OK;&lt;br /&gt;
    ClPtrT  resTest = NULL;&lt;br /&gt;
    ClSizeT resSize;&lt;br /&gt;
    if (running == 0 || ha_state != CL_AMS_HA_STATE_ACTIVE)&lt;br /&gt;
    {&lt;br /&gt;
        goto cleanup; &lt;br /&gt;
    }&lt;br /&gt;
    clprintf(CL_LOG_SEV_NOTICE,&amp;quot;We've got an event to receive&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    resTest = clHeapAllocate(eventDataSize + 1);&lt;br /&gt;
    if (resTest == NULL)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR, &amp;quot;Failed to allocate space for event&amp;quot;);&lt;br /&gt;
        goto cleanup; &lt;br /&gt;
    }&lt;br /&gt;
    *(((char *)resTest) + eventDataSize) = 0;&lt;br /&gt;
    resSize = eventDataSize;&lt;br /&gt;
    rc = clEventDataGet(eventHandle, resTest, &amp;amp;resSize);&lt;br /&gt;
    if (rc != CL_OK)&lt;br /&gt;
    {&lt;br /&gt;
        clprintf(CL_LOG_SEV_ERROR, &amp;quot;Failed to get event data [0x%x]&amp;quot;, rc);&lt;br /&gt;
        clHeapFree(resTest);&lt;br /&gt;
        goto cleanup;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    clprintf(CL_LOG_SEV_NOTICE,&amp;quot;received event: %s&amp;quot;, (char *)resTest);&lt;br /&gt;
&lt;br /&gt;
    cleanup:&lt;br /&gt;
    //Free the memory associated with eventHandle&lt;br /&gt;
    clEventFree(eventHandle);&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 event delivery callback function is named &amp;lt;code&amp;gt;csa112Comp_appEventCallback&amp;lt;/code&amp;gt;.  First it checks that the running variable is not zero and that the High Availability State is &amp;lt;code&amp;gt;CL_AMS_HA_STATE_ACTIVE&amp;lt;/code&amp;gt;, otherwise it returns, dropping the event in the bit bucket.  Next it checks whether our incoming data buffer needs to be deallocated.  If there is a buffer, it deallocates it and then allocates enough data to receive the incoming event data.  Then, we extract the data from the event into the newly allocated buffer using &amp;lt;code&amp;gt;clEventDataGet&amp;lt;/code&amp;gt;.  Finally, we print the event data we received using &amp;lt;code&amp;gt;clprintf&amp;lt;/code&amp;gt; which is another member of Clovis' OS Abstraction Layer.  As its name and usage suggest, it is the OSAL replacement for printf.&lt;br /&gt;
&lt;br /&gt;
===csa212 SA Forum Compliant Event Subscription===&lt;br /&gt;
&lt;br /&gt;
csa212 demonstrates the usage of SA Forum's Event Service. This sample application does not deviate functionally from csa112. The differences in code are due to using SA Forum data types (structures) and APIs , as presented in the following two tables. (Note we have not repeated data types and APIs covered previously.)&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+align=&amp;quot;bottom&amp;quot;| '''SA Forum Data Types with the SAFplus Platform equivalent'''&lt;br /&gt;
|- style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
!SA Forum Data Types   &lt;br /&gt;
!OpenClovis Data Types&lt;br /&gt;
|-&lt;br /&gt;
|SaEvtHandleT&lt;br /&gt;
|ClEventInitHandleT&lt;br /&gt;
|-&lt;br /&gt;
|SaEvtChannelHandleT&lt;br /&gt;
|ClEventChannelHandleT&lt;br /&gt;
|-&lt;br /&gt;
|SaEvtCallbacksT&lt;br /&gt;
|ClEventCallbacksT&lt;br /&gt;
|-&lt;br /&gt;
|SA_EVT_CHANNEL_SUBSCRIBER&lt;br /&gt;
|CL_EVENT_CHANNEL_SUBSCRIBER &lt;br /&gt;
|-&lt;br /&gt;
|SA_EVT_CHANNEL_CREATE&lt;br /&gt;
|CL_EVENT_CHANNEL_CREATE&lt;br /&gt;
|-&lt;br /&gt;
|SA_TIME_END&lt;br /&gt;
|CL_RMD_TIMEOUT_FOREVER &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+align=&amp;quot;bottom&amp;quot;| '''SA Forum APIs with the SAFplus Platform equivalent'''&lt;br /&gt;
|- style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
!SA Forum APIs&lt;br /&gt;
!OpenClovis APIs&lt;br /&gt;
|-&lt;br /&gt;
|SaEvtInitialize&lt;br /&gt;
|ClEventInitialize&lt;br /&gt;
|-&lt;br /&gt;
|saEvtChannelOpen&lt;br /&gt;
|clEventChannelOpen&lt;br /&gt;
|-&lt;br /&gt;
|saEvtEventSubscribe&lt;br /&gt;
|clEventExtSubscribe&lt;br /&gt;
|-&lt;br /&gt;
|saEvtEventDataGet&lt;br /&gt;
|clEventDataGet&lt;br /&gt;
|-&lt;br /&gt;
|saEvtChannelClose&lt;br /&gt;
|clEventChannelClose&lt;br /&gt;
|-&lt;br /&gt;
|saEvtFinalize&lt;br /&gt;
|clEventFinalize&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===How to Run csa112 and What to Observe===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Start example csa112 in the same manner that we have started previous examples, with the SAFplus Platform Console.(Unlock csa212SGI0 instead of csa112SGI0 to run csa212).&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;
&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 csa112SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Looking at the log file for this example you should see the following.&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&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/csa112CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 21:59:49 2008   (SCNodeI0.24077 : csa112CompEO.---.---.00028 :   INFO)&lt;br /&gt;
 Component [csa112CompI0] : PID [24077]. Initializing&lt;br /&gt;
Mon Jul 14 21:59:49 2008   (SCNodeI0.24077 : csa112CompEO.---.---.00029 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
Mon Jul 14 21:59:49 2008   (SCNodeI0.24077 : csa112CompEO.---.---.00030 :   INFO)&lt;br /&gt;
    IOC Port                : 0x80&lt;br /&gt;
Mon Jul 14 21:59:49 2008   (SCNodeI0.24077 : csa112CompEO.---.---.00037 :   INFO)&lt;br /&gt;
 csa112: Instantiated as component instance csa112CompI0.&lt;br /&gt;
Mon Jul 14 21:59:49 2008   (SCNodeI0.24077 : csa112CompEO.---.---.00038 :   INFO)&lt;br /&gt;
 csa112CompI0: Waiting for CSI assignment...&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 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 csa112SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At this point you should see the following in the log.&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&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/csa112CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 22:01:29 2008   (SCNodeI0.24077 : csa112CompEO.---.---.00049 :   INFO)&lt;br /&gt;
 csa112: ACTIVE state requested; activating service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Thats all there is to this example. What you are looking at in the log is the output of our event listener. It doesn't appear very interesting because we have not yet written an event publisher that will give the program something to output. We'll do that in the next example (csa113).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;At this point we can shut down our example in the usual fashion.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa112SGI0&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockInstantiation sg csa112SGI0&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;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
[[File:OpenClovis_Note.png]]When running model csa212 you will not see the output described for the the amsLockAssignment and amsUnlock commands.&lt;br /&gt;
&lt;br /&gt;
===Summary and References===&lt;br /&gt;
&lt;br /&gt;
We've seen how to create a basic event subscriber application using Clovis' event manager library.  For further reading check the Clovis SAFplus Platform API reference guide, specifically the section on the event manager.  Also, the header file: &amp;lt;code&amp;gt;clEventExtApi.h&amp;lt;/code&amp;gt; should be helpful.&lt;/div&gt;</summary>
		<author><name>Senthilk</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-27T03:28:36Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &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.  There may be extra entries, but you should at least see an entry where &amp;lt;code&amp;gt;ClassName = CLASS_CSA105RES_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;
    [0] ClassName=Chassis ClassId=0x10001 inst=0 [flgs=0x508]&lt;br /&gt;
        [0] ClassName=SCNodeRes ClassId=0x10007 inst=0 [flgs=0x508]&lt;br /&gt;
            *[3] ClassName=CLASS_SCNODERES_PROV_MSO ClassId=0x10009 inst=0 [flgs=0x508]&lt;br /&gt;
        [0] ClassName=csa105Res ClassId=0x10004 inst=0 [flgs=0x508]&lt;br /&gt;
            *[2] ClassName=CLASS_CSA105RES_ALARM_MSO ClassId=0x10006 inst=0 [flgs=0x508]&lt;br /&gt;
            *[3] ClassName=CLASS_CSA105RES_PROV_MSO ClassId=0x10005 inst=0 [flgs=0x508]&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>Senthilk</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-27T03:27:51Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &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;
    [0] ClassName=Chassis ClassId=0x10001 inst=0 [flgs=0x508]&lt;br /&gt;
        [0] ClassName=SCNodeRes ClassId=0x10007 inst=0 [flgs=0x508]&lt;br /&gt;
            *[3] ClassName=CLASS_SCNODERES_PROV_MSO ClassId=0x10009 inst=0 [flgs=0x508]&lt;br /&gt;
        [0] ClassName=csa104Res ClassId=0x10002 inst=0 [flgs=0x508]&lt;br /&gt;
            *[3] ClassName=CLASS_CSA104RES_PROV_MSO ClassId=0x10003 inst=0 [flgs=0x508]&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>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/csa103</id>
		<title>Doc:latest/evalguide/csa103</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/csa103"/>
				<updated>2010-08-27T03:16:33Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==csa103 Checkpointing==&lt;br /&gt;
&lt;br /&gt;
===Objective===&lt;br /&gt;
&lt;br /&gt;
csa103 demonstrates how to use the Clovis Checkpoint service to provide basic failure recovery.  csa103 builds on csa102.&lt;br /&gt;
&lt;br /&gt;
===What Will You Learn===&lt;br /&gt;
&lt;br /&gt;
*how to initialize the checkpoint client library, &lt;br /&gt;
*how to create a checkpoint and  open a checkpoint, &lt;br /&gt;
*how to create a section in the checkpoint &lt;br /&gt;
*how to save data to the checkpoint section and read data from the checkpoint section.&lt;br /&gt;
&lt;br /&gt;
===The 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/csa103Comp&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&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 ((rc = checkpoint_initialize()) != CL_OK)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed [0x%x] to initialize checkpoint&amp;quot;,&lt;br /&gt;
                    appname, rc);&lt;br /&gt;
            return rc;&lt;br /&gt;
        }&lt;br /&gt;
        if ((rc = checkpoint_read_seq(&amp;amp;seq)) != CL_OK)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed [0x%x] to read checkpoint&amp;quot;,&lt;br /&gt;
                    appname, rc);&lt;br /&gt;
            checkpoint_finalize();&lt;br /&gt;
            return rc;&lt;br /&gt;
        }&lt;br /&gt;
    #ifdef CL_INST&lt;br /&gt;
        if ((rc = clDataTapInit(DATA_TAP_DEFAULT_FLAGS, 103)) != CL_OK)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: Failed [0x%x] to initialize data tap&amp;quot;,&lt;br /&gt;
                    appname, rc);&lt;br /&gt;
        }&lt;br /&gt;
    #endif&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 software in &amp;lt;code&amp;gt;clCompAppMain.c&amp;lt;/code&amp;gt; is new to csa103. The call to &amp;lt;code&amp;gt;checkpoint_initialize&amp;lt;/code&amp;gt; is pretty straightforward.  This function discussed in detail later within this section.  The call to &amp;lt;code&amp;gt;checkpoint_read_seq&amp;lt;/code&amp;gt; is also pretty straightforward.  It reads the current sequence value from the checkpoint (at this point it should be zero) and loads it into the variable: &amp;lt;code&amp;gt;seq&amp;lt;/code&amp;gt;.  It is important to note the call to &amp;lt;code&amp;gt;checkpont_finalize&amp;lt;/code&amp;gt; if the call to &amp;lt;code&amp;gt;checkpoint_read_seq&amp;lt;/code&amp;gt; does not return &amp;lt;code&amp;gt;CL_OK&amp;lt;/code&amp;gt;.  This call closes the checkpoint and cleanly finalizes the checkpoint library.  We'll look more at &amp;lt;code&amp;gt;checkpoint_read_seq&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;checkpoint_finalize&amp;lt;/code&amp;gt; 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;
        /* Checkpoint new sequence number */&lt;br /&gt;
        rc = checkpoint_write_seq(seq);&lt;br /&gt;
        if (rc != CL_OK)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: ERROR: Checkpoint write failed. Exiting.&amp;quot;, appname);&lt;br /&gt;
            break;&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 rest of the csa103's main loop is the same as the main loop in csa102, but the seven lines above are new.  Here we write the new value of the checkpoint variable to the checkpoint section and print and error if this fails.  We'll look closer at &amp;lt;code&amp;gt;checkpoint_write_seq&amp;lt;/code&amp;gt; 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;
    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;
         * ---BEGIN_APPLICATION_CODE--- &lt;br /&gt;
         */&lt;br /&gt;
        ClCharT     compname[100]={0};&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * ---END_APPLICATION_CODE---&lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * Print information about the CSI Set&lt;br /&gt;
         */&lt;br /&gt;
        strncpy(compname, compName-&amp;gt;value, compName-&amp;gt;length);&lt;br /&gt;
&lt;br /&gt;
        clprintf (CL_LOG_SEV_INFO, &amp;quot;Component [%s] : PID [%d]. CSI Set Received&amp;quot;, &lt;br /&gt;
              compname, (int)mypid);&lt;br /&gt;
&lt;br /&gt;
        clCompAppAMFPrintCSI(csiDescriptor, haState);&lt;br /&gt;
    &lt;br /&gt;
        /*&lt;br /&gt;
          Take appropriate action based on state&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;
  &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;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&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;
                clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: Active state requested from state %d&amp;quot;,&lt;br /&gt;
                        appname, ha_state);&lt;br /&gt;
&lt;br /&gt;
                checkpoint_replica_activate();&lt;br /&gt;
                if (ha_state == CL_AMS_HA_STATE_STANDBY)&lt;br /&gt;
                {&lt;br /&gt;
                    /* Read checkpoint, make our replica the active replica */&lt;br /&gt;
                    clprintf(CL_LOG_SEV_INFO,&amp;quot;%s reading checkpoint&amp;quot;, appname);&lt;br /&gt;
                    checkpoint_read_seq(&amp;amp;seq);&lt;br /&gt;
                    clprintf(CL_LOG_SEV_INFO,&amp;quot;%s read checkpoint: seq = %u&amp;quot;, appname, seq);&lt;br /&gt;
                }&lt;br /&gt;
            &lt;br /&gt;
                ha_state = CL_AMS_HA_STATE_ACTIVE;&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_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;
                 clprintf(CL_LOG_SEV_INFO,&amp;quot; Standby state requested from state %d&amp;quot;,ha_state);&lt;br /&gt;
            &lt;br /&gt;
                 ha_state = CL_AMS_HA_STATE_STANDBY;&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;
  &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;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&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;
            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;
                clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: QUIESCED&amp;quot;, appname);&lt;br /&gt;
                ha_state = haState;&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_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;
                clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: QUIESCING&amp;quot;, appname);&lt;br /&gt;
                ha_state = haState;&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;
  &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;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&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;
            default:&lt;br /&gt;
            {&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    &lt;br /&gt;
        return CL_OK;&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;
Now looking at csa103's implementation of &amp;lt;code&amp;gt;clCompAppAMFCSISet&amp;lt;/code&amp;gt;, we see that rather than just a few cases, we handle several cases: &amp;lt;code&amp;gt;QUIESCING&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;QUIESCED&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ACTIVE&amp;lt;/code&amp;gt;, and  &amp;lt;code&amp;gt;STANDBY&amp;lt;/code&amp;gt;.  In each state, the global variable &amp;lt;code&amp;gt;ha_state&amp;lt;/code&amp;gt; to the new_state value that is passed in is set.  This is similar to csa102, except that we add the feature that in the &amp;lt;code&amp;gt;CL_AMS_HA_STATE_ACTIVE&amp;lt;/code&amp;gt; case if our previous state was &amp;lt;code&amp;gt;CL_AMS_HA_STATE_STANDBY&amp;lt;/code&amp;gt; we read the sequence from the checkpoint so that the main loop will pick it up.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&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;
    checkpoint_initialize()&lt;br /&gt;
    {&lt;br /&gt;
        ClRcT      rc = CL_OK;&lt;br /&gt;
        ClVersionT ckpt_version = {'B', 1, 1};&lt;br /&gt;
        ClNameT    ckpt_name = { strlen(CKPT_NAME), CKPT_NAME };&lt;br /&gt;
        ClUint32T  seq_no;&lt;br /&gt;
        ClCkptCheckpointCreationAttributesT create_atts = {&lt;br /&gt;
            .creationFlags     = CL_CKPT_WR_ACTIVE_REPLICA |&lt;br /&gt;
                                 CL_CKPT_CHECKPOINT_COLLOCATED,&lt;br /&gt;
            .checkpointSize    = 2 * sizeof(ClUint32T), // two sections of 4 bytes.&lt;br /&gt;
            .retentionDuration = (ClTimeT)0,&lt;br /&gt;
            .maxSections       = 2, // two sections&lt;br /&gt;
            .maxSectionSize    = sizeof(ClUint32T),&lt;br /&gt;
            .maxSectionIdSize  = (ClSizeT)64&lt;br /&gt;
        };&lt;br /&gt;
 &lt;br /&gt;
        ClCkptSectionCreationAttributesT section_atts = {&lt;br /&gt;
            .sectionId = &amp;amp;ckpt_sid,&lt;br /&gt;
            .expirationTime = CL_TIME_END&lt;br /&gt;
        };&lt;br /&gt;
 &lt;br /&gt;
        clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: checkpoint_initialize&amp;quot;, appname);&lt;br /&gt;
        /* Initialize checkpointing service instance */&lt;br /&gt;
        rc = clCkptInitialize(&amp;amp;ckpt_svc_handle,	/* Checkpoint service handle */&lt;br /&gt;
						  NULL,			    /* Optional callbacks table */&lt;br /&gt;
						  &amp;amp;ckpt_version);   /* Required verison number */&lt;br /&gt;
        if (rc != CL_OK)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: ERROR: Failed to initialize checkpoint service&amp;quot;,&lt;br /&gt;
                    appname);&lt;br /&gt;
            return rc;&lt;br /&gt;
        }&lt;br /&gt;
        clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: Checkpoint service initialized (handle=0x%llx)&amp;quot;,&lt;br /&gt;
           appname, ckpt_svc_handle);&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Here is &amp;lt;code&amp;gt;checkpoint_initialize&amp;lt;/code&amp;gt;.  Here we initialize the &amp;lt;code&amp;gt;ClNameT&amp;lt;/code&amp;gt; structure that holds the name of the checkpoint to be opened/created with the line: &amp;lt;code&amp;gt;ClNameT    ckpt_name = { strlen(CKPT_NAME), CKPT_NAME };&amp;lt;/code&amp;gt;. We then define a set of attributes to associate with the checkpoint when creating that checkpoint. The &amp;lt;code&amp;gt;creationFlags&amp;lt;/code&amp;gt; includes &amp;lt;code&amp;gt;CL_CKPT_WR_ACTIVE_REPLICA&amp;lt;/code&amp;gt;.  This means that the checkpoint to be created will be asynchronous, or once active server updation is completed, the call returns to the application, all other replica updates happens parallel. &amp;lt;code&amp;gt;CheckpointSize&amp;lt;/code&amp;gt; is set to the sizeof a 32 bit unsigned integer, which is the sequence number we print in the main loop.  The &amp;lt;code&amp;gt;retentionDuration&amp;lt;/code&amp;gt; is the time that the checkpoint service will keep the checkpoint in store after the last client has closed the checkpoint.  &amp;lt;code&amp;gt;MaxSections&amp;lt;/code&amp;gt; is 2 as this checkpoint will be used to store two sections.  &amp;lt;code&amp;gt;MaxSectionSize&amp;lt;/code&amp;gt; is the set to the sizeof a 32 bit unsigned integer, as application stores only unsigned integer. And &amp;lt;code&amp;gt;maxSectionIdSize&amp;lt;/code&amp;gt; is 64 bytes.&lt;br /&gt;
&lt;br /&gt;
We next use &amp;lt;code&amp;gt;ClCkptSectionCreationAttributesT section_atts&amp;lt;/code&amp;gt; to define the creation attributes for the sole section of the checkpoint. The &amp;lt;code&amp;gt;sectionId&amp;lt;/code&amp;gt; is just the name of the section along with the number of bytes in the name.  The &amp;lt;code&amp;gt;expirationTime&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;CL_TIME_END&amp;lt;/code&amp;gt; to imply that the section is never deleted automatically if the checkpoint itself still remains.&lt;br /&gt;
&lt;br /&gt;
The call to &amp;lt;code&amp;gt;clCkptInitialize&amp;lt;/code&amp;gt; has to be called before any other checkpoint functions.  The &amp;lt;code&amp;gt;ckpt_svc_handle&amp;lt;/code&amp;gt; is where the handle is returned.  The handle must be passed to some future checkpoint api calls, namely the &amp;lt;code&amp;gt;clCkptCheckpointOpen&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;clCkptFinalize&amp;lt;/code&amp;gt; calls.  The callbacks table is passed as &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; which implies that our application doesn't provide any callbacks.  Finally the &amp;lt;code&amp;gt;ckpt_version&amp;lt;/code&amp;gt; identifies what version of the api this application is written to.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&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;
        // Create the checkpoint for read and write.&lt;br /&gt;
        rc = clCkptCheckpointOpen(ckpt_svc_handle,      // Service handle&lt;br /&gt;
                                    &amp;amp;ckpt_name,         // Checkpoint name&lt;br /&gt;
                                    &amp;amp;create_atts,       // Optional creation attr.&lt;br /&gt;
                                    (CL_CKPT_CHECKPOINT_READ |&lt;br /&gt;
                                     CL_CKPT_CHECKPOINT_WRITE |&lt;br /&gt;
                                     CL_CKPT_CHECKPOINT_CREATE),&lt;br /&gt;
                                    (ClTimeT)-1,        // No timeout&lt;br /&gt;
                                    &amp;amp;ckpt_handle);      // Checkpoint handle&lt;br /&gt;
        if (rc != CL_OK)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: ERROR: Failed [0x%x] to open checkpoint&amp;quot;,&lt;br /&gt;
                    appname, rc);&lt;br /&gt;
            (void)clCkptFinalize(ckpt_svc_handle);&lt;br /&gt;
            return rc;&lt;br /&gt;
        }&lt;br /&gt;
        clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: Checkpoint opened (handle=0x%llx)&amp;quot;, appname, ckpt_handle);&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;
         * Try to create a section so that updates can operate by overwriting&lt;br /&gt;
         * the section over and over again.&lt;br /&gt;
         * If subsequent processes come through here, they will fail to create&lt;br /&gt;
         * the section.  That is OK, even though it will cause an error message&lt;br /&gt;
         * If the section create fails because the section is already there, then&lt;br /&gt;
         * read the sequence number&lt;br /&gt;
         */&lt;br /&gt;
        // Put data in network byte order&lt;br /&gt;
        seq_no = htonl(seq);&lt;br /&gt;
&lt;br /&gt;
        // Creating the section&lt;br /&gt;
        checkpoint_replica_activate();&lt;br /&gt;
        rc = clCkptSectionCreate(ckpt_handle,           // Checkpoint handle&lt;br /&gt;
                                 &amp;amp;section_atts,         // Section attributes&lt;br /&gt;
                                 (ClUint8T*)&amp;amp;seq_no,    // Initial data&lt;br /&gt;
                                 (ClSizeT)sizeof(seq_no)); // Size of data&lt;br /&gt;
        if (rc != CL_OK &amp;amp;&amp;amp; (CL_GET_ERROR_CODE(rc) != CL_ERR_ALREADY_EXIST))&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: ERROR: Failed to create checkpoint section&amp;quot;, appname);&lt;br /&gt;
            (void)clCkptCheckpointClose(ckpt_handle);&lt;br /&gt;
            (void)clCkptFinalize(ckpt_svc_handle);&lt;br /&gt;
            return rc;&lt;br /&gt;
        }&lt;br /&gt;
        else if (rc != CL_OK &amp;amp;&amp;amp; (CL_GET_ERROR_CODE(rc) == CL_ERR_ALREADY_EXIST))&lt;br /&gt;
        {&lt;br /&gt;
            rc = checkpoint_read_seq(&amp;amp;seq);&lt;br /&gt;
            if (rc != CL_OK)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: ERROR: Failed [0x%x] to read checkpoint section&amp;quot;,&lt;br /&gt;
                            appname, rc);&lt;br /&gt;
                (void)clCkptCheckpointClose(ckpt_handle);&lt;br /&gt;
                (void)clCkptFinalize(ckpt_svc_handle);&lt;br /&gt;
                return rc;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_INFO,&amp;quot;%s: Section created&amp;quot;, appname);&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;
With &amp;lt;code&amp;gt;rc = clCkptCheckpointOpen&amp;lt;/code&amp;gt; we attempt to open the specified checkpoint.  When &amp;lt;code&amp;gt;checkpoint_initialize&amp;lt;/code&amp;gt; is called the checkpoint may or may not exist.  We attempt to open the checkpoint for READ/WRITE access. &lt;br /&gt;
&lt;br /&gt;
Next we check if we created the checkpoint and then we need to create the section with a call to &amp;lt;code&amp;gt;clCkptSectionCreate&amp;lt;/code&amp;gt;.  We pass the checkpoint handle obtained from &amp;lt;code&amp;gt;clCkptCheckpointOpen&amp;lt;/code&amp;gt;, the section attributes declared earlier, and the address of the initial value along with the size in bytes of the initial value.&lt;br /&gt;
&lt;br /&gt;
We convert the initial value to network byte order by the code &amp;lt;code&amp;gt;seq_no = htonl(seq)&amp;lt;/code&amp;gt;, before passing it to &amp;lt;code&amp;gt;clCkptSectionCreate&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If we do not create the section, then we read the current value in the checkpoint into our global seq variable.&lt;br /&gt;
&lt;br /&gt;
Note that whenever we return an error return code from the function that we have either not opened the checkpoint/initialized the checkpoint service, or we have closed the checkpoint and finalized the checkpoint service with calls to &amp;lt;code&amp;gt;clCkptCheckpointClose&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;clCkptFinalize&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;
    static ClRcT &lt;br /&gt;
    checkpoint_finalize(void)&lt;br /&gt;
    {&lt;br /&gt;
        ClRcT rc;&lt;br /&gt;
&lt;br /&gt;
        rc = clCkptCheckpointClose(ckpt_handle);&lt;br /&gt;
        if (rc != CL_OK)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: failed: [0x%x] to close checkpoint handle 0x%llx&amp;quot;,&lt;br /&gt;
                        appname, rc, ckpt_handle);&lt;br /&gt;
        }&lt;br /&gt;
        rc = clCkptFinalize(ckpt_svc_handle);&lt;br /&gt;
        if (rc != CL_OK)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_ERROR,&amp;quot;%s: failed: [0x%x] to finalize checkpoint&amp;quot;,&lt;br /&gt;
                        appname, rc);&lt;br /&gt;
        }&lt;br /&gt;
        return CL_OK;&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 code snippet presents &amp;lt;code&amp;gt;checkpoint_finalize&amp;lt;/code&amp;gt;.  It's quite simple.  First it closes the checkpoint handle with a call to &amp;lt;code&amp;gt;clCkptCheckpointClose&amp;lt;/code&amp;gt;.  Next it finalizes the checkpoint library with a call to &amp;lt;code&amp;gt;clCkptFinalize&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;
    static ClRcT&lt;br /&gt;
    checkpoint_write_seq(ClUint32T seq)&lt;br /&gt;
    {&lt;br /&gt;
        ClRcT rc = CL_OK;&lt;br /&gt;
        ClUint32T seq_no;&lt;br /&gt;
    &lt;br /&gt;
        /* Putting data in network byte order */&lt;br /&gt;
        seq_no = htonl(seq);&lt;br /&gt;
    &lt;br /&gt;
        /* Write checkpoint */&lt;br /&gt;
        rc = clCkptSectionOverwrite(ckpt_handle,&lt;br /&gt;
                                    &amp;amp;ckpt_sid,&lt;br /&gt;
                                    &amp;amp;seq_no,&lt;br /&gt;
                                    sizeof(ClUint32T));&lt;br /&gt;
        if (rc != CL_OK)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed [0x%x] to write to section&amp;quot;, rc);&lt;br /&gt;
        }&lt;br /&gt;
        else &lt;br /&gt;
        {&lt;br /&gt;
            /*&lt;br /&gt;
             * Synchronize the checkpoint to all the replicas.&lt;br /&gt;
             */&lt;br /&gt;
            rc = clCkptCheckpointSynchronize(ckpt_handle, CL_TIME_END );&lt;br /&gt;
            if (rc != CL_OK)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_ERROR,&amp;quot;Failed [0x%x] to synchronize the checkpoint&amp;quot;, rc);&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;
With &amp;lt;code&amp;gt;checkpoint_write_seq&amp;lt;/code&amp;gt; we first convert the sequence number passed into network byte order.  Then we pass it to &amp;lt;code&amp;gt;clCKptSectionOverwrite&amp;lt;/code&amp;gt; which writes it to the checkpoint section created in &amp;lt;code&amp;gt;checkpoint_initialize&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;
    static ClRcT&lt;br /&gt;
    checkpoint_read_seq(ClUint32T *seq)&lt;br /&gt;
    {&lt;br /&gt;
        ClRcT rc = CL_OK;&lt;br /&gt;
        ClUint32T err_idx; /* Error index in ioVector */&lt;br /&gt;
        ClUint32T seq_no = 0xffffffff;&lt;br /&gt;
        ClCkptIOVectorElementT iov = {&lt;br /&gt;
            .sectionId  = ckpt_sid,&lt;br /&gt;
            .dataBuffer = (ClPtrT)&amp;amp;seq_no,&lt;br /&gt;
            .dataSize   = sizeof(ClUint32T),&lt;br /&gt;
            .dataOffset = (ClOffsetT)0,&lt;br /&gt;
            .readSize   = sizeof(ClUint32T)&lt;br /&gt;
        };&lt;br /&gt;
        &lt;br /&gt;
        rc = clCkptCheckpointRead(ckpt_handle, &amp;amp;iov, 1, &amp;amp;err_idx);&lt;br /&gt;
        if (rc != CL_OK)&lt;br /&gt;
        {&lt;br /&gt;
            clprintf(CL_LOG_SEV_ERROR,&amp;quot;Error: [0x%x] from checkpoint read, err_idx = %u&amp;quot;,&lt;br /&gt;
                        rc, err_idx);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* FIXME: How to process this err_idx? */&lt;br /&gt;
        *seq = ntohl(seq_no);&lt;br /&gt;
    &lt;br /&gt;
        return rc;&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;
With &amp;lt;code&amp;gt;checkpoint_read_seq&amp;lt;/code&amp;gt; we initialize &amp;lt;code&amp;gt;seq_no&amp;lt;/code&amp;gt; to all ones just so it will be more obvious if the &amp;lt;code&amp;gt;clCkptCheckpointRead&amp;lt;/code&amp;gt; call fails and the value of &amp;lt;code&amp;gt;seq_no&amp;lt;/code&amp;gt; doesn't get overwritten.  Then, we set up the &amp;lt;code&amp;gt;iov&amp;lt;/code&amp;gt; variable.  We set the &amp;lt;code&amp;gt;sectionID&amp;lt;/code&amp;gt;  field to &amp;lt;code&amp;gt;ckpt_sid&amp;lt;/code&amp;gt; which is the id of the section created in &amp;lt;code&amp;gt;checkpoint_initialize&amp;lt;/code&amp;gt;.  The &amp;lt;code&amp;gt;dataBuffer&amp;lt;/code&amp;gt; gets set to the address of the &amp;lt;code&amp;gt;seq_no&amp;lt;/code&amp;gt; variable which is where we want the checkpoint data loaded.  The &amp;lt;code&amp;gt;dataSize&amp;lt;/code&amp;gt; field is set to the the size of the &amp;lt;code&amp;gt;seq_no&amp;lt;/code&amp;gt; variable.  &amp;lt;code&amp;gt;DataOfset&amp;lt;/code&amp;gt; is set to zero since the sequence number is the only thing stored in the section, so it resides at the front of the section.  &amp;lt;code&amp;gt;readSize&amp;lt;/code&amp;gt; is set to the size of the sequence number variable.&lt;br /&gt;
&lt;br /&gt;
Within &amp;lt;code&amp;gt;checkpoint_read_seq&amp;lt;/code&amp;gt; we pass the iovector to &amp;lt;code&amp;gt;clCkptCheckpointRead&amp;lt;/code&amp;gt; along with the &amp;lt;code&amp;gt;ckpt_handle&amp;lt;/code&amp;gt;, the constant 1, and the address of the &amp;lt;code&amp;gt;err_idx&amp;lt;/code&amp;gt; variable.  The constant 1 is the number of elements in the array of &amp;lt;code&amp;gt;ClCkptIOVectorElementT structs&amp;lt;/code&amp;gt; that we're passing.  That is, we're passing the address of a single &amp;lt;code&amp;gt;ClCkptIOVectorElementT struct&amp;lt;/code&amp;gt;.  The &amp;lt;code&amp;gt;err_idx&amp;lt;/code&amp;gt; will hold the index in that array where &amp;lt;code&amp;gt;clCkptCheckpointRead&amp;lt;/code&amp;gt; found an error.  That is, if there is going to be an error, it will be at index 0 since we're only passing on entry in the &amp;lt;code&amp;gt;iovector&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===csa203===&lt;br /&gt;
&lt;br /&gt;
csa203 demonstrates the usage of SA Forum's Checkpointing service. This sample application does not deviate functionally from csa103. The code differences are due to using SA Forum data types (structures) and APIs , as presented in the following two tables. (Note we have not repeated data types and APIs covered previously.)&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+align=&amp;quot;bottom&amp;quot;| '''SA Forum Data Types with the SAFplus Platform equivalent'''&lt;br /&gt;
|- style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
!SA Forum Data Types   &lt;br /&gt;
!OpenClovis Data Types&lt;br /&gt;
|-&lt;br /&gt;
|SaCkptHandleT&lt;br /&gt;
|ClCkptSvcHdlT&lt;br /&gt;
|-&lt;br /&gt;
|SaCkptHandleT&lt;br /&gt;
|ClCkptHdlT&lt;br /&gt;
|-&lt;br /&gt;
|SaCkptSectionIdT&lt;br /&gt;
|ClCkptSectionIdT&lt;br /&gt;
|-&lt;br /&gt;
|SaCkptCheckpointCreationAttributesT&lt;br /&gt;
|ClCkptCheckpointCreationAttributesT&lt;br /&gt;
|-&lt;br /&gt;
|SaCkptSectionCreationAttributesT&lt;br /&gt;
|ClCkptSectionCreationAttributesT&lt;br /&gt;
|-&lt;br /&gt;
|SaCkptIOVectorElementT&lt;br /&gt;
|ClCkptIOVectorElementT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+align=&amp;quot;bottom&amp;quot;| '''SA Forum APIs with the SAFplus Platform equivalent'''&lt;br /&gt;
|- style=&amp;quot;color:black;background-color:#ffffaa;&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
!SA Forum APIs&lt;br /&gt;
!OpenClovis APIs&lt;br /&gt;
|-&lt;br /&gt;
|saCkptInitialize&lt;br /&gt;
|clCkptInitialize&lt;br /&gt;
|-&lt;br /&gt;
|saCkptCheckpointOpen&lt;br /&gt;
|clCkptCheckpointOpen&lt;br /&gt;
|-&lt;br /&gt;
|saCkptSectionCreate&lt;br /&gt;
|clCkptSectionCreate&lt;br /&gt;
|-&lt;br /&gt;
|saCkptCheckpointClose&lt;br /&gt;
|clCkptCheckpointClose&lt;br /&gt;
|-&lt;br /&gt;
|saCkptFinalize&lt;br /&gt;
|clCkptFinalize&lt;br /&gt;
|-&lt;br /&gt;
|saCkptSectionOverwrite&lt;br /&gt;
|clCkptSectionOverwrite&lt;br /&gt;
|-&lt;br /&gt;
|saCkptCheckpointSynchronize&lt;br /&gt;
|clCkptCheckpointSynchronize&lt;br /&gt;
|-&lt;br /&gt;
|saCkptCheckpointRead&lt;br /&gt;
|clCkptCheckpointRead&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===How to Run csa103 and What to Observe===&lt;br /&gt;
&lt;br /&gt;
This sample application can run on all Runtime Hardware Setups. The following, lists which node &amp;lt;code&amp;gt;csa103compI*&amp;lt;/code&amp;gt; runs on.&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;'''Runtime Hardware Setup 1.1 and 2.1'''&lt;br /&gt;
&amp;lt;br&amp;gt;csa103compI0 and csa103compI1 will run upon the single node.&lt;br /&gt;
&amp;lt;li&amp;gt;'''Runtime Hardware Setup 1.2 and 2.2'''&lt;br /&gt;
&amp;lt;br&amp;gt;csa103compI0 runs on PayloadNodeI0 and csa103compI1 runs on PayloadNodeI1&lt;br /&gt;
&amp;lt;li&amp;gt;'''Runtime Hardware Setup 1.3 and 2.3'''&lt;br /&gt;
&amp;lt;br&amp;gt;csa103compI2 and csa103compI3 run on SCNodeI0 and SCNodeI1 respectively. csa103compI0 and csa103compI1 run on PayloadNodeI0 and PayloadNodeI1 respectively.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;In the four node set up SCNodeI0 and SCNodeI1 output data via &amp;lt;code&amp;gt;/root/asp/var/log/csa103CompI2&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/root/asp/var/log/csa103CompI3&amp;lt;/code&amp;gt; respectively. Therefore in this case follow the below instructions replacing csa103CompI0 and csa103compI1 with csa103compI2 and csa103compI3 respectively.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We run csa103 very much the same way we run any of the rest of the sample applications: with the SAFplus Platform Console.&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;First, on the active System Controller move it to state LockAssignment with (Unlock csa203SGI0 instead of csa103SGI0 to run csa203)&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;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 csa103SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following output is given when you run &amp;lt;code&amp;gt;tail -f&amp;lt;/code&amp;gt; on the csa103 log files. For example:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# tail -f /root/asp/var/log/csa103CompI0.log&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;| /root/asp/var/log/csa103CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 00:01:09 2008   (SCNodeI0.15238 : csa103CompEO.---.---.00030 :   INFO)&lt;br /&gt;
 Component [csa103CompI0] : PID [15238]. Initializing&lt;br /&gt;
Mon Jul 14 00:01:09 2008   (SCNodeI0.15238 : csa103CompEO.---.---.00031 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
Mon Jul 14 00:01:09 2008   (SCNodeI0.15238 : csa103CompEO.---.---.00032 :   INFO)&lt;br /&gt;
    IOC Port                : 0x81&lt;br /&gt;
Mon Jul 14 00:01:09 2008   (SCNodeI0.15238 : csa103CompEO.---.---.00033 :   INFO)&lt;br /&gt;
 csa103: Instantiated as component instance csa103CompI0.&lt;br /&gt;
Mon Jul 14 00:01:09 2008   (SCNodeI0.15238 : csa103CompEO.---.---.00034 :   INFO)&lt;br /&gt;
 csa103CompI0: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 00:01:09 2008   (SCNodeI0.15238 : csa103CompEO.---.---.00035 :   INFO)&lt;br /&gt;
 csa103CompI0: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 00:01:09 2008   (SCNodeI0.15238 : csa103CompEO.---.---.00036 :   INFO)&lt;br /&gt;
 csa103CompI0: checkpoint_initialize&lt;br /&gt;
Mon Jul 14 00:01:10 2008   (SCNodeI0.15238 : csa103CompEO.---.---.00043 :   INFO)&lt;br /&gt;
 csa103CompI0: Checkpoint service initialized (handle=0x1)&lt;br /&gt;
Mon Jul 14 00:01:10 2008   (SCNodeI0.15238 : csa103CompEO.---.---.00045 :   INFO)&lt;br /&gt;
 csa103CompI0: 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;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# tail -f /root/asp/var/log/csa103CompI1.log&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;| /root/asp/var/log/csa103CompI1Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 00:01:09 2008   (SCNodeI0.15234 : csa103CompEO.---.---.00030 :   INFO)&lt;br /&gt;
 Component [csa103CompI1] : PID [15234]. Initializing&lt;br /&gt;
Mon Jul 14 00:01:09 2008   (SCNodeI0.15234 : csa103CompEO.---.---.00031 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
Mon Jul 14 00:01:09 2008   (SCNodeI0.15234 : csa103CompEO.---.---.00032 :   INFO)&lt;br /&gt;
    IOC Port                : 0x80&lt;br /&gt;
Mon Jul 14 00:01:09 2008   (SCNodeI0.15234 : csa103CompEO.---.---.00033 :   INFO)&lt;br /&gt;
 csa103: Instantiated as component instance csa103CompI1.&lt;br /&gt;
Mon Jul 14 00:01:09 2008   (SCNodeI0.15234 : csa103CompEO.---.---.00034 :   INFO)&lt;br /&gt;
 csa103CompI1: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 00:01:09 2008   (SCNodeI0.15234 : csa103CompEO.---.---.00035 :   INFO)&lt;br /&gt;
 csa103CompI1: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 00:01:09 2008   (SCNodeI0.15234 : csa103CompEO.---.---.00036 :   INFO)&lt;br /&gt;
 csa103CompI1: checkpoint_initialize&lt;br /&gt;
Mon Jul 14 00:01:09 2008   (SCNodeI0.15234 : csa103CompEO.---.---.00043 :   INFO)&lt;br /&gt;
 csa103CompI1: Checkpoint service initialized (handle=0x1)&lt;br /&gt;
Mon Jul 14 00:01:09 2008   (SCNodeI0.15234 : csa103CompEO.---.---.00045 :   INFO)&lt;br /&gt;
 csa103CompI1: Checkpoint opened (handle=0x2)&lt;br /&gt;
Mon Jul 14 00:01:09 2008   (SCNodeI0.15234 : csa103CompEO.---.---.00053 :   INFO)&lt;br /&gt;
 csa103CompI1: Section created&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;Then, unlock the application by running &lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsUnlock sg csa103SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the application log files, you 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/csa103CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 00:09:08 2008   (SCNodeI0.15238 : csa103CompEO.---.---.00058 :   INFO)&lt;br /&gt;
  Standby state requested from state 0&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/csa103CompI1Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 00:09:08 2008   (SCNodeI0.15234 : csa103CompEO.---.---.00064 :   INFO)&lt;br /&gt;
 csa103CompI1: Active state requested from state 0&lt;br /&gt;
Mon Jul 14 00:09:09 2008   (SCNodeI0.15234 : csa103CompEO.---.---.00065 :   INFO)&lt;br /&gt;
 csa103CompI1: Hello World! (seq=0)&lt;br /&gt;
Mon Jul 14 00:09:10 2008   (SCNodeI0.15234 : csa103CompEO.---.---.00066 :   INFO)&lt;br /&gt;
 csa103CompI1: Hello World! (seq=1)&lt;br /&gt;
Mon Jul 14 00:09:11 2008   (SCNodeI0.15234 : csa103CompEO.---.---.00067 :   INFO)&lt;br /&gt;
 csa103CompI1: Hello World! (seq=2)&lt;br /&gt;
Mon Jul 14 00:09:12 2008   (SCNodeI0.15234 : csa103CompEO.---.---.00068 :   INFO)&lt;br /&gt;
 csa103CompI1: Hello World! (seq=3)&lt;br /&gt;
Mon Jul 14 00:09:13 2008   (SCNodeI0.15234 : csa103CompEO.---.---.00069 :   INFO)&lt;br /&gt;
 csa103CompI1: Hello World! (seq=4)&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, find the active csa103 process, the one that's printing the Hello World lines and kill it.  To find the process ID issue the following command from a bash shell.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
 # ps -eaf | grep csa103&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
This should produce an output that looks similar to the following.&lt;br /&gt;
 root     17830 15663  0 14:21 ?        00:00:00 csa103Comp -p&lt;br /&gt;
 root     17839 15663  0 14:21 ?        00:00:00 csa103Comp -p&lt;br /&gt;
 root     18558 16145  0 14:32 pts/4    00:00:00 grep csa103&lt;br /&gt;
Notice the two entries that end with csa103Comp -p. These are our two component processes. The first one is usually the active process. This is the one that we will kill. In this case the process ID is 17830. So to kill the active component you issue the command:&lt;br /&gt;
&lt;br /&gt;
 # kill -9 17830&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Note.png]]If this step does not result in the active component being killed then it is likely that the standby component was killed. In this case simply try killing the other process. &lt;br /&gt;
&lt;br /&gt;
After killing the active component you should see lines in the log files 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;| /root/asp/var/log/csa103CompI1Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 00:16:43 2008   (SCNodeI0.15234 : csa103CompEO.---.---.00515 :   INFO)&lt;br /&gt;
 csa103CompI1: Hello World! (seq=452)&lt;br /&gt;
Mon Jul 14 00:16:44 2008   (SCNodeI0.15234 : csa103CompEO.---.---.00516 :   INFO)&lt;br /&gt;
 csa103CompI1: Hello World! (seq=453)&lt;br /&gt;
Mon Jul 14 00:16:45 2008   (SCNodeI0.15234 : csa103CompEO.---.---.00517 :   INFO)&lt;br /&gt;
 csa103CompI1: Hello World! (seq=454)&lt;br /&gt;
Mon Jul 14 00:16:46 2008   (SCNodeI0.15234 : csa103CompEO.---.---.00518 :   INFO)&lt;br /&gt;
 csa103CompI1: Hello World! (seq=455)&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;| /var/log/csa103CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 00:16:48 2008   (SCNodeI0.15238 : csa103CompEO.---.---.00065 :   INFO)&lt;br /&gt;
 csa103CompI0: Active state requested from state 2&lt;br /&gt;
Mon Jul 14 00:16:48 2008   (SCNodeI0.15238 : csa103CompEO.---.---.00066 :   INFO)&lt;br /&gt;
 csa103CompI0 reading checkpoint&lt;br /&gt;
Mon Jul 14 00:16:48 2008   (SCNodeI0.15238 : csa103CompEO.---.---.00067 :   INFO)&lt;br /&gt;
 csa103CompI0 read checkpoint: seq = 456&lt;br /&gt;
Mon Jul 14 00:16:49 2008   (SCNodeI0.15238 : csa103CompEO.---.---.00068 :   INFO)&lt;br /&gt;
 csa103CompI0: Hello World! (seq=456)&lt;br /&gt;
Mon Jul 14 00:16:50 2008   (SCNodeI0.15238 : csa103CompEO.---.---.00069 :   INFO)&lt;br /&gt;
 csa103CompI0: Hello World! (seq=457)&lt;br /&gt;
Mon Jul 14 00:16:51 2008   (SCNodeI0.15238 : csa103CompEO.---.---.00070 :   INFO)&lt;br /&gt;
 csa103CompI0: Hello World! (seq=458)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Where we can see CompI1 printing 455 and then dieing, where upon CompI0 gets the notice to take over processing, reads the checkpoint and then takes over with seq=456 and so on.&lt;br /&gt;
&lt;br /&gt;
Then, in the CompI1 log file we 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/csa103CompI1Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 00:16:49 2008   (SCNodeI0.15553 : csa103CompEO.---.---.00044 :   INFO)&lt;br /&gt;
 csa103: Instantiated as component instance csa103CompI1.&lt;br /&gt;
Mon Jul 14 00:16:49 2008   (SCNodeI0.15553 : csa103CompEO.---.---.00045 :   INFO)&lt;br /&gt;
 csa103CompI1: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 00:16:49 2008   (SCNodeI0.15553 : csa103CompEO.---.---.00046 :   INFO)&lt;br /&gt;
 csa103CompI1: Waiting for CSI assignment...&lt;br /&gt;
Mon Jul 14 00:16:49 2008   (SCNodeI0.15553 : csa103CompEO.---.---.00047 :   INFO)&lt;br /&gt;
 csa103CompI1: checkpoint_initialize&lt;br /&gt;
Mon Jul 14 00:16:50 2008   (SCNodeI0.15553 : csa103CompEO.---.---.00054 :   INFO)&lt;br /&gt;
 csa103CompI1: Checkpoint service initialized (handle=0x1)&lt;br /&gt;
Mon Jul 14 00:16:50 2008   (SCNodeI0.15553 : csa103CompEO.---.---.00056 :   INFO)&lt;br /&gt;
 csa103CompI1: 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;
That is the component that had been killed being restarted.  &lt;br /&gt;
&lt;br /&gt;
CompI0 is moving along just fine, and we see CompI1 come back up.  If we then kill CompI0 we 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/csa103CompI1Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Mon Jul 14 00:29:44 2008   (SCNodeI0.15553 : csa103CompEO.---.---.00065 :   INFO)&lt;br /&gt;
 csa103CompI1: Active state requested from state 2&lt;br /&gt;
Mon Jul 14 00:29:44 2008   (SCNodeI0.15553 : csa103CompEO.---.---.00066 :   INFO)&lt;br /&gt;
 csa103CompI1 reading checkpoint&lt;br /&gt;
Mon Jul 14 00:29:44 2008   (SCNodeI0.15553 : csa103CompEO.---.---.00067 :   INFO)&lt;br /&gt;
 csa103CompI1 read checkpoint: seq = 1225&lt;br /&gt;
Mon Jul 14 00:29:45 2008   (SCNodeI0.15553 : csa103CompEO.---.---.00068 :   INFO)&lt;br /&gt;
 csa103CompI1: Hello World! (seq=1225)&lt;br /&gt;
Mon Jul 14 00:29:46 2008   (SCNodeI0.15553 : csa103CompEO.---.---.00069 :   INFO)&lt;br /&gt;
 csa103CompI1: Hello World! (seq=1226)&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Where we can see the CompI0 process die, and CompI1 process read the sequence number from the checkpoint and then take over from where CompI0 left off.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;To stop csa103 use the following SAFplus Platform Console command.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa103SGI0&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 change the state of csa103SGI0 to LockInstantiation and close the SAFplus Platform Console.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockInstantiation sg csa103SGI0&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;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Additional Tests for Runtime Hardware Setup 1.3 and 2.3===&lt;br /&gt;
&lt;br /&gt;
Now repeat  the experiment till the stage before we kill  the active process  and follow these steps.&lt;br /&gt;
&lt;br /&gt;
'''Step A'''&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Stop SAFplus Platform on SCNodeI0 using &amp;lt;code&amp;gt;/etc/init.d/asp stop&amp;lt;/code&amp;gt;. Observer the logs &amp;lt;code&amp;gt;/root/asp/var/log/csa103CompI3Log.latest&amp;lt;/code&amp;gt; on SCNodeI1. This will become active  and start printing the hello world logs as above. &lt;br /&gt;
Note in this case active System Controller SCNode1 is still aware of PayloadNodeI0 and PayloadNodeI1.&lt;br /&gt;
&amp;lt;li&amp;gt;Start looking at the logs  for &amp;lt;code&amp;gt;/root/asp/var/log/csa103CompI0Log.latest&amp;lt;/code&amp;gt; in PayloadNodeI0. This will print the  standby  logs as  above.&lt;br /&gt;
&amp;lt;li&amp;gt;Stop  SAFplus Platform  on PayloadNodeI0  and start observing the logs on PayloadNodeI1 in &amp;lt;code&amp;gt;/root/asp/var/log/csa103CompI1Log.latest&amp;lt;/code&amp;gt; for standby.&lt;br /&gt;
In this case, you can see, via the active System Controller logs that PayloadNodeI0 is not active whilst PayloadNodeI1 is.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Step B'''  For Hardware Setup 1.3 only&lt;br /&gt;
#Repeat A  with the slight exception  that the  blade running SCNodeI0  is  yanked out(&amp;lt;code&amp;gt;/etc/init.d/asp zap&amp;lt;/code&amp;gt;) instead of gracefully shutting  down SAFplus Platform in step 1.&lt;br /&gt;
&lt;br /&gt;
===Summary and References===&lt;br /&gt;
We've seen :&lt;br /&gt;
&lt;br /&gt;
*how to use Clovis' checkpoint service to save some program state and recover that state from a separate process&lt;br /&gt;
*how to initialize the client checkpoint library&lt;br /&gt;
*how to create and open checkpoints &lt;br /&gt;
*how to create and use sections in an opened checkpoint&lt;br /&gt;
&lt;br /&gt;
Further information can be found within the following: ''OpenClovis API Reference Guide''.&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/csa102</id>
		<title>Doc:latest/evalguide/csa102</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/csa102"/>
				<updated>2010-08-27T03:15:54Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==csa102 Redundancy and Failover==&lt;br /&gt;
&lt;br /&gt;
===Objective===&lt;br /&gt;
&lt;br /&gt;
This sample demonstrates basic HA (High Availability) and SU (Service Unit) fail-over functionality.  The application has two components, both processing the same workload as csa101, that is, repeatedly printing &amp;quot;Hello World&amp;quot;.  The difference, however, is that in this case there is now an active component and a standby component, with only the active component performing the printing function.&lt;br /&gt;
&lt;br /&gt;
csa102 is quite similar to csa101, and this section will discuss the areas in which they deviate.&lt;br /&gt;
&lt;br /&gt;
===What you will learn===&lt;br /&gt;
&lt;br /&gt;
*Keeping track of HA states and how to respond to callbacks requesting HA state changes.&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/csa102Comp&lt;br /&gt;
&lt;br /&gt;
This sample component is implemented in a single C module that is quite similar to the csa101 module.  We will discuss the additions in detail.&lt;br /&gt;
&lt;br /&gt;
We define a static variable to keep track of the component's HA state as:&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&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.h&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;                        &lt;br /&gt;
#define STRING_HA_STATE(S)                                                  \&lt;br /&gt;
(   ((S) == CL_AMS_HA_STATE_ACTIVE)             ? &amp;quot;Active&amp;quot; :                \&lt;br /&gt;
    ((S) == CL_AMS_HA_STATE_STANDBY)            ? &amp;quot;Standby&amp;quot; :               \&lt;br /&gt;
    ((S) == CL_AMS_HA_STATE_QUIESCED)           ? &amp;quot;Quiesced&amp;quot; :              \&lt;br /&gt;
    ((S) == CL_AMS_HA_STATE_QUIESCING)          ? &amp;quot;Quiescing&amp;quot; :             \&lt;br /&gt;
    ((S) == CL_AMS_HA_STATE_NONE)               ? &amp;quot;None&amp;quot; :                  \&lt;br /&gt;
                                                  &amp;quot;Unknown&amp;quot; )&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
This is subsequently used to control the processing of this component's workload.&lt;br /&gt;
&lt;br /&gt;
As with csa101, 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;
clCompAppAMFCSISet()&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;
                clprintf(CL_LOG_SEV_INFO,&amp;quot;csa102: ACTIVE state requested; activating service\n&amp;quot;);&lt;br /&gt;
                running = 1;&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_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;
                clprintf(CL_LOG_SEV_INFO,&amp;quot;csa102: New state is not the ACTIVE; deactivating service\n&amp;quot;);&lt;br /&gt;
                running = 0;&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;
  &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;
            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;
                clprintf(CL_LOG_SEV_INFO,&amp;quot;csa102: Acknowledging new state\n&amp;quot;);&lt;br /&gt;
                running = 0;&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_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;
                clprintf(CL_LOG_SEV_INFO,&amp;quot;csa102: Signaling completion of QUIESCING\n&amp;quot;);&lt;br /&gt;
                running = 0;&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;
                break;&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;
It is worth noting that the &amp;lt;code&amp;gt;running&amp;lt;/code&amp;gt; variable, as used by csa101 is not modified here.  Instead, the &amp;lt;code&amp;gt;ha_state&amp;lt;/code&amp;gt; variable is used to control the component's workload processing, as displayed in the main worker loop:&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&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;
        while (!exiting)&lt;br /&gt;
        {&lt;br /&gt;
            if (running)&lt;br /&gt;
            {&lt;br /&gt;
                clprintf(CL_LOG_SEV_INFO,&amp;quot;csa102: Hello World! %s\n&amp;quot;, show_progress());&lt;br /&gt;
            }&lt;br /&gt;
            sleep(1);&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;
It is also worth noting that the &amp;lt;code&amp;gt;running&amp;lt;/code&amp;gt; variable is still used to control the worker loop as in csa101, but it is only controlled by requests to change the EO (Executable Object) state, not the HA state of the component.&lt;br /&gt;
&lt;br /&gt;
===How to Run csa102 and What to Observe===&lt;br /&gt;
&lt;br /&gt;
As with the csa101 example we will use the SAFplus Platform Console to manipulate the administrative state of the csa102 service group.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;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 csa102SGI0 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 1&lt;br /&gt;
 cli[Test:SCNodeI0]-&amp;gt; setc cpm&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa102SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Because example 102 has two components there will be two application log files to view.  These are &amp;lt;code&amp;gt;/root/asp/var/log/csa102CompI0Log.latest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/root/asp/var/log/csa102CompI1Log.latest&amp;lt;/code&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/csa102CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Sun Jul 13 22:38:17 2008   (SCNodeI0.13418 : csa102CompEO.---.---.00029 :   INFO) &lt;br /&gt;
 Component [csa102CompI0] : PID [13418]. Initializing&lt;br /&gt;
&lt;br /&gt;
Sun Jul 13 22:38:17 2008   (SCNodeI0.13418 : csa102CompEO.---.---.00030 :   INFO) &lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
&lt;br /&gt;
Sun Jul 13 22:38:17 2008   (SCNodeI0.13418 : csa102CompEO.---.---.00031 :   INFO)&lt;br /&gt;
    IOC Port                : 0x80&lt;br /&gt;
&lt;br /&gt;
Sun Jul 13 22:38:17 2008   (SCNodeI0.13418 : csa102CompEO.---.---.00032 :   INFO)&lt;br /&gt;
 csa102: Instantiated as component instance csa102CompI0.&lt;br /&gt;
&lt;br /&gt;
Sun Jul 13 22:38:17 2008   (SCNodeI0.13418 : csa102CompEO.---.---.00033 :   INFO)&lt;br /&gt;
 csa102CompI0: Waiting for CSI assignment...&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/csa102CompI1Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Sun Jul 13 22:38:18 2008   (SCNodeI0.13422 : csa102CompEO.---.---.00028 :   INFO)&lt;br /&gt;
 Component [csa102CompI1] : PID [13422]. Initializing&lt;br /&gt;
&lt;br /&gt;
Sun Jul 13 22:38:18 2008   (SCNodeI0.13422 : csa102CompEO.---.---.00029 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
&lt;br /&gt;
Sun Jul 13 22:38:18 2008   (SCNodeI0.13422 : csa102CompEO.---.---.00030 :   INFO)&lt;br /&gt;
    IOC Port                : 0x81&lt;br /&gt;
&lt;br /&gt;
Sun Jul 13 22:38:18 2008   (SCNodeI0.13422 : csa102CompEO.---.---.00031 :   INFO)&lt;br /&gt;
 csa102: Instantiated as component instance csa102CompI1.&lt;br /&gt;
&lt;br /&gt;
Sun Jul 13 22:38:18 2008   (SCNodeI0.13422 : csa102CompEO.---.---.00032 :   INFO)&lt;br /&gt;
 csa102CompI1: Waiting for CSI assignment...&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, unlock the 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:SCNodeI0:CPM]-&amp;gt; amsUnlock sg csa102SGI0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
and in the /var/log/csa102CompI*.log files 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/csa102CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Sun Jul 13 23:00:18 2008   (SCNodeI0.13422 : csa102CompEO.---.---.00487 :   INFO)&lt;br /&gt;
 csa102: Hello World!       .&lt;br /&gt;
&lt;br /&gt;
Sun Jul 13 23:00:19 2008   (SCNodeI0.13422 : csa102CompEO.---.---.00488 :   INFO)&lt;br /&gt;
 csa102: Hello World!        .&lt;br /&gt;
&lt;br /&gt;
Sun Jul 13 23:00:20 2008   (SCNodeI0.13422 : csa102CompEO.---.---.00489 :   INFO)&lt;br /&gt;
 csa102: Hello World!         .&lt;br /&gt;
&lt;br /&gt;
Sun Jul 13 23:00:21 2008   (SCNodeI0.13422 : csa102CompEO.---.---.00490 :   INFO)&lt;br /&gt;
 csa102: Hello World!          .&lt;br /&gt;
&lt;br /&gt;
Sun Jul 13 23:00:22 2008   (SCNodeI0.13422 : csa102CompEO.---.---.00491 :   INFO)&lt;br /&gt;
 csa102: Hello World! .&lt;br /&gt;
&lt;br /&gt;
Sun Jul 13 23:00:23 2008   (SCNodeI0.13422 : csa102CompEO.---.---.00492 :   INFO)&lt;br /&gt;
 csa102: Hello World!  .&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/csa102CompI1Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Sun Jul 13 22:43:00 2008   (SCNodeI0.13422 : csa102CompEO.---.---.00043 :   INFO)&lt;br /&gt;
 csa102: New state is not the ACTIVE; deactivating service&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;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;/code&amp;gt;.  csa102CompI0 is the active component in this case, and csa102CompI1 is the standby.  Consequently, the &amp;quot;Hello world!&amp;quot; lines appear in csa102CompI0.log and not in csa102CompI1.log.  They will continue to be logged to that file until the HA state of that component changes, for example, when the process logging those lines is killed.  In the mean time the standby component: csa102CompI1 just waits until it is told that it should take over the workload.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changing the HA state of the Client/Server'''&lt;br /&gt;
&lt;br /&gt;
The easiest way to test component fail-over is to kill the process associated with the active component using the &amp;lt;code&amp;gt;kill&amp;lt;/code&amp;gt; command.  For this you need to know the process ID of the active component. To find the process ID issue the following command from a bash shell.&lt;br /&gt;
 # ps -eaf | grep csa102&lt;br /&gt;
This should produce an output that looks similar to the following.&lt;br /&gt;
 root     15872 15663  0 13:49 ?        00:00:01 csa102Comp -p&lt;br /&gt;
 root     16328 15663  0 13:56 ?        00:00:00 csa102Comp -p&lt;br /&gt;
 root     17304 16145  0 14:11 pts/4    00:00:00 grep csa102&lt;br /&gt;
Notice the two entries that end with &amp;lt;code&amp;gt;csa102Comp -p&amp;lt;/code&amp;gt;. These are our two component processes. The first one is usually the active process. This is the one that we will kill. In this case the process ID is 15872. So to kill the active component you issue the command:&lt;br /&gt;
 # kill -9 15872&lt;br /&gt;
[[File:OpenClovis_Note.png]]If this step does not result in the active component being killed then it is likely that the standby component was killed. In this case simply try killing the other process.&lt;br /&gt;
&lt;br /&gt;
After executing the &amp;lt;code&amp;gt;kill&amp;lt;/code&amp;gt; command you can see in the csa102CompI1 application that the standby component is now active.&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&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/csa102CompI1Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Sun Jul 13 23:00:18 2008   (SCNodeI0.13422 : csa102CompEO.---.---.00487 :   INFO)&lt;br /&gt;
 csa102: Hello World!       .&lt;br /&gt;
&lt;br /&gt;
Sun Jul 13 23:00:19 2008   (SCNodeI0.13422 : csa102CompEO.---.---.00488 :   INFO)&lt;br /&gt;
 csa102: Hello World!        .&lt;br /&gt;
&lt;br /&gt;
Sun Jul 13 23:00:20 2008   (SCNodeI0.13422 : csa102CompEO.---.---.00489 :   INFO)&lt;br /&gt;
 csa102: Hello World!         .&lt;br /&gt;
&lt;br /&gt;
Sun Jul 13 23:00:21 2008   (SCNodeI0.13422 : csa102CompEO.---.---.00490 :   INFO)&lt;br /&gt;
 csa102: Hello World!          .&lt;br /&gt;
&lt;br /&gt;
Sun Jul 13 23:00:22 2008   (SCNodeI0.13422 : csa102CompEO.---.---.00491 :   INFO)&lt;br /&gt;
 csa102: Hello World! .&lt;br /&gt;
&lt;br /&gt;
Sun Jul 13 23:00:23 2008   (SCNodeI0.13422 : csa102CompEO.---.---.00492 :   INFO)&lt;br /&gt;
 csa102: Hello World!  .     .&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
This indicates that the standby component has taken over for the failed active component.&lt;br /&gt;
&lt;br /&gt;
Looking in the csa102CompI0 application log you can see that this component was killed and has been restarted. Since csa102CompI1 took over as the active component this component now goes into the standby state.&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding = &amp;quot;0&amp;quot; border=&amp;quot;0&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/csa102CompI0Log.latest&lt;br /&gt;
 |- &lt;br /&gt;
 |&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Sun Jul 13 22:53:02 2008   (SCNodeI0.13712 : csa102CompEO.---.---.00040 :   INFO)&lt;br /&gt;
 Component [csa102CompI0] : PID [13712]. Initializing&lt;br /&gt;
&lt;br /&gt;
Sun Jul 13 22:53:02 2008   (SCNodeI0.13712 : csa102CompEO.---.---.00041 :   INFO)&lt;br /&gt;
    IOC Address             : 0x1&lt;br /&gt;
&lt;br /&gt;
Sun Jul 13 22:53:02 2008   (SCNodeI0.13712 : csa102CompEO.---.---.00042 :   INFO)&lt;br /&gt;
    IOC Port                : 0x80&lt;br /&gt;
&lt;br /&gt;
Sun Jul 13 22:53:02 2008   (SCNodeI0.13712 : csa102CompEO.---.---.00043 :   INFO)&lt;br /&gt;
 csa102: Instantiated as component instance csa102CompI0.&lt;br /&gt;
&lt;br /&gt;
Sun Jul 13 22:53:02 2008   (SCNodeI0.13712 : csa102CompEO.---.---.00044 :   INFO)&lt;br /&gt;
 csa102CompI0: Waiting for CSI assignment...&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
You can continue to observe this failover by alternately killing the active component.&lt;br /&gt;
&lt;br /&gt;
To stop csa102 using the SAFplus Platform Console.&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockAssignment sg csa102SGI0&lt;br /&gt;
Successfully changed state of csa102SGI0 to LockAssignment&lt;br /&gt;
 cli[Test:SCNodeI0:CPM]-&amp;gt; amsLockInstantiation sg csa102SGI0&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;
Successfully changed state of csa102SGI0 to LockInstantiation and exit.&lt;br /&gt;
&lt;br /&gt;
===Summary===&lt;br /&gt;
&lt;br /&gt;
This Sample Application has covered basic HA and failover, with changing the state of a component to active and standby.&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/csa</id>
		<title>Doc:latest/evalguide/csa</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/csa"/>
				<updated>2010-08-27T03:15:02Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Sample Applications==&lt;br /&gt;
&lt;br /&gt;
Each sample application demonstrates a different feature of SAFplus Platform, by showing particular APIs  and their usage. Some of the features demonstrated are Checkpointing, Provisioning, Component Failover, Event Subscription and Publication. These are itemized further within Table &lt;br /&gt;
[[#Table_Clovis_Sample_Applications|Clovis Sample Applications]].&lt;br /&gt;
&lt;br /&gt;
The numbering of the application follows a general guideline. csa101 through csa113 are designed to demonstrate one particular feature of SAFplus Platform at a time. In addition higher numbered sample application tend to build on concepts introduced in lower numbered applications.&lt;br /&gt;
&lt;br /&gt;
The sample applications are located within:&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval/src/app&lt;br /&gt;
&lt;br /&gt;
===SA Forum Compliance===&lt;br /&gt;
&lt;br /&gt;
Adherence to standards is a critical requirement for Next Generation Network deployments. The Service Availability Forum (SA Forum) is the primary standards body in the context of High Availability Middleware and enjoys the participation of over 95% of Tier 1 TEMs. OpenClovis has been actively participating in the forum and helping to drive the emerging Hardware Platform Interface (HPI) and Application Interface Specification (AIS) standards based on its experience.&lt;br /&gt;
       &lt;br /&gt;
As a result of the close involvement of OpenClovis with the SA Forum, the OpenClovis product is aligned with the SA Forum standards which specifies a Highly Available (HA)  Applications Framework.  The framework defines various services such as Availability Management Framework (AMF), Checkpointing, Group Membership and Event Services. &lt;br /&gt;
&lt;br /&gt;
In this chapter we also introduce a SA Forum compliant variance of the Clovis Sample Applications, using SA Forum APIs rather than OpenClovis APIs. These sample applications are labeled as the 200 series and are functionally equivalent to the Clovis Sample Application 100 series. The main difference is in using SA Forum APIs rather than OpenClovis APIs. For example csa101 has a SA Forum functionally equivalent, labeled csa201, where the only real differences are in function names, eg. &amp;lt;code&amp;gt;clCpmClientInitialize&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;clCpmComponentNameGet&amp;lt;/code&amp;gt; have the  SA Forum equivalent &amp;lt;code&amp;gt;saAmfInitialize&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;saAmfComponentNameGet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Since SA Forum does not cover various services provided by SAFplus Platform we will limit sample applications to only those services which SA Forum has defined.&lt;br /&gt;
&lt;br /&gt;
The SA Forum equivalent sample applications are located within:&lt;br /&gt;
 &amp;lt;project-area_dir&amp;gt;/eval/src/app&lt;br /&gt;
&lt;br /&gt;
===Clovis Sample Applications===&lt;br /&gt;
&lt;br /&gt;
The following table provides a brief descriptions of the sample applications found within  this Evaluation Guide. For a detailed description of how to create and build csa101 using OpenClovis IDE and OpenClovis SAFplus Platform, see the ''OpenClovis Sample Application Tutorial''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Table_Clovis_Sample_Applications&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;20&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|+align=&amp;quot;bottom&amp;quot; | '''Clovis Sample Applications'''&lt;br /&gt;
|- style=&amp;quot;background-color:#ffffcc;&amp;quot;&lt;br /&gt;
|App.Ref.&lt;br /&gt;
|Scope&lt;br /&gt;
|Description&lt;br /&gt;
|-&lt;br /&gt;
|csa101&lt;br /&gt;
|Basic component management&lt;br /&gt;
|Periodic Hello World message, can be suspended/resumed, started/shutdown/killed from CPM via the SAFplus Platform Console. &lt;br /&gt;
|-&lt;br /&gt;
|csa102&lt;br /&gt;
|Basic redundancy and failover&lt;br /&gt;
|csa101 plus capable of starting one active and one standby instances. Only active prints messages. Once active is killed (emulating a crash or by a manual switch-over), standby becomes active and print messages.&lt;br /&gt;
|-&lt;br /&gt;
|csa103&lt;br /&gt;
|Failover and checkpointing&lt;br /&gt;
|csa102 plus a incremented sequence number (SN) is printed with each message. The SN is checkpointed to standby, so standby continues from where the active left off.&lt;br /&gt;
|-&lt;br /&gt;
|csa104&lt;br /&gt;
|Basic app. manageability&lt;br /&gt;
|csa103 plus the frequency of the print is configurable at run-time via a managed attribute. This attribute is exposed by both the SAFplus Platform Console as well as SNMP, and the MIB is provided for this.&lt;br /&gt;
|-&lt;br /&gt;
|csa105&lt;br /&gt;
|Alarm Managment&lt;br /&gt;
|Demonstrates how provisioning and alarm libraries work together to achieve a simple software alarm management, and how COR change notification is utilized.&lt;br /&gt;
|-&lt;br /&gt;
|csa112&lt;br /&gt;
|Event Subscription&lt;br /&gt;
|Demonstrates how to use Clovis' event service to subscribe to events.&lt;br /&gt;
|-&lt;br /&gt;
|csa113&lt;br /&gt;
|Event Publisher&lt;br /&gt;
|how to publish events using Clovis' Event Manager API&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Starting and Stopping SAFplus Platform===&lt;br /&gt;
&lt;br /&gt;
====Starting SAFplus Platform====&lt;br /&gt;
&lt;br /&gt;
To start SAFplus Platform on System Controller node.&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Open a shell.&lt;br /&gt;
&amp;lt;li&amp;gt;ssh into the System Controller node as root.&lt;br /&gt;
&amp;lt;li&amp;gt;once logged in, at /root run the following commands&lt;br /&gt;
   &amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
   # cd asp&lt;br /&gt;
   # etc/init.d/asp start&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;
[[File:OpenClovis_Note.png]] If SAFplus Platform fails to start properly it could be due to the machine's firewall being enabled. SAFplus Platform will not run properly with an enabled firewall. See the ''Environment Related Observation'' section of the ''OpenClovis Release Notes'' for more information.&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Note.png]] Only one System Controller can run in an active state, on a subnet at one time.&lt;br /&gt;
&lt;br /&gt;
Repeat steps 1 to 3, for Payload Node 1 and 2, if any. &lt;br /&gt;
&lt;br /&gt;
At this point, we don't have any applications running on these blades. They are available, but not started. We can start/stop the sample applications by Unlocking/Locking the Service Group (this is SA Forum terminology) corresponding to each application using the OpenClovis SAFplus Platform Console. This method is described further within Section [[Doc:Evalguide/csa102#How to Run csa102 and What to Observe|How to Run csa102 and What to Observe]]. The start/stop mechanism  is to allow us to run 1 application at a time, so we are not flooded with the output from all the applications, all intermixed.&lt;br /&gt;
&lt;br /&gt;
As the reader progresses through this chapter, each application will be discussed, various code snippets will be highlighted to explain SAFplus Platform capabilities, and you will then be given the commands to start that particular sample running, allowing you to examine the output from the sample.&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Note.png]] By default SCNode0, SCNode1, PayloadNode0 and PayloadNode1 are configured (see target.conf) to use the eth0 ethernet interface. Within each of the nodes this configuration information is stored within the following two files.&lt;br /&gt;
*&amp;lt;code&amp;gt;/root/asp/etc/clGmsConfig.xml&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;/root/asp/etc/asp.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is not always the case, for example on one of your nodes you may want to switch to eth1. If you would like to do so without changing target.conf and rebuilding the images and redeploying then use your favourite editor, eg vi, to replace the occurrence of eth0 with the appropriate form, e.g. eth1 in these two files.&lt;br /&gt;
&lt;br /&gt;
====Stopping SAFplus Platform====&lt;br /&gt;
&lt;br /&gt;
To stop SAFplus Platform on the System Controller&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Open a shell.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;ssh into the System Controller node as root.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;once logged in, at /root run the following command&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# cd asp&lt;br /&gt;
# etc/init.d/asp stop&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;
As mentioned within Section [[#Starting SAFplus|Starting SAFplus]], repeat steps 1 to 3, for the Payload nodes, if any. The steps clean  up the SAFplus Platform processes and *.db files.&lt;br /&gt;
&lt;br /&gt;
===Sample Application Output===&lt;br /&gt;
&lt;br /&gt;
Purely to ease the output from the collection of Sample Applications, Clovis has used an approach to logging output with the use of printf(). These files are output with the aid of the &amp;quot;ev&amp;quot; library and the ev.h header file. The header file is located within the below directory.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;project-area_dir&amp;gt;/eval/src/app/ev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Senthilk</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-27T03:14:21Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &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-3.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-3.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-3.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-3.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-3.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-3.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-3.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>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/setup</id>
		<title>Doc:latest/evalguide/setup</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/setup"/>
				<updated>2010-08-27T03:12:43Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Runtime Hardware Setup==&lt;br /&gt;
&lt;br /&gt;
As SAFplus Platform will run on an environment which consists of chassis, blades, switch fabrics and shelf managers, we have created Runtime Hardware Setup 1.1, 1.2 and 1.3. If this equipment is not available we suggest using a similar environment where PCs/laptops can be used to replace the chassis and blades, see Runtime Hardware setup 2.1, 2.2 and 2.3.&lt;br /&gt;
&lt;br /&gt;
'''Management Station Machine'''&lt;br /&gt;
&lt;br /&gt;
The Management Machine allows users to launch the Evaluation System on the target environment, enabling them to remotely control SAFplus Platform (via ssh), start and stop sample applications and monitor output.&lt;br /&gt;
 &lt;br /&gt;
'''System Controller'''&lt;br /&gt;
&lt;br /&gt;
One or more System Controllers are required within our target environment. For further information on the role of a System Controller see the Clovis SAFplus Platform User Guide.&lt;br /&gt;
&lt;br /&gt;
'''Payload Node'''&lt;br /&gt;
&lt;br /&gt;
Two Payload Nodes are required for our Evaluation System to demonstrate multi node SAFplus Platform functionality. This is required for Runtime Setup 1.2, 1.3, 2.2 and 2.3.&lt;br /&gt;
&lt;br /&gt;
===Runtime Hardware Setup 1.1===&lt;br /&gt;
&lt;br /&gt;
This is the simple chassis, blade setup. Where one blade/node is present and acts as the System controller. Within the Runtime Hardware Setup 1.1,  the following equipment is used.&lt;br /&gt;
*1 ATCA Chassis&lt;br /&gt;
*1 x Intel MPCBL0001N04 Blades.&lt;br /&gt;
*1 ATCA Chassis Management Module (CMM)&lt;br /&gt;
*1 ATCA Switch Fabric &lt;br /&gt;
*1 PC Management Station&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+align=&amp;quot;bottom&amp;quot; | '''Runtime Hardware Setup 1.1'''&lt;br /&gt;
|- style=&amp;quot;background-color:lightgray;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|System Controller &lt;br /&gt;
|Management Station&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|OS&lt;br /&gt;
|Linux&lt;br /&gt;
|Linux&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|Kernel V&lt;br /&gt;
|2.6&lt;br /&gt;
|2.6&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|eth0&lt;br /&gt;
|192.168.30.X&lt;br /&gt;
|192.168.0.X&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|Chassis Slot&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Note.png]] The IP addresses here are examples. The end user is able to use his/her IP address. The necessary changes have to be made to &amp;lt;code&amp;gt;target.conf&amp;lt;/code&amp;gt;. (See Section [[Doc:Evalguide/build#Configuration File - target.conf| Configuration File - target.conf]]) &lt;br /&gt;
&lt;br /&gt;
The following diagram shows how the above equipment has been interconnected.&lt;br /&gt;
&lt;br /&gt;
[[File:eval_HwSetup1-1.png|500px|frame|center|'''Runtime Hardware Setup 1.1''']]&lt;br /&gt;
&lt;br /&gt;
===Runtime Hardware Setup 1.2===&lt;br /&gt;
&lt;br /&gt;
This is the chassis and blade setup, where three blades/nodes are present that act as the System Controller and two Payload Nodes. Within the Runtime Hardware Setup 1.2,  the following equipment is used:&lt;br /&gt;
*1 ATCA Chassis&lt;br /&gt;
*3 x Intel MPCBL0001N04 Blades.&lt;br /&gt;
*1 ATCA Chassis Management Module&lt;br /&gt;
*1 ATCA Switch Fabric &lt;br /&gt;
*1 PC Management Station&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+align=&amp;quot;bottom&amp;quot; | '''Runtime Hardware Setup 1.2'''&lt;br /&gt;
|- style=&amp;quot;background-color:lightgray;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|System Controller &lt;br /&gt;
|Payload Node0&lt;br /&gt;
|Payload Node1&lt;br /&gt;
|Management Station&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|OS&lt;br /&gt;
|Linux&lt;br /&gt;
|Linux&lt;br /&gt;
|Linux&lt;br /&gt;
|Linux&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|Kernel V&lt;br /&gt;
|2.6&lt;br /&gt;
|2.6&lt;br /&gt;
|2.6&lt;br /&gt;
|2.6&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|eth0&lt;br /&gt;
|192.168.30.X&lt;br /&gt;
|192.168.30.X&lt;br /&gt;
|192.168.30.X&lt;br /&gt;
|192.168.30.X&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|Chassis Slot&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|3&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:eval_HwSetup1-2.png|frame|center|'''Runtime Hardware Setup 1.2''']]&lt;br /&gt;
&lt;br /&gt;
===Runtime Hardware Setup 1.3===&lt;br /&gt;
&lt;br /&gt;
This four blade setup, requires two System Controllers and two Payload Nodes. The following equipment is used:&lt;br /&gt;
*1 ATCA Chassis&lt;br /&gt;
*4 x Intel MPCBL0001N04 Blades.&lt;br /&gt;
*1 ATCA Chassis Management Module&lt;br /&gt;
*1 ATCA Switch Fabric &lt;br /&gt;
*1 PC Management Station&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+align=&amp;quot;bottom&amp;quot; | '''Runtime Hardware Setup 1.3'''&lt;br /&gt;
|- style=&amp;quot;background-color:lightgray;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|System Controller0 &lt;br /&gt;
|System Controller1 &lt;br /&gt;
|Payload Node0&lt;br /&gt;
|Payload Node1&lt;br /&gt;
|Management Station&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|OS&lt;br /&gt;
|Linux&lt;br /&gt;
|Linux&lt;br /&gt;
|Linux&lt;br /&gt;
|Linux&lt;br /&gt;
|Linux&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|Kernel V&lt;br /&gt;
|2.6&lt;br /&gt;
|2.6&lt;br /&gt;
|2.6&lt;br /&gt;
|2.6&lt;br /&gt;
|2.6&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|eth0&lt;br /&gt;
|192.168.30.X&lt;br /&gt;
|192.168.30.X&lt;br /&gt;
|192.168.30.X&lt;br /&gt;
|192.168.30.X&lt;br /&gt;
|192.168.30.X&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|Chassis Slot&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|3&lt;br /&gt;
|4&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:eval_HwSetup1-3.png|frame|center|'''Runtime Hardware Setup 1.3''']]&lt;br /&gt;
&lt;br /&gt;
===Runtime Hardware Setup 2.1===&lt;br /&gt;
&lt;br /&gt;
If chassis, blades and switch fabrics are not available and you wish to run the single node setup, then the target environment can be emulated by Runtime Hardware Setup 2.1.  This is the simplest set up and requires only one PC/laptop to act as the Development Machine, Management Machine and System Controller.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+align=&amp;quot;bottom&amp;quot; | '''Runtime Hardware Setup 2.1'''&lt;br /&gt;
|- style=&amp;quot;background-color:lightgray;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|System Controller &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|OS&lt;br /&gt;
| Linux&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|Kernel V&lt;br /&gt;
|2.6&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|eth0&lt;br /&gt;
|192.168.30.X&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:eval_HwSetup2-1.png|frame|center|'''Runtime Hardware Setup 2.1''']]&lt;br /&gt;
&lt;br /&gt;
===Runtime Hardware Setup 2.2===&lt;br /&gt;
&lt;br /&gt;
If chassis, blades and switch fabrics are not available, then the target environment can be emulated by Runtime Hardware Setup 2.2. Below is  a list of the required hardware:&lt;br /&gt;
&lt;br /&gt;
*'''4 PCs/Laptops''' &lt;br /&gt;
&lt;br /&gt;
As shown in Figure [[#Runtime Hardware Setup 2.2|Runtime Hardware Setup 2.2]], these will represent:&lt;br /&gt;
*1 Management Station Machine&lt;br /&gt;
*1 System Controller node&lt;br /&gt;
*2 Payload Nodes (PCs/Laptops)	&lt;br /&gt;
*1 switch &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+align=&amp;quot;bottom&amp;quot; | '''Runtime Hardware Setup 2.2'''&lt;br /&gt;
|- style=&amp;quot;background-color:lightgray;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|System Controller  &lt;br /&gt;
|Payload Node0&lt;br /&gt;
|Payload Node1&lt;br /&gt;
|Management Station&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|OS&lt;br /&gt;
|Linux&lt;br /&gt;
|Linux&lt;br /&gt;
|Linux&lt;br /&gt;
|Linux&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|Kernel V&lt;br /&gt;
|2.6&lt;br /&gt;
|2.6&lt;br /&gt;
|2.6&lt;br /&gt;
|2.6&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|eth0&lt;br /&gt;
|192.168.30.X&lt;br /&gt;
|192.168.30.X&lt;br /&gt;
|192.168.30.X&lt;br /&gt;
|192.168.30.X&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Runtime Hardware Setup 2.2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:eval_HwSetup2-2.png|frame|center|'''Runtime Hardware Setup 2.2''']]&lt;br /&gt;
&lt;br /&gt;
===Runtime Hardware Setup 2.3===&lt;br /&gt;
&lt;br /&gt;
If four PCs are available then the target environment can be emulated by Runtime Hardware Setup 2.3. Below is a list of the required hardware:&lt;br /&gt;
*'''4 PCs/Laptops'''&lt;br /&gt;
&lt;br /&gt;
These will represent:&lt;br /&gt;
*1 Management Station Machine&lt;br /&gt;
*2 System Controller node&lt;br /&gt;
*2 Payload Nodes (PCs/Laptops)	&lt;br /&gt;
*1 switch &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+align=&amp;quot;bottom&amp;quot; | '''Runtime Hardware Setup 2.3'''&lt;br /&gt;
|- style=&amp;quot;background-color:lightgray;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|System Controller0 &lt;br /&gt;
|System Controller1  &lt;br /&gt;
|Payload Node0&lt;br /&gt;
|Payload Node1&lt;br /&gt;
|Management Station&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|OS&lt;br /&gt;
|Linux&lt;br /&gt;
|Linux&lt;br /&gt;
|Linux&lt;br /&gt;
|Linux&lt;br /&gt;
|Linux&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|Kernel V&lt;br /&gt;
|2.6&lt;br /&gt;
|2.6&lt;br /&gt;
|2.6&lt;br /&gt;
|2.6&lt;br /&gt;
|2.6&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|eth0&lt;br /&gt;
|192.168.30.X&lt;br /&gt;
|192.168.30.X&lt;br /&gt;
|192.168.30.X&lt;br /&gt;
|192.168.30.X&lt;br /&gt;
|192.168.30.X&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:eval_HwSetup2-3.png|frame|center|'''Runtime Hardware Setup 2.3''']]&lt;br /&gt;
&lt;br /&gt;
===Summary and Next Steps===&lt;br /&gt;
&lt;br /&gt;
This chapter has laid out the various hardware setups available to run our sample applications. Once you have chosen the set up that you wish to try and have all the hardware in place, correctly interlinked, the next step is to install the run time targets. This is discussed within the following chapter.&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/prerequisites</id>
		<title>Doc:latest/evalguide/prerequisites</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/prerequisites"/>
				<updated>2010-08-27T03:11:58Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Hardware and Software Prerequisites==&lt;br /&gt;
&lt;br /&gt;
The OpenClovis SAFplus Platform SDK allows the modeller to define exactly what kind of hardware configuration a model runs on.  This Evaluation Model has been set up to allow a variety of hardware configurations.  You should match your hardware as best as possible with one of the configurations described below.&lt;br /&gt;
&lt;br /&gt;
This chapter initially summarizes the configurations you may recreate, followed by a description of the hardware and software specifications.&lt;br /&gt;
&lt;br /&gt;
The hardware set up you wish to choose depends upon two factors:&lt;br /&gt;
*whether you wish to use ATCA blades or PCs/laptops &lt;br /&gt;
*number of PCs/laptops/blades you have available&lt;br /&gt;
&lt;br /&gt;
The following table helps you decide which setup you can recreate. For example, if you wish to use an ATCA chassis and have 3 blades available, then you may wish to create Hardware Setup 1.2.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|+align=&amp;quot;bottom&amp;quot; | '''Hardware Setups'''&lt;br /&gt;
!style=&amp;quot;background-color:lightgray;&amp;quot;|&lt;br /&gt;
!style=&amp;quot;background-color:lightgray;&amp;quot; colspan=&amp;quot;3&amp;quot;| Hardware Setup&lt;br /&gt;
|- style=&amp;quot;background-color:lightgray;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|Single Node&lt;br /&gt;
|3 Node - Distributed&lt;br /&gt;
|4 Node - Distributed&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|Chassis/Blades&lt;br /&gt;
|Hardware Setup 1.1&lt;br /&gt;
|Hardware Setup 1.2&lt;br /&gt;
|Hardware Setup 1.3&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|Pcs/Laptops&lt;br /&gt;
|Hardware Setup 2.1&lt;br /&gt;
|Hardware Setup 2.2&lt;br /&gt;
|Hardware Setup 2.3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Note.png]] The word Node here represents either a PC, laptop or blade.&lt;br /&gt;
&lt;br /&gt;
===Development Environment===&lt;br /&gt;
&lt;br /&gt;
The Development Machine is the primary machine where the SAFplus Platform SDK and Evaluation System is installed and built. As discussed within this document, the development machine plays an important role in moving System Controller and Payload Node images to the runtime environment.&lt;br /&gt;
&lt;br /&gt;
'''Development Machine'''&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|+align=&amp;quot;bottom&amp;quot; | '''Development Machine Environment'''&lt;br /&gt;
|- style=&amp;quot;background-color:lightgray;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|Hardware&lt;br /&gt;
|Software&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|Development Machine&lt;br /&gt;
|PC or Laptop&lt;br /&gt;
&amp;lt;br&amp;gt;Hard disk - 10 GB or more&lt;br /&gt;
&amp;lt;br&amp;gt;RAM - 512 MB or more&lt;br /&gt;
&amp;lt;br&amp;gt;Processor - Intel Pentium II (or better) &lt;br /&gt;
| Linux Distribution (Ubuntu 7.04 preferred)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Note.png]] Although a distinction is made throughout this document to separate the two  functions of the  Development Machine and  Management Station Machine, they can in fact be the same PC/Laptop.&lt;br /&gt;
&lt;br /&gt;
===Runtime Environment===&lt;br /&gt;
&lt;br /&gt;
A  distinction is made between the Development and Runtime Environment as SAFplus Platform will most likely run within an environment made up of chassis, blades, shelf managers, switches etc. and be monitored remotely. Hence we have attempted to make this Evaluation System simulate the environment it will be used in, as represented in Runtime Hardware Setup 1.1, 1.2 and 1.3 (see Chapter [[Doc:evalguide/setup#Runtime Hardware Setup| Runtime Hardware Setup]]). An alternative setup is also provided, using PCs, as discussed in Runtime Hardware Setup 2.1, 2.2 and 2.3 (again see Chapter [[Doc:evalguide/setup#Runtime Hardware Setup| Runtime Hardware Setup]]).&lt;br /&gt;
&lt;br /&gt;
====Runtime Setup 1.1, 1.2 and 1.3====&lt;br /&gt;
&lt;br /&gt;
Runtime Hardware Setup 1.1, 1.2 or 1.3 requires a Chassis and 1, 3 or 4 blade(s) respectively and one PC or laptop to act as the Management Station Machine. Below is listed the equipment required.&lt;br /&gt;
&lt;br /&gt;
=====Chassis=====&lt;br /&gt;
&lt;br /&gt;
ATCA chassis with a Shelf Manager.&lt;br /&gt;
&lt;br /&gt;
=====Management Station Machine=====&lt;br /&gt;
&lt;br /&gt;
A Management Station is necessary for Runtime Hardware Setup 1.1, 1.2 and 1.3.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|+align=&amp;quot;bottom&amp;quot; | '''Management Station Environment'''&lt;br /&gt;
|- style=&amp;quot;background-color:lightgray;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|Hardware&lt;br /&gt;
|Software&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|Development Station Machine&lt;br /&gt;
|PC or Laptop&lt;br /&gt;
&amp;lt;br&amp;gt;Hard disk - 10 GB or more&lt;br /&gt;
&amp;lt;br&amp;gt;RAM - 512 MB or more&lt;br /&gt;
&amp;lt;br&amp;gt;Processor - Intel Pentium II (or better) &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Note.png]] It is possible to use a single PC/laptop as both host for the development and management machines. Virtual machine environments can also be used with some limitations to the hardware exercises.&lt;br /&gt;
&lt;br /&gt;
=====System Controller=====&lt;br /&gt;
&lt;br /&gt;
Runtime Hardware Setup 1.1 and 1.2 required one System Controller.&lt;br /&gt;
&lt;br /&gt;
Runtime Hardware Setup 1.3 requires two System Controllers.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|+align=&amp;quot;bottom&amp;quot; | '''System Controller'''&lt;br /&gt;
|- style=&amp;quot;background-color:lightgray;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|Hardware&lt;br /&gt;
|Software&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|System Controller&lt;br /&gt;
|ATCA Intel (MPCBL0001) Blade&lt;br /&gt;
&amp;lt;br&amp;gt;Hard Disk - 10 GB or more&lt;br /&gt;
&amp;lt;br&amp;gt;RAM - 512 MB or more&lt;br /&gt;
| Linux Distribution (Ubuntu 7.04 preferred)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Payload (Blades) Node=====&lt;br /&gt;
&lt;br /&gt;
Two Payload nodes are necessary for Runtime Hardware Setup 1.2 and 1.3.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|+align=&amp;quot;bottom&amp;quot; | '''Payload Nodes'''&lt;br /&gt;
|- style=&amp;quot;background-color:lightgray;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|Hardware&lt;br /&gt;
|Software&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|Two Payload Blades&lt;br /&gt;
|ATCA Intel (MPCBL0001) Blade&lt;br /&gt;
&amp;lt;br&amp;gt;Hard Disk - 10 GB or more&lt;br /&gt;
&amp;lt;br&amp;gt;RAM - 512 MB or more&lt;br /&gt;
| Linux Distribution (Ubuntu 7.04 preferred)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Switch=====&lt;br /&gt;
&lt;br /&gt;
10/100Mbps or Gigabit Ethernet switch.&lt;br /&gt;
&lt;br /&gt;
See Chapter [[Doc:evalguide/build#Building the Evaluation System and Deploying Runtime Images| Building the Evaluation System and Deploying Runtime Images]] for further installation details.&lt;br /&gt;
&lt;br /&gt;
====Runtime Setup 2.1, 2.2 and 2.3====&lt;br /&gt;
&lt;br /&gt;
Runtime Hardware Setup 2 is a simpler hardware set up, only requiring PC(s)/laptop(s) and a switch. Runtime Hardware Setup 2.1, 2.2 or 2.3 requires 1, 3 or 4 PC(s) or laptop(s) respectively. In addition a PC or laptop is needed to act as the Management Station Machine. Below is listed the equipment required.&lt;br /&gt;
&lt;br /&gt;
=====Management Station Machine=====&lt;br /&gt;
&lt;br /&gt;
One Management Station is necessary for Runtime Hardware Setup 2.1, 2.2 and 2.3.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|+align=&amp;quot;bottom&amp;quot; | '''Development Management Machine'''&lt;br /&gt;
|- style=&amp;quot;background-color:lightgray;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|Hardware&lt;br /&gt;
|Software&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|Management/Development Station Machine&lt;br /&gt;
|PC or Laptop&lt;br /&gt;
&amp;lt;br&amp;gt;Hard disk - 10 GB or more&lt;br /&gt;
&amp;lt;br&amp;gt;RAM - 512 MB or more&lt;br /&gt;
&amp;lt;br&amp;gt;Processor - Intel Pentium II (or better) &lt;br /&gt;
| Linux Distribution (Ubuntu 7.04 preferred)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:OpenClovis_Note.png]] It is possible to use a single PC as the development machine, management machine and simultaneously as the target for a single node.  Distributed node exercises will require a second machine.  Virtual machine environments can also be used with some limitations to the hardware exercises.&lt;br /&gt;
&lt;br /&gt;
=====System Controller=====&lt;br /&gt;
&lt;br /&gt;
Runtime Hardware Setup 1.1 and 1.2 required one System Controller.&lt;br /&gt;
&lt;br /&gt;
Runtime Hardware Setup 1.3 requires two System Controllers.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|+align=&amp;quot;bottom&amp;quot; | '''System Controller'''&lt;br /&gt;
|- style=&amp;quot;background-color:lightgray;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|Hardware&lt;br /&gt;
|Software&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|System Controller&lt;br /&gt;
|PC or Laptop&lt;br /&gt;
&amp;lt;br&amp;gt;Hard disk - 10 GB or more&lt;br /&gt;
&amp;lt;br&amp;gt;RAM - 512 MB or more&lt;br /&gt;
&amp;lt;br&amp;gt;Processor - Intel Pentium II (or Better)&lt;br /&gt;
| Linux Distribution (Ubuntu 7.04 preferred)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Payload Node=====&lt;br /&gt;
&lt;br /&gt;
Two Payload PCs /laptops are required for Runtime Hardware Setup 2.2 and 2.3.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|+align=&amp;quot;bottom&amp;quot; | '''Payload Nodes'''&lt;br /&gt;
|- style=&amp;quot;background-color:lightgray;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|Hardware&lt;br /&gt;
|Software&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:lightgray;&amp;quot;|Two Payload Nodes&lt;br /&gt;
|PC or Laptop&lt;br /&gt;
&amp;lt;br&amp;gt;HD - 10 GB or more&lt;br /&gt;
&amp;lt;br&amp;gt;RAM - 512 MB or more&lt;br /&gt;
&amp;lt;br&amp;gt;Processor - Intel Pentium II (or Better)&lt;br /&gt;
| Linux Distribution (Ubuntu 7.04 preferred)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Switch=====&lt;br /&gt;
&lt;br /&gt;
10/100 Mbps or Gigabit ethernet switch.&lt;br /&gt;
&lt;br /&gt;
See Chapter [[Doc:evalguide/build#Building the Evaluation System and Deploying Runtime Images| Building the Evaluation System and Deploying Runtime Images]] for further runtime installation details.&lt;br /&gt;
&lt;br /&gt;
===Summary===&lt;br /&gt;
&lt;br /&gt;
This chapter provided a list of the equipment required for the development and runtime environment. See Chapter [[Doc:evalguide/setup#Runtime Hardware Setup|Runtime Hardware Setup]], for further information concerning setting up the hardware environment. This is followed by Chapter [[Doc:evalguide/build#Building the Evaluation System and Deploying Runtime Images| Building the Evaluation System and Deploying Runtime Images]], which provides information concerning the installation of target images onto the runtime environment.&lt;/div&gt;</summary>
		<author><name>Senthilk</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/evalguide/scope</id>
		<title>Doc:latest/evalguide/scope</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/evalguide/scope"/>
				<updated>2010-08-27T03:11:11Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Objectives and Scope==&lt;br /&gt;
&lt;br /&gt;
===Objectives===&lt;br /&gt;
&lt;br /&gt;
The Clovis Evaluation System's objective is to provide an evaluation software package that can be used to learn more about OpenClovis SAFplus Platform SDK. By the end of the evaluation the user will gain a better understanding of:&lt;br /&gt;
*The scope of the product.  The sample applications are not a comprehensive tour of all OpenClovis SAFplus Platform features but do cover the ones most commonly used. &lt;br /&gt;
*The usage patterns associated with the product &lt;br /&gt;
*The product's quality and usability&lt;br /&gt;
&lt;br /&gt;
===Scope===&lt;br /&gt;
&lt;br /&gt;
To help users gain a better understanding of our product this Evaluation System User Guide introduces the SAFplus Platform runtime sample applications. To cover these areas of interest this document encompasses the following:&lt;br /&gt;
&lt;br /&gt;
*'''Chapter 2''': Covers the necessary HW &amp;amp; SW required&lt;br /&gt;
*'''Chapter 3''': Presents the Hardware Setups possible with PC(s)/Laptop(s) or ATCA equipment.&lt;br /&gt;
*'''Chapter 4''': Covers the steps to configure the software for the runtime environments on which to run the sample applications and provides steps to install the target images from the Development Machine.&lt;br /&gt;
*'''Chapter 5''': Provides instructions on running the SAFplus Platform and the sample applications.  For each sample application a description is provided that explains its purpose, highlights key blocks of code, shows how to run it on the cluster, and describes what to observe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id='eval_Contents'&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:eval_Contents_new.png|frame|center| '''Content of OpenClovis Evaluation System User Guide''' ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Headline text ==&lt;/div&gt;</summary>
		<author><name>Senthilk</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-27T03:10:21Z</updated>
		
		<summary type="html">&lt;p&gt;Senthilk: &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-3.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-3.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>Senthilk</name></author>	</entry>

	</feed>