<?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=Suraj</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=Suraj"/>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Special:Contributions/Suraj"/>
		<updated>2026-05-05T12:38:18Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.20.2</generator>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/apiexamples</id>
		<title>Doc:Sdk 4.1/awdguide/apiexamples</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/apiexamples"/>
				<updated>2009-07-27T17:26:57Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==API Examples==&lt;br /&gt;
API documentation is included in this documentation package.  Additionally, there are several examples located in the &amp;quot;bin&amp;quot; directory of the distribution.  These examples provide a basic overview of the APIs and how to use them and also show some simple client/server implementations.&lt;br /&gt;
&lt;br /&gt;
===Basic API Use Example: apiexample.py===&lt;br /&gt;
&lt;br /&gt;
This is intended to be an interactive example (i.e. cut-and-paste the lines into a Python shell running under SAFplus Platform).  It presents an overview of the highest layer of APIs and shows how cluster information can be retrieved, software can be installed, and an upgrade started.&lt;br /&gt;
&lt;br /&gt;
It can be run in any SAFplus-connected python shell.  To get to an SAFplus-connected Python shell, either use the shell embedded in the SAFplus Platform web server (browse to /shell), or run one from the command line.  To run from the command line (recommended because you get a full-featured standard python shell) do the following:&lt;br /&gt;
&lt;br /&gt;
Set up paths to get ARD libraries:&lt;br /&gt;
 $ export PYTHONPATH={ardDir}/lib:{ardDir}/bin&lt;br /&gt;
 $ export PATH={ardDir}/bin:$PATH&lt;br /&gt;
&lt;br /&gt;
Run Python. Make SURE to specify ARD's embedded Python, and not your distribution's installed version!&lt;br /&gt;
 $ {ASP_Dir}/bin/asp_run {ardDir}/bin/python2.5&lt;br /&gt;
&lt;br /&gt;
Now at the Python prompt, run this line FIRST to hook into the SAFplus Platform AMF:&lt;br /&gt;
 &amp;gt;&amp;gt; import amfpy; amfpy.initializeAmf()&lt;br /&gt;
&lt;br /&gt;
At this point you can use all ARD Python services, as shown in the following script:&lt;br /&gt;
&lt;br /&gt;
====apiexample.py====&lt;br /&gt;
&lt;br /&gt;
 # Standard Python modules&lt;br /&gt;
 import os&lt;br /&gt;
 import time&lt;br /&gt;
&lt;br /&gt;
 # ARD Python API example code, including deployment and upgrade:&lt;br /&gt;
 import upgrade; import clusterinfo; import aspApp; import aspAmf; import appdeploy&lt;br /&gt;
&lt;br /&gt;
 # Hook into the various services&lt;br /&gt;
 ci = clusterinfo.ci     # The clusterinfo.ci objects reflect the entire state of the cluster&lt;br /&gt;
 amf = aspAmf.Session()  # The aspAmf.Session class lets you modify the cluster state&lt;br /&gt;
&lt;br /&gt;
 # Example of getting the node names&lt;br /&gt;
 print [x.name for x in ci.nodeList]&lt;br /&gt;
&lt;br /&gt;
 # Get the name of the node in slot 1&lt;br /&gt;
 print ci.nodes[1].name&lt;br /&gt;
&lt;br /&gt;
 # Example of getting the sg started/stopped status&lt;br /&gt;
 print &amp;quot;Running Service Groups:&amp;quot;&lt;br /&gt;
 for x in clusterinfo.ci.sgList:&lt;br /&gt;
   if x.isRunning():&lt;br /&gt;
     print x.name&lt;br /&gt;
&lt;br /&gt;
 # Example of getting SU status and of traversing the entity hierarchy&lt;br /&gt;
 print &amp;quot;Active Service Units:&amp;quot;&lt;br /&gt;
 for x in clusterinfo.ci.suList:&lt;br /&gt;
   if x.isActive():&lt;br /&gt;
     print &amp;quot;%s is active for service group %s and is running on node %s (slot: %d)&amp;quot; % (x.name,x.sg.name,x.node.name,x.node.slot)&lt;br /&gt;
&lt;br /&gt;
 # Example of stopping and restarting an entity&lt;br /&gt;
 su = ci.suList[0]&lt;br /&gt;
 print &amp;quot;Stopping %s&amp;quot; % su.name&lt;br /&gt;
 amf.Shutdown(su)&lt;br /&gt;
 # Now we must reload the clusterinfo to reflect changes.&lt;br /&gt;
 ci.load()&lt;br /&gt;
 su = ci.entities[su.name]  # and reload our temporary.  Its best to access your entities by name in case the list order changes&lt;br /&gt;
 if su.isRunning():&lt;br /&gt;
   print &amp;quot;SU %s is still running&amp;quot; % su.name&lt;br /&gt;
 else:&lt;br /&gt;
   print &amp;quot;SU %s is stopped&amp;quot; % su.name&lt;br /&gt;
 amf.Startup(su)&lt;br /&gt;
 ci.load()&lt;br /&gt;
 su = ci.entities[su.name]  # its best to access your entities by name in case the list order changes&lt;br /&gt;
 if su.isRunning():&lt;br /&gt;
   print &amp;quot;SU %s is running&amp;quot; % su.name&lt;br /&gt;
 else:&lt;br /&gt;
   print &amp;quot;SU %s is still stopped&amp;quot; % su.name&lt;br /&gt;
&lt;br /&gt;
 # Initialize the Application bundle DB &amp;amp; pass the bundle repository directory.  Note that you should only create 1 of these per bundle repository directory  or you will have 2 entities managing the same data.&lt;br /&gt;
 appDb = aspApp.AppDb(os.getenv(&amp;quot;ASP_DIR&amp;quot;,&amp;quot;/tmp&amp;quot;) + &amp;quot;/apps&amp;quot;)&lt;br /&gt;
 ci.setAppDb(appDb)  # Hook them up (so clusterinfo knows about application versions)&lt;br /&gt;
 myNode = &amp;quot;ctrlI0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # Set additional data that SAFplus Platform may not know into the node&lt;br /&gt;
 # This info is necessary to deploy software&lt;br /&gt;
 # (it also can be entered via the GUI, or via etc/clustercfg.xml file)&lt;br /&gt;
 # You need to change these values to correctly reflect your setup&lt;br /&gt;
 if ci.entities[myNode].localUser == 'unknown':&lt;br /&gt;
   ci.entities[myNode].setIntraclusterAccess(&amp;quot;192.168.66.130&amp;quot;,&amp;quot;root&amp;quot;,&amp;quot;clovis&amp;quot;,&amp;quot;/root/ocmsdemo7&amp;quot;)&lt;br /&gt;
 # The above example sets 1 node.  For the application deployment example&lt;br /&gt;
 # below to work, you must set all of the nodes to the correct values.&lt;br /&gt;
&lt;br /&gt;
 # Add 2 bundle files into the system.  Of course you must modify the path to&lt;br /&gt;
 # point to valid bundle files.&lt;br /&gt;
 appDb.NewAppFile(&amp;quot;/code/vipapp1.4.0.0.tgz&amp;quot;)&lt;br /&gt;
 appDb.NewAppFile(&amp;quot;/code/vipapp1.4.0.1.tgz&amp;quot;)&lt;br /&gt;
 # Note that if you want AppDb to automatically find them again, &lt;br /&gt;
 # you must copy them into the repository (the directory you specified&lt;br /&gt;
 # when creating &amp;quot;appDb&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
 # Show all bundles and versions&lt;br /&gt;
 print [(x.name,x.version) for x in appDb.AppList()]&lt;br /&gt;
&lt;br /&gt;
 # Find all &amp;quot;live&amp;quot; nodes&lt;br /&gt;
 # Of course, you can't deploy to nodes that aren't powered up!&lt;br /&gt;
 liveNodes = filter(lambda x: x.isRunning(),ci.nodeList)&lt;br /&gt;
 print [x.name for x in liveNodes]&lt;br /&gt;
&lt;br /&gt;
 # Get an application&lt;br /&gt;
 appFile = appDb.apps['virtualIp'].version['1.4.0.0']&lt;br /&gt;
 print &amp;quot;Name: &amp;quot;, appFile.name, &amp;quot;Located At: &amp;quot;, appFile.dir, &amp;quot;Version: &amp;quot;, appFile.version  &lt;br /&gt;
&lt;br /&gt;
Deploy the application:&lt;br /&gt;
&lt;br /&gt;
 # Tweak the configuration for just this deployment&lt;br /&gt;
 # If I didn't copy the configuration, I would be modifying it in RAM&lt;br /&gt;
 # which would affect other deployments I do within this Python session.&lt;br /&gt;
 import copy&lt;br /&gt;
 newCfg = copy.deepcopy(appFile.cfg)&lt;br /&gt;
 # For example, set failback parameter to True:&lt;br /&gt;
 newCfg.virtualIp.modifiers.failBack = True&lt;br /&gt;
&lt;br /&gt;
 # Really Deploy&lt;br /&gt;
 import appdeploy&lt;br /&gt;
 (sgList,(errors,notes)) = appdeploy.deploy(appFile.dir,newCfg,liveNodes,abortIfCantAccess=True,copy=True,deploy=True)&lt;br /&gt;
 # Did you get a pexpect exception?  You probably forgot to specify the node &lt;br /&gt;
 # intracluster access data as shown above.  Or you may have specified&lt;br /&gt;
 # incorrect information.&lt;br /&gt;
 myNewSg  = sgList[0]&lt;br /&gt;
 mySgName = myNewSg.name &lt;br /&gt;
 print &amp;quot;Deployed application and created SG %s&amp;quot; % mySgName&lt;br /&gt;
 # Reload the AMF information model&lt;br /&gt;
 ci.load()&lt;br /&gt;
&lt;br /&gt;
 # Reaccess via ci global to get refreshed data.&lt;br /&gt;
 mySg = ci.entities[mySgName]&lt;br /&gt;
 # Let's start it up&lt;br /&gt;
 amf.Startup(mySg)&lt;br /&gt;
 # Give it time to come up&lt;br /&gt;
 # I reaccess through ci each time to get refreshed data.&lt;br /&gt;
 while not ci.entities[mySgName].isRunning():&lt;br /&gt;
   time.sleep(5)&lt;br /&gt;
   ci.refresh()&lt;br /&gt;
 print &amp;quot;It is running&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Let's do an upgrade!&lt;br /&gt;
&lt;br /&gt;
 # Start the upgrade manager...&lt;br /&gt;
 umgr = upgrade.UpgradeMgr()&lt;br /&gt;
 umgr.add(mySg)  # Add my Service Group to it.&lt;br /&gt;
 upSg = umgr.entities[mySgName]  # Get my sg's upgrade entity &lt;br /&gt;
 upSg.upMethod = upgrade.RollingUpgrade&lt;br /&gt;
 print mySg.appVer.version&lt;br /&gt;
&lt;br /&gt;
 # Start the upgrade...&lt;br /&gt;
 upSg.Upgrade(appDb.apps['virtualIp'].version['1.4.0.1'])&lt;br /&gt;
 ci.load() # Reload the database.&lt;br /&gt;
 mySg = ci.entities[mySg.name]  # Get the new SG object&lt;br /&gt;
 print mySg.appVer.version&lt;br /&gt;
&lt;br /&gt;
===XML client/server example===&lt;br /&gt;
&lt;br /&gt;
This example is located in the &amp;quot;bin&amp;quot; directory and consists of 2 files &amp;quot;xmlclientexample.py&amp;quot; and &amp;quot;xmlserverexample.py&amp;quot;.  It implements a simple XML-RPC client server application that demonstrates how the ARD can interface with 3rd party off-box element management systems.  Please look at these files to see how it works.&lt;br /&gt;
&lt;br /&gt;
===HTTP client/server example===&lt;br /&gt;
&lt;br /&gt;
This example is located in the &amp;quot;bin&amp;quot; directory and consists of 2 files &amp;quot;httpclientexample.py&amp;quot; and &amp;quot;httpserverexample.py&amp;quot;.  It implements a simple http server application that demonstrates how the ARD can interface with 3rd party off-box element management systems.  The intention behind this example is to show a client-server application communicating via http not a human browseable web site (the main ARD GUI application demonstrates how a web-based EMS can be constructed).&lt;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/deploymentdetails</id>
		<title>Doc:Sdk 4.1/awdguide/deploymentdetails</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/deploymentdetails"/>
				<updated>2009-07-27T17:24:57Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AwdDocHeader}}&lt;br /&gt;
==AWD Deployments (Service Groups) Page==&lt;br /&gt;
&lt;br /&gt;
This page shows the details of the selected Application (SAF Service Group).  To properly understand this page it is best to understand the SAF entity hierarchy documented in the SAF AMF specification.  &lt;br /&gt;
&lt;br /&gt;
The top table describes the Service Group in detail.  In this case the &amp;quot;Version&amp;quot; field is yellow, which indicates that a new version of this application is available in the bundle manager ([[Doc:sdk_4.1/awdguide/applications | Applications ]] page) and so this application can be upgraded.&lt;br /&gt;
&lt;br /&gt;
The second table describes all the programs that make up this application.  In this case, 2 programs are running on different nodes, in an active/standby relationship.&lt;br /&gt;
&lt;br /&gt;
The third table describes all work assigned to this applications (SAF Service Instances).  In this case there is just one work item called &amp;quot;virtualIpSIi0_firstIp&amp;quot;.  If you click on the name, you will be sent to the work details page, where you can modify the Name/Value pairs that define this work.  You man also click the &amp;quot;New&amp;quot; button to create a new work item.  Doing so will create a new row in the table.  You can then fill in any relevant details.  You may create as many new work items as desired.  When finished, click the &amp;quot;Commit Changes&amp;quot; button to actually submit your changes to the SAFplus Platform Web Director.&lt;br /&gt;
&lt;br /&gt;
As with all pages, you may select any table row by clicking the select box in that row and then click on a button to operate on the selected rows.  In this page, you may start, stop, idle, or delete entities.  If the deployment's version field is yellow, you may also upgrade the deployment by selecting the deployment (select the only row in the top table) and then clicking on the &amp;quot;Upgrade button&amp;quot;.  You may only upgrade at a deployment granularity, so selecting a component program or work item and then clicking upgrade will give an error.&lt;br /&gt;
&lt;br /&gt;
[[File:awdSg.png|frame|center|'''OpenClovis SAFplus Platform Web Director Service Group Page''']]&lt;br /&gt;
&lt;br /&gt;
You may also extend this deployment onto more nodes by typing the node name into the text box located near the &amp;quot;extend&amp;quot; button and then clicking on the button.  For example, in this model, I could &amp;quot;extend&amp;quot; onto the node in slot 1 by typing &amp;quot;ctrlI0&amp;quot; into the box.  You may also extend the deployment onto other nodes (or reduce it) by typing a new redundancy model designation into the &amp;quot;Change redundancy type&amp;quot; box and then clicking &amp;quot;Migrate&amp;quot;.  This is a very powerful one shot button, but it has some drawbacks; for example the system will automatically choose nodes to extend or delete.  Of course, you can do the same functionality by hand by explicitly &amp;quot;extending&amp;quot; onto desired nodes (to add nodes) or by selecting rows and clicking &amp;quot;delete&amp;quot; (to remove them).  &lt;br /&gt;
&lt;br /&gt;
Of course, to successfully use the extend or migrate functionality, you must install the software to the appropriate nodes yourself.  This can be done via the [[Doc:sdk_4.1/awdguide/applications | Applications (SAF Software Bundles) Page ]].  If you forget to do so, the extend or migrate will work, but you will not be able to actually start the software on that node (until you install it)!  &lt;br /&gt;
&lt;br /&gt;
Advanced Configuration can be accessed by clicking on the &amp;quot;+ Advanced Configuration&amp;quot; title.  Once opened, the advanced configuration looks like:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:awdSgAdvCfg.png|frame|center|'''OpenClovis SAFplus Platform Web Director Applications Page''']]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Documentation for each field is beyond the scope of this document.  It exists on the page itself, in the SAF AMF spec, and within the OpenClovis documentation.&lt;br /&gt;
&lt;br /&gt;
You may change any field by clicking on it (it will dynamically create a edit box), making the change, and then (when all desired fields are changed) clicking the &amp;quot;Commit Changes&amp;quot; button.&lt;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/si</id>
		<title>Doc:Sdk 4.1/awdguide/si</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/si"/>
				<updated>2009-07-27T17:23:20Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AwdDocHeader}}&lt;br /&gt;
===Application Provisioning Page===&lt;br /&gt;
&lt;br /&gt;
This page allows you to change the SAF CSI name/value pairs before the SAFplus Platform assigns the CSI to a component.  For more details about SAF CSI please see the SAF AMF specification located at www.saforum.org.&lt;br /&gt;
&lt;br /&gt;
The name/value pairs that appear application initial deployment are defaults specified in the application bundle file.  To change the defaults, delete the items that should be changed (by checking them and clicking delete) and then recreate them by clicking &amp;quot;new&amp;quot; to add a new line, filling in the name and value (you can do this multiple times) and finally clicking on &amp;quot;commit changes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Note that the SAFplus Platform and the SAFplus Platform Runtime Director simply passes these provisioned values to the component; therefore it cannot do any validation on the fields.  It is important to get them right to ensure correct operation of your component.&lt;br /&gt;
&lt;br /&gt;
[[File:awdsi.png|frame|center|'''OpenClovis SAFplus Platform Web Director Work Details Page''']]&lt;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/upgrade</id>
		<title>Doc:Sdk 4.1/awdguide/upgrade</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/upgrade"/>
				<updated>2009-07-27T17:12:22Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AwdDocHeader}}&lt;br /&gt;
==Application Upgrade==&lt;br /&gt;
&lt;br /&gt;
After an application deployment is scheduled for an upgrade (by selecting it and clicking on the &amp;quot;upgrade&amp;quot; button in various places in the GUI).  It appears in this upgrade page.  Multiple upgradeable deployments can appear here simultaneously and you may run the upgrades simultaneously or sequentially as you wish.&lt;br /&gt;
&lt;br /&gt;
Select the application deployments to be upgraded by clicking on the left checkbox.  Next choose &amp;quot;rolling&amp;quot; or &amp;quot;single-step&amp;quot; upgrade on the right.  &amp;quot;Rolling&amp;quot; upgrade executes an in-service algorithm in which the application is upgraded on each node sequentially ensuring that some nodes always remain to provide the application service.  To use this method, applications must be capable of having different versions run simultaneously on the cluster.  &amp;quot;Single-step&amp;quot; upgrade upgrades the application on every node simultaneously, causing a short interruption in service.  However, this method does not require that application versions interoperate.  These upgrade algorithms are explained in detail in the SAF SMF (Software Manageability Framework) specification. &lt;br /&gt;
&lt;br /&gt;
Leave &amp;quot;automatic&amp;quot; as &amp;quot;yes&amp;quot; since manual upgrades are not yet supported.  &lt;br /&gt;
&lt;br /&gt;
When ready, click &amp;quot;Start&amp;quot;.  This page will be updated dynamically so you will see the upgrade's progress.&lt;br /&gt;
&lt;br /&gt;
[[File:awdUpgrade.png|frame|center|'''OpenClovis SAFplus Platform Web Director Upgrade Page''']]&lt;br /&gt;
&lt;br /&gt;
This is a view of an in-progress rolling upgrade.  Note that the payloadI0 node is no longer running the application (its status is &amp;quot;down&amp;quot;) and that it is being upgraded.  Also note that the &amp;quot;payloadI1&amp;quot; node is up, and active -- it is providing the service during the upgrade of the &amp;quot;payloadI0&amp;quot; node.&lt;br /&gt;
&lt;br /&gt;
[[File:awdMidUpgrade.png|frame|center|'''OpenClovis SAFplus Platform Web Director Mid-Upgrade Page''']]&lt;br /&gt;
&lt;br /&gt;
When the upgrade is complete and you are satisfied with the correct operation, click &amp;quot;Commit&amp;quot; to remove it from the upgrade page.&lt;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/programs</id>
		<title>Doc:Sdk 4.1/awdguide/programs</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/programs"/>
				<updated>2009-07-27T17:09:31Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AwdDocHeader}}&lt;br /&gt;
==Programs (SAF Components)==&lt;br /&gt;
This page shows information about every SAFplus-aware process running in the cluster.  You may modify the running state of these processes using the standard &amp;quot;select-rows and click button&amp;quot; method that exists throughout the GUI.&lt;br /&gt;
&lt;br /&gt;
[[File:awdComponents.png|frame|center|'''OpenClovis SAFplus Platform Web Director Nodes Page''']]&lt;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/deployments</id>
		<title>Doc:Sdk 4.1/awdguide/deployments</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/deployments"/>
				<updated>2009-07-27T17:06:04Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AwdDocHeader}}&lt;br /&gt;
==AWD Deployments (Service Groups) Page==&lt;br /&gt;
This page shows the applications deployed (SAF Service Groups) on the cluster.&lt;br /&gt;
The table contains one row per deployment.  In this case the only applications running are the SAFplus Platform Web Director itself (ClusterMgrSGI0) and a single application called &amp;quot;virtualIpSGi0&amp;quot;.  Note that some fields are not populated for the ClusterMgrSGI0 deployment because the ClusterMgr was not dynamically deployed into this model.  Also note that the &amp;quot;Version&amp;quot; field for the &amp;quot;virtualIp&amp;quot; deployment is yellow, which indicates that a new version of this application is available in the bundle manager ([[Doc:sdk_4.1/awdguide/applications | Applications ]] page) and so this application deployment can be upgraded.&lt;br /&gt;
&lt;br /&gt;
[[File:awdSgs.png|frame|center|'''OpenClovis SAFplus Platform Web Director Deployments (Service Groups) Page''']]&lt;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/deploy</id>
		<title>Doc:Sdk 4.1/awdguide/deploy</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/deploy"/>
				<updated>2009-07-27T17:00:56Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AwdDocHeader}}&lt;br /&gt;
===Application Installation and/or Deployment===&lt;br /&gt;
To install and run software bundles on the cluster, use the application deployment page.  On the top, select the nodes on which you want the application to be installed/deployed.  Next choose the &amp;quot;Operation&amp;quot; (just install -- copy the software, just deploy -- create the application in AMF with the assumption that it is already installed, or do both).  If the software is already installed it will not be installed again, so the &amp;quot;Install and Deploy&amp;quot; option is the most commonly used option.  Next change the deployment name, if desired.&lt;br /&gt;
&lt;br /&gt;
Next, change any High Availability parameters.  Note that the parameters shown are selected by the application.  It is possible that the application will not work for a particular combination of parameters so only modify these if you know the application intimately.&lt;br /&gt;
&lt;br /&gt;
Finally click the &amp;quot;Deploy&amp;quot; button to make it happen.  Be patient!  Since the system may be installing the application on remote nodes it can take some time.&lt;br /&gt;
&lt;br /&gt;
[[File:awdDeploy.png|frame|center|'''OpenClovis SAFplus Platform Web Director New Application Deployment Page''']]&lt;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/nodedetails</id>
		<title>Doc:Sdk 4.1/awdguide/nodedetails</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/nodedetails"/>
				<updated>2009-07-27T16:57:37Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AwdDocHeader}}&lt;br /&gt;
==Node Details==&lt;br /&gt;
&lt;br /&gt;
This page describes the node details.  Shown are the state of the node, the applications running on the node, and the exact programs running on the node.  At the bottom is a form showing the information required to do a software installation onto the node.  See the &amp;quot;New Node&amp;quot; screen for more details about these fields.&lt;br /&gt;
&lt;br /&gt;
[[File:awdNode.png|frame|center|'''OpenClovis SAFplus Platform Web Director Node Details Page''']]&lt;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/applications</id>
		<title>Doc:Sdk 4.1/awdguide/applications</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/applications"/>
				<updated>2009-07-27T16:56:08Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AwdDocHeader}}&lt;br /&gt;
==Applications (SAF Software Bundles) Page==&lt;br /&gt;
&lt;br /&gt;
Application bundles can be uploaded to the cluster, where they are stored in an application repository.  Applications in the repository are not actually installed or deployed in the cluster -- they are simply available for installation and deployment. This page shows the uploaded applications and versions.  In this case 2 versions of the &amp;quot;virtualIp&amp;quot; application have been uploaded 1.4.0.0 and 1.4.0.1.&lt;br /&gt;
&lt;br /&gt;
Applications can be uploaded using the &amp;quot;upload new application&amp;quot; box at the bottom of the main window.  Next applications can be installed and/or deployed through the &amp;quot;Deploy&amp;quot; button (first check the desired application version).  It is also possible to schedule applications to be upgraded here (check the OLD version and click upgrade) or to delete application versions from the repository.&lt;br /&gt;
&lt;br /&gt;
[[File:awdapp.png|frame|center|'''OpenClovis SAFplus Platform Web Director Applications Page''']]&lt;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/newnode</id>
		<title>Doc:Sdk 4.1/awdguide/newnode</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/newnode"/>
				<updated>2009-07-27T16:45:00Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AwdDocHeader}}&lt;br /&gt;
===New Node===&lt;br /&gt;
The &amp;quot;New Node&amp;quot; page allows the user to provision a new node in the cluster.  It remains the user's responsibility to install and start SAFplus Platform on the new node.  &lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Name&amp;quot; and &amp;quot;Slot&amp;quot; are required fields; although the slot will only be used if the node is not in an ATCA chassis.  Otherwise the node's actual slot will be used.  These values also must be defined in the asp/etc/asp.conf file on the new node (this is the mechanism used to &amp;quot;connect&amp;quot; the provisioned node with a real node.&lt;br /&gt;
&lt;br /&gt;
The IP Address, Admin username, Admin password, and SAFplus Platform directory fields are needed for application software deployment.  Application deployment uses the &amp;quot;scp&amp;quot; protocol, and so if the cluster is configured with ssh private/public keys then it is not necessary to fill out these fields.  There are many tutorials online describing this configuration so it will not be discussed here.  For security reasons, using ssh keys is recommended for deployment.&lt;br /&gt;
&lt;br /&gt;
[[File:awdNewNode.png|frame|center|'''OpenClovis SAFplus Platform Web Director New Node Page''']]&lt;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/nodes</id>
		<title>Doc:Sdk 4.1/awdguide/nodes</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/nodes"/>
				<updated>2009-07-27T16:37:50Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AwdDocHeader}}&lt;br /&gt;
==AWD Nodes Page==&lt;br /&gt;
&lt;br /&gt;
[[File:awdNodes.png|frame|center|'''OpenClovis SAFplus Platform Web Director Nodes Page''']]&lt;br /&gt;
&lt;br /&gt;
The AWD Nodes table describes details about the state of each node in the system.  The node's name, IP address, administrative (i.e. desired) state, actual state, redundancy role, and what SAFplus Platform applications and processes are running on it are all available.  By checking one or multiple rows, you may press the &amp;quot;start&amp;quot;, &amp;quot;idle&amp;quot;, &amp;quot;stop&amp;quot;, &amp;quot;switchover&amp;quot;, or &amp;quot;delete&amp;quot; buttons to execute that operation on one or more nodes.  To create a new node, click the &amp;quot;New node&amp;quot; menu item in the left-hand sidebar.&lt;br /&gt;
&lt;br /&gt;
The node's IP address must be correct for the SAFplus Platform web director to correctly deploy software onto the node.  To set the node's IP Address, and other details, click the node's name in the left-hand sidebar.  This will bring you to the [[Doc:sdk_4.1/awdguide/nodedetails |  Node Details Page ]].&lt;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/frame</id>
		<title>Doc:Sdk 4.1/awdguide/frame</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/frame"/>
				<updated>2009-07-27T16:32:14Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AwdDocHeader}}&lt;br /&gt;
==AWD Frame and Common Elements==&lt;br /&gt;
&lt;br /&gt;
This is the AWD “Nodes” page.  It displays the state of all nodes/blades/computers (pick your terminology) in the OpenClovis SAFplus Platform cluster and is used as the &amp;quot;home&amp;quot; page of the AWD.  Let us examine the surrounding frame before we take a look at the table itself.  This frame will be the same in most AWD pages.  &lt;br /&gt;
&lt;br /&gt;
[[File:awdNodes.png|frame|center|'''OpenClovis SAFplus Platform Web Director Nodes Page''']]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On top is the AWD title bar.  At the upper left is the OpenClovis logo (rebrandable) and just below that (in brown) is the last time this page was refreshed.  On the right side is the title of this page, “Nodes”, and below that is a menu of major functionality (note if this instance of AWD was running on a chassis, we would also see a “chassis” menu item on this bar).  On the far right is a small “logout” link for when you are done using the AWD.&lt;br /&gt;
&lt;br /&gt;
On the left side is the AWD sidebar.  This sidebar contains links to dynamic content pages.  In this case  every node, and application is listed.  There are also 2 shortcut menu choices to create a new application deployment “New deployment” and to create a new node “New node”.  If an application has extended AWD with custom content, you would also see a link to this customization in this sidebar.&lt;br /&gt;
&lt;br /&gt;
On the bottom is the AWD footer.  On the left are two buttons.  The first demonstrates internationalization by allowing you to dynamically switch the entire web site between displaying SA Forum and “human” readable text.  For example, if SA Forum terminology was turned on, the “Start” button would instead be labeled “Unlock”, the “Idle” button “lock assignment”, and the “Stop” button “lock instantiation”.  The next button selects how often the web page should be reloaded.  By selecting a different time, you can choose your desired compromise between network traffic and data accuracy.  Finally on the far right is the OpenClovis Copyright notice (rebrandable).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the nodes page shown above, you can see that the name of each node (displayed in a column of the main table) is colored.  Entity names are color-coded based on the current status of the entity.&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;| Color &lt;br /&gt;
!style=&amp;quot;color:#66b154; background:#09477c&amp;quot;| Meaning&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:green&amp;quot; | Green&lt;br /&gt;
| Entity is OK&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:yellow&amp;quot; | Yellow&lt;br /&gt;
| Entity is OK but idle/unused.  This may happen administratively or because there is nothing for the entity to do.&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:orange&amp;quot; | Orange&lt;br /&gt;
| Entity is unprotected (i.e. it is configured for redundancy but is currently running without redundancy)&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:red&amp;quot; | Red&lt;br /&gt;
| Entity is down&lt;br /&gt;
|- style=&amp;quot;color:#ffffff; background:#549cc6&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:gray&amp;quot; | Gray&lt;br /&gt;
| Entity is off or does not exist&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/login</id>
		<title>Doc:Sdk 4.1/awdguide/login</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/login"/>
				<updated>2009-07-27T16:15:40Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AwdDocHeader}}&lt;br /&gt;
==Login==&lt;br /&gt;
To access AWD functionality, you must log in first.  By default the AWD is running on port 8080 on both system controller nodes.&lt;br /&gt;
&lt;br /&gt;
[[File:awdLogin.png|frame|center|'''OpenClovis SAFplus Platform Web Director Login Screen''']]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is the SAFplus Platform Web Director login page.  Three user groups are supported, read, read/write, and administrator.  Users in the read-only group can look at pages, users in the read/write group can look at pages AND make changes.  Finally, the administrator group can manage AWD web site settings.  The default administrator username/password is &amp;quot;root&amp;quot;/&amp;quot;clovis&amp;quot; and this account will be automatically created upon startup if accidentally deleted.  Note: to setup users, etc, or to change the administrator password please use the TurboGears-supplied Catwalk web site management toolbox accessible from your browser at “//{AWD node}/catwalk”.  Documentation for this tool is located in the turbogears project (http://www.turbogears.org/).&lt;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/screens</id>
		<title>Doc:Sdk 4.1/awdguide/screens</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/screens"/>
				<updated>2009-07-27T15:28:26Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AwdDocHeader}}&lt;br /&gt;
==Screens==&lt;br /&gt;
The following pages describe the GUI screens that constitute the SAFplus Platform Web director.&lt;br /&gt;
&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;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/upgradedirector</id>
		<title>Doc:Sdk 4.1/awdguide/upgradedirector</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/upgradedirector"/>
				<updated>2009-07-27T15:24:39Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AwdDocHeader}}&lt;br /&gt;
==Upgrade Director==&lt;br /&gt;
&lt;br /&gt;
The Upgrade Director is a separate entity that controls the upgrade of the SAFplus Platform middleware and optionally the OS.  To upgrade applications, please see the &amp;quot;Software Management&amp;quot; subsection.&lt;br /&gt;
&lt;br /&gt;
The core of the Upgrade Director consists of a python program that is run on both system controllers that upgrades a cluster using an in-service (rolling) algorithm.  This is difficult because the node that the upgrade director's themselves are running on may need to be rebooted.  However, since the upgrade director is run redundantly (on both system controllers) there is always one live node to direct operations.&lt;br /&gt;
&lt;br /&gt;
===Delivery===&lt;br /&gt;
&lt;br /&gt;
The Upgrade Director requires an &amp;quot;upgrade bundle&amp;quot; file to run.  This file contains the Upgrade Director itself and all files necessary to do an upgrade.  New upgrade bundle file formats can be used by deriving new classes from the &amp;quot;UpgradeBundle&amp;quot; and &amp;quot;UpgradeRemote&amp;quot; classes.  &lt;br /&gt;
&lt;br /&gt;
The Upgrade Director provides a default, self-executing, linux-distribution-neutral bundle file format based on gzipped tar files.  A script is also provided that will create this bundle given a compiled SAFplus Platform tree and an xml configuration file.&lt;br /&gt;
&lt;br /&gt;
===XML File Format===&lt;br /&gt;
&lt;br /&gt;
The following is an example XML file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;bundle_config ver=&amp;quot;1.0.0.0&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;asp&amp;gt;&lt;br /&gt;
        &amp;lt;image version=&amp;quot;4.1.0&amp;quot; arch=&amp;quot;i686&amp;quot; os=&amp;quot;ubuntu&amp;quot; osVersion=&amp;quot;9.04&amp;quot; files='i686-linux-2.6.22.tgz'/&amp;gt;&lt;br /&gt;
    &amp;lt;/asp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;app&amp;gt;&lt;br /&gt;
        &amp;lt;virtualIp version=&amp;quot;1.4.0.1&amp;quot; arch=&amp;quot;i686&amp;quot; os=&amp;quot;linux&amp;quot; files='vipapp1.4.0.1.tgz' /&amp;gt;&lt;br /&gt;
    &amp;lt;/app&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;upgradeDirector&amp;gt;&lt;br /&gt;
        &amp;lt;default fromAspVersion=&amp;quot;4.0&amp;quot; aspVersion=&amp;quot;4.1&amp;quot; files='/code/svn/clustermgt/clustermgt/root/ocms/src/app/asppybinding /code/svn/clustermgt/clustermgt/root/ocms/src/app/upgradeDirector /code/svn/clustermgt/clustermgt/root/ocms/target/i686/linux-2.6.22/lib/' /&amp;gt;&lt;br /&gt;
    &amp;lt;/upgradeDirector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;os&amp;gt;&lt;br /&gt;
        &amp;lt;Ubuntu fromVersion=&amp;quot;8.04&amp;quot; version=&amp;quot;9.10&amp;quot; files='fakeubuntu9.10.tgz' /&amp;gt;&lt;br /&gt;
    &amp;lt;/os&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/bundle_config&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This XML file is included in the upgrade bundle for use when upgrading the cluster.  Any unknown tag or attribute is simply ignored, so this file format may be extended to supply additional functionality.  If the entity is applicable to all possibilities (such as what operating system the code runs on, or what version must be running on the system before the upgrade) then the specifying attribute may be removed.&lt;br /&gt;
&lt;br /&gt;
In this release, only a single entry in each major section is allowed -- for example, the software does not determine which SAFplus Platform image or OS image should be used in the upgrade.  There should be only one image specified.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Description of tags ====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;bundle_config&amp;gt; This tag defines the start and end of the config file.  It contains as single attribute which is the version of this XML config file format.  Currently &amp;quot;ver&amp;quot; which must be &amp;quot;1.0.0.0&amp;quot;.&lt;br /&gt;
* &amp;lt;asp&amp;gt; This tag contains the SAFplus Platform images available within this bundle.  Currently only a single SAFplus Platform image is supported per bundle.&lt;br /&gt;
* &amp;lt;image&amp;gt; This tag defines the SAFplus Platform image.  Its attributes are:&lt;br /&gt;
** version The SAFplus Platform version&lt;br /&gt;
** arch The architecture this SAFplus Platform is compiled for&lt;br /&gt;
** os The OS this image was compiled on&lt;br /&gt;
** osVersion The OS version this image was compiled on &lt;br /&gt;
** files The SAFplus Platform image file.  This is the output of &amp;quot;make images&amp;quot; executed in an SAFplus Platform model, with your target.conf set to generate a single binary image, and separate .conf files.&lt;br /&gt;
* &amp;lt;app&amp;gt; Simultaneous application upgrade is not supported in this release&lt;br /&gt;
* &amp;lt;upgradeDirector&amp;gt; This section specifies the upgrade director software available in this bundle&lt;br /&gt;
**  fromAspVersion Specifies what version of SAFplus Platform the upgrade director can upgrade from.&lt;br /&gt;
**  aspVersion Specifies what version of SAFplus Platform the upgrade director can upgrade to.&lt;br /&gt;
**  files A space-separated list of files and directories that must contain the upgrade director application and all required libraries.  These file will be copied into the bundle.&lt;br /&gt;
* &amp;lt;os&amp;gt; What operating system upgrades are contained in this bundle&lt;br /&gt;
** fromVersion The node must be running this version for this file to be applicable&lt;br /&gt;
** version The version of the os in this file&lt;br /&gt;
** files A space-separated list of files and directories that contain the operating system.  These files/directories will be copied into the bundle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Bundle Creation ===&lt;br /&gt;
&lt;br /&gt;
A bundle is created by running the &amp;quot;createUpgradeBundle.py&amp;quot; script located in the upgradeDirector directory.  It is run like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export UPGRADE_IMAGE_PATH=&amp;lt;colon separated list of directories&amp;gt;&lt;br /&gt;
python createUpgradeBundle.py &amp;lt;xmlConfigFile&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The UPGRADE_IMAGE_PATH directory allows you to specify the set of search directories when looking for files referenced in the xml config file.  The purpose of the UPGRADE_IMAGE_PATH variable twofold: First, to allow the script to handle changes in the directory hierarchy without requiring the config file to be changed.  This is useful   for multiple-developer source-controlled environments since different &amp;quot;checkouts&amp;quot; may use different root trees.  Second, to allow the config file to be copied into the bundle itself and still have applicable file names.&lt;br /&gt;
&lt;br /&gt;
=== Bundle Execution ===&lt;br /&gt;
The created bundle is a gzipped tar file which is wrapped in a simple self-extracting script (selfextractor.sh).  This script can either extract all files in the archive (i.e. detar them) or extract and start the runtime director.    This latter is the rolling upgrade operation.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
To extract all files in the archive:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;bundle&amp;gt; extract&lt;br /&gt;
specifically:&lt;br /&gt;
./asp4.1.0.bdl extract&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To start the upgrade director:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;bundle&amp;gt; &amp;lt;current SAFplus Platform dir&amp;gt;&lt;br /&gt;
specifically:&lt;br /&gt;
./asp4.1.0.bdl /root/asp40&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that this command should only be run on a single controller node in your cluster.  It will automatically identify the other controller node and run the upgrade director redundantly on it.&lt;br /&gt;
&lt;br /&gt;
Please see the &amp;quot;selfextractor.sh&amp;quot; script for more details and for customization.&lt;br /&gt;
&lt;br /&gt;
===Software Overview===&lt;br /&gt;
&lt;br /&gt;
Please see the API documentation for details on the software.&lt;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/appbundle</id>
		<title>Doc:Sdk 4.1/awdguide/appbundle</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/appbundle"/>
				<updated>2009-07-27T15:21:25Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AwdDocHeader}}&lt;br /&gt;
==Application Bundle Format==&lt;br /&gt;
&lt;br /&gt;
An application bundle is a gzipped tar file (.tgz, open via the &amp;quot;tar xvfz &amp;lt;file&amp;gt;&amp;quot; command) that contains at a minimum the following layout:&lt;br /&gt;
&lt;br /&gt;
 appcfg.xml&lt;br /&gt;
 deploy (a directory)&lt;br /&gt;
   bin  (a directory)&lt;br /&gt;
     &amp;lt;application binary files&amp;gt;&lt;br /&gt;
   etc&lt;br /&gt;
     &amp;lt;application configuration files&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The appcfg.xml file describes the contents of the application bundle.  It is an xml V1.1 document with a simple layout.  As a simplification to standard XML, attributes and child tags are considered equivalent and the special attribute &amp;quot;value&amp;quot; is equivalent to child content.  The purpose is to allow the xml author to use whichever form is more convenient.  This concept is most easily understood by noting that all of the following are equivalent config files:&lt;br /&gt;
&lt;br /&gt;
====Classic XML====&lt;br /&gt;
 &amp;lt;foo&amp;gt;&lt;br /&gt;
   &amp;lt;bar&amp;gt;1&amp;lt;/bar&amp;gt;&lt;br /&gt;
 &amp;lt;/foo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Compact XML====&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
   &amp;lt;foo bar=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Partially compacted XML====&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;foo&amp;gt;&lt;br /&gt;
   &amp;lt;bar value=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;/bar&amp;gt;&lt;br /&gt;
 &amp;lt;/foo&amp;gt;&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Example configuration file===&lt;br /&gt;
&lt;br /&gt;
The following is a typical appcfg.xml configuration file.  This file is used in the SAFplus Platform virtualIp example provided with your SAFplus Platform source distribution:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;virtualIp ver=&amp;quot;1.4.0.0&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;programNames prog0=&amp;quot;vip&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;redundancyModel value=&amp;quot;3+1&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;totalNodes value=&amp;quot;4&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;modifiers&amp;gt;&lt;br /&gt;
   &amp;lt;failBack value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;autoRepair value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;restartsBeforeFailure value='0' /&amp;gt;&lt;br /&gt;
   &amp;lt;activeStandbyRatio value='50' /&amp;gt;&lt;br /&gt;
 &amp;lt;/modifiers&amp;gt;&lt;br /&gt;
 &amp;lt;messages&amp;gt;&lt;br /&gt;
   &amp;lt;newDeployment&amp;gt;Virtual IP application deployed.  Please edit the work assignment (SAF SI) to customize your virtual IP address and interface before starting it.&amp;lt;/newDeployment&amp;gt;&lt;br /&gt;
 &amp;lt;/messages&amp;gt;&lt;br /&gt;
 &amp;lt;work&amp;gt;&lt;br /&gt;
   &amp;lt;firstIp VirtualIpAddress=&amp;quot;192.168.1.250&amp;quot; VirtualNetMask=&amp;quot;255.255.255.0&amp;quot; VirtualDevice=&amp;quot;eth0:10&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/work&amp;gt;&lt;br /&gt;
 &amp;lt;/virtualIp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The tags are described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Root Tag===&lt;br /&gt;
The root tag (in this case &amp;quot;virtualIp&amp;quot;) is the name of the application (SAF Service Group).  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Attribute: ver====&lt;br /&gt;
It has a single attribute &amp;quot;ver&amp;quot; that specifies the version of the software in a 4 dotted digit format.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ProgramNames===&lt;br /&gt;
ProgramNames specifies the names of every SAF component to be run in the application (SAF Service Group).  A single SAF Service Unit will be created on each node that this Service Group is deployed onto, and this SU will contain 1 component for every specified attribute to this tag.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Attribute: progN====&lt;br /&gt;
This tag takes any number of attributes, labelled prog0...progN.  Each attribute specifies the name of a Component to be created, and also the name of a binary located in &amp;quot;deploy/bin&amp;quot; that the component will run.  &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;lt;programNames prog0=&amp;quot;vip&amp;quot; prog1='myProg' /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===RedundancyModel===&lt;br /&gt;
Specify what type of redundancy this Service Group requires&lt;br /&gt;
&lt;br /&gt;
====Attribute: value====&lt;br /&gt;
This specifies the redundancy model.  Possible values are:&lt;br /&gt;
* &amp;quot;2N&amp;quot;: 1 Active/1 standby redundancy&lt;br /&gt;
* &amp;quot;N+M&amp;quot;: N Active/N standby redundancy&lt;br /&gt;
* &amp;quot;custom&amp;quot;: The application will explicitly assign redundancy&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;lt;redundancyModel value=&amp;quot;3+1&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===totalNodes===&lt;br /&gt;
Recommend the optimal number of nodes to run this application on.&lt;br /&gt;
&lt;br /&gt;
====Attribute: value====&lt;br /&gt;
A number specifying the number of nodes&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;lt;totalNodes value=&amp;quot;4&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===modifiers===&lt;br /&gt;
To override the default configuration for any Service Group configuration parameter, specify the parameter and value as a child tag of this tag.  The possible child tags are standard SAF and are also documented in the AWD GUI's deployment page under &amp;quot;Advanced Configuration&amp;quot;, or in the SAF AMF, SAFplus Platform SDK or IDE documentation.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;modifiers&amp;gt;&lt;br /&gt;
   &amp;lt;failBack value=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;autoRepair value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;restartsBeforeFailure value='0' /&amp;gt;&lt;br /&gt;
   &amp;lt;activeStandbyRatio value='50' /&amp;gt;&lt;br /&gt;
 &amp;lt;/modifiers&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====failback====&lt;br /&gt;
Should work be automatically moved back to the original location after a failure?&lt;br /&gt;
&lt;br /&gt;
====autoRepair====&lt;br /&gt;
After a failure, should a node be put directly back into service, or should an adminstrative reset be required.&lt;br /&gt;
&lt;br /&gt;
====instantiateDuration (Instantiation delay)====&lt;br /&gt;
How long to wait after system startup before starting this application.&lt;br /&gt;
&lt;br /&gt;
====numPrefActiveSUs (Preferred number of active nodes)====&lt;br /&gt;
Active nodes are executing your application.&lt;br /&gt;
&lt;br /&gt;
====numPrefStandbySUs (Preferred number of standby nodes)====&lt;br /&gt;
These nodes act as redundant backups for the active nodes.&lt;br /&gt;
&lt;br /&gt;
====numPrefIdleSUs (Preferred number of idle nodes)====&lt;br /&gt;
Idle nodes have the application running but no work assignments.  For example, if this number is 0 the application will not be started on any nodes until it is needed.  If 1 it will be started on 1 additional node (assuming that the app is deployed to enough nodes).&lt;br /&gt;
&lt;br /&gt;
====maxActiveSIsPerSU (Maximum active work)====&lt;br /&gt;
Maximum active work assignments on one program.&lt;br /&gt;
&lt;br /&gt;
====maxStandbySIsPerSU (Maximum standby work)====&lt;br /&gt;
Maximum standby work assignments on one program.&lt;br /&gt;
&lt;br /&gt;
====compRestartDuration (Process validation period)====&lt;br /&gt;
If a process fails X times within this duration the failure is escalated.  X is the 'Maximum process failure count' below.&lt;br /&gt;
&lt;br /&gt;
====compRestartCountMax (Maximum process failure count)====&lt;br /&gt;
How many times to restart a failed component before giving up and escalating to all processes on this node in this deployment.&lt;br /&gt;
&lt;br /&gt;
====suRestartDuration (Service Unit restart duration)====&lt;br /&gt;
If all processes in this deployment on one node take longer than this time to start up, the deployment is considered failed.&lt;br /&gt;
&lt;br /&gt;
====suRestartCountMax (Maximum service unit failure count)====&lt;br /&gt;
How many times to restart all the processes in this deployment before giving up and moving work to another node.&lt;br /&gt;
&lt;br /&gt;
====isCollocationAllowed (Collocation)====&lt;br /&gt;
Allow multiple instances to run on the same node.  WARNING: doing so may mean that work is assigned active and standby on the same node, which means you will not have physical redundancy!&lt;br /&gt;
&lt;br /&gt;
====alpha (Redundancy degradation ratio)====&lt;br /&gt;
Percent of active nodes vs standby nodes when the preferred configuration can not be met&lt;br /&gt;
&lt;br /&gt;
====autoAdjust (Automatic work adjustment)====&lt;br /&gt;
Automatically move work assignments between blades to match as closely as possible the configured work-&amp;gt;node preferences.&lt;br /&gt;
&lt;br /&gt;
====autoAdjustProbation (Work adjustment interval)====&lt;br /&gt;
How long between checks to see if work adjustments need to be made&lt;br /&gt;
&lt;br /&gt;
====reductionProcedure (Automatic active assignment )====&lt;br /&gt;
As nodes are removed, standby work assignments are automatically removed to make room for active work assignments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===messages===&lt;br /&gt;
The messages section allows you to provide a message to the user during certain actions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====newDeployment====&lt;br /&gt;
The new deployment tag specifies the message to print after a successful deployment of this application.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
   &amp;lt;messages&amp;gt;&lt;br /&gt;
   &amp;lt;newdeployment&amp;gt;This application is deployed onto the selected nodes.&amp;lt;/newdeployment&amp;gt;&lt;br /&gt;
   &amp;lt;/messages&amp;gt;&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===work===&lt;br /&gt;
The work tag is used to specify the work assignments (SAF Service Instance and Component Service Instances) for this application.  Each item of work is defined by a child tag, and the tag name will become the name of the SAF Service Instance.  Attributes become the name/value pairs in each CSI.  This specification is simpler than the full SAF definition and so covers a subset of the full SAF expressibility.  In particular, every component defined in the &amp;quot;ProgramNames&amp;quot; tag will have a CSI created for it, and each CSI will contain every name/value pair.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;work&amp;gt;&lt;br /&gt;
   &amp;lt;firstIp VirtualIpAddress=&amp;quot;192.168.1.250&amp;quot; VirtualNetMask=&amp;quot;255.255.255.0&amp;quot; VirtualDevice=&amp;quot;eth0:10&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/work&amp;gt;&lt;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/swmgmt</id>
		<title>Doc:Sdk 4.1/awdguide/swmgmt</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/swmgmt"/>
				<updated>2009-07-27T15:18:36Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AwdDocHeader}}&lt;br /&gt;
==Software Management==&lt;br /&gt;
&lt;br /&gt;
Software Management consists of the creation and management of software bundles, software version tracking, deployment, removal, and upgrade.  The software management functionality is available as a set of Python APIs delivered as part of the AWD API.  Individual function documentation is available in the AWD API reference guide.&lt;br /&gt;
&lt;br /&gt;
===Software Lifecycle===&lt;br /&gt;
&lt;br /&gt;
This section describes the application software lifecycle from the perspective of the AWD GUI for clarity.  However, understand that AWD APIs exist to access every stage of this process independently of the GUI and of other stages.  Therefore an independently written EMS can selectively modify or override any or all of these stages.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:awdsoftwarelifecycle.png|frame|right|'''Software Lifecycle''']]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Upload:  Application Software is delivered in the form of a &amp;quot;bundle&amp;quot;, which is a tarred, gzipped (.tgz) archive file containing the application.  The application author generates this bundle as part of the application &amp;quot;build&amp;quot; process.  This bundle file is uploaded to the ARD server (controller nodes) and is stored in the AWD's software repository.&lt;br /&gt;
&lt;br /&gt;
2. Deployment:  Once the application software is in the AWD bundle manager, it can be deployed to nodes.  In this step the software is automatically copied to each node and the appropriate SAF AMF Entities are created to model the application&lt;br /&gt;
&lt;br /&gt;
3. New Version:  A new version (bugfix or major change) of the application is delivered as another bundle in the same manner as the original upload.&lt;br /&gt;
&lt;br /&gt;
4. Upgrade:  An upgrade can occur when a newer version of application software exists in the bundle manager then is running on the nodes.  The user initiates an upgrade, and can do so selectively -- that is, for particular deployments (service groups) and not others.  Multiple upgrades can be ongoing at the same time.&lt;br /&gt;
&lt;br /&gt;
5. Removal:  When no deployments are currently using a particular version of application software, that software can be deleted from the bundle manager.&lt;br /&gt;
&lt;br /&gt;
===Software Library Overview===&lt;br /&gt;
&lt;br /&gt;
====AspApp====&lt;br /&gt;
Software can be provided to the AWD in a single bundle file, which is essentially a Linux .tgz (gzipped tar archive) that contains specific files and a well-defined directory layout.  Most importantly, at the top level there exists an XML file called &amp;quot;appcfg.xml&amp;quot;.  This file describes the application contained in the bundle file, and includes details such as its current version and required redundancy model (see [[Doc:sdk_4.1/awdguide/appbundle | Application Bundle Format ]]).  &lt;br /&gt;
&lt;br /&gt;
The &amp;quot;aspApp&amp;quot; module manages bundles in the system. It is notified of a bundle file via and API call that simply takes the name of the file as a parameter (AppDb.NewAppFile()).  The module then opens the file, parses the appcfg.xml file and creates an &amp;quot;AppFile&amp;quot; object that corresponds to this software bundle.  This object contains data members and methods that make it easy for an application to access all information about the bundle.  The module also places this &amp;quot;AppFile&amp;quot; object into a global database of all application bundles, so that it is easy to understand its relationship to other bundles that are also in the system (such as to prior versions of the same application).  It also connects this application bundle to the existing SAFplus Platform state, so you can easily determine whether this application bundle has already been deployed on the system and exactly which Service Groups are running it.&lt;br /&gt;
&lt;br /&gt;
[[File:awdAspApp.png|frame|center|'''OpenClovis SAFplus Platform Web Director Application Management Object Hierarchy''']]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====AppDeploy====&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;appDeploy&amp;quot; module handles software deployment.  It contains a single API called &amp;quot;deploy&amp;quot; that takes some data members from an AppFile object (basically the bundle extraction location and the deployment configuration), a list of nodes to deploy to, and some flags controlling various aspects of the operation.  The function does not take the AppFile directly for two reasons:&lt;br /&gt;
* It is usable on software that is not part of the software bundle management.&lt;br /&gt;
* You may want to modify the software's deployment configuration.&lt;br /&gt;
&lt;br /&gt;
Using this function, you may either copy the software onto all specified nodes, create the required SAF AMF entities in the information model, or do both simultaneously (depending on the flags passed).&lt;br /&gt;
&lt;br /&gt;
You may also select whether you want an exception raised upon error (such as inability to deploy the software to a node), or whether you want to continue, returning all issues at the end of the operation.&lt;br /&gt;
&lt;br /&gt;
All together, this results in an incredibly powerful but simple deployment facility!&lt;br /&gt;
&lt;br /&gt;
====Application Removal====&lt;br /&gt;
&lt;br /&gt;
Applicaton removal is extremely simple.  You simple choose the SAF entities to be deleted, and call the &amp;quot;DeleteEntities&amp;quot; member of the aspAmf module.  The system makes sure that applications are shut down before deletion, etc.  And to make the process even simpler, there is a helper function in the clusterinfo module called &amp;quot;getDependentEntities&amp;quot; that will return a list of all entities that are wholly dependent on the entity passed in.  These two functions can be used in conjunction to create a very powerful application or entity removal system.  For example, to delete a Service Group named &amp;quot;mySg&amp;quot; the following code could be used:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
entities = ci.getDependentEntities(ci.entities[&amp;quot;mySg&amp;quot;])&lt;br /&gt;
amf.DeleteEntities(entities)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[In the code above, &amp;quot;ci&amp;quot; is the global clusterinfo database located at &amp;quot;clusterinfo.ci&amp;quot; and &amp;quot;amf&amp;quot; is an instance of an aspAmf session (aspAmf.Session())].&lt;br /&gt;
&lt;br /&gt;
This will delete the Service Group and all Service Units, Components, Service Instances, and Component Service Instances within that Service Group.  &lt;br /&gt;
&lt;br /&gt;
This idiom works for all SAF entities.  For example, to delete a node named &amp;quot;myNode&amp;quot; the exact same code could be used (other then the entity name):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
entities = ci.getDependentEntities(ci.entities[&amp;quot;myNode&amp;quot;])&lt;br /&gt;
amf.DeleteEntities(entities)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will delete the node and all Service Units and Components running on that node.  If a Service Group is running on several nodes including the deleted node, only the Service Unit and Components on the node will be affected -- the Service Group does not need to be taken out of service, and work (SAF SIs) will automatically be transferred to Service Units that are not being deleted!&lt;br /&gt;
&lt;br /&gt;
====Application Upgrade====&lt;br /&gt;
&lt;br /&gt;
Application Upgrade is implemented in the &amp;quot;upgrade&amp;quot; module.  This module contains an upgrade manager (UpgradeMgr) that is essentially a container for objects that describe the upgrade state of individual Service Groups (UpgradeSg).&lt;br /&gt;
&lt;br /&gt;
To initiate an upgrade one first must provide the software bundle file containing the new version to the bundle manager (aspApp, described above).  Next, one simply adds the service group to the upgrade manager by calling the UpgradeMgr.add() member function with the service group entity (accessed via clusterinfo).  At this point an UpgradeSg object is created but not yest started.  It is now possible to configure the specifics of the upgrade operation by calling UpgradeSg member functions and modifying member variables.  For the upgrade algorithm (single step or rolling) can be selected by modifying the &amp;quot;upMethod&amp;quot; member variable.&lt;br /&gt;
&lt;br /&gt;
Finally, an upgrade can be initiated by calling the UpgradeSg.Upgrade() member function.  This function accepts as a parameter an AppFile (see above for a description of AppFile) object that describes exactly what target software to upgrade to.  The upgrade system takes care of automatically deploying the software to the required nodes, shutting down Service Units, and deleting and recreating SAF AMF entities.&lt;br /&gt;
&lt;br /&gt;
Its THAT simple!&lt;br /&gt;
&lt;br /&gt;
=====Additional Upgrade APIs=====&lt;br /&gt;
&lt;br /&gt;
There are also additional APIs that allow a programmer to have more control over the upgrade process.  The &amp;quot;Upgrade&amp;quot; member function is actually a thin wrapper around a &amp;quot;generator&amp;quot; function (http://docs.python.org/tutorial/classes.html#generators) that &amp;quot;returns&amp;quot; each time a single step in the upgrade is complete.  So you can directly call the generator function if you need to execute some code at each step in the upgrade process.  The AWD GUI uses this feature to implement step-by-step guided upgrade.&lt;br /&gt;
&lt;br /&gt;
The upgrade objects are also derived from a single class called ChangeTracker.  The ChangeTracker class has an API that allows threads to block until a state change has occurred (ChangeTracker.changeWait).  As the upgrade proceeds, waiting threads are unblocked each time the upgrade changes the state of the cluster, allowing application code to be written to observe these state changes.  For example, the AWD GUI uses this technique to report the upgrade state changes to the web browser as they occur, allowing the user to watch the upgrade's progress.&lt;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/swmgmt</id>
		<title>Doc:Sdk 4.1/awdguide/swmgmt</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/swmgmt"/>
				<updated>2009-07-27T15:15:10Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AwdDocHeader}}&lt;br /&gt;
==Software Management==&lt;br /&gt;
&lt;br /&gt;
Software Management consists of the creation and management of software bundles, software version tracking, deployment, removal, and upgrade.  The software management functionality is available as a set of Python APIs delivered as part of the AWD API.  Individual function documentation is available in the AWD API reference guide.&lt;br /&gt;
&lt;br /&gt;
===Software Lifecycle===&lt;br /&gt;
&lt;br /&gt;
This section describes the application software lifecycle from the perspective of the AWD GUI for clarity.  However, understand that AWD APIs exist to access every stage of this process independently of the GUI and of other stages.  Therefore an independently written EMS can selectively modify or override any or all of these stages.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:awdsoftwarelifecycle.png|frame|right|'''Software Lifecycle''']]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Upload:  Application Software is delivered in the form of a &amp;quot;bundle&amp;quot;, which is a tarred, gzipped (.tgz) archive file containing the application.  The application author generates this bundle as part of the application &amp;quot;build&amp;quot; process.  This bundle file is uploaded to the ARD server (controller nodes) and is stored in the AWD's software repository.&lt;br /&gt;
&lt;br /&gt;
2. Deployment:  Once the application software is in the AWD bundle manager, it can be deployed to nodes.  In this step the software is automatically copied to each node and the appropriate SAF AMF Entities are created to model the application&lt;br /&gt;
&lt;br /&gt;
3. New Version:  A new version (bugfix or major change) of the application is delivered as another bundle in the same manner as the original upload.&lt;br /&gt;
&lt;br /&gt;
4. Upgrade:  An upgrade can occur when a newer version of application software exists in the bundle manager then is running on the nodes.  The user initiates an upgrade, and can do so selectively -- that is, for particular deployments (service groups) and not others.  Multiple upgrades can be ongoing at the same time.&lt;br /&gt;
&lt;br /&gt;
5. Removal:  When no deployments are currently using a particular version of application software, that software can be deleted from the bundle manager.&lt;br /&gt;
&lt;br /&gt;
===Software Library Overview===&lt;br /&gt;
&lt;br /&gt;
====AspApp====&lt;br /&gt;
Software can be provided to the AWD in a single bundle file, which is essentially a Linux .tgz (gzipped tar archive) that contains specific files and a well-defined directory layout.  Most importantly, at the top level there exists an XML file called &amp;quot;appcfg.xml&amp;quot;.  This file describes the application contained in the bundle file, and includes details such as its current version and required redundancy model (see [[Doc:sdk_4.0/awdguide/appbundle | Application Bundle Format ]]).  &lt;br /&gt;
&lt;br /&gt;
The &amp;quot;aspApp&amp;quot; module manages bundles in the system. It is notified of a bundle file via and API call that simply takes the name of the file as a parameter (AppDb.NewAppFile()).  The module then opens the file, parses the appcfg.xml file and creates an &amp;quot;AppFile&amp;quot; object that corresponds to this software bundle.  This object contains data members and methods that make it easy for an application to access all information about the bundle.  The module also places this &amp;quot;AppFile&amp;quot; object into a global database of all application bundles, so that it is easy to understand its relationship to other bundles that are also in the system (such as to prior versions of the same application).  It also connects this application bundle to the existing SAFplus Platform state, so you can easily determine whether this application bundle has already been deployed on the system and exactly which Service Groups are running it.&lt;br /&gt;
&lt;br /&gt;
[[File:awdAspApp.png|frame|center|'''OpenClovis SAFplus Platform Web Director Application Management Object Hierarchy''']]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====AppDeploy====&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;appDeploy&amp;quot; module handles software deployment.  It contains a single API called &amp;quot;deploy&amp;quot; that takes some data members from an AppFile object (basically the bundle extraction location and the deployment configuration), a list of nodes to deploy to, and some flags controlling various aspects of the operation.  The function does not take the AppFile directly for two reasons:&lt;br /&gt;
* It is usable on software that is not part of the software bundle management.&lt;br /&gt;
* You may want to modify the software's deployment configuration.&lt;br /&gt;
&lt;br /&gt;
Using this function, you may either copy the software onto all specified nodes, create the required SAF AMF entities in the information model, or do both simultaneously (depending on the flags passed).&lt;br /&gt;
&lt;br /&gt;
You may also select whether you want an exception raised upon error (such as inability to deploy the software to a node), or whether you want to continue, returning all issues at the end of the operation.&lt;br /&gt;
&lt;br /&gt;
All together, this results in an incredibly powerful but simple deployment facility!&lt;br /&gt;
&lt;br /&gt;
====Application Removal====&lt;br /&gt;
&lt;br /&gt;
Applicaton removal is extremely simple.  You simple choose the SAF entities to be deleted, and call the &amp;quot;DeleteEntities&amp;quot; member of the aspAmf module.  The system makes sure that applications are shut down before deletion, etc.  And to make the process even simpler, there is a helper function in the clusterinfo module called &amp;quot;getDependentEntities&amp;quot; that will return a list of all entities that are wholly dependent on the entity passed in.  These two functions can be used in conjunction to create a very powerful application or entity removal system.  For example, to delete a Service Group named &amp;quot;mySg&amp;quot; the following code could be used:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
entities = ci.getDependentEntities(ci.entities[&amp;quot;mySg&amp;quot;])&lt;br /&gt;
amf.DeleteEntities(entities)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[In the code above, &amp;quot;ci&amp;quot; is the global clusterinfo database located at &amp;quot;clusterinfo.ci&amp;quot; and &amp;quot;amf&amp;quot; is an instance of an aspAmf session (aspAmf.Session())].&lt;br /&gt;
&lt;br /&gt;
This will delete the Service Group and all Service Units, Components, Service Instances, and Component Service Instances within that Service Group.  &lt;br /&gt;
&lt;br /&gt;
This idiom works for all SAF entities.  For example, to delete a node named &amp;quot;myNode&amp;quot; the exact same code could be used (other then the entity name):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
entities = ci.getDependentEntities(ci.entities[&amp;quot;myNode&amp;quot;])&lt;br /&gt;
amf.DeleteEntities(entities)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will delete the node and all Service Units and Components running on that node.  If a Service Group is running on several nodes including the deleted node, only the Service Unit and Components on the node will be affected -- the Service Group does not need to be taken out of service, and work (SAF SIs) will automatically be transferred to Service Units that are not being deleted!&lt;br /&gt;
&lt;br /&gt;
====Application Upgrade====&lt;br /&gt;
&lt;br /&gt;
Application Upgrade is implemented in the &amp;quot;upgrade&amp;quot; module.  This module contains an upgrade manager (UpgradeMgr) that is essentially a container for objects that describe the upgrade state of individual Service Groups (UpgradeSg).&lt;br /&gt;
&lt;br /&gt;
To initiate an upgrade one first must provide the software bundle file containing the new version to the bundle manager (aspApp, described above).  Next, one simply adds the service group to the upgrade manager by calling the UpgradeMgr.add() member function with the service group entity (accessed via clusterinfo).  At this point an UpgradeSg object is created but not yest started.  It is now possible to configure the specifics of the upgrade operation by calling UpgradeSg member functions and modifying member variables.  For the upgrade algorithm (single step or rolling) can be selected by modifying the &amp;quot;upMethod&amp;quot; member variable.&lt;br /&gt;
&lt;br /&gt;
Finally, an upgrade can be initiated by calling the UpgradeSg.Upgrade() member function.  This function accepts as a parameter an AppFile (see above for a description of AppFile) object that describes exactly what target software to upgrade to.  The upgrade system takes care of automatically deploying the software to the required nodes, shutting down Service Units, and deleting and recreating SAF AMF entities.&lt;br /&gt;
&lt;br /&gt;
Its THAT simple!&lt;br /&gt;
&lt;br /&gt;
=====Additional Upgrade APIs=====&lt;br /&gt;
&lt;br /&gt;
There are also additional APIs that allow a programmer to have more control over the upgrade process.  The &amp;quot;Upgrade&amp;quot; member function is actually a thin wrapper around a &amp;quot;generator&amp;quot; function (http://docs.python.org/tutorial/classes.html#generators) that &amp;quot;returns&amp;quot; each time a single step in the upgrade is complete.  So you can directly call the generator function if you need to execute some code at each step in the upgrade process.  The AWD GUI uses this feature to implement step-by-step guided upgrade.&lt;br /&gt;
&lt;br /&gt;
The upgrade objects are also derived from a single class called ChangeTracker.  The ChangeTracker class has an API that allows threads to block until a state change has occurred (ChangeTracker.changeWait).  As the upgrade proceeds, waiting threads are unblocked each time the upgrade changes the state of the cluster, allowing application code to be written to observe these state changes.  For example, the AWD GUI uses this technique to report the upgrade state changes to the web browser as they occur, allowing the user to watch the upgrade's progress.&lt;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/deppkg</id>
		<title>Doc:Sdk 4.1/awdguide/deppkg</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/deppkg"/>
				<updated>2009-07-27T15:11:58Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AwdDocHeader}}&lt;br /&gt;
==Deployment and Packaging==&lt;br /&gt;
The SAFplus Platform Web Director GUI is provided in the form of a gzipped tar file (.tgz).  You should open this file (tar xvfz {filename}) in the SAFplus Platform user's (generally &amp;quot;root&amp;quot;) home directory or the SAFplus Platform base directory.  It will create a directory called aspwebdirector-{version}-{OS}-{arch}.  The rest of this document will refer to this directory using the symbol {AWDBASE}.&lt;br /&gt;
&lt;br /&gt;
===Integration within your IDE model===&lt;br /&gt;
The SAFplus Platform Web Director GUI can be integrated within your IDE-based model by creating a 1+1 Service group with 1 component on 1 or 2 SAFplus Platform nodes.  The component executable should reference a script that simply executes the AWD binary ({AWDBASE}/bin/aspwebdirector).  Before running your model, you must run the {AWDBASE}/install script to ensure that all of the AWD requirements are installed.&lt;br /&gt;
&lt;br /&gt;
===Dynamic Installation===&lt;br /&gt;
Additionally, the SAFplus Platform Web Director GUI can be dynamically installed into a running SAFplus Platform chassis.  To do so, detar the package and run the ./install and then the ./start scripts.  These scripts do not need to be run again (even after an cluster reboot) unless you remove the SAFplus Platform configuration (located in the &amp;quot;var&amp;quot; directory of your SAFplus Platform installation).  If the SAFplus Platform configuration is deleted, you will need to run the &amp;quot;./start&amp;quot; script again to insert the AWD service group into the SAFplus Platform Application Management Framework (AMF).&lt;br /&gt;
&lt;br /&gt;
===Library Integration===&lt;br /&gt;
The SAFplus Platform Web Director Libraries can be deployed within your management application by running your management application (or agent) on an SAFplus Platform node and running a Python interpreter within it.  Embedding a Python interpreter in this manner is very simple.  You may use the AWD GUI as an example of how to do so, or you may read the &amp;quot;Extending and Embedding Python&amp;quot; chapter of the python documentation located at http://www.python.org.&lt;br /&gt;
&lt;br /&gt;
===Standalone Python===&lt;br /&gt;
Additionally, you may run the SAFplus Platform Web Director Libraries stand-alone in its own Python shell.  To do so, first start SAFplus Platform and then add the AWD &amp;quot;bin&amp;quot; directory to your &amp;quot;PYTHONPATH&amp;quot; environment variable (see Python documentation for more details) so you can &amp;quot;import&amp;quot; the AWD libraries.  Next, from the SAFplus Platform base directory run &amp;quot;bin/asp_run python&amp;quot;.  You should see the python prompt.  Next run:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import asppy&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; asppy.initializeAmf()&lt;br /&gt;
&lt;br /&gt;
At this point, you should be able to access the API.  For example:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import clusterinfo&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; print [x.name for x in clusterinfo.ci.nodes]&lt;br /&gt;
&lt;br /&gt;
Additionally, if you choose to not run the GUI, you do not need most of the applications that are installed as part of the {AWDBASE}/install script (although it does not hurt to install them).  All that is needed is &amp;quot;pexpect&amp;quot; which is used for deployment (to automate the &amp;quot;scp&amp;quot; command).  You may see how to install this by hand by looking at the {AWDBASE}/3rdparty/Makefile file.  If you are not using the GUI or the deployment features, you do not need to install any prerequisites.&lt;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/overview</id>
		<title>Doc:Sdk 4.1/awdguide/overview</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/overview"/>
				<updated>2009-07-27T15:08:31Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{AwdDocHeader}}&lt;br /&gt;
==Overview==&lt;br /&gt;
&lt;br /&gt;
The following diagram show the major functional blocks provided by the SAFplus Platform Web Director.&lt;br /&gt;
&lt;br /&gt;
[[File:awdHLD.png|frame|center|'''SAFplus Platform Web Director High Level Architecture Diagram''']]&lt;br /&gt;
&lt;br /&gt;
The complete AWD package includes everything above the red curve that denotes the Python/C boundary.  Above the red curve, blue boxes denote software created by OpenClovis while brown boxes show the free open source software that the AWD utilizes.  &lt;br /&gt;
&lt;br /&gt;
For explanatory purposes, the fundamental components of your cluster are shown below the red curve.  These include the OpenClovis SAFplus Platform (required), HPI (optional and it is bundled with SAFplus Platform), a SQL database, and Linux (or other OS supported by SAFplus Platform).&lt;br /&gt;
&lt;br /&gt;
===Architecture Block Descriptions===&lt;br /&gt;
&lt;br /&gt;
====SAFplus Platform Web Director====&lt;br /&gt;
&lt;br /&gt;
The SAFplus Platform Web Director itself is a thin layer that simply implements the GUI look and feel and calls the underlying APIs.  It uses the TurboGears web application framework and templating system to serve particular web pages.  To facilitate rebranding, customization, and extensibility, this layer is carefully constructed to contain only the web logic, and not any SAFplus Platform functionality.&lt;br /&gt;
&lt;br /&gt;
All subsequent sections describe the APIs available to any application.  These APIs are described in detail in the SAFplus Platform Web Director API document.&lt;br /&gt;
&lt;br /&gt;
====Software Management====&lt;br /&gt;
&lt;br /&gt;
The software management layer consists of APIs that handle software deployment onto any node, software bundle and version management, and in-service software upgrade (ISSU).  This layer uses the Object Access Layer to access the SAFplus Platform middleware and Linux services to deploy software.&lt;br /&gt;
&lt;br /&gt;
====Object Access Layer====&lt;br /&gt;
&lt;br /&gt;
This set of APIs presents the cluster Information Model as a set of objects and methods, instead of presenting it functionally as occurs in the lower layers.&lt;br /&gt;
&lt;br /&gt;
=====ClusterInfo=====&lt;br /&gt;
&lt;br /&gt;
The ClusterInfo library presents the AMF Information Model (both configuration and current state) as a set of objects.  Since the Information Model naturally consists of objects (Service Groups, Service Units, and Components for example) this abstraction greatly simplifies the effort required to access the data.&lt;br /&gt;
&lt;br /&gt;
Also included are routines that create internally consistent groups of Information Model entities.  For example, a single function call will return a complete SAF Service Group hierarchy (Service Group, Service Unit, Components, Service Instances, and Component Service Instances) for a new application that is both internally consistent and consistent with the existing Information Model.  This set of objects is not yet installed into the system, allowing you to tweak and modify their configuration before &amp;quot;committing&amp;quot; the group.&lt;br /&gt;
&lt;br /&gt;
=====AspAmf=====&lt;br /&gt;
&lt;br /&gt;
The AspAmf library contains all functions that modify the AMF Information Model.  These functions are tightly integrated with the ClusterInfo entities and encapsulate a tremendous amount of functionality as compared to the underlying functional interface.  For example, modifying the Information Model to implement common operations such as adding or removing a Service Group can require hundreds of function calls at the AMF layer. However this can be done in a single AspAmf API call called &amp;quot;InstallApp&amp;quot;.  This single call takes as a parameter a list of AMF entities, and (from the user's perspective) it simply adds them into the AMF Information Model.  But actually doing so is not so simple!  The function ensures that the entities are created if they do not exist, or modified to match a new configuration if they already exist.  It also ensures that the entities are created in the proper order and that they correctly reference each other and existing objects within the Information Model.  The end result is a very simple API to accomplish a complex task.&lt;br /&gt;
&lt;br /&gt;
The AspAmf library also contains APIs to query entity state and start and stop them.&lt;br /&gt;
&lt;br /&gt;
=====AmfPy=====&lt;br /&gt;
&lt;br /&gt;
The amfpy library allows a Python program to register itself as an AMF component and therefore receive AMF component control callbacks (start, stop, CSI assignment, etc).  Both extending and embedding is supported -- that is Python can either be embedded as a small interpreter into an SAFplus-aware C program, or it can be run standalone and the amfpy functionality can be &amp;quot;import&amp;quot;ed.  Python programs can either be spawned automatically by the AMF's component manager, or can be run from the command line (using the asp_run tool provided by the SAFplus Platform) and register with the AMF dynamically.&lt;br /&gt;
&lt;br /&gt;
=====SWIG Interfaces=====&lt;br /&gt;
&lt;br /&gt;
Most OpenClovis SAFplus Platform functions are directly available at the Python interpreter using an automatically generated Python-to-C translation layer.  However, it is often inconvenient to use these functions since they correspond one-to-one with equivalent C functions.  Additionally if the function uses complex pointer or object relationships (such as forced casting of pointers) it is sometimes very difficult or even impossible to express the parameters in a type-safe language like Python.  Therefore it is recommended that this layer only be used if the functionality does not exist in the higher layers.&lt;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/preface</id>
		<title>Doc:Sdk 4.1/awdguide/preface</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/awdguide/preface"/>
				<updated>2009-07-27T15:04:06Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=='''Preface'''==&lt;br /&gt;
&lt;br /&gt;
''OpenClovis SAFplus Platform Web Director (AWD) User Guide'' provides information about the usage of OpenClovis Web Director, a web-based cluster and chassis management system from OpenClovis Inc. that complements the OpenClovis SAFplus Platform (Application Service Platform). This guide helps you to utilise the OpenClovis Web Director in your own environment.&lt;br /&gt;
&lt;br /&gt;
OpenClovis SAFplus Platform Web Director is designed to simplify and accelerate the development of Telecom application software over OpenClovis platform. It provides a simple and powerful mechanism to examine and modify an online SAFplus Platform cluster, to share critical chassis resources, install and manage new applications, and dynamically modify the SAFplus Platform Information Model.  &lt;br /&gt;
&lt;br /&gt;
The OpenClovis SAFplus Platform Web Director is also a &amp;quot;living&amp;quot; case study for customers to use when creating a web-based EMS (element management system) or network management glue layer.  It can be easily rebranded to provide essentially an off-the-shelf EMS for SAFplus Platform deployments, customized to provide enhanced EMS functionality, or used as a reference when integrating OpenClovis SAFplus Platform into an existing EMS framework.&lt;br /&gt;
&lt;br /&gt;
===Audience===&lt;br /&gt;
&lt;br /&gt;
OpenClovis SAFplus Platform Web Director (AWD) User Guide is designed for system integrators, designers, and system architects. 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 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;
&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>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/taeguide/testcases</id>
		<title>Doc:latest/taeguide/testcases</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/taeguide/testcases"/>
				<updated>2009-07-01T12:14:48Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains the list of all test cases which are being run and reported to the report server. It also shows total number of a test case run reported to the report server and success/failure rate per test case.&lt;br /&gt;
[[File:TAE_testcases.png|frame|center|'''OpenClovis TAE report server Testcases Page''']]&lt;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/taeguide/fixtures</id>
		<title>Doc:latest/taeguide/fixtures</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/taeguide/fixtures"/>
				<updated>2009-07-01T12:13:56Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:TAE_fixtures.png|frame|center|'''OpenClovis TAE report server Fixtures Page''']]&lt;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/taeguide/models</id>
		<title>Doc:latest/taeguide/models</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/taeguide/models"/>
				<updated>2009-07-01T12:11:51Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:TAE_models.png|frame|center|'''OpenClovis TAE report server Models Page''']]&lt;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/taeguide/logfiles</id>
		<title>Doc:latest/taeguide/logfiles</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/taeguide/logfiles"/>
				<updated>2009-07-01T12:10:37Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*TAE log files and Node postmortem files&lt;br /&gt;
&lt;br /&gt;
[[File:TAE_log_files.png|frame|center|'''OpenClovis TAE Report server Test log files Page''']]&lt;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/taeguide/testreport</id>
		<title>Doc:latest/taeguide/testreport</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/taeguide/testreport"/>
				<updated>2009-07-01T12:07:38Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page displays the detailed report of test cases run for a particular model. You can reach this page by clicking Go to Report link on project report page.&lt;br /&gt;
&lt;br /&gt;
[[File:Test_report.png|frame|center|'''OpenClovis TAE report server Test Report Page''']]&lt;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/taeguide/reports</id>
		<title>Doc:latest/taeguide/reports</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/taeguide/reports"/>
				<updated>2009-07-01T12:05:59Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains the test report of all models with SAFplus Platform revision on which it was run. On this page we have filter based on different parameters like model name, SAFplus Platform revision, model revision, start date and end date. You can use this filter to check the desired report.&lt;br /&gt;
&lt;br /&gt;
[[File:List reports.png|frame|center|'''OpenClovis TAE Report server Reports Page''']]&lt;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:latest/taeguide/projectSummary</id>
		<title>Doc:latest/taeguide/projectSummary</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:latest/taeguide/projectSummary"/>
				<updated>2009-07-01T12:03:24Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*This page displays the report of TAE test runs for a particular project. It contains the test run report of all models which are run using TAE. This page a two kind of summary:&lt;br /&gt;
** '''Bar Chart:''' It gives the number of reports generated in last 20 days.&lt;br /&gt;
** '''Pie Chart:''' It shows two types of test reports for models based on date and revision. It also shows the percentage of test cases which are passed e.g. 79% means 79 % of total test cases are passing, rest are failing or erroring out. If you place the cursor on pie chart It will pop up information of no. of test cases, no. of passes etc. If you click on pie chart it will guide you to full report of the test cases run in that model.&lt;br /&gt;
&lt;br /&gt;
[[File:Project_summary4.0.png|frame|center|'''OpenClovis TAE report server Project Summary''']]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Project_summary4.0_2.png|frame|center|'''OpenClovis TAE report server Project Summary''']]&lt;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/taeguide/projects</id>
		<title>Doc:Sdk 4.1/taeguide/projects</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/taeguide/projects"/>
				<updated>2009-07-01T12:00:38Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page displays the list of all SAFplus Platform projects for which TAE tests are run. You can click on project name to get the TAE test report. &lt;br /&gt;
&lt;br /&gt;
[[File:TaereportMain.png|frame|center|'''OpenClovis TAE Report server Projects Page''']]&lt;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/taeguide/screens</id>
		<title>Doc:Sdk 4.1/taeguide/screens</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/taeguide/screens"/>
				<updated>2009-07-01T11:58:48Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &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>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/taeguide/reportserver</id>
		<title>Doc:Sdk 4.1/taeguide/reportserver</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/taeguide/reportserver"/>
				<updated>2009-07-01T11:57:59Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &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>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/taeguide/reportserver</id>
		<title>Doc:Sdk 4.1/taeguide/reportserver</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/taeguide/reportserver"/>
				<updated>2009-07-01T11:56:49Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &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.0/taeguide/screens | Screens ]]&lt;br /&gt;
** [[Doc:sdk_4.0/taeguide/projects | Projects ]]&lt;br /&gt;
** [[Doc:sdk_4.0/taeguide/projectSummary | Project Summary ]]&lt;br /&gt;
** [[Doc:sdk_4.0/taeguide/reports | Test Reports ]]&lt;br /&gt;
** [[Doc:sdk_4.0/taeguide/testreport | Test Report in Detail ]]&lt;br /&gt;
** [[Doc:sdk_4.0/taeguide/logfiles | TAE log files and Node postmortem files ]]&lt;br /&gt;
** [[Doc:sdk_4.0/taeguide/models | Models ]]&lt;br /&gt;
** [[Doc:sdk_4.0/taeguide/fixtures | TAE Fixtures ]]&lt;br /&gt;
** [[Doc:sdk_4.0/taeguide/testcases | Testcases ]]&lt;/div&gt;</summary>
		<author><name>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/taeguide/runtae</id>
		<title>Doc:Sdk 4.1/taeguide/runtae</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/taeguide/runtae"/>
				<updated>2009-07-01T11:27:20Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &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>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/taeguide/testintg</id>
		<title>Doc:Sdk 4.1/taeguide/testintg</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/taeguide/testintg"/>
				<updated>2009-07-01T11:19:44Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &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>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/taeguide/testimpl</id>
		<title>Doc:Sdk 4.1/taeguide/testimpl</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/taeguide/testimpl"/>
				<updated>2009-06-26T12:09:30Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &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>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/taeguide/deppkg</id>
		<title>Doc:Sdk 4.1/taeguide/deppkg</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/taeguide/deppkg"/>
				<updated>2009-06-26T12:08:30Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &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>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/taeguide/overview</id>
		<title>Doc:Sdk 4.1/taeguide/overview</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/taeguide/overview"/>
				<updated>2009-06-26T12:06:42Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &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>Suraj</name></author>	</entry>

	<entry>
		<id>https://help.openclovis.com/index.php/Doc:Sdk_4.1/taeguide/preface</id>
		<title>Doc:Sdk 4.1/taeguide/preface</title>
		<link rel="alternate" type="text/html" href="https://help.openclovis.com/index.php/Doc:Sdk_4.1/taeguide/preface"/>
				<updated>2009-06-26T12:04:59Z</updated>
		
		<summary type="html">&lt;p&gt;Suraj: &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>Suraj</name></author>	</entry>

	</feed>