<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.meego.com/skins/common/feed.css?270"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://wiki.meego.com/index.php?title=Special:Contributions/Tvainio&amp;feed=atom&amp;limit=50&amp;target=Tvainio&amp;year=&amp;month=</id>
		<title>MeeGo wiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.meego.com/index.php?title=Special:Contributions/Tvainio&amp;feed=atom&amp;limit=50&amp;target=Tvainio&amp;year=&amp;month="/>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Special:Contributions/Tvainio"/>
		<updated>2013-06-20T10:58:51Z</updated>
		<subtitle>From MeeGo wiki</subtitle>
		<generator>MediaWiki 1.16.2</generator>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS</id>
		<title>Quality/QA-tools/OTS</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS"/>
				<updated>2011-02-14T08:35:33Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OTS Index =&lt;br /&gt;
&lt;br /&gt;
Welcome to the Open Test System (OTS) Wiki Index.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
OTS is the '''Open Test Service''' for testing software systems on evolving hardware architectures.&lt;br /&gt;
  &lt;br /&gt;
It was born out of the test framework incrementally developed for use on [http://maemo.org/ Maemo] project and is in use for 24/7 testing service by [http://www.nokia.com/ Nokia].&lt;br /&gt;
&lt;br /&gt;
More detailed info can be found from [[Quality/QA-tools/OTS/About|about]] page.&lt;br /&gt;
&lt;br /&gt;
== Releases ==&lt;br /&gt;
&lt;br /&gt;
Current release [http://meego.gitorious.org/meego-quality-assurance/ots tag 0.8.1]. See [[Quality/QA-tools/OTS/UserDocumentation/Upgrading|upgrading]] instructions!&lt;br /&gt;
&lt;br /&gt;
Next release [https://bugs.meego.com/show_bug.cgi?id=13258 0.8.2]&lt;br /&gt;
&lt;br /&gt;
See OTS [[Quality/QA-tools/OTS/Roadmap| roadmap.]]&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/UserDocumentation | User Documentation]]&lt;br /&gt;
** [[Quality/QA-tools/OTS/UserDocumentation/Installation | Installation Ubuntu]]&lt;br /&gt;
** [[Quality/QA-tools/OTS/UserDocumentation/Installation_rpm | Installation RPM]]&lt;br /&gt;
** [[Quality/QA-tools/OTS/UserDocumentation/Upgrading | Upgrading]]&lt;br /&gt;
* [[Quality/QA-tools/OTS/DeveloperDocs | Developer Documentation]]&lt;br /&gt;
* [[Quality/QA-tools/OTS/AdminDocs | System Administration]]&lt;br /&gt;
* [[Quality/QA-tools/OTS/Glossary | Glossary]]&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/Experimental</id>
		<title>Quality/QA-tools/OTS/DeveloperDocs/Experimental</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/Experimental"/>
				<updated>2011-02-07T13:37:58Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* How to monitor ots? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Experimental Area ==&lt;br /&gt;
&lt;br /&gt;
Documentation for experimental branches, spikes, WIPs etc. You can also add documentation related to your merge requests or patches here.&lt;br /&gt;
&lt;br /&gt;
The docs should be moved to proper place in OTS wiki after the feature gets integrated to master branch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''This area is relevant for OTS developers only! Information under this area does not apply to master or released OTS versions.'''&lt;br /&gt;
&lt;br /&gt;
=== 0.1 ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[Quality/QA-tools/OTS/DeveloperDocs/Experimental/Django|Advanced OTS server using django]] (Relates to branch dev_branch_0.1_django_server) &amp;lt;/s&amp;gt;&lt;br /&gt;
**Released in 0.1.1 version. Documentation moved to [[Quality/QA-tools/OTS/UserDocumentation/Installation#Django_Based_Server]]&lt;br /&gt;
&lt;br /&gt;
=== 0.8.2 ===&lt;br /&gt;
&lt;br /&gt;
=== How to monitor ots? ===&lt;br /&gt;
&lt;br /&gt;
We have monitor DTO:s. Probably some kind of hierarchy of dto monitor objects.&lt;br /&gt;
&lt;br /&gt;
* Testrun Events for all testrun states (flashing, bootup, testing, test result processing...):&lt;br /&gt;
** Test pkg execution event (start/stop) (minimum requirement for [FEA] 9036)&lt;br /&gt;
** Flashing Event (start/stop) (n:th try)&lt;br /&gt;
** Bootup event  (n:th try)&lt;br /&gt;
** Testsuite/set/case/step event? (What level of detail we want to monitor?) Remember that logging still exists...&lt;br /&gt;
** Testrun overall result&lt;br /&gt;
&lt;br /&gt;
* Worker events:&lt;br /&gt;
** Worker state (Start/stop/busy(testrun id)/free) (information about queues)&lt;br /&gt;
** Heartbeat?&lt;br /&gt;
&lt;br /&gt;
* Failure event dto? (Flashing failed, device failure...)?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
What about statistics monitoring? What do we need?&lt;br /&gt;
&lt;br /&gt;
* Number of testruns?&lt;br /&gt;
* Number of workers?&lt;br /&gt;
* Active testruns?&lt;br /&gt;
* PASS/FAIL/ERROR ratios?&lt;br /&gt;
* Error statistics?&lt;br /&gt;
** Most common errors&lt;br /&gt;
** Some kind of grouping of errors and statistics for them (user fault vs catastrophic ots failure vs device/image error vs...)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
&lt;br /&gt;
* One host can have multiple worker instances running. Dto:s need to have information about the instance, not just hostname.&lt;br /&gt;
* &lt;br /&gt;
&lt;br /&gt;
==== Who receives monitor dto:s? ====&lt;br /&gt;
&lt;br /&gt;
Current implementation uses the same testrun response queue and process for monitor dto:s. This is simple to implement for testrun related events but very limited for generic monitoring of the whole system. For example most of the worker events cannot be sent to testrun queue because they are not related to a specific testrun and we don't know if there even is any testrun response queues around.&lt;br /&gt;
&lt;br /&gt;
Having a separate permanent queue and a separate listener process for monitoring would allow monitoring also outside a testrun.&lt;br /&gt;
&lt;br /&gt;
Pros:&lt;br /&gt;
&lt;br /&gt;
* Can be deployed as a completely separate component&lt;br /&gt;
** even into a different machine&lt;br /&gt;
** Maintenance, update etc. does not affect test execution in any way&lt;br /&gt;
&lt;br /&gt;
Cons:&lt;br /&gt;
&lt;br /&gt;
* One more process/daemon to maintain&lt;br /&gt;
** More complicated install&lt;br /&gt;
* Might cause errors.&lt;br /&gt;
** Not running =&amp;gt; Lots of messages pile up in the queue&lt;br /&gt;
* Dependencies&lt;br /&gt;
** What if for example the distribution model relies on monitor component to provide up to date data?&lt;br /&gt;
* How to provide testrun specific monitor info to Publishers?&lt;br /&gt;
&lt;br /&gt;
==== TODO ====&lt;br /&gt;
&lt;br /&gt;
* Current server side implementation does not send monitor dtos to Publishers in real time. They are sent only after the testrun is done.&lt;br /&gt;
&lt;br /&gt;
=== Bug 9036 - [FEA] Test package distribution based on history (last execution time of a package) ===&lt;br /&gt;
&lt;br /&gt;
Proposal:&lt;br /&gt;
&lt;br /&gt;
* Data provided by monitor dto:s&lt;br /&gt;
* Data stored to a DB&lt;br /&gt;
** A separate DB for this plugin only or dependency to a more common monitor DB?&lt;br /&gt;
* A custom distribution model that reads data from DB and creates tasks based on that&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
&lt;br /&gt;
* We cannot limit to testpackage level. Implementation for set level distribution is already ongoing.&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/Experimental</id>
		<title>Quality/QA-tools/OTS/DeveloperDocs/Experimental</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/Experimental"/>
				<updated>2011-02-07T13:32:54Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* How to monitor ots? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Experimental Area ==&lt;br /&gt;
&lt;br /&gt;
Documentation for experimental branches, spikes, WIPs etc. You can also add documentation related to your merge requests or patches here.&lt;br /&gt;
&lt;br /&gt;
The docs should be moved to proper place in OTS wiki after the feature gets integrated to master branch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''This area is relevant for OTS developers only! Information under this area does not apply to master or released OTS versions.'''&lt;br /&gt;
&lt;br /&gt;
=== 0.1 ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[Quality/QA-tools/OTS/DeveloperDocs/Experimental/Django|Advanced OTS server using django]] (Relates to branch dev_branch_0.1_django_server) &amp;lt;/s&amp;gt;&lt;br /&gt;
**Released in 0.1.1 version. Documentation moved to [[Quality/QA-tools/OTS/UserDocumentation/Installation#Django_Based_Server]]&lt;br /&gt;
&lt;br /&gt;
=== 0.8.2 ===&lt;br /&gt;
&lt;br /&gt;
=== How to monitor ots? ===&lt;br /&gt;
&lt;br /&gt;
We have monitor DTO:s. Probably some kind of hierarchy of dto monitor objects.&lt;br /&gt;
&lt;br /&gt;
* Testrun Events for all testrun states (flashing, bootup, testing, test result processing...):&lt;br /&gt;
** Test pkg execution event (start/stop) (minimum requirement for [FEA] 9036)&lt;br /&gt;
** Flashing Event (start/stop) (n:th try)&lt;br /&gt;
** Bootup event  (n:th try)&lt;br /&gt;
** Testsuite/set/case/step event? (What level of detail we want to monitor?) Remember that logging still exists...&lt;br /&gt;
** Testrun overall result&lt;br /&gt;
&lt;br /&gt;
* Worker events:&lt;br /&gt;
** Worker state (Start/stop/busy(testrun id)/free) (What about queue info?)&lt;br /&gt;
** Heartbeat?&lt;br /&gt;
&lt;br /&gt;
* Failure event dto? (Flashing failed, device failure...)?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
What about statistics monitoring? What do we need?&lt;br /&gt;
&lt;br /&gt;
* Number of testruns?&lt;br /&gt;
* Number of workers?&lt;br /&gt;
* Active testruns?&lt;br /&gt;
* PASS/FAIL/ERROR ratios?&lt;br /&gt;
* Error statistics?&lt;br /&gt;
** Most common errors&lt;br /&gt;
** Some kind of grouping of errors and statistics for them (user fault vs catastrophic ots failure vs device/image error vs...)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
&lt;br /&gt;
* One host can have multiple worker instances running. Dto:s need to have information about the instance, not just hostname.&lt;br /&gt;
* &lt;br /&gt;
&lt;br /&gt;
==== Who receives monitor dto:s? ====&lt;br /&gt;
&lt;br /&gt;
Current implementation uses the same testrun response queue and process for monitor dto:s. This is simple to implement for testrun related events but very limited for generic monitoring of the whole system. For example most of the worker events cannot be sent to testrun queue because they are not related to a specific testrun and we don't know if there even is any testrun response queues around.&lt;br /&gt;
&lt;br /&gt;
Having a separate permanent queue and a separate listener process for monitoring would allow monitoring also outside a testrun.&lt;br /&gt;
&lt;br /&gt;
Pros:&lt;br /&gt;
&lt;br /&gt;
* Can be deployed as a completely separate component&lt;br /&gt;
** even into a different machine&lt;br /&gt;
** Maintenance, update etc. does not affect test execution in any way&lt;br /&gt;
&lt;br /&gt;
Cons:&lt;br /&gt;
&lt;br /&gt;
* One more process/daemon to maintain&lt;br /&gt;
** More complicated install&lt;br /&gt;
* Might cause errors.&lt;br /&gt;
** Not running =&amp;gt; Lots of messages pile up in the queue&lt;br /&gt;
* Dependencies&lt;br /&gt;
** What if for example the distribution model relies on monitor component to provide up to date data?&lt;br /&gt;
* How to provide testrun specific monitor info to Publishers?&lt;br /&gt;
&lt;br /&gt;
==== TODO ====&lt;br /&gt;
&lt;br /&gt;
* Current server side implementation does not send monitor dtos to Publishers in real time. They are sent only after the testrun is done.&lt;br /&gt;
&lt;br /&gt;
=== Bug 9036 - [FEA] Test package distribution based on history (last execution time of a package) ===&lt;br /&gt;
&lt;br /&gt;
Proposal:&lt;br /&gt;
&lt;br /&gt;
* Data provided by monitor dto:s&lt;br /&gt;
* Data stored to a DB&lt;br /&gt;
** A separate DB for this plugin only or dependency to a more common monitor DB?&lt;br /&gt;
* A custom distribution model that reads data from DB and creates tasks based on that&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
&lt;br /&gt;
* We cannot limit to testpackage level. Implementation for set level distribution is already ongoing.&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/Experimental</id>
		<title>Quality/QA-tools/OTS/DeveloperDocs/Experimental</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/Experimental"/>
				<updated>2011-02-07T13:30:30Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* How to monitor ots? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Experimental Area ==&lt;br /&gt;
&lt;br /&gt;
Documentation for experimental branches, spikes, WIPs etc. You can also add documentation related to your merge requests or patches here.&lt;br /&gt;
&lt;br /&gt;
The docs should be moved to proper place in OTS wiki after the feature gets integrated to master branch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''This area is relevant for OTS developers only! Information under this area does not apply to master or released OTS versions.'''&lt;br /&gt;
&lt;br /&gt;
=== 0.1 ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[Quality/QA-tools/OTS/DeveloperDocs/Experimental/Django|Advanced OTS server using django]] (Relates to branch dev_branch_0.1_django_server) &amp;lt;/s&amp;gt;&lt;br /&gt;
**Released in 0.1.1 version. Documentation moved to [[Quality/QA-tools/OTS/UserDocumentation/Installation#Django_Based_Server]]&lt;br /&gt;
&lt;br /&gt;
=== 0.8.2 ===&lt;br /&gt;
&lt;br /&gt;
=== How to monitor ots? ===&lt;br /&gt;
&lt;br /&gt;
We have monitor DTO:s. Probably some kind of hierarchy of dto monitor objects.&lt;br /&gt;
&lt;br /&gt;
* Testrun Events:&lt;br /&gt;
** Test pkg execution event (start/stop) (minimum requirement for [FEA] 9036)&lt;br /&gt;
** Flashing Event (start/stop) (n:th try)&lt;br /&gt;
** Bootup event  (n:th try)&lt;br /&gt;
** Testsuite/set/case/step event? (What level of detail we want to monitor?) Remember that logging still exists...&lt;br /&gt;
** Testrun overall result&lt;br /&gt;
&lt;br /&gt;
* Worker events:&lt;br /&gt;
** Worker state (Start/stop/busy(testrun id)/free) (What about queue info?)&lt;br /&gt;
** Heartbeat?&lt;br /&gt;
&lt;br /&gt;
* Failure event dto? (Flashing failed, device failure...)?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
What about statistics monitoring? What do we need?&lt;br /&gt;
&lt;br /&gt;
* Number of testruns?&lt;br /&gt;
* Number of workers?&lt;br /&gt;
* Active testruns?&lt;br /&gt;
* PASS/FAIL/ERROR ratios?&lt;br /&gt;
* Error statistics?&lt;br /&gt;
** Most common errors&lt;br /&gt;
** Some kind of grouping of errors and statistics for them (user fault vs catastrophic ots failure vs device/image error vs...)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
&lt;br /&gt;
* One host can have multiple worker instances running. Dto:s need to have information about the instance, not just hostname.&lt;br /&gt;
* &lt;br /&gt;
&lt;br /&gt;
==== Who receives monitor dto:s? ====&lt;br /&gt;
&lt;br /&gt;
Current implementation uses the same testrun response queue and process for monitor dto:s. This is simple to implement for testrun related events but very limited for generic monitoring of the whole system. For example most of the worker events cannot be sent to testrun queue because they are not related to a specific testrun and we don't know if there even is any testrun response queues around.&lt;br /&gt;
&lt;br /&gt;
Having a separate permanent queue and a separate listener process for monitoring would allow monitoring also outside a testrun.&lt;br /&gt;
&lt;br /&gt;
Pros:&lt;br /&gt;
&lt;br /&gt;
* Can be deployed as a completely separate component&lt;br /&gt;
** even into a different machine&lt;br /&gt;
** Maintenance, update etc. does not affect test execution in any way&lt;br /&gt;
&lt;br /&gt;
Cons:&lt;br /&gt;
&lt;br /&gt;
* One more process/daemon to maintain&lt;br /&gt;
** More complicated install&lt;br /&gt;
* Might cause errors.&lt;br /&gt;
** Not running =&amp;gt; Lots of messages pile up in the queue&lt;br /&gt;
* Dependencies&lt;br /&gt;
** What if for example the distribution model relies on monitor component to provide up to date data?&lt;br /&gt;
* How to provide testrun specific monitor info to Publishers?&lt;br /&gt;
&lt;br /&gt;
==== TODO ====&lt;br /&gt;
&lt;br /&gt;
* Current server side implementation does not send monitor dtos to Publishers in real time. They are sent only after the testrun is done.&lt;br /&gt;
&lt;br /&gt;
=== Bug 9036 - [FEA] Test package distribution based on history (last execution time of a package) ===&lt;br /&gt;
&lt;br /&gt;
Proposal:&lt;br /&gt;
&lt;br /&gt;
* Data provided by monitor dto:s&lt;br /&gt;
* Data stored to a DB&lt;br /&gt;
** A separate DB for this plugin only or dependency to a more common monitor DB?&lt;br /&gt;
* A custom distribution model that reads data from DB and creates tasks based on that&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
&lt;br /&gt;
* We cannot limit to testpackage level. Implementation for set level distribution is already ongoing.&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/Experimental</id>
		<title>Quality/QA-tools/OTS/DeveloperDocs/Experimental</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/Experimental"/>
				<updated>2011-02-07T13:18:26Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* How to monitor ots? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Experimental Area ==&lt;br /&gt;
&lt;br /&gt;
Documentation for experimental branches, spikes, WIPs etc. You can also add documentation related to your merge requests or patches here.&lt;br /&gt;
&lt;br /&gt;
The docs should be moved to proper place in OTS wiki after the feature gets integrated to master branch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''This area is relevant for OTS developers only! Information under this area does not apply to master or released OTS versions.'''&lt;br /&gt;
&lt;br /&gt;
=== 0.1 ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[Quality/QA-tools/OTS/DeveloperDocs/Experimental/Django|Advanced OTS server using django]] (Relates to branch dev_branch_0.1_django_server) &amp;lt;/s&amp;gt;&lt;br /&gt;
**Released in 0.1.1 version. Documentation moved to [[Quality/QA-tools/OTS/UserDocumentation/Installation#Django_Based_Server]]&lt;br /&gt;
&lt;br /&gt;
=== 0.8.2 ===&lt;br /&gt;
&lt;br /&gt;
=== How to monitor ots? ===&lt;br /&gt;
&lt;br /&gt;
We have monitor DTO:s. Probably some kind of hierarchy of dto monitor objects.&lt;br /&gt;
&lt;br /&gt;
* Testrun Events:&lt;br /&gt;
** Test pkg execution event (start/stop) (minimum requirement for [FEA] 9036)&lt;br /&gt;
** Flashing Event (start/stop) (n:th try)&lt;br /&gt;
** Bootup event  (n:th try)&lt;br /&gt;
** Testsuite/set/case/step event? (What level of detail we want to monitor?) Remember that logging still exists...&lt;br /&gt;
** Testrun overall result&lt;br /&gt;
&lt;br /&gt;
* Worker events:&lt;br /&gt;
** Worker state (Start/stop/busy/free) (What about queue info?)&lt;br /&gt;
** Heartbeat?&lt;br /&gt;
&lt;br /&gt;
* Failure event dto? (Flashing failed, device failure...)?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
What about statistics monitoring? What do we need?&lt;br /&gt;
&lt;br /&gt;
* Number of testruns?&lt;br /&gt;
* Number of workers?&lt;br /&gt;
* Active testruns?&lt;br /&gt;
* PASS/FAIL/ERROR ratios?&lt;br /&gt;
* Error statistics?&lt;br /&gt;
** Most common errors&lt;br /&gt;
** Some kind of grouping of errors and statistics for them (user fault vs catastrophic ots failure vs device/image error vs...)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
&lt;br /&gt;
* One host can have multiple worker instances running. Dto:s need to have information about the instance, not just hostname.&lt;br /&gt;
* &lt;br /&gt;
&lt;br /&gt;
==== Who receives monitor dto:s? ====&lt;br /&gt;
&lt;br /&gt;
Current implementation uses the same testrun response queue and process for monitor dto:s. This is simple to implement for testrun related events but very limited for generic monitoring of the whole system. For example most of the worker events cannot be sent to testrun queue because they are not related to a specific testrun and we don't know if there even is any testrun response queues around.&lt;br /&gt;
&lt;br /&gt;
Having a separate permanent queue and a separate listener process for monitoring would allow monitoring also outside a testrun.&lt;br /&gt;
&lt;br /&gt;
Pros:&lt;br /&gt;
&lt;br /&gt;
* Can be deployed as a completely separate component&lt;br /&gt;
** even into a different machine&lt;br /&gt;
** Maintenance, update etc. does not affect test execution in any way&lt;br /&gt;
&lt;br /&gt;
Cons:&lt;br /&gt;
&lt;br /&gt;
* One more process/daemon to maintain&lt;br /&gt;
** More complicated install&lt;br /&gt;
* Might cause errors.&lt;br /&gt;
** Not running =&amp;gt; Lots of messages pile up in the queue&lt;br /&gt;
* Dependencies&lt;br /&gt;
** What if for example the distribution model relies on monitor component to provide up to date data?&lt;br /&gt;
* How to provide testrun specific monitor info to Publishers?&lt;br /&gt;
&lt;br /&gt;
==== TODO ====&lt;br /&gt;
&lt;br /&gt;
* Current server side implementation does not send monitor dtos to Publishers in real time. They are sent only after the testrun is done.&lt;br /&gt;
&lt;br /&gt;
=== Bug 9036 - [FEA] Test package distribution based on history (last execution time of a package) ===&lt;br /&gt;
&lt;br /&gt;
Proposal:&lt;br /&gt;
&lt;br /&gt;
* Data provided by monitor dto:s&lt;br /&gt;
* Data stored to a DB&lt;br /&gt;
** A separate DB for this plugin only or dependency to a more common monitor DB?&lt;br /&gt;
* A custom distribution model that reads data from DB and creates tasks based on that&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
&lt;br /&gt;
* We cannot limit to testpackage level. Implementation for set level distribution is already ongoing.&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/Experimental</id>
		<title>Quality/QA-tools/OTS/DeveloperDocs/Experimental</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/Experimental"/>
				<updated>2011-02-07T12:37:49Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Bug 9036 - [FEA] Test package distribution based on history (last execution time of a package) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Experimental Area ==&lt;br /&gt;
&lt;br /&gt;
Documentation for experimental branches, spikes, WIPs etc. You can also add documentation related to your merge requests or patches here.&lt;br /&gt;
&lt;br /&gt;
The docs should be moved to proper place in OTS wiki after the feature gets integrated to master branch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''This area is relevant for OTS developers only! Information under this area does not apply to master or released OTS versions.'''&lt;br /&gt;
&lt;br /&gt;
=== 0.1 ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[Quality/QA-tools/OTS/DeveloperDocs/Experimental/Django|Advanced OTS server using django]] (Relates to branch dev_branch_0.1_django_server) &amp;lt;/s&amp;gt;&lt;br /&gt;
**Released in 0.1.1 version. Documentation moved to [[Quality/QA-tools/OTS/UserDocumentation/Installation#Django_Based_Server]]&lt;br /&gt;
&lt;br /&gt;
=== 0.8.2 ===&lt;br /&gt;
&lt;br /&gt;
=== How to monitor ots? ===&lt;br /&gt;
&lt;br /&gt;
We have monitor DTO:s. Probably some kind of hierarchy of dto monitor objects.&lt;br /&gt;
&lt;br /&gt;
* Testrun Events:&lt;br /&gt;
** Test pkg execution event (start/stop) (minimum requirement for [FEA] 9036)&lt;br /&gt;
** Flashing Event (start/stop)&lt;br /&gt;
** Testsuite/set/case/step event? (What level of detail we want to monitor?) Remember that logging still exists...&lt;br /&gt;
** Testrun overall result&lt;br /&gt;
&lt;br /&gt;
* Worker events:&lt;br /&gt;
** Worker state (Start/stop/busy/free) (What about queue info?)&lt;br /&gt;
** Heartbeat?&lt;br /&gt;
&lt;br /&gt;
* Failure event dto? (Flashing failed, device failure...)?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
What about statistics monitoring? What do we need?&lt;br /&gt;
&lt;br /&gt;
* Number of testruns?&lt;br /&gt;
* Number of workers?&lt;br /&gt;
* Active testruns?&lt;br /&gt;
* PASS/FAIL/ERROR ratios?&lt;br /&gt;
* Error statistics?&lt;br /&gt;
** Most common errors&lt;br /&gt;
** Some kind of grouping of errors and statistics for them (user fault vs catastrophic ots failure vs device/image error vs...)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Who receives monitor dto:s? ====&lt;br /&gt;
&lt;br /&gt;
Current implementation uses the same testrun response queue and process for monitor dto:s. This is simple to implement for testrun related events but very limited for generic monitoring of the whole system. For example most of the worker events cannot be sent to testrun queue because they are not related to a specific testrun and we don't know if there even is any testrun response queues around.&lt;br /&gt;
&lt;br /&gt;
Having a separate permanent queue and a separate listener process for monitoring would allow monitoring also outside a testrun.&lt;br /&gt;
&lt;br /&gt;
Pros:&lt;br /&gt;
&lt;br /&gt;
* Can be deployed as a completely separate component&lt;br /&gt;
** even into a different machine&lt;br /&gt;
** Maintenance, update etc. does not affect test execution in any way&lt;br /&gt;
&lt;br /&gt;
Cons:&lt;br /&gt;
&lt;br /&gt;
* One more process/daemon to maintain&lt;br /&gt;
** More complicated install&lt;br /&gt;
* Might cause errors.&lt;br /&gt;
** Not running =&amp;gt; Lots of messages pile up in the queue&lt;br /&gt;
* Dependencies&lt;br /&gt;
** What if for example the distribution model relies on monitor component to provide up to date data?&lt;br /&gt;
* How to provide testrun specific monitor info to Publishers?&lt;br /&gt;
&lt;br /&gt;
==== TODO ====&lt;br /&gt;
&lt;br /&gt;
* Current server side implementation does not send monitor dtos to Publishers in real time. They are sent only after the testrun is done.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Bug 9036 - [FEA] Test package distribution based on history (last execution time of a package) ===&lt;br /&gt;
&lt;br /&gt;
Proposal:&lt;br /&gt;
&lt;br /&gt;
* Data provided by monitor dto:s&lt;br /&gt;
* Data stored to a DB&lt;br /&gt;
** A separate DB for this plugin only or dependency to a more common monitor DB?&lt;br /&gt;
* A custom distribution model that reads data from DB and creates tasks based on that&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
&lt;br /&gt;
* We cannot limit to testpackage level. Implementation for set level distribution is already ongoing.&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/Experimental</id>
		<title>Quality/QA-tools/OTS/DeveloperDocs/Experimental</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/Experimental"/>
				<updated>2011-02-07T12:31:57Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Experimental Area */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Experimental Area ==&lt;br /&gt;
&lt;br /&gt;
Documentation for experimental branches, spikes, WIPs etc. You can also add documentation related to your merge requests or patches here.&lt;br /&gt;
&lt;br /&gt;
The docs should be moved to proper place in OTS wiki after the feature gets integrated to master branch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''This area is relevant for OTS developers only! Information under this area does not apply to master or released OTS versions.'''&lt;br /&gt;
&lt;br /&gt;
=== 0.1 ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[Quality/QA-tools/OTS/DeveloperDocs/Experimental/Django|Advanced OTS server using django]] (Relates to branch dev_branch_0.1_django_server) &amp;lt;/s&amp;gt;&lt;br /&gt;
**Released in 0.1.1 version. Documentation moved to [[Quality/QA-tools/OTS/UserDocumentation/Installation#Django_Based_Server]]&lt;br /&gt;
&lt;br /&gt;
=== 0.8.2 ===&lt;br /&gt;
&lt;br /&gt;
=== How to monitor ots? ===&lt;br /&gt;
&lt;br /&gt;
We have monitor DTO:s. Probably some kind of hierarchy of dto monitor objects.&lt;br /&gt;
&lt;br /&gt;
* Testrun Events:&lt;br /&gt;
** Test pkg execution event (start/stop) (minimum requirement for [FEA] 9036)&lt;br /&gt;
** Flashing Event (start/stop)&lt;br /&gt;
** Testsuite/set/case/step event? (What level of detail we want to monitor?) Remember that logging still exists...&lt;br /&gt;
** Testrun overall result&lt;br /&gt;
&lt;br /&gt;
* Worker events:&lt;br /&gt;
** Worker state (Start/stop/busy/free) (What about queue info?)&lt;br /&gt;
** Heartbeat?&lt;br /&gt;
&lt;br /&gt;
* Failure event dto? (Flashing failed, device failure...)?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
What about statistics monitoring? What do we need?&lt;br /&gt;
&lt;br /&gt;
* Number of testruns?&lt;br /&gt;
* Number of workers?&lt;br /&gt;
* Active testruns?&lt;br /&gt;
* PASS/FAIL/ERROR ratios?&lt;br /&gt;
* Error statistics?&lt;br /&gt;
** Most common errors&lt;br /&gt;
** Some kind of grouping of errors and statistics for them (user fault vs catastrophic ots failure vs device/image error vs...)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Who receives monitor dto:s? ====&lt;br /&gt;
&lt;br /&gt;
Current implementation uses the same testrun response queue and process for monitor dto:s. This is simple to implement for testrun related events but very limited for generic monitoring of the whole system. For example most of the worker events cannot be sent to testrun queue because they are not related to a specific testrun and we don't know if there even is any testrun response queues around.&lt;br /&gt;
&lt;br /&gt;
Having a separate permanent queue and a separate listener process for monitoring would allow monitoring also outside a testrun.&lt;br /&gt;
&lt;br /&gt;
Pros:&lt;br /&gt;
&lt;br /&gt;
* Can be deployed as a completely separate component&lt;br /&gt;
** even into a different machine&lt;br /&gt;
** Maintenance, update etc. does not affect test execution in any way&lt;br /&gt;
&lt;br /&gt;
Cons:&lt;br /&gt;
&lt;br /&gt;
* One more process/daemon to maintain&lt;br /&gt;
** More complicated install&lt;br /&gt;
* Might cause errors.&lt;br /&gt;
** Not running =&amp;gt; Lots of messages pile up in the queue&lt;br /&gt;
* Dependencies&lt;br /&gt;
** What if for example the distribution model relies on monitor component to provide up to date data?&lt;br /&gt;
* How to provide testrun specific monitor info to Publishers?&lt;br /&gt;
&lt;br /&gt;
==== TODO ====&lt;br /&gt;
&lt;br /&gt;
* Current server side implementation does not send monitor dtos to Publishers in real time. They are sent only after the testrun is done.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Bug 9036 - [FEA] Test package distribution based on history (last execution time of a package) ===&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
* Data provided by monitor dto:s&lt;br /&gt;
* Data stored to a DB&lt;br /&gt;
* A custom distribution model that reads data from DB and creates tasks based on that&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
&lt;br /&gt;
* We cannot limit to testpackage level. Implementation for set level distribution is already ongoing.&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS</id>
		<title>Quality/QA-tools/OTS</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS"/>
				<updated>2011-02-04T13:25:14Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Releases */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OTS Index =&lt;br /&gt;
&lt;br /&gt;
Welcome to the Open Test System (OTS) Wiki Index.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
OTS is the '''Open Test Service''' for testing software systems on evolving hardware architectures.&lt;br /&gt;
  &lt;br /&gt;
It was born out of the test framework incrementally developed for use on [http://maemo.org/ Maemo] project and is in use for 24/7 testing service by [http://www.nokia.com/ Nokia].&lt;br /&gt;
&lt;br /&gt;
See [http://ots.meego.com/logger/view/ MeeGo OTS WebUi].&lt;br /&gt;
&lt;br /&gt;
More detailed info can be found from [[Quality/QA-tools/OTS/About|about]] page.&lt;br /&gt;
&lt;br /&gt;
== Releases ==&lt;br /&gt;
&lt;br /&gt;
Current release [http://meego.gitorious.org/meego-quality-assurance/ots tag 0.8.1].&lt;br /&gt;
&lt;br /&gt;
Next release [https://bugs.meego.com/show_bug.cgi?id=13258 0.8.2]&lt;br /&gt;
&lt;br /&gt;
See OTS [[Quality/QA-tools/OTS/Roadmap| roadmap.]]&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/UserDocumentation | User Documentation]]&lt;br /&gt;
** [[Quality/QA-tools/OTS/UserDocumentation/Installation | Installation Ubuntu]]&lt;br /&gt;
** [[Quality/QA-tools/OTS/UserDocumentation/Installation_rpm | Installation RPM]]&lt;br /&gt;
* [[Quality/QA-tools/OTS/DeveloperDocs | Developer Documentation]]&lt;br /&gt;
* [[Quality/QA-tools/OTS/AdminDocs | System Administration]]&lt;br /&gt;
* [[Quality/QA-tools/OTS/Glossary | Glossary]]&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/CreatingACustomDistributionModel</id>
		<title>Quality/QA-tools/OTS/DeveloperDocs/CreatingACustomDistributionModel</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/CreatingACustomDistributionModel"/>
				<updated>2011-02-04T10:47:53Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* How to Customize Test Package Distribution in OTS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== How to Customize Test Package Distribution in OTS ==&lt;br /&gt;
&lt;br /&gt;
OTS supports 2 distribution models. By default all packages are executed in one task. In practice this means that one worker will take care of the whole testrun by flashing the device and running all test packages one after another. If &amp;quot;perpackage&amp;quot; distribution model is used, a separate task will be created for each package. If enough workers are free, all packages will be tested on a separate worker in parallel. This is in theory the fastest possible way to execute the packages.&lt;br /&gt;
&lt;br /&gt;
In reality the device preparation takes a lot of time and there usually is not enough workers free so some kind of optimized distribution model between these two extremes might make the system more useful. To make this possible starting from version 0.8.1 OTS supports custom distribution models.&lt;br /&gt;
&lt;br /&gt;
More background information about the distribution optimization can be found in [[Quality/QA-tools/OTS/OptimisingThroughput|Optimising throughput.]]&lt;br /&gt;
&lt;br /&gt;
=== Creating a Custom Distribution Model ===&lt;br /&gt;
&lt;br /&gt;
Distribution models use setuptools entry point mechanism just like PublisherPlugins do. An example can be found in [[http://meego.gitorious.org/meego-quality-assurance/ots/trees/master/examples/ots.plugin.example_distribution_model  examples/ots/plugin/example_distribution_model/]]&lt;br /&gt;
&lt;br /&gt;
==== Defining the Distribution Model in setup.py ====&lt;br /&gt;
&lt;br /&gt;
An entry point named &amp;quot;ots_distribution_model&amp;quot; needs to be defined in the setup.py to make OTS find the custom distribution model:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    entry_points={&amp;quot;ots_distribution_model&amp;quot;:&lt;br /&gt;
                      [&amp;quot;example_model = ots.plugin.example_distribution_model.example_model:get_model&amp;quot;]&lt;br /&gt;
                  },&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The name &amp;quot;example_model&amp;quot; is the name of the custom model. It maps directly to the OTS testrun parameter distribution_model and ots_trigger parameter &amp;lt;code&amp;gt;-c DISTMODEL, --distribution=DISTMODEL&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Implementing the Distribution Model ====&lt;br /&gt;
&lt;br /&gt;
The actual distribution model is loaded with a factory method that gets all testrun options as parameters. It should return a callable that takes test package list as input and returns conductor commands as a list.&lt;br /&gt;
&lt;br /&gt;
A plugin example is available in [http://meego.gitorious.org/meego-quality-assurance/ots/blobs/master/examples/ots.plugin.example_distribution_model/ots/plugin/example_distribution_model/example_model.py examples/ots/plugin/example_distribution_model/example_model.py]&lt;br /&gt;
&lt;br /&gt;
Fully implemented distribution models can be found in [http://meego.gitorious.org/meego-quality-assurance/ots/blobs/master/ots.server/ots/server/allocator/default_distribution_models.py ots/server/allocator/default_distribution_models.py]&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/CreatingACustomDistributionModel</id>
		<title>Quality/QA-tools/OTS/DeveloperDocs/CreatingACustomDistributionModel</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/CreatingACustomDistributionModel"/>
				<updated>2011-02-04T10:45:03Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Creating a Custom Distribution Model */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== How to Customize Test Package Distribution in OTS ==&lt;br /&gt;
&lt;br /&gt;
OTS supports 2 distribution models. By default all packages are executed in one task. In practice this means that one worker will take care of the whole testrun by flashing the device and running all test packages one after another. If &amp;quot;perpackage&amp;quot; distribution model is used, a separate task will be created for each package. If enough workers are free, all packages will be tested on a separate worker in parallel. This is in theory the fastest possible way to execute the packages.&lt;br /&gt;
&lt;br /&gt;
In reality the device preparation takes a lot of time and there usually is not enough workers free so some kind of optimized distribution model between these two extremes might make the system more useful. To make this possible OTS supports custom distribution models.&lt;br /&gt;
&lt;br /&gt;
More background information about the distribution optimization can be found in [[Quality/QA-tools/OTS/OptimisingThroughput|Optimising throughput.]]&lt;br /&gt;
&lt;br /&gt;
=== Creating a Custom Distribution Model ===&lt;br /&gt;
&lt;br /&gt;
Distribution models use setuptools entry point mechanism just like PublisherPlugins do. An example can be found in [[http://meego.gitorious.org/meego-quality-assurance/ots/trees/master/examples/ots.plugin.example_distribution_model  examples/ots/plugin/example_distribution_model/]]&lt;br /&gt;
&lt;br /&gt;
==== Defining the Distribution Model in setup.py ====&lt;br /&gt;
&lt;br /&gt;
An entry point named &amp;quot;ots_distribution_model&amp;quot; needs to be defined in the setup.py to make OTS find the custom distribution model:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    entry_points={&amp;quot;ots_distribution_model&amp;quot;:&lt;br /&gt;
                      [&amp;quot;example_model = ots.plugin.example_distribution_model.example_model:get_model&amp;quot;]&lt;br /&gt;
                  },&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The name &amp;quot;example_model&amp;quot; is the name of the custom model. It maps directly to the OTS testrun parameter distribution_model and ots_trigger parameter &amp;lt;code&amp;gt;-c DISTMODEL, --distribution=DISTMODEL&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Implementing the Distribution Model ====&lt;br /&gt;
&lt;br /&gt;
The actual distribution model is loaded with a factory method that gets all testrun options as parameters. It should return a callable that takes test package list as input and returns conductor commands as a list.&lt;br /&gt;
&lt;br /&gt;
A plugin example is available in [http://meego.gitorious.org/meego-quality-assurance/ots/blobs/master/examples/ots.plugin.example_distribution_model/ots/plugin/example_distribution_model/example_model.py examples/ots/plugin/example_distribution_model/example_model.py]&lt;br /&gt;
&lt;br /&gt;
Fully implemented distribution models can be found in [http://meego.gitorious.org/meego-quality-assurance/ots/blobs/master/ots.server/ots/server/allocator/default_distribution_models.py ots/server/allocator/default_distribution_models.py]&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/CreatingACustomDistributionModel</id>
		<title>Quality/QA-tools/OTS/DeveloperDocs/CreatingACustomDistributionModel</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/CreatingACustomDistributionModel"/>
				<updated>2011-02-04T10:44:08Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: Created page with &amp;quot;== How to Customize Test Package Distribution in OTS ==  OTS supports 2 distribution models. By default all packages are executed in one task. In practice this means that one wor…&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== How to Customize Test Package Distribution in OTS ==&lt;br /&gt;
&lt;br /&gt;
OTS supports 2 distribution models. By default all packages are executed in one task. In practice this means that one worker will take care of the whole testrun by flashing the device and running all test packages one after another. If &amp;quot;perpackage&amp;quot; distribution model is used, a separate task will be created for each package. If enough workers are free, all packages will be tested on a separate worker in parallel. This is in theory the fastest possible way to execute the packages.&lt;br /&gt;
&lt;br /&gt;
In reality the device preparation takes a lot of time and there usually is not enough workers free so some kind of optimized distribution model between these two extremes might make the system more useful. To make this possible OTS supports custom distribution models.&lt;br /&gt;
&lt;br /&gt;
More background information about the distribution optimization can be found in [[Quality/QA-tools/OTS/OptimisingThroughput|Optimising throughput.]]&lt;br /&gt;
&lt;br /&gt;
=== Creating a Custom Distribution Model ===&lt;br /&gt;
&lt;br /&gt;
Distribution models use setuptools entry point mechanism just like PublisherPlugins do. An example can be found in [[http://meego.gitorious.org/meego-quality-assurance/ots/trees/master/examples/ots.plugin.example_distribution_model  ots.plugin.example_distribution_model]]&lt;br /&gt;
&lt;br /&gt;
==== Defining the Distribution Model in setup.py ====&lt;br /&gt;
&lt;br /&gt;
An entry point named &amp;quot;ots_distribution_model&amp;quot; needs to be defined in the setup.py to make OTS find the custom distribution model:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    entry_points={&amp;quot;ots_distribution_model&amp;quot;:&lt;br /&gt;
                      [&amp;quot;example_model = ots.plugin.example_distribution_model.example_model:get_model&amp;quot;]&lt;br /&gt;
                  },&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The name &amp;quot;example_model&amp;quot; is the name of the custom model. It maps directly to the OTS testrun parameter distribution_model and ots_trigger parameter &amp;lt;code&amp;gt;-c DISTMODEL, --distribution=DISTMODEL&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Implementing the Distribution Model ====&lt;br /&gt;
&lt;br /&gt;
The actual distribution model is loaded with a factory method that gets all testrun options as parameters. It should return a callable that takes test package list as input and returns conductor commands as a list.&lt;br /&gt;
&lt;br /&gt;
A plugin example is available in [http://meego.gitorious.org/meego-quality-assurance/ots/blobs/master/examples/ots.plugin.example_distribution_model/ots/plugin/example_distribution_model/example_model.py examples/ots/plugin/example_distribution_model/example_model.py]&lt;br /&gt;
&lt;br /&gt;
Fully implemented distribution models can be found in [http://meego.gitorious.org/meego-quality-assurance/ots/blobs/master/ots.server/ots/server/allocator/default_distribution_models.py ots/server/allocator/default_distribution_models.py]&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs</id>
		<title>Quality/QA-tools/OTS/DeveloperDocs</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs"/>
				<updated>2011-02-04T10:21:00Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Extending OTS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OTS - Open Testing Service =&lt;br /&gt;
&lt;br /&gt;
== Related Documentation ==&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/DevelopmentGuidelines | Development Guidelines]]&lt;br /&gt;
* [[Quality/QA-tools/OTS/Contributions | Contributions]]&lt;br /&gt;
* [[Quality/QA-tools/OTS/Architecture]]&lt;br /&gt;
* [[Quality/QA-tools/OTS/Packages | Packages]]&lt;br /&gt;
* [[Quality/QA-tools/OTS/ErrorCodes | Error Codes]]&lt;br /&gt;
* [[Quality/QA-tools/OTS/Glossary]]&lt;br /&gt;
* [[Quality/QA-tools/OTS/DeveloperDocs/Transition0.1-0.8|Making transition from 0.1 to 0.8]]&lt;br /&gt;
&lt;br /&gt;
== Synopsis ==&lt;br /&gt;
&lt;br /&gt;
OTS is a Distributed Test System that takes a Data Driven Approach using XML Files to allow parallel testing of Applications on evolving Hardware platforms.  &lt;br /&gt;
&lt;br /&gt;
Design has been driven by the need for a language neutral test platform that allows testing under different device architectures in parallel.&lt;br /&gt;
&lt;br /&gt;
== High Level Overview ==  &lt;br /&gt;
&lt;br /&gt;
OTS allows a Test Sequence to be fanned out from a hub known as a '''Distributor''' to a remote machine known as a '''Worker'''. &lt;br /&gt;
Each '''Worker''' has a '''Device Group''' associated with it, this is defined in the configuration. The Tests are routed to the '''Worker''' &lt;br /&gt;
on the basis of the '''Device Group'''.&lt;br /&gt;
&lt;br /&gt;
An XML '''Test Definition File''' describes the Tests that are run. The results are returned to the '''Distributor''' in an XML '''Results File'''.&lt;br /&gt;
 &lt;br /&gt;
The '''Distributor''' takes a '''Device Group''' and '''Timeout''' as inputs, as well as the '''Command''' for running '''Tasks'''. Tests are run within a '''Task''' which  &lt;br /&gt;
is currently run as a process. The '''Command''' will typically take a path to the '''Test Definition File''' as an input. &lt;br /&gt;
If the process exceeds the '''Timeout''' the '''Task''' is stopped (the process is killed). &lt;br /&gt;
&lt;br /&gt;
A number of '''Tasks''' can be added to a '''Testrun'''. The '''Testrun''' will normally wait for all '''Tasks''' to finish before completion. &lt;br /&gt;
&lt;br /&gt;
Data (status, error and results) are communicated back from the '''Task''' to the '''Worker'''.  The '''Results Object''' is a container for the files outputted: '''Test Definition File''',  '''Results File''' &lt;br /&gt;
and any other files produced by the test as well as metadata relating to the run. &lt;br /&gt;
&lt;br /&gt;
== Technology ==&lt;br /&gt;
&lt;br /&gt;
OTS is written in [http://www.python.org/ Python 2.6].&lt;br /&gt;
&lt;br /&gt;
[http://www.amqp.org/confluence/display/AMQP/Advanced+Message+Queuing+Protocol AMQP] protocol is used for communication.&lt;br /&gt;
&lt;br /&gt;
=== XmlFileFormats ===&lt;br /&gt;
&lt;br /&gt;
The XML file formats provide the datum for the system.&lt;br /&gt;
&lt;br /&gt;
Download [http://meego.gitorious.org/meego-quality-assurance/test-definition/trees/master them] and add the path to the '''results_xsd''' parameter in your [http://meego.gitorious.org/meego-quality-assurance/ots/blobs/dev_branch_0.8/ots.server/ots/server/ots_server.ini ots_server.ini] file&lt;br /&gt;
&lt;br /&gt;
=== Third Party Dependencies ===&lt;br /&gt;
&lt;br /&gt;
==== RabbitMQ ====&lt;br /&gt;
&lt;br /&gt;
You need to install [http://www.rabbitmq.com/server.html RabbitMQ], this is AMQP message server.&lt;br /&gt;
&lt;br /&gt;
===== Managing the Queues =====&lt;br /&gt;
&lt;br /&gt;
If you need to delete or empty the queues there are [http://meego.gitorious.org/meego-quality-assurance/ots/trees/master/ots.server/ots/server/distributor/dev_utils utilities] to help with this.&lt;br /&gt;
&lt;br /&gt;
==== Python Packages ====&lt;br /&gt;
&lt;br /&gt;
The following python packages are needed&lt;br /&gt;
&lt;br /&gt;
* [http://pypi.python.org/pypi/setuptools setuptools]&lt;br /&gt;
&lt;br /&gt;
* [http://www.voidspace.org.uk/python/configobj.html configobj]&lt;br /&gt;
 &lt;br /&gt;
* [http://pypi.python.org/pypi/multiprocessing multiprocessing]&lt;br /&gt;
&lt;br /&gt;
* [http://code.google.com/p/py-amqplib/ pyamqplib] (version 0.6.1 or newer)&lt;br /&gt;
&lt;br /&gt;
* [http://www.familieleuthe.de/DownloadMiniXsv.html minixsv]&lt;br /&gt;
&lt;br /&gt;
* [http://www.djangoproject.com/download/1.1.2/tarball/ django]&lt;br /&gt;
&lt;br /&gt;
* [http://code.google.com/p/python-nose/ nose]&lt;br /&gt;
&lt;br /&gt;
== Diving In ==&lt;br /&gt;
&lt;br /&gt;
The following steps show how to get a Development Environment up and running&lt;br /&gt;
&lt;br /&gt;
=== 1. Install Dependencies ===&lt;br /&gt;
&lt;br /&gt;
* Install the Third Party Dependencies&lt;br /&gt;
&lt;br /&gt;
* Get the XML File Formats and set the OTS_TESTDEFINITION environment variable&lt;br /&gt;
&lt;br /&gt;
=== 2. Build the Eggs === &lt;br /&gt;
&lt;br /&gt;
From the root directory&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ./setup.sh&lt;br /&gt;
 source ./paths.sh&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Unittests ===&lt;br /&gt;
&lt;br /&gt;
Run the unittests from the root directory&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ./nose.sh&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Component Tests ===&lt;br /&gt;
&lt;br /&gt;
Component Tests run high level tests on an OTS Component using Mocks of the dependencies.&lt;br /&gt;
&lt;br /&gt;
You can run these with the component_tests shell script in the root directory. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ./component_tests.sh&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. Hello OTS World ===&lt;br /&gt;
&lt;br /&gt;
The source contains a simple demonstration of the way the key elements work. &lt;br /&gt;
&lt;br /&gt;
==== 1. Open two terminal windows. ====&lt;br /&gt;
&lt;br /&gt;
==== 2. In the first window run the server ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 cd $SERVER&lt;br /&gt;
 cd hub/demos&lt;br /&gt;
 python demo_hub.py&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3. You should see this: ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 &amp;lt;snip&amp;gt;&lt;br /&gt;
 20XX-XX-XX XX:XX:XX,XXX - ots.server.distributor.taskrunner - DEBUG - Sending command '['echo', 'hello world']' with key 'foo'&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4. In the second window run the worker ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 cd $WORKER&lt;br /&gt;
 python worker.py -c config.ini&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5. Now in the Server terminal the command should run to completion. You should see the following line in the logs: ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  20XX-XX-XX XX:XX:XX,XXX - ots.worker.command - DEBUG - process.communicate() returned echo hello world&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It will raise a PackageException. This is normal as no Tasks that are run return Packages to the Server&lt;br /&gt;
&lt;br /&gt;
==== 6. And on the logs on the Worker side should contain: ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 XXXX-XX-XX XX:XX:XX,XXX - ots.worker.command - DEBUG - process.communicate() returned echo hello world&lt;br /&gt;
 XXXX-XX-XX XX:XX:XX,XXX - ots.worker.task_broker - DEBUG - Task in state: 'finish'&lt;br /&gt;
 XXXX-XX-XX XX:XX:XX,XXX - ots.worker.task_broker - INFO - Recommence consume on queue: foo&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation == &lt;br /&gt;
&lt;br /&gt;
It is intended that the '''Distributor''' and each '''Worker''' should be installed to separate machines.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Distributor ===&lt;br /&gt;
&lt;br /&gt;
The format of the configuration file is as follows. &lt;br /&gt;
&lt;br /&gt;
The `host` is the name of the RabbitMQ server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [Client]&lt;br /&gt;
 host =  localhost&lt;br /&gt;
 vhost = / &lt;br /&gt;
 port = 5672&lt;br /&gt;
 username = guest&lt;br /&gt;
 password = guest&lt;br /&gt;
 queue = FIXME&lt;br /&gt;
 consumer_tag = worker&lt;br /&gt;
 services_exchange = services&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Worker ===&lt;br /&gt;
&lt;br /&gt;
Edit your config.ini so that the &lt;br /&gt;
&lt;br /&gt;
 * `queue`&lt;br /&gt;
 * `routing_key`&lt;br /&gt;
 * `services_exchange` &lt;br /&gt;
&lt;br /&gt;
Are set for your '''Device Group'''. &lt;br /&gt;
&lt;br /&gt;
And the `host` is the name of your RabbitMQ server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [Worker]&lt;br /&gt;
 host =  localhost&lt;br /&gt;
 vhost = / &lt;br /&gt;
 port = 5672&lt;br /&gt;
 username = guest&lt;br /&gt;
 password = guest&lt;br /&gt;
 queue = foo&lt;br /&gt;
 routing_key = foo&lt;br /&gt;
 services_exchange = foo&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Starting the Worker ====&lt;br /&gt;
&lt;br /&gt;
To start your Worker:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 python worker.py -c config.ini&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Automated System Tests ==&lt;br /&gt;
&lt;br /&gt;
Automated system tests are available in ots.system_tests. They trigger various testruns with xmlrpc and check return value and log messages.&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
&lt;br /&gt;
* Fully functional OTS system with one worker.&lt;br /&gt;
* A SW Product &amp;quot;ots-system-tests&amp;quot; configured so that it defaults to the worker.&lt;br /&gt;
* A meego image with test-definition-tests and testrunner-lite-regression-tests.&lt;br /&gt;
* Django based advanced OTS setup.&lt;br /&gt;
* BeautifulSoup python library.&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
&lt;br /&gt;
* make the system test image available for the workers. (for example copy it to your apache static content directory /var/www/static/)&lt;br /&gt;
* Modify system_tests.conf in ots.system_tests directory to match your system.&lt;br /&gt;
* Make sure all the urls in system_tests.conf work.&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
&lt;br /&gt;
* System tests execute multiple full testruns. Running all tests can easily take more than 1.5 hours with N900 worker.&lt;br /&gt;
* Make sure there's no other activities ongoing in the system while running the tests.&lt;br /&gt;
* Some error handling tests expect certain devicegroups and sw products _not_ to be available. If these test cases fail you can remove those queues with ots tools.&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
&lt;br /&gt;
OTS is distributed under an LGPL license.&lt;br /&gt;
&lt;br /&gt;
== Contributions ==&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/Contributions | Contributions]]&lt;br /&gt;
* [[Quality/QA-tools/OTS/DevelopmentGuidelines | Guidelines]]&lt;br /&gt;
* [[Quality/QA-tools/OTS/DevelopmentGuidelines/Review | Review process]]&lt;br /&gt;
&lt;br /&gt;
== Wiki ==&lt;br /&gt;
&lt;br /&gt;
[[Quality/QA-tools/OTS | OTS Wiki Home]]&lt;br /&gt;
&lt;br /&gt;
== Source Code Documentation ==&lt;br /&gt;
&lt;br /&gt;
FIXME&lt;br /&gt;
&lt;br /&gt;
== Mailing List ==&lt;br /&gt;
&lt;br /&gt;
[http://lists.meego.com/listinfo/meego-qa MeeGo QA] mailing list&lt;br /&gt;
&lt;br /&gt;
== IRC Channel ==&lt;br /&gt;
&lt;br /&gt;
The #meego-qa-tools irc channel in freenode&lt;br /&gt;
&lt;br /&gt;
== Bugs == &lt;br /&gt;
&lt;br /&gt;
The [http://bugs.meego.com/ Meego bugs page]&lt;br /&gt;
&lt;br /&gt;
== Platform Dependencies ==&lt;br /&gt;
&lt;br /&gt;
OTS is tested to run on Linux only.&lt;br /&gt;
&lt;br /&gt;
Tested on Ubuntu (8.04, 10.04, 10.10), Fedora 13, MeeGo and Redhat.&lt;br /&gt;
&lt;br /&gt;
Binary support for Ubuntu, Fedora and MeeGo.&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/DeveloperDocs/Components | Components]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/DeveloperDocs/Server | Server]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/DeveloperDocs/Plugins | Plugins]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/DeveloperDocs/DataFlow | DataFlow]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/DeveloperDocs/Behaviour | Behaviour]]&lt;br /&gt;
&lt;br /&gt;
== APIs ==&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/DeveloperDocs/OTS_Server_API | Server]]&lt;br /&gt;
&lt;br /&gt;
* [http://meego.gitorious.org/meego-quality-assurance/ots/blobs/dev_branch_0.8/ots.server/ots/server/distributor/api.py Distributor]&lt;br /&gt;
&lt;br /&gt;
* [http://meego.gitorious.org/meego-quality-assurance/ots/blobs/dev_branch_0.8/ots.results/ots/results/api.py Results]&lt;br /&gt;
&lt;br /&gt;
* [http://meego.gitorious.org/meego-quality-assurance/ots/blobs/dev_branch_0.8/ots.worker/ots/worker/api.py Worker]&lt;br /&gt;
&lt;br /&gt;
== Extending OTS ==&lt;br /&gt;
&lt;br /&gt;
You can extend OTS with your own [[Quality/QA-tools/OTS/CreatingAPublisher|Publisher]]&lt;br /&gt;
and with [[Quality/QA-tools/OTS/DeveloperDocs/CreatingACustomDistributionModel|custom package distribution models.]]&lt;br /&gt;
&lt;br /&gt;
== Experimental ==&lt;br /&gt;
&lt;br /&gt;
Documentation for experimental branches, spikes, WIPs etc. can be found in [[Quality/QA-tools/OTS/DeveloperDocs/Experimental]].&lt;br /&gt;
&lt;br /&gt;
== Analysis ==&lt;br /&gt;
&lt;br /&gt;
[[Quality/QA-tools/OTS/DeveloperDocs/ErrorSituations| OTS 0.1 Error Situations]]&lt;br /&gt;
&lt;br /&gt;
[[Quality/QA-tools/OTS/DeveloperDocs/TypicalUsage| Typical OTS users and usage scenarios]]&lt;br /&gt;
&lt;br /&gt;
== Project Planning ==&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/Roadmap | Roadmap]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/DevelopmentStatus | DevelopmentStatus]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/Meetings | Meetings]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/ReleaseChecklist | ReleaseChecklist]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/ReleasePractices | ReleasePractices]]&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/UserDocumentation/Migration_0.1_0.8</id>
		<title>Quality/QA-tools/OTS/UserDocumentation/Migration 0.1 0.8</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/UserDocumentation/Migration_0.1_0.8"/>
				<updated>2011-02-03T13:43:17Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* OTS Server */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OTS migration from version 0.1.x to 0.8.x =&lt;br /&gt;
&lt;br /&gt;
== OTS Server ==&lt;br /&gt;
&lt;br /&gt;
* First backup all old configurations&lt;br /&gt;
 /etc/ots-server.ini&lt;br /&gt;
 /opt/ots.sqlite&lt;br /&gt;
 /etc/ots_qareports_plugin.conf&lt;br /&gt;
 Your extension configurations&lt;br /&gt;
&lt;br /&gt;
* Remove 0.1.x version&lt;br /&gt;
 sudo apt-get purge python-ots-common python-ots-server python-server python-ots-qareports-plugin python-ots-tools&lt;br /&gt;
or&lt;br /&gt;
 sudo rm -fr /usr/local/lib/python2.6/dist-packages/ots*&lt;br /&gt;
or&lt;br /&gt;
 sudo rm -fr /usr/lib/python2.6/site-packages/ots*&lt;br /&gt;
&lt;br /&gt;
* Follow [[Quality/QA-tools/OTS/UserDocumentation/Installation| 0.8 installation instructions]] how to setup the server&lt;br /&gt;
&lt;br /&gt;
=== Configuring 0.8 to match 0.1 ===&lt;br /&gt;
&lt;br /&gt;
==== Email ====&lt;br /&gt;
&lt;br /&gt;
* In 0.8 the email feature is implemented as [[Quality/QA-tools/OTS/Plugins/Email| OTS server's plug-in]]&lt;br /&gt;
&lt;br /&gt;
* It uses the server's configuration file&lt;br /&gt;
 /etc/ots_server.ini&lt;br /&gt;
&lt;br /&gt;
* In 0.1 these settings were defined in your extension config. Copy values from there.&lt;br /&gt;
&lt;br /&gt;
* If you want to use your 0.1 message_body, remove line break marks '\n' from the string and put all text between the &amp;quot;&amp;quot;&amp;quot; -marks.&lt;br /&gt;
&lt;br /&gt;
==== Default SW configuration and SW products ====&lt;br /&gt;
&lt;br /&gt;
* In 0.8 default SW configurations and SW products are defined in the server's configuration.&lt;br /&gt;
 /etc/ots_server.ini&lt;br /&gt;
&lt;br /&gt;
* In 0.1 these settings were defined in your extension config.&lt;br /&gt;
&lt;br /&gt;
* Add one or several SW products under the 'swproducts' section.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[swproducts]&lt;br /&gt;
  [[meego_n900]]&lt;br /&gt;
    timeout = 60&lt;br /&gt;
    distribution_model = default&lt;br /&gt;
    email = on&lt;br /&gt;
    email-attachments = off&lt;br /&gt;
    emmc = &amp;quot;&amp;quot;&lt;br /&gt;
    input_plugin = &amp;quot;default&amp;quot;&lt;br /&gt;
    [[[device]]]&lt;br /&gt;
      devicegroup = n900&lt;br /&gt;
&lt;br /&gt;
  [[meego_aava]]&lt;br /&gt;
    timeout = 120&lt;br /&gt;
    distribution_model = default&lt;br /&gt;
    email = on&lt;br /&gt;
    email-attachments = on&lt;br /&gt;
    emmc = &amp;quot;&amp;quot;&lt;br /&gt;
    input_plugin = &amp;quot;default&amp;quot;&lt;br /&gt;
    [[[device]]]&lt;br /&gt;
      devicegroup = aava&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Django Based server ====&lt;br /&gt;
&lt;br /&gt;
* Follow the [[Quality/QA-tools/OTS/Plugins/HTTP_logger| logger plug-in]] instructions how to setup new Django server.&lt;br /&gt;
&lt;br /&gt;
* Old database file /opt/ots.sqlite, is '''not''' compatible with 0.8 version. &lt;br /&gt;
&lt;br /&gt;
* '''No''' custom ots_config or extension points used anymore. If want to use testrun_db, create new plug-in to OTS server.&lt;br /&gt;
&lt;br /&gt;
* HTTP logging is automatically on if plug-in is installed.&lt;br /&gt;
&lt;br /&gt;
==== QA-Reports ====&lt;br /&gt;
&lt;br /&gt;
* No changes in 0.8, just install [[Quality/QA-tools/OTS/Plugins/QAReports| python-ots-plugin-qareports]] to your OTS server. &lt;br /&gt;
&lt;br /&gt;
* Configuration file is the same&lt;br /&gt;
 /etc/ots_qareports_plugin.conf&lt;br /&gt;
&lt;br /&gt;
==== Other configurations ====&lt;br /&gt;
&lt;br /&gt;
* OTS 0.8 uses mainly the server's configuration. Update values from the 0.1 configuration (/etc/ots-server.ini) to 0.8 (/etc/ots_server.ini).&lt;br /&gt;
&lt;br /&gt;
* '''No''' extension points used in 0.8&lt;br /&gt;
&lt;br /&gt;
==== Input Plugins ====&lt;br /&gt;
&lt;br /&gt;
OTS 0.1 supports feeding information back to ots client(for example the build machine) with input plugins. The key features of of OTS 0.1 input plugins are:  &lt;br /&gt;
&lt;br /&gt;
* Publish testrun log url to the client in the beginning of the testrun&lt;br /&gt;
* Publish result urls to the client&lt;br /&gt;
* Publish result files to the client&lt;br /&gt;
* Runtime selection of input plugin with testrun options&lt;br /&gt;
&lt;br /&gt;
OTS 0.8 does not support input plugins but is able to do the same things with Publisher plugins. The needed steps are described below. The publisher plugin replacing an input plugin is referred as ClientPublisher.&lt;br /&gt;
&lt;br /&gt;
* Publish URLs to clients:&lt;br /&gt;
# All publishers can share their report urls by implementing the get_this_publisher_uris() method. For example ots.plugins.logger shares the the testrun log url by doing this. All reporting tool plugins should do the same.&lt;br /&gt;
# ClientPublisher needs to implement set_all_publisher_uris(self, uris_dict) method. The uris_dict contains all URLs from all publishers so it's easy to send them to the client in this method. The plugin can also filter the URLs if it does not want to send all of them to the client.&lt;br /&gt;
# The URL processing is done right after all publishers are loaded so log url gets sent in the beginning of the testrun as expected.&lt;br /&gt;
&lt;br /&gt;
* Result file Storage&lt;br /&gt;
# ClientPublisher gets all result files by implementing set_results(self, results). It's easy to send them to client in that method..&lt;br /&gt;
&lt;br /&gt;
* Dynamic runtime selection of input plugins&lt;br /&gt;
# All plugin constructors get the additional testrun options as keyword arguments. Disabling and enabling a specific ClientPublisher can be done in the constructor by checking the input parameters.&lt;br /&gt;
&lt;br /&gt;
* get_changed_packages(self, build_id)&lt;br /&gt;
# This should be implemented in the particular reporting tool that requires this information. OTS does not use this information in test execution so there's no need to handle this in OTS.&lt;br /&gt;
&lt;br /&gt;
== OTS Worker ==&lt;br /&gt;
&lt;br /&gt;
* First backup all old configurations&lt;br /&gt;
 /etc/conductor.conf&lt;br /&gt;
 /etc/conductor/&lt;br /&gt;
 /etc/ots.ini&lt;br /&gt;
&lt;br /&gt;
* Remove 0.1.x version&lt;br /&gt;
 sudo apt-get purge python-ots-common python-ots-worker&lt;br /&gt;
or&lt;br /&gt;
 sudo rm -fr /usr/local/lib/python2.6/dist-packages/ots*&lt;br /&gt;
or&lt;br /&gt;
 sudo rm -fr /usr/lib/python2.6/site-packages/ots*&lt;br /&gt;
&lt;br /&gt;
* Follow [[Quality/QA-tools/OTS/UserDocumentation/Installation| 0.8 installation instructions]] how to setup the worker&lt;br /&gt;
&lt;br /&gt;
* No changes in the configuration files, just copy old ots.ini and conductor.conf to /etc.&lt;br /&gt;
&lt;br /&gt;
* No changes to customflasher.&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus</id>
		<title>Quality/QA-tools/OTS/DevelopmentStatus</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus"/>
				<updated>2011-02-02T10:37:06Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''' This page is no longer maintained. Development is managed in bugs.meego.org '''&lt;br /&gt;
&lt;br /&gt;
= Release 0.8 unstable =&lt;br /&gt;
&lt;br /&gt;
== Application Framework ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Configuration&lt;br /&gt;
| Single configuration file and format, &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Plugins&lt;br /&gt;
| Runtime discoverable mechanism, with clear usage model&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions&lt;br /&gt;
| An understandable exception handling model. Documented&lt;br /&gt;
| OTS 0.9&lt;br /&gt;
|-&lt;br /&gt;
| Logging&lt;br /&gt;
| A coherent distributed logging system&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Upgrade Capability &lt;br /&gt;
| Worker version management&lt;br /&gt;
| OTS 0.9&lt;br /&gt;
|-&lt;br /&gt;
| Function call&lt;br /&gt;
| Conductor should be function call not a process&lt;br /&gt;
| OTS 0.9&lt;br /&gt;
|-&lt;br /&gt;
| Properties &lt;br /&gt;
| Merge from 0.1 branch&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions, regression&lt;br /&gt;
| Check that all relevant exceptions from 0.1 are in place&lt;br /&gt;
| Done&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Data Transfer Objects&lt;br /&gt;
| Taxonomy thereof. Pythonic APIs&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| TestDefinition&lt;br /&gt;
| Removed&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| High Level API&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Hub&lt;br /&gt;
| High level procedural code &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Disambiguation Datamodel&lt;br /&gt;
| Clear persistence and data management&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Distributor&lt;br /&gt;
| Opaque Data Transfer&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Default Options&lt;br /&gt;
| Mapping of Default Options to SW product &lt;br /&gt;
| Done&lt;br /&gt;
|- &lt;br /&gt;
| XMLRPC&lt;br /&gt;
| Add XMLRPC interface&lt;br /&gt;
| Done&lt;br /&gt;
|- &lt;br /&gt;
| Allocator&lt;br /&gt;
| API for custom Task allocation &lt;br /&gt;
| OTS 0.8.1&lt;br /&gt;
|- &lt;br /&gt;
| Publisher Plugins&lt;br /&gt;
| API and demos for 3rd party Publisher Plugins &lt;br /&gt;
| Done&lt;br /&gt;
|- &lt;br /&gt;
| Input Plugin&lt;br /&gt;
| Incorporate and mark as deprecated&lt;br /&gt;
| OTS 0.8.1&lt;br /&gt;
|- &lt;br /&gt;
| Parallel Testruns&lt;br /&gt;
| Trigger the same testrun on multiple targets&lt;br /&gt;
| OTS 0.8.1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Worker ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Integrate Conductor&lt;br /&gt;
| &lt;br /&gt;
| Full tool chain running&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Plugins ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Reporting Plugin&lt;br /&gt;
| Clear separation between test tool and reporting  &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Email Plugin &lt;br /&gt;
| Email Plugin for Publisher API &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| QA Reports Plugin &lt;br /&gt;
| Publisher plugin for Meego QA Reports tool&lt;br /&gt;
| Done&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Usability Issues ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Unittests run as sudo&lt;br /&gt;
| Queue size API calls&lt;br /&gt;
| Fixed&lt;br /&gt;
|-&lt;br /&gt;
| Developer Installation out-of-the-box&lt;br /&gt;
| Make as easy as possible. Clear instructions.   &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| API Documentation&lt;br /&gt;
| All component APIs documented &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
| You Tube Video&lt;br /&gt;
| Instruction Video  &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Other Problems ==&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;s&amp;gt;A testrun with invalid sw_product executes a testrun with sandbox-values. An error should be raised and no testrun should be executed.&amp;lt;/s&amp;gt;'''&lt;br /&gt;
* '''&amp;lt;s&amp;gt;Exceptions are not handled and they hit the xmlrpc. request_sync() should always return PASS/FAIL/ERROR. nothing else.&amp;lt;/s&amp;gt;'''&lt;br /&gt;
* '''Incompatible worker version leaves worker in an unknown state and does not report the problem clearly.'''&lt;br /&gt;
&lt;br /&gt;
= Scheduled for 0.9 Release =&lt;br /&gt;
&lt;br /&gt;
== Organisation, maintenance and upgrades == &lt;br /&gt;
&lt;br /&gt;
* Component reorg (Assess a better representation of Components in code layout. Check impact on deployment)&lt;br /&gt;
&lt;br /&gt;
* Better unittest harvester (perhaps ''setup.py test'')&lt;br /&gt;
&lt;br /&gt;
* Evaluate status of dependencies (AMQP 1.0, minixsv supports Python 2.5, setuptools versus distribute etc)&lt;br /&gt;
&lt;br /&gt;
== Conductor ==&lt;br /&gt;
&lt;br /&gt;
* Python APIs&lt;br /&gt;
&lt;br /&gt;
* API stability&lt;br /&gt;
&lt;br /&gt;
* 6Pack integration&lt;br /&gt;
&lt;br /&gt;
* Automated reboot&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
* Remove InputPlugin&lt;br /&gt;
&lt;br /&gt;
* Lower level extension points on Result File Parsing&lt;br /&gt;
&lt;br /&gt;
* 6Pack Integration&lt;br /&gt;
&lt;br /&gt;
= Not scheduled items =&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
* HTTPS XML-RPC&lt;br /&gt;
&lt;br /&gt;
* AMQP connection using SSL encryption&lt;br /&gt;
&lt;br /&gt;
* OTS server and worker working in user mode&lt;br /&gt;
&lt;br /&gt;
* Define firewall settings for OTS server and worker&lt;br /&gt;
&lt;br /&gt;
* User authentication and access rights&lt;br /&gt;
&lt;br /&gt;
* Test request DDoS filter&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus</id>
		<title>Quality/QA-tools/OTS/DevelopmentStatus</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus"/>
				<updated>2011-02-02T10:35:20Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Other Problems */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Release 0.8 unstable =&lt;br /&gt;
&lt;br /&gt;
== Application Framework ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Configuration&lt;br /&gt;
| Single configuration file and format, &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Plugins&lt;br /&gt;
| Runtime discoverable mechanism, with clear usage model&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions&lt;br /&gt;
| An understandable exception handling model. Documented&lt;br /&gt;
| OTS 0.9&lt;br /&gt;
|-&lt;br /&gt;
| Logging&lt;br /&gt;
| A coherent distributed logging system&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Upgrade Capability &lt;br /&gt;
| Worker version management&lt;br /&gt;
| OTS 0.9&lt;br /&gt;
|-&lt;br /&gt;
| Function call&lt;br /&gt;
| Conductor should be function call not a process&lt;br /&gt;
| OTS 0.9&lt;br /&gt;
|-&lt;br /&gt;
| Properties &lt;br /&gt;
| Merge from 0.1 branch&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions, regression&lt;br /&gt;
| Check that all relevant exceptions from 0.1 are in place&lt;br /&gt;
| Done&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Data Transfer Objects&lt;br /&gt;
| Taxonomy thereof. Pythonic APIs&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| TestDefinition&lt;br /&gt;
| Removed&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| High Level API&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Hub&lt;br /&gt;
| High level procedural code &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Disambiguation Datamodel&lt;br /&gt;
| Clear persistence and data management&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Distributor&lt;br /&gt;
| Opaque Data Transfer&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Default Options&lt;br /&gt;
| Mapping of Default Options to SW product &lt;br /&gt;
| Done&lt;br /&gt;
|- &lt;br /&gt;
| XMLRPC&lt;br /&gt;
| Add XMLRPC interface&lt;br /&gt;
| Done&lt;br /&gt;
|- &lt;br /&gt;
| Allocator&lt;br /&gt;
| API for custom Task allocation &lt;br /&gt;
| OTS 0.8.1&lt;br /&gt;
|- &lt;br /&gt;
| Publisher Plugins&lt;br /&gt;
| API and demos for 3rd party Publisher Plugins &lt;br /&gt;
| Done&lt;br /&gt;
|- &lt;br /&gt;
| Input Plugin&lt;br /&gt;
| Incorporate and mark as deprecated&lt;br /&gt;
| OTS 0.8.1&lt;br /&gt;
|- &lt;br /&gt;
| Parallel Testruns&lt;br /&gt;
| Trigger the same testrun on multiple targets&lt;br /&gt;
| OTS 0.8.1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Worker ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Integrate Conductor&lt;br /&gt;
| &lt;br /&gt;
| Full tool chain running&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Plugins ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Reporting Plugin&lt;br /&gt;
| Clear separation between test tool and reporting  &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Email Plugin &lt;br /&gt;
| Email Plugin for Publisher API &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| QA Reports Plugin &lt;br /&gt;
| Publisher plugin for Meego QA Reports tool&lt;br /&gt;
| Done&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Usability Issues ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Unittests run as sudo&lt;br /&gt;
| Queue size API calls&lt;br /&gt;
| Fixed&lt;br /&gt;
|-&lt;br /&gt;
| Developer Installation out-of-the-box&lt;br /&gt;
| Make as easy as possible. Clear instructions.   &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| API Documentation&lt;br /&gt;
| All component APIs documented &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
| You Tube Video&lt;br /&gt;
| Instruction Video  &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Other Problems ==&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;s&amp;gt;A testrun with invalid sw_product executes a testrun with sandbox-values. An error should be raised and no testrun should be executed.&amp;lt;/s&amp;gt;'''&lt;br /&gt;
* '''&amp;lt;s&amp;gt;Exceptions are not handled and they hit the xmlrpc. request_sync() should always return PASS/FAIL/ERROR. nothing else.&amp;lt;/s&amp;gt;'''&lt;br /&gt;
* '''Incompatible worker version leaves worker in an unknown state and does not report the problem clearly.'''&lt;br /&gt;
&lt;br /&gt;
= Scheduled for 0.9 Release =&lt;br /&gt;
&lt;br /&gt;
== Organisation, maintenance and upgrades == &lt;br /&gt;
&lt;br /&gt;
* Component reorg (Assess a better representation of Components in code layout. Check impact on deployment)&lt;br /&gt;
&lt;br /&gt;
* Better unittest harvester (perhaps ''setup.py test'')&lt;br /&gt;
&lt;br /&gt;
* Evaluate status of dependencies (AMQP 1.0, minixsv supports Python 2.5, setuptools versus distribute etc)&lt;br /&gt;
&lt;br /&gt;
== Conductor ==&lt;br /&gt;
&lt;br /&gt;
* Python APIs&lt;br /&gt;
&lt;br /&gt;
* API stability&lt;br /&gt;
&lt;br /&gt;
* 6Pack integration&lt;br /&gt;
&lt;br /&gt;
* Automated reboot&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
* Remove InputPlugin&lt;br /&gt;
&lt;br /&gt;
* Lower level extension points on Result File Parsing&lt;br /&gt;
&lt;br /&gt;
* 6Pack Integration&lt;br /&gt;
&lt;br /&gt;
= Not scheduled items =&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
* HTTPS XML-RPC&lt;br /&gt;
&lt;br /&gt;
* AMQP connection using SSL encryption&lt;br /&gt;
&lt;br /&gt;
* OTS server and worker working in user mode&lt;br /&gt;
&lt;br /&gt;
* Define firewall settings for OTS server and worker&lt;br /&gt;
&lt;br /&gt;
* User authentication and access rights&lt;br /&gt;
&lt;br /&gt;
* Test request DDoS filter&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus</id>
		<title>Quality/QA-tools/OTS/DevelopmentStatus</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus"/>
				<updated>2011-02-02T10:34:50Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Plugins */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Release 0.8 unstable =&lt;br /&gt;
&lt;br /&gt;
== Application Framework ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Configuration&lt;br /&gt;
| Single configuration file and format, &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Plugins&lt;br /&gt;
| Runtime discoverable mechanism, with clear usage model&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions&lt;br /&gt;
| An understandable exception handling model. Documented&lt;br /&gt;
| OTS 0.9&lt;br /&gt;
|-&lt;br /&gt;
| Logging&lt;br /&gt;
| A coherent distributed logging system&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Upgrade Capability &lt;br /&gt;
| Worker version management&lt;br /&gt;
| OTS 0.9&lt;br /&gt;
|-&lt;br /&gt;
| Function call&lt;br /&gt;
| Conductor should be function call not a process&lt;br /&gt;
| OTS 0.9&lt;br /&gt;
|-&lt;br /&gt;
| Properties &lt;br /&gt;
| Merge from 0.1 branch&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions, regression&lt;br /&gt;
| Check that all relevant exceptions from 0.1 are in place&lt;br /&gt;
| Done&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Data Transfer Objects&lt;br /&gt;
| Taxonomy thereof. Pythonic APIs&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| TestDefinition&lt;br /&gt;
| Removed&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| High Level API&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Hub&lt;br /&gt;
| High level procedural code &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Disambiguation Datamodel&lt;br /&gt;
| Clear persistence and data management&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Distributor&lt;br /&gt;
| Opaque Data Transfer&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Default Options&lt;br /&gt;
| Mapping of Default Options to SW product &lt;br /&gt;
| Done&lt;br /&gt;
|- &lt;br /&gt;
| XMLRPC&lt;br /&gt;
| Add XMLRPC interface&lt;br /&gt;
| Done&lt;br /&gt;
|- &lt;br /&gt;
| Allocator&lt;br /&gt;
| API for custom Task allocation &lt;br /&gt;
| OTS 0.8.1&lt;br /&gt;
|- &lt;br /&gt;
| Publisher Plugins&lt;br /&gt;
| API and demos for 3rd party Publisher Plugins &lt;br /&gt;
| Done&lt;br /&gt;
|- &lt;br /&gt;
| Input Plugin&lt;br /&gt;
| Incorporate and mark as deprecated&lt;br /&gt;
| OTS 0.8.1&lt;br /&gt;
|- &lt;br /&gt;
| Parallel Testruns&lt;br /&gt;
| Trigger the same testrun on multiple targets&lt;br /&gt;
| OTS 0.8.1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Worker ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Integrate Conductor&lt;br /&gt;
| &lt;br /&gt;
| Full tool chain running&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Plugins ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Reporting Plugin&lt;br /&gt;
| Clear separation between test tool and reporting  &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Email Plugin &lt;br /&gt;
| Email Plugin for Publisher API &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| QA Reports Plugin &lt;br /&gt;
| Publisher plugin for Meego QA Reports tool&lt;br /&gt;
| Done&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Usability Issues ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Unittests run as sudo&lt;br /&gt;
| Queue size API calls&lt;br /&gt;
| Fixed&lt;br /&gt;
|-&lt;br /&gt;
| Developer Installation out-of-the-box&lt;br /&gt;
| Make as easy as possible. Clear instructions.   &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| API Documentation&lt;br /&gt;
| All component APIs documented &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
| You Tube Video&lt;br /&gt;
| Instruction Video  &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Other Problems ==&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;s&amp;gt;A testrun with invalid sw_product executes a testrun with sandbox-values. An error should be raised and no testrun should be executed.&amp;lt;/s&amp;gt;'''&lt;br /&gt;
* '''Exceptions are not handled and they hit the xmlrpc. request_sync() should always return PASS/FAIL/ERROR. nothing else.'''&lt;br /&gt;
* '''Incompatible worker version leaves worker in an unknown state and does not report the problem clearly.'''&lt;br /&gt;
&lt;br /&gt;
= Scheduled for 0.9 Release =&lt;br /&gt;
&lt;br /&gt;
== Organisation, maintenance and upgrades == &lt;br /&gt;
&lt;br /&gt;
* Component reorg (Assess a better representation of Components in code layout. Check impact on deployment)&lt;br /&gt;
&lt;br /&gt;
* Better unittest harvester (perhaps ''setup.py test'')&lt;br /&gt;
&lt;br /&gt;
* Evaluate status of dependencies (AMQP 1.0, minixsv supports Python 2.5, setuptools versus distribute etc)&lt;br /&gt;
&lt;br /&gt;
== Conductor ==&lt;br /&gt;
&lt;br /&gt;
* Python APIs&lt;br /&gt;
&lt;br /&gt;
* API stability&lt;br /&gt;
&lt;br /&gt;
* 6Pack integration&lt;br /&gt;
&lt;br /&gt;
* Automated reboot&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
* Remove InputPlugin&lt;br /&gt;
&lt;br /&gt;
* Lower level extension points on Result File Parsing&lt;br /&gt;
&lt;br /&gt;
* 6Pack Integration&lt;br /&gt;
&lt;br /&gt;
= Not scheduled items =&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
* HTTPS XML-RPC&lt;br /&gt;
&lt;br /&gt;
* AMQP connection using SSL encryption&lt;br /&gt;
&lt;br /&gt;
* OTS server and worker working in user mode&lt;br /&gt;
&lt;br /&gt;
* Define firewall settings for OTS server and worker&lt;br /&gt;
&lt;br /&gt;
* User authentication and access rights&lt;br /&gt;
&lt;br /&gt;
* Test request DDoS filter&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus</id>
		<title>Quality/QA-tools/OTS/DevelopmentStatus</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus"/>
				<updated>2011-02-02T10:33:47Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Server */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Release 0.8 unstable =&lt;br /&gt;
&lt;br /&gt;
== Application Framework ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Configuration&lt;br /&gt;
| Single configuration file and format, &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Plugins&lt;br /&gt;
| Runtime discoverable mechanism, with clear usage model&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions&lt;br /&gt;
| An understandable exception handling model. Documented&lt;br /&gt;
| OTS 0.9&lt;br /&gt;
|-&lt;br /&gt;
| Logging&lt;br /&gt;
| A coherent distributed logging system&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Upgrade Capability &lt;br /&gt;
| Worker version management&lt;br /&gt;
| OTS 0.9&lt;br /&gt;
|-&lt;br /&gt;
| Function call&lt;br /&gt;
| Conductor should be function call not a process&lt;br /&gt;
| OTS 0.9&lt;br /&gt;
|-&lt;br /&gt;
| Properties &lt;br /&gt;
| Merge from 0.1 branch&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions, regression&lt;br /&gt;
| Check that all relevant exceptions from 0.1 are in place&lt;br /&gt;
| Done&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Data Transfer Objects&lt;br /&gt;
| Taxonomy thereof. Pythonic APIs&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| TestDefinition&lt;br /&gt;
| Removed&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| High Level API&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Hub&lt;br /&gt;
| High level procedural code &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Disambiguation Datamodel&lt;br /&gt;
| Clear persistence and data management&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Distributor&lt;br /&gt;
| Opaque Data Transfer&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Default Options&lt;br /&gt;
| Mapping of Default Options to SW product &lt;br /&gt;
| Done&lt;br /&gt;
|- &lt;br /&gt;
| XMLRPC&lt;br /&gt;
| Add XMLRPC interface&lt;br /&gt;
| Done&lt;br /&gt;
|- &lt;br /&gt;
| Allocator&lt;br /&gt;
| API for custom Task allocation &lt;br /&gt;
| OTS 0.8.1&lt;br /&gt;
|- &lt;br /&gt;
| Publisher Plugins&lt;br /&gt;
| API and demos for 3rd party Publisher Plugins &lt;br /&gt;
| Done&lt;br /&gt;
|- &lt;br /&gt;
| Input Plugin&lt;br /&gt;
| Incorporate and mark as deprecated&lt;br /&gt;
| OTS 0.8.1&lt;br /&gt;
|- &lt;br /&gt;
| Parallel Testruns&lt;br /&gt;
| Trigger the same testrun on multiple targets&lt;br /&gt;
| OTS 0.8.1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Worker ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Integrate Conductor&lt;br /&gt;
| &lt;br /&gt;
| Full tool chain running&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Plugins ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| BIFH Plugin&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| In Progress (Spike completed awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Reporting Plugin&lt;br /&gt;
| Clear separation between test tool and reporting  &lt;br /&gt;
| In Progress (First pass API. Stubbed demo)&lt;br /&gt;
|-&lt;br /&gt;
| Email Plugin &lt;br /&gt;
| Email Plugin for Publisher API &lt;br /&gt;
| Requires system tests&lt;br /&gt;
|-&lt;br /&gt;
| QA Reports Plugin &lt;br /&gt;
| Publisher plugin for Meego QA Reports tool&lt;br /&gt;
| done&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Usability Issues ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Unittests run as sudo&lt;br /&gt;
| Queue size API calls&lt;br /&gt;
| Fixed&lt;br /&gt;
|-&lt;br /&gt;
| Developer Installation out-of-the-box&lt;br /&gt;
| Make as easy as possible. Clear instructions.   &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| API Documentation&lt;br /&gt;
| All component APIs documented &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
| You Tube Video&lt;br /&gt;
| Instruction Video  &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Other Problems ==&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;s&amp;gt;A testrun with invalid sw_product executes a testrun with sandbox-values. An error should be raised and no testrun should be executed.&amp;lt;/s&amp;gt;'''&lt;br /&gt;
* '''Exceptions are not handled and they hit the xmlrpc. request_sync() should always return PASS/FAIL/ERROR. nothing else.'''&lt;br /&gt;
* '''Incompatible worker version leaves worker in an unknown state and does not report the problem clearly.'''&lt;br /&gt;
&lt;br /&gt;
= Scheduled for 0.9 Release =&lt;br /&gt;
&lt;br /&gt;
== Organisation, maintenance and upgrades == &lt;br /&gt;
&lt;br /&gt;
* Component reorg (Assess a better representation of Components in code layout. Check impact on deployment)&lt;br /&gt;
&lt;br /&gt;
* Better unittest harvester (perhaps ''setup.py test'')&lt;br /&gt;
&lt;br /&gt;
* Evaluate status of dependencies (AMQP 1.0, minixsv supports Python 2.5, setuptools versus distribute etc)&lt;br /&gt;
&lt;br /&gt;
== Conductor ==&lt;br /&gt;
&lt;br /&gt;
* Python APIs&lt;br /&gt;
&lt;br /&gt;
* API stability&lt;br /&gt;
&lt;br /&gt;
* 6Pack integration&lt;br /&gt;
&lt;br /&gt;
* Automated reboot&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
* Remove InputPlugin&lt;br /&gt;
&lt;br /&gt;
* Lower level extension points on Result File Parsing&lt;br /&gt;
&lt;br /&gt;
* 6Pack Integration&lt;br /&gt;
&lt;br /&gt;
= Not scheduled items =&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
* HTTPS XML-RPC&lt;br /&gt;
&lt;br /&gt;
* AMQP connection using SSL encryption&lt;br /&gt;
&lt;br /&gt;
* OTS server and worker working in user mode&lt;br /&gt;
&lt;br /&gt;
* Define firewall settings for OTS server and worker&lt;br /&gt;
&lt;br /&gt;
* User authentication and access rights&lt;br /&gt;
&lt;br /&gt;
* Test request DDoS filter&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus</id>
		<title>Quality/QA-tools/OTS/DevelopmentStatus</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus"/>
				<updated>2011-02-02T10:32:12Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Common */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Release 0.8 unstable =&lt;br /&gt;
&lt;br /&gt;
== Application Framework ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Configuration&lt;br /&gt;
| Single configuration file and format, &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Plugins&lt;br /&gt;
| Runtime discoverable mechanism, with clear usage model&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions&lt;br /&gt;
| An understandable exception handling model. Documented&lt;br /&gt;
| OTS 0.9&lt;br /&gt;
|-&lt;br /&gt;
| Logging&lt;br /&gt;
| A coherent distributed logging system&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Upgrade Capability &lt;br /&gt;
| Worker version management&lt;br /&gt;
| OTS 0.9&lt;br /&gt;
|-&lt;br /&gt;
| Function call&lt;br /&gt;
| Conductor should be function call not a process&lt;br /&gt;
| OTS 0.9&lt;br /&gt;
|-&lt;br /&gt;
| Properties &lt;br /&gt;
| Merge from 0.1 branch&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions, regression&lt;br /&gt;
| Check that all relevant exceptions from 0.1 are in place&lt;br /&gt;
| Done&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Data Transfer Objects&lt;br /&gt;
| Taxonomy thereof. Pythonic APIs&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| TestDefinition&lt;br /&gt;
| Removed&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| High Level API&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Hub&lt;br /&gt;
| High level procedural code &lt;br /&gt;
| In Progress&lt;br /&gt;
|-&lt;br /&gt;
| Disambiguation Datamodel&lt;br /&gt;
| Clear persistence and data management&lt;br /&gt;
| In Progress (Persistence parameters separated out)&lt;br /&gt;
|-&lt;br /&gt;
| Distributor&lt;br /&gt;
| Opaque Data Transfer&lt;br /&gt;
| Completed&lt;br /&gt;
|-&lt;br /&gt;
| Default Options&lt;br /&gt;
| Mapping of Default Options to SW product &lt;br /&gt;
| '''BROKEN. Default device options are not handled correctly. see options_factory unit tests'''&lt;br /&gt;
|- &lt;br /&gt;
| XMLRPC&lt;br /&gt;
| Add XMLRPC interface&lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Allocator&lt;br /&gt;
| API for custom Task allocation &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|- &lt;br /&gt;
| Publisher Plugins&lt;br /&gt;
| API and demos for 3rd party Publisher Plugins &lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Input Plugin&lt;br /&gt;
| Incorporate and mark as deprecated&lt;br /&gt;
| '''Not started''' It should be possible to implement this as a publisher. Reporting tools can handle getting target package information.&lt;br /&gt;
|- &lt;br /&gt;
| Allocator Entry Point&lt;br /&gt;
| Add appropriate extension point to allocator to allow custom distribution&lt;br /&gt;
| '''Awaiting merge'''&lt;br /&gt;
|- &lt;br /&gt;
| Parallel Testruns&lt;br /&gt;
| Trigger the same testrun on multiple targets&lt;br /&gt;
| In Progress&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Worker ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Integrate Conductor&lt;br /&gt;
| &lt;br /&gt;
| Full tool chain running&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Plugins ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| BIFH Plugin&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| In Progress (Spike completed awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Reporting Plugin&lt;br /&gt;
| Clear separation between test tool and reporting  &lt;br /&gt;
| In Progress (First pass API. Stubbed demo)&lt;br /&gt;
|-&lt;br /&gt;
| Email Plugin &lt;br /&gt;
| Email Plugin for Publisher API &lt;br /&gt;
| Requires system tests&lt;br /&gt;
|-&lt;br /&gt;
| QA Reports Plugin &lt;br /&gt;
| Publisher plugin for Meego QA Reports tool&lt;br /&gt;
| done&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Usability Issues ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Unittests run as sudo&lt;br /&gt;
| Queue size API calls&lt;br /&gt;
| Fixed&lt;br /&gt;
|-&lt;br /&gt;
| Developer Installation out-of-the-box&lt;br /&gt;
| Make as easy as possible. Clear instructions.   &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| API Documentation&lt;br /&gt;
| All component APIs documented &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
| You Tube Video&lt;br /&gt;
| Instruction Video  &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Other Problems ==&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;s&amp;gt;A testrun with invalid sw_product executes a testrun with sandbox-values. An error should be raised and no testrun should be executed.&amp;lt;/s&amp;gt;'''&lt;br /&gt;
* '''Exceptions are not handled and they hit the xmlrpc. request_sync() should always return PASS/FAIL/ERROR. nothing else.'''&lt;br /&gt;
* '''Incompatible worker version leaves worker in an unknown state and does not report the problem clearly.'''&lt;br /&gt;
&lt;br /&gt;
= Scheduled for 0.9 Release =&lt;br /&gt;
&lt;br /&gt;
== Organisation, maintenance and upgrades == &lt;br /&gt;
&lt;br /&gt;
* Component reorg (Assess a better representation of Components in code layout. Check impact on deployment)&lt;br /&gt;
&lt;br /&gt;
* Better unittest harvester (perhaps ''setup.py test'')&lt;br /&gt;
&lt;br /&gt;
* Evaluate status of dependencies (AMQP 1.0, minixsv supports Python 2.5, setuptools versus distribute etc)&lt;br /&gt;
&lt;br /&gt;
== Conductor ==&lt;br /&gt;
&lt;br /&gt;
* Python APIs&lt;br /&gt;
&lt;br /&gt;
* API stability&lt;br /&gt;
&lt;br /&gt;
* 6Pack integration&lt;br /&gt;
&lt;br /&gt;
* Automated reboot&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
* Remove InputPlugin&lt;br /&gt;
&lt;br /&gt;
* Lower level extension points on Result File Parsing&lt;br /&gt;
&lt;br /&gt;
* 6Pack Integration&lt;br /&gt;
&lt;br /&gt;
= Not scheduled items =&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
* HTTPS XML-RPC&lt;br /&gt;
&lt;br /&gt;
* AMQP connection using SSL encryption&lt;br /&gt;
&lt;br /&gt;
* OTS server and worker working in user mode&lt;br /&gt;
&lt;br /&gt;
* Define firewall settings for OTS server and worker&lt;br /&gt;
&lt;br /&gt;
* User authentication and access rights&lt;br /&gt;
&lt;br /&gt;
* Test request DDoS filter&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus</id>
		<title>Quality/QA-tools/OTS/DevelopmentStatus</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus"/>
				<updated>2011-02-02T10:31:53Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Application Framework */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Release 0.8 unstable =&lt;br /&gt;
&lt;br /&gt;
== Application Framework ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Configuration&lt;br /&gt;
| Single configuration file and format, &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Plugins&lt;br /&gt;
| Runtime discoverable mechanism, with clear usage model&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions&lt;br /&gt;
| An understandable exception handling model. Documented&lt;br /&gt;
| OTS 0.9&lt;br /&gt;
|-&lt;br /&gt;
| Logging&lt;br /&gt;
| A coherent distributed logging system&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Upgrade Capability &lt;br /&gt;
| Worker version management&lt;br /&gt;
| OTS 0.9&lt;br /&gt;
|-&lt;br /&gt;
| Function call&lt;br /&gt;
| Conductor should be function call not a process&lt;br /&gt;
| OTS 0.9&lt;br /&gt;
|-&lt;br /&gt;
| Properties &lt;br /&gt;
| Merge from 0.1 branch&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions, regression&lt;br /&gt;
| Check that all relevant exceptions from 0.1 are in place&lt;br /&gt;
| Done&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Data Transfer Objects&lt;br /&gt;
| Taxonomy thereof. Pythonic APIs&lt;br /&gt;
| Completed (Awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| TestDefinition&lt;br /&gt;
| Removed&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| High Level API&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Hub&lt;br /&gt;
| High level procedural code &lt;br /&gt;
| In Progress&lt;br /&gt;
|-&lt;br /&gt;
| Disambiguation Datamodel&lt;br /&gt;
| Clear persistence and data management&lt;br /&gt;
| In Progress (Persistence parameters separated out)&lt;br /&gt;
|-&lt;br /&gt;
| Distributor&lt;br /&gt;
| Opaque Data Transfer&lt;br /&gt;
| Completed&lt;br /&gt;
|-&lt;br /&gt;
| Default Options&lt;br /&gt;
| Mapping of Default Options to SW product &lt;br /&gt;
| '''BROKEN. Default device options are not handled correctly. see options_factory unit tests'''&lt;br /&gt;
|- &lt;br /&gt;
| XMLRPC&lt;br /&gt;
| Add XMLRPC interface&lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Allocator&lt;br /&gt;
| API for custom Task allocation &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|- &lt;br /&gt;
| Publisher Plugins&lt;br /&gt;
| API and demos for 3rd party Publisher Plugins &lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Input Plugin&lt;br /&gt;
| Incorporate and mark as deprecated&lt;br /&gt;
| '''Not started''' It should be possible to implement this as a publisher. Reporting tools can handle getting target package information.&lt;br /&gt;
|- &lt;br /&gt;
| Allocator Entry Point&lt;br /&gt;
| Add appropriate extension point to allocator to allow custom distribution&lt;br /&gt;
| '''Awaiting merge'''&lt;br /&gt;
|- &lt;br /&gt;
| Parallel Testruns&lt;br /&gt;
| Trigger the same testrun on multiple targets&lt;br /&gt;
| In Progress&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Worker ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Integrate Conductor&lt;br /&gt;
| &lt;br /&gt;
| Full tool chain running&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Plugins ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| BIFH Plugin&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| In Progress (Spike completed awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Reporting Plugin&lt;br /&gt;
| Clear separation between test tool and reporting  &lt;br /&gt;
| In Progress (First pass API. Stubbed demo)&lt;br /&gt;
|-&lt;br /&gt;
| Email Plugin &lt;br /&gt;
| Email Plugin for Publisher API &lt;br /&gt;
| Requires system tests&lt;br /&gt;
|-&lt;br /&gt;
| QA Reports Plugin &lt;br /&gt;
| Publisher plugin for Meego QA Reports tool&lt;br /&gt;
| done&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Usability Issues ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Unittests run as sudo&lt;br /&gt;
| Queue size API calls&lt;br /&gt;
| Fixed&lt;br /&gt;
|-&lt;br /&gt;
| Developer Installation out-of-the-box&lt;br /&gt;
| Make as easy as possible. Clear instructions.   &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| API Documentation&lt;br /&gt;
| All component APIs documented &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
| You Tube Video&lt;br /&gt;
| Instruction Video  &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Other Problems ==&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;s&amp;gt;A testrun with invalid sw_product executes a testrun with sandbox-values. An error should be raised and no testrun should be executed.&amp;lt;/s&amp;gt;'''&lt;br /&gt;
* '''Exceptions are not handled and they hit the xmlrpc. request_sync() should always return PASS/FAIL/ERROR. nothing else.'''&lt;br /&gt;
* '''Incompatible worker version leaves worker in an unknown state and does not report the problem clearly.'''&lt;br /&gt;
&lt;br /&gt;
= Scheduled for 0.9 Release =&lt;br /&gt;
&lt;br /&gt;
== Organisation, maintenance and upgrades == &lt;br /&gt;
&lt;br /&gt;
* Component reorg (Assess a better representation of Components in code layout. Check impact on deployment)&lt;br /&gt;
&lt;br /&gt;
* Better unittest harvester (perhaps ''setup.py test'')&lt;br /&gt;
&lt;br /&gt;
* Evaluate status of dependencies (AMQP 1.0, minixsv supports Python 2.5, setuptools versus distribute etc)&lt;br /&gt;
&lt;br /&gt;
== Conductor ==&lt;br /&gt;
&lt;br /&gt;
* Python APIs&lt;br /&gt;
&lt;br /&gt;
* API stability&lt;br /&gt;
&lt;br /&gt;
* 6Pack integration&lt;br /&gt;
&lt;br /&gt;
* Automated reboot&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
* Remove InputPlugin&lt;br /&gt;
&lt;br /&gt;
* Lower level extension points on Result File Parsing&lt;br /&gt;
&lt;br /&gt;
* 6Pack Integration&lt;br /&gt;
&lt;br /&gt;
= Not scheduled items =&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
* HTTPS XML-RPC&lt;br /&gt;
&lt;br /&gt;
* AMQP connection using SSL encryption&lt;br /&gt;
&lt;br /&gt;
* OTS server and worker working in user mode&lt;br /&gt;
&lt;br /&gt;
* Define firewall settings for OTS server and worker&lt;br /&gt;
&lt;br /&gt;
* User authentication and access rights&lt;br /&gt;
&lt;br /&gt;
* Test request DDoS filter&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus</id>
		<title>Quality/QA-tools/OTS/DevelopmentStatus</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus"/>
				<updated>2011-02-02T10:31:31Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Application Framework */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Release 0.8 unstable =&lt;br /&gt;
&lt;br /&gt;
== Application Framework ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Configuration&lt;br /&gt;
| Single configuration file and format, &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Plugins&lt;br /&gt;
| Runtime discoverable mechanism, with clear usage model&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions&lt;br /&gt;
| An understandable exception handling model. Documented&lt;br /&gt;
| OTS 0.9&lt;br /&gt;
|-&lt;br /&gt;
| Logging&lt;br /&gt;
| A coherent distributed logging system&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Upgrade Capability &lt;br /&gt;
| Worker version management&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Function call&lt;br /&gt;
| Conductor should be function call not a process&lt;br /&gt;
| OTS 0.9&lt;br /&gt;
|-&lt;br /&gt;
| Properties &lt;br /&gt;
| Merge from 0.1 branch&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions, regression&lt;br /&gt;
| Check that all relevant exceptions from 0.1 are in place&lt;br /&gt;
| Done&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Data Transfer Objects&lt;br /&gt;
| Taxonomy thereof. Pythonic APIs&lt;br /&gt;
| Completed (Awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| TestDefinition&lt;br /&gt;
| Removed&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| High Level API&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Hub&lt;br /&gt;
| High level procedural code &lt;br /&gt;
| In Progress&lt;br /&gt;
|-&lt;br /&gt;
| Disambiguation Datamodel&lt;br /&gt;
| Clear persistence and data management&lt;br /&gt;
| In Progress (Persistence parameters separated out)&lt;br /&gt;
|-&lt;br /&gt;
| Distributor&lt;br /&gt;
| Opaque Data Transfer&lt;br /&gt;
| Completed&lt;br /&gt;
|-&lt;br /&gt;
| Default Options&lt;br /&gt;
| Mapping of Default Options to SW product &lt;br /&gt;
| '''BROKEN. Default device options are not handled correctly. see options_factory unit tests'''&lt;br /&gt;
|- &lt;br /&gt;
| XMLRPC&lt;br /&gt;
| Add XMLRPC interface&lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Allocator&lt;br /&gt;
| API for custom Task allocation &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|- &lt;br /&gt;
| Publisher Plugins&lt;br /&gt;
| API and demos for 3rd party Publisher Plugins &lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Input Plugin&lt;br /&gt;
| Incorporate and mark as deprecated&lt;br /&gt;
| '''Not started''' It should be possible to implement this as a publisher. Reporting tools can handle getting target package information.&lt;br /&gt;
|- &lt;br /&gt;
| Allocator Entry Point&lt;br /&gt;
| Add appropriate extension point to allocator to allow custom distribution&lt;br /&gt;
| '''Awaiting merge'''&lt;br /&gt;
|- &lt;br /&gt;
| Parallel Testruns&lt;br /&gt;
| Trigger the same testrun on multiple targets&lt;br /&gt;
| In Progress&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Worker ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Integrate Conductor&lt;br /&gt;
| &lt;br /&gt;
| Full tool chain running&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Plugins ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| BIFH Plugin&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| In Progress (Spike completed awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Reporting Plugin&lt;br /&gt;
| Clear separation between test tool and reporting  &lt;br /&gt;
| In Progress (First pass API. Stubbed demo)&lt;br /&gt;
|-&lt;br /&gt;
| Email Plugin &lt;br /&gt;
| Email Plugin for Publisher API &lt;br /&gt;
| Requires system tests&lt;br /&gt;
|-&lt;br /&gt;
| QA Reports Plugin &lt;br /&gt;
| Publisher plugin for Meego QA Reports tool&lt;br /&gt;
| done&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Usability Issues ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Unittests run as sudo&lt;br /&gt;
| Queue size API calls&lt;br /&gt;
| Fixed&lt;br /&gt;
|-&lt;br /&gt;
| Developer Installation out-of-the-box&lt;br /&gt;
| Make as easy as possible. Clear instructions.   &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| API Documentation&lt;br /&gt;
| All component APIs documented &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
| You Tube Video&lt;br /&gt;
| Instruction Video  &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Other Problems ==&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;s&amp;gt;A testrun with invalid sw_product executes a testrun with sandbox-values. An error should be raised and no testrun should be executed.&amp;lt;/s&amp;gt;'''&lt;br /&gt;
* '''Exceptions are not handled and they hit the xmlrpc. request_sync() should always return PASS/FAIL/ERROR. nothing else.'''&lt;br /&gt;
* '''Incompatible worker version leaves worker in an unknown state and does not report the problem clearly.'''&lt;br /&gt;
&lt;br /&gt;
= Scheduled for 0.9 Release =&lt;br /&gt;
&lt;br /&gt;
== Organisation, maintenance and upgrades == &lt;br /&gt;
&lt;br /&gt;
* Component reorg (Assess a better representation of Components in code layout. Check impact on deployment)&lt;br /&gt;
&lt;br /&gt;
* Better unittest harvester (perhaps ''setup.py test'')&lt;br /&gt;
&lt;br /&gt;
* Evaluate status of dependencies (AMQP 1.0, minixsv supports Python 2.5, setuptools versus distribute etc)&lt;br /&gt;
&lt;br /&gt;
== Conductor ==&lt;br /&gt;
&lt;br /&gt;
* Python APIs&lt;br /&gt;
&lt;br /&gt;
* API stability&lt;br /&gt;
&lt;br /&gt;
* 6Pack integration&lt;br /&gt;
&lt;br /&gt;
* Automated reboot&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
* Remove InputPlugin&lt;br /&gt;
&lt;br /&gt;
* Lower level extension points on Result File Parsing&lt;br /&gt;
&lt;br /&gt;
* 6Pack Integration&lt;br /&gt;
&lt;br /&gt;
= Not scheduled items =&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
* HTTPS XML-RPC&lt;br /&gt;
&lt;br /&gt;
* AMQP connection using SSL encryption&lt;br /&gt;
&lt;br /&gt;
* OTS server and worker working in user mode&lt;br /&gt;
&lt;br /&gt;
* Define firewall settings for OTS server and worker&lt;br /&gt;
&lt;br /&gt;
* User authentication and access rights&lt;br /&gt;
&lt;br /&gt;
* Test request DDoS filter&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs</id>
		<title>Quality/QA-tools/OTS/DeveloperDocs</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs"/>
				<updated>2011-01-28T13:49:39Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Technology */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OTS - Open Testing Service =&lt;br /&gt;
&lt;br /&gt;
== Related Documentation ==&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/Architecture]]&lt;br /&gt;
* [[Quality/QA-tools/OTS/Glossary]]&lt;br /&gt;
* [http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/Transition0.1-0.8 Making transition from 0.1 to 0.8]&lt;br /&gt;
&lt;br /&gt;
== Synopsis ==&lt;br /&gt;
&lt;br /&gt;
OTS is a Distributed Test System that takes a Data Driven Approach using XML Files to allow parallel testing of Applications on evolving Hardware platforms.  &lt;br /&gt;
&lt;br /&gt;
Design has been driven by the need for a language neutral test platform that allows testing under different device architectures in parallel.&lt;br /&gt;
&lt;br /&gt;
== High Level Overview ==  &lt;br /&gt;
&lt;br /&gt;
OTS allows a Test Sequence to be fanned out from a hub known as a '''Distributor''' to a remote machine known as a '''Worker'''. &lt;br /&gt;
Each '''Worker''' has a '''Device Group''' associated with it, this is defined in the configuration. The Tests are routed to the '''Worker''' &lt;br /&gt;
on the basis of the '''Device Group'''.&lt;br /&gt;
&lt;br /&gt;
An XML '''Test Definition File''' describes the Tests that are run. The results are returned to the '''Distributor''' in an XML '''Results File'''.&lt;br /&gt;
 &lt;br /&gt;
The '''Distributor''' takes a '''Device Group''' and '''Timeout''' as inputs, as well as the '''Command''' for running '''Tasks'''. Tests are run within a '''Task''' which  &lt;br /&gt;
is currently run as a process. The '''Command''' will typically take a path to the '''Test Definition File''' as an input. &lt;br /&gt;
If the process exceeds the '''Timeout''' the '''Task''' is stopped (the process is killed). &lt;br /&gt;
&lt;br /&gt;
A number of '''Tasks''' can be added to a '''Testrun'''. The '''Testrun''' will normally wait for all '''Tasks''' to finish before completion. &lt;br /&gt;
&lt;br /&gt;
Data (status, error and results) are communicated back from the '''Task''' to the '''Worker'''.  The '''Results Object''' is a container for the files outputted: '''Test Definition File''',  '''Results File''' &lt;br /&gt;
and any other files produced by the test as well as metadata relating to the run. &lt;br /&gt;
&lt;br /&gt;
== Technology ==&lt;br /&gt;
&lt;br /&gt;
OTS is written in Python 2.6.&lt;br /&gt;
&lt;br /&gt;
OTS has the following FIXME (provided as separate PDF)&lt;br /&gt;
&lt;br /&gt;
=== XmlFileFormats ===&lt;br /&gt;
&lt;br /&gt;
The XML file formats provide the datum for the system.&lt;br /&gt;
&lt;br /&gt;
Download [http://meego.gitorious.org/meego-quality-assurance/test-definition/trees/master them] and add the path to the '''results_xsd''' parameter in your [http://meego.gitorious.org/meego-quality-assurance/ots/blobs/dev_branch_0.8/ots.server/ots/server/ots_server.ini ots_server.ini] file&lt;br /&gt;
&lt;br /&gt;
=== Third Party Dependencies ===&lt;br /&gt;
&lt;br /&gt;
==== RabbitMQ ====&lt;br /&gt;
&lt;br /&gt;
You need to install [http://www.rabbitmq.com/server.html RabbitMQ]. &lt;br /&gt;
&lt;br /&gt;
===== Managing the Queues =====&lt;br /&gt;
&lt;br /&gt;
If you need to delete or empty the queues there are [http://meego.gitorious.org/meego-quality-assurance/ots/trees/master/ots.server/ots/server/distributor/dev_utils utilities] to help with this.&lt;br /&gt;
&lt;br /&gt;
==== Python Packages ====&lt;br /&gt;
&lt;br /&gt;
The following python packages are needed&lt;br /&gt;
&lt;br /&gt;
* [http://pypi.python.org/pypi/setuptools setuptools]&lt;br /&gt;
&lt;br /&gt;
* [http://www.voidspace.org.uk/python/configobj.html configobj]&lt;br /&gt;
 &lt;br /&gt;
* [http://pypi.python.org/pypi/multiprocessing multiprocessing]&lt;br /&gt;
&lt;br /&gt;
* [http://code.google.com/p/py-amqplib/ pyamqplib] (version 0.6.1 or newer)&lt;br /&gt;
&lt;br /&gt;
* [http://www.familieleuthe.de/DownloadMiniXsv.html minixsv]&lt;br /&gt;
&lt;br /&gt;
* [http://www.djangoproject.com/download/1.1.2/tarball/ django]&lt;br /&gt;
&lt;br /&gt;
* [http://code.google.com/p/python-nose/ nose]&lt;br /&gt;
&lt;br /&gt;
== Diving In ==&lt;br /&gt;
&lt;br /&gt;
The following steps show how to get a Development Environment up and running&lt;br /&gt;
&lt;br /&gt;
=== 1. Install Dependencies ===&lt;br /&gt;
&lt;br /&gt;
* Install the Third Party Dependencies&lt;br /&gt;
&lt;br /&gt;
* Get the XML File Formats and set the OTS_TESTDEFINITION environment variable&lt;br /&gt;
&lt;br /&gt;
=== 2. Build the Eggs === &lt;br /&gt;
&lt;br /&gt;
From the root directory&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ./setup.sh&lt;br /&gt;
 source ./paths.sh&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Unittests ===&lt;br /&gt;
&lt;br /&gt;
Run the unittests from the root directory&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ./nose.sh&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Component Tests ===&lt;br /&gt;
&lt;br /&gt;
Component Tests run high level tests on an OTS Component using Mocks of the dependencies.&lt;br /&gt;
&lt;br /&gt;
You can run these with the component_tests shell script in the root directory. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ./component_tests.sh&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. Hello OTS World ===&lt;br /&gt;
&lt;br /&gt;
The source contains a simple demonstration of the way the key elements work. &lt;br /&gt;
&lt;br /&gt;
==== 1. Open two terminal windows. ====&lt;br /&gt;
&lt;br /&gt;
==== 2. In the first window run the server ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 cd $SERVER&lt;br /&gt;
 cd hub/demos&lt;br /&gt;
 python demo_hub.py&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3. You should see this: ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 &amp;lt;snip&amp;gt;&lt;br /&gt;
 20XX-XX-XX XX:XX:XX,XXX - ots.server.distributor.taskrunner - DEBUG - Sending command '['echo', 'hello world']' with key 'foo'&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4. In the second window run the worker ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 cd $WORKER&lt;br /&gt;
 python worker.py -c config.ini&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5. Now in the Server terminal the command should run to completion. You should see the following line in the logs: ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  20XX-XX-XX XX:XX:XX,XXX - ots.worker.command - DEBUG - process.communicate() returned echo hello world&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It will raise a PackageException. This is normal as no Tasks that are run return Packages to the Server&lt;br /&gt;
&lt;br /&gt;
==== 6. And on the logs on the Worker side should contain: ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 XXXX-XX-XX XX:XX:XX,XXX - ots.worker.command - DEBUG - process.communicate() returned echo hello world&lt;br /&gt;
 XXXX-XX-XX XX:XX:XX,XXX - ots.worker.task_broker - DEBUG - Task in state: 'finish'&lt;br /&gt;
 XXXX-XX-XX XX:XX:XX,XXX - ots.worker.task_broker - INFO - Recommence consume on queue: foo&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation == &lt;br /&gt;
&lt;br /&gt;
It is intended that the '''Distributor''' and each '''Worker''' should be installed to separate machines.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Distributor ===&lt;br /&gt;
&lt;br /&gt;
The format of the configuration file is as follows. &lt;br /&gt;
&lt;br /&gt;
The `host` is the name of the RabbitMQ server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [Client]&lt;br /&gt;
 host =  localhost&lt;br /&gt;
 vhost = / &lt;br /&gt;
 port = 5672&lt;br /&gt;
 username = guest&lt;br /&gt;
 password = guest&lt;br /&gt;
 queue = FIXME&lt;br /&gt;
 consumer_tag = worker&lt;br /&gt;
 services_exchange = services&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Worker ===&lt;br /&gt;
&lt;br /&gt;
Edit your config.ini so that the &lt;br /&gt;
&lt;br /&gt;
 * `queue`&lt;br /&gt;
 * `routing_key`&lt;br /&gt;
 * `services_exchange` &lt;br /&gt;
&lt;br /&gt;
Are set for your '''Device Group'''. &lt;br /&gt;
&lt;br /&gt;
And the `host` is the name of your RabbitMQ server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [Worker]&lt;br /&gt;
 host =  localhost&lt;br /&gt;
 vhost = / &lt;br /&gt;
 port = 5672&lt;br /&gt;
 username = guest&lt;br /&gt;
 password = guest&lt;br /&gt;
 queue = foo&lt;br /&gt;
 routing_key = foo&lt;br /&gt;
 services_exchange = foo&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Starting the Worker ====&lt;br /&gt;
&lt;br /&gt;
To start your Worker:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 python worker.py -c config.ini&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Automated System Tests ==&lt;br /&gt;
&lt;br /&gt;
Automated system tests are available in ots.system_tests. They trigger various testruns with xmlrpc and check return value and log messages.&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
&lt;br /&gt;
* Fully functional OTS system with one worker.&lt;br /&gt;
* A SW Product &amp;quot;ots-system-tests&amp;quot; configured so that it defaults to the worker.&lt;br /&gt;
* A meego image with test-definition-tests and testrunner-lite-regression-tests.&lt;br /&gt;
* Django based advanced OTS setup.&lt;br /&gt;
* BeautifulSoup python library.&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
&lt;br /&gt;
* make the system test image available for the workers. (for example copy it to your apache static content directory /var/www/static/)&lt;br /&gt;
* Modify system_tests.conf in ots.system_tests directory to match your system.&lt;br /&gt;
* Make sure all the urls in system_tests.conf work.&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
&lt;br /&gt;
* System tests execute multiple full testruns. Running all tests can easily take more than 1.5 hours with N900 worker.&lt;br /&gt;
* Make sure there's no other activities ongoing in the system while running the tests.&lt;br /&gt;
* Some error handling tests expect certain devicegroups and sw products _not_ to be available. If these test cases fail you can remove those queues with ots tools.&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
&lt;br /&gt;
OTS is distributed under an LGPL license.&lt;br /&gt;
&lt;br /&gt;
== Contributions ==&lt;br /&gt;
&lt;br /&gt;
From [http://meego.gitorious.org/meego-quality-assurance/ qa-tools]&lt;br /&gt;
&lt;br /&gt;
== Wiki ==&lt;br /&gt;
&lt;br /&gt;
[[Quality/QA-tools/OTS | OTS Wiki Home]]&lt;br /&gt;
&lt;br /&gt;
== Source Code Documentation ==&lt;br /&gt;
&lt;br /&gt;
FIXME&lt;br /&gt;
&lt;br /&gt;
== Mailing List ==&lt;br /&gt;
&lt;br /&gt;
FIXME&lt;br /&gt;
&lt;br /&gt;
== IRC Channel ==&lt;br /&gt;
&lt;br /&gt;
The #meego-qa-tools irc channel in freenode&lt;br /&gt;
&lt;br /&gt;
== Bugs == &lt;br /&gt;
&lt;br /&gt;
The [http://bugs.meego.com/ Meego bugs page]&lt;br /&gt;
&lt;br /&gt;
== Platform Dependencies ==&lt;br /&gt;
&lt;br /&gt;
OTS is tested to run on Linux only. Productization environment is Ubuntu 8.04 LTS (Long Term Support).&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/DeveloperDocs/Components | Components]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/DeveloperDocs/Server | Server]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/DeveloperDocs/Plugins | Plugins]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/DeveloperDocs/DataFlow | DataFlow]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/DeveloperDocs/Behaviour | Behaviour]]&lt;br /&gt;
&lt;br /&gt;
== APIs ==&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/DeveloperDocs/OTS_Server_API | Server]]&lt;br /&gt;
&lt;br /&gt;
* [http://meego.gitorious.org/meego-quality-assurance/ots/blobs/dev_branch_0.8/ots.server/ots/server/distributor/api.py Distributor]&lt;br /&gt;
&lt;br /&gt;
* [http://meego.gitorious.org/meego-quality-assurance/ots/blobs/dev_branch_0.8/ots.results/ots/results/api.py Results]&lt;br /&gt;
&lt;br /&gt;
* [http://meego.gitorious.org/meego-quality-assurance/ots/blobs/dev_branch_0.8/ots.worker/ots/worker/api.py Worker]&lt;br /&gt;
&lt;br /&gt;
== Extending OTS ==&lt;br /&gt;
&lt;br /&gt;
You can extend OTS with your own [http://wiki.meego.com/Quality/QA-tools/OTS/CreatingAPublisher Publisher]&lt;br /&gt;
&lt;br /&gt;
== Experimental ==&lt;br /&gt;
&lt;br /&gt;
Documentation for experimental branches, spikes, WIPs etc. can be found in [[Quality/QA-tools/OTS/DeveloperDocs/Experimental]].&lt;br /&gt;
&lt;br /&gt;
== Analysis ==&lt;br /&gt;
&lt;br /&gt;
[[Quality/QA-tools/OTS/DeveloperDocs/ErrorSituations| OTS 0.1 Error Situations]]&lt;br /&gt;
&lt;br /&gt;
[[Quality/QA-tools/OTS/DeveloperDocs/TypicalUsage| Typical OTS users and usage scenarios]]&lt;br /&gt;
&lt;br /&gt;
== Project Planning ==&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/Roadmap | Roadmap]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/DevelopmentStatus | DevelopmentStatus]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/Meetings | Meetings]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/ReleaseChecklist | ReleaseChecklist]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/ReleasePractices | ReleasePractices]]&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS</id>
		<title>Quality/QA-tools/OTS</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS"/>
				<updated>2011-01-28T13:24:02Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* OTS Index */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OTS Index =&lt;br /&gt;
&lt;br /&gt;
Welcome to the Open Test System (OTS) Wiki Index.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
OTS is the '''Open Test Service''' for testing software systems on evolving hardware architectures.&lt;br /&gt;
  &lt;br /&gt;
It was born out of the test framework incrementally developed for use on [http://maemo.org/ Maemo] project and is in use for 24/7 testing service by [http://www.nokia.com/ Nokia].&lt;br /&gt;
&lt;br /&gt;
=== What it does ===&lt;br /&gt;
&lt;br /&gt;
'''OTS has the following primary functions:'''&lt;br /&gt;
&lt;br /&gt;
* Distribution&lt;br /&gt;
* Load balancing&lt;br /&gt;
* Remote command running&lt;br /&gt;
* Hardware control&lt;br /&gt;
* Data Acquisition&lt;br /&gt;
* Data Analysis&lt;br /&gt;
&lt;br /&gt;
'''OTS offers the following services:'''&lt;br /&gt;
&lt;br /&gt;
* Fully Open Source&lt;br /&gt;
* Web server &lt;br /&gt;
* Extensible Architecture&lt;br /&gt;
* Interoperability&lt;br /&gt;
&lt;br /&gt;
=== Why it does it ===&lt;br /&gt;
&lt;br /&gt;
Quite simply: to increase efficiency and quality of on-device software testing. &lt;br /&gt;
&lt;br /&gt;
=== How it does it ===&lt;br /&gt;
&lt;br /&gt;
The [[Quality/QA-tools/OTS/Architecture | System Overview]] gives an outline of how OTS works&lt;br /&gt;
&lt;br /&gt;
=== Installing ===&lt;br /&gt;
&lt;br /&gt;
Follow the [[Quality/QA-tools/OTS/UserDocumentation/Installation | installation instructions]]&lt;br /&gt;
&lt;br /&gt;
== Index ==&lt;br /&gt;
&lt;br /&gt;
=== Developer Documentation ===&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/Architecture | Overview]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/DeveloperDocs | Developers Start Here ]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/DevelopmentGuidelines | Development Guidelines]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/Contributions | Contributions]]&lt;br /&gt;
&lt;br /&gt;
=== Terminology ===&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/Glossary | Glossary]]&lt;br /&gt;
&lt;br /&gt;
=== System Administration ===&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/Routing | Testrun Routing]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/Protocols | Ports and Protocols]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/Configuration | Configuration]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/DeveloperDocs/OTS_Timeouts | Timeouts]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/OptimisingThroughput | Optimising Throughput]]&lt;br /&gt;
&lt;br /&gt;
=== Standards and Conventions ===&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/Packages | Packages]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/ErrorCodes | Error Codes]]&lt;br /&gt;
&lt;br /&gt;
=== User Documentation ===&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/UserDocumentation/Installation | Installation]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/UserDocumentation | User Documentation]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/Flashing | Flashing]]&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs</id>
		<title>Quality/QA-tools/OTS/DeveloperDocs</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs"/>
				<updated>2011-01-13T11:33:59Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Python Packages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OTS - Open Testing Service =&lt;br /&gt;
&lt;br /&gt;
== Related Documentation ==&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/Architecture]]&lt;br /&gt;
* [[Quality/QA-tools/OTS/Glossary]]&lt;br /&gt;
* [http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/Transition0.1-0.8 Making transition from 0.1 to 0.8]&lt;br /&gt;
&lt;br /&gt;
== Synopsis ==&lt;br /&gt;
&lt;br /&gt;
OTS is a Distributed Test System that takes a Data Driven Approach using XML Files to allow parallel testing of Applications on evolving Hardware platforms.  &lt;br /&gt;
&lt;br /&gt;
Design has been driven by the need for a language neutral test platform that allows testing under different device architectures in parallel.&lt;br /&gt;
&lt;br /&gt;
== High Level Overview ==  &lt;br /&gt;
&lt;br /&gt;
OTS allows a Test Sequence to be fanned out from a hub known as a '''Distributor''' to a remote machine known as a '''Worker'''. &lt;br /&gt;
Each '''Worker''' has a '''Device Group''' associated with it, this is defined in the configuration. The Tests are routed to the '''Worker''' &lt;br /&gt;
on the basis of the '''Device Group'''.&lt;br /&gt;
&lt;br /&gt;
An XML '''Test Definition File''' describes the Tests that are run. The results are returned to the '''Distributor''' in an XML '''Results File'''.&lt;br /&gt;
 &lt;br /&gt;
The '''Distributor''' takes a '''Device Group''' and '''Timeout''' as inputs, as well as the '''Command''' for running '''Tasks'''. Tests are run within a '''Task''' which  &lt;br /&gt;
is currently run as a process. The '''Command''' will typically take a path to the '''Test Definition File''' as an input. &lt;br /&gt;
If the process exceeds the '''Timeout''' the '''Task''' is stopped (the process is killed). &lt;br /&gt;
&lt;br /&gt;
A number of '''Tasks''' can be added to a '''Testrun'''. The '''Testrun''' will normally wait for all '''Tasks''' to finish before completion. &lt;br /&gt;
&lt;br /&gt;
Data (status, error and results) are communicated back from the '''Task''' to the '''Worker'''.  The '''Results Object''' is a container for the files outputted: '''Test Definition File''',  '''Results File''' &lt;br /&gt;
and any other files produced by the test as well as metadata relating to the run. &lt;br /&gt;
&lt;br /&gt;
== Technology ==&lt;br /&gt;
&lt;br /&gt;
OTS is written in Python 2.5.&lt;br /&gt;
&lt;br /&gt;
OTS has the following FIXME (provided as separate PDF)&lt;br /&gt;
&lt;br /&gt;
=== XmlFileFormats ===&lt;br /&gt;
&lt;br /&gt;
The XML file formats provide the datum for the system.&lt;br /&gt;
&lt;br /&gt;
Download [http://meego.gitorious.org/meego-quality-assurance/test-definition/trees/master them] and add the path to the '''results_xsd''' parameter in your [http://meego.gitorious.org/meego-quality-assurance/ots/blobs/dev_branch_0.8/ots.server/ots/server/ots_server.ini ots_server.ini] file&lt;br /&gt;
&lt;br /&gt;
=== Third Party Dependencies ===&lt;br /&gt;
&lt;br /&gt;
==== RabbitMQ ====&lt;br /&gt;
&lt;br /&gt;
You need to install [http://www.rabbitmq.com/server.html RabbitMQ]. &lt;br /&gt;
&lt;br /&gt;
===== Managing the Queues =====&lt;br /&gt;
&lt;br /&gt;
If you need to delete or empty the queues there are [http://meego.gitorious.org/meego-quality-assurance/ots/trees/master/ots.server/ots/server/distributor/dev_utils utilities] to help with this.&lt;br /&gt;
&lt;br /&gt;
==== Python Packages ====&lt;br /&gt;
&lt;br /&gt;
The following python packages are needed&lt;br /&gt;
&lt;br /&gt;
* [http://pypi.python.org/pypi/setuptools setuptools]&lt;br /&gt;
&lt;br /&gt;
* [http://www.voidspace.org.uk/python/configobj.html configobj]&lt;br /&gt;
 &lt;br /&gt;
* [http://pypi.python.org/pypi/multiprocessing multiprocessing]&lt;br /&gt;
&lt;br /&gt;
* [http://code.google.com/p/py-amqplib/ pyamqplib] (version 0.6.1 or newer)&lt;br /&gt;
&lt;br /&gt;
* [http://www.familieleuthe.de/DownloadMiniXsv.html minixsv]&lt;br /&gt;
&lt;br /&gt;
* [http://www.djangoproject.com/download/1.1.2/tarball/ django]&lt;br /&gt;
&lt;br /&gt;
* [http://code.google.com/p/python-nose/ nose]&lt;br /&gt;
&lt;br /&gt;
== Diving In ==&lt;br /&gt;
&lt;br /&gt;
The following steps show how to get a Development Environment up and running&lt;br /&gt;
&lt;br /&gt;
=== 1. Install Dependencies ===&lt;br /&gt;
&lt;br /&gt;
* Install the Third Party Dependencies&lt;br /&gt;
&lt;br /&gt;
* Get the XML File Formats and set the OTS_TESTDEFINITION environment variable&lt;br /&gt;
&lt;br /&gt;
=== 2. Build the Eggs === &lt;br /&gt;
&lt;br /&gt;
From the root directory&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ./setup.sh&lt;br /&gt;
 source ./paths.sh&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Unittests ===&lt;br /&gt;
&lt;br /&gt;
Run the unittests from the root directory&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ./nose.sh&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Component Tests ===&lt;br /&gt;
&lt;br /&gt;
Component Tests run high level tests on an OTS Component using Mocks of the dependencies.&lt;br /&gt;
&lt;br /&gt;
You can run these with the component_tests shell script in the root directory. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ./component_tests.sh&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. Hello OTS World ===&lt;br /&gt;
&lt;br /&gt;
The source contains a simple demonstration of the way the key elements work. &lt;br /&gt;
&lt;br /&gt;
==== 1. Open two terminal windows. ====&lt;br /&gt;
&lt;br /&gt;
==== 2. In the first window run the server ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 cd $SERVER&lt;br /&gt;
 cd hub/demos&lt;br /&gt;
 python demo_hub.py&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3. You should see this: ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 &amp;lt;snip&amp;gt;&lt;br /&gt;
 20XX-XX-XX XX:XX:XX,XXX - ots.server.distributor.taskrunner - DEBUG - Sending command '['echo', 'hello world']' with key 'foo'&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4. In the second window run the worker ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 cd $WORKER&lt;br /&gt;
 python worker.py -c config.ini&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5. Now in the Server terminal the command should run to completion. You should see the following line in the logs: ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  20XX-XX-XX XX:XX:XX,XXX - ots.worker.command - DEBUG - process.communicate() returned echo hello world&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It will raise a PackageException. This is normal as no Tasks that are run return Packages to the Server&lt;br /&gt;
&lt;br /&gt;
==== 6. And on the logs on the Worker side should contain: ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 XXXX-XX-XX XX:XX:XX,XXX - ots.worker.command - DEBUG - process.communicate() returned echo hello world&lt;br /&gt;
 XXXX-XX-XX XX:XX:XX,XXX - ots.worker.task_broker - DEBUG - Task in state: 'finish'&lt;br /&gt;
 XXXX-XX-XX XX:XX:XX,XXX - ots.worker.task_broker - INFO - Recommence consume on queue: foo&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation == &lt;br /&gt;
&lt;br /&gt;
It is intended that the '''Distributor''' and each '''Worker''' should be installed to separate machines.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Distributor ===&lt;br /&gt;
&lt;br /&gt;
The format of the configuration file is as follows. &lt;br /&gt;
&lt;br /&gt;
The `host` is the name of the RabbitMQ server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [Client]&lt;br /&gt;
 host =  localhost&lt;br /&gt;
 vhost = / &lt;br /&gt;
 port = 5672&lt;br /&gt;
 username = guest&lt;br /&gt;
 password = guest&lt;br /&gt;
 queue = FIXME&lt;br /&gt;
 consumer_tag = worker&lt;br /&gt;
 services_exchange = services&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Worker ===&lt;br /&gt;
&lt;br /&gt;
Edit your config.ini so that the &lt;br /&gt;
&lt;br /&gt;
 * `queue`&lt;br /&gt;
 * `routing_key`&lt;br /&gt;
 * `services_exchange` &lt;br /&gt;
&lt;br /&gt;
Are set for your '''Device Group'''. &lt;br /&gt;
&lt;br /&gt;
And the `host` is the name of your RabbitMQ server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [Worker]&lt;br /&gt;
 host =  localhost&lt;br /&gt;
 vhost = / &lt;br /&gt;
 port = 5672&lt;br /&gt;
 username = guest&lt;br /&gt;
 password = guest&lt;br /&gt;
 queue = foo&lt;br /&gt;
 routing_key = foo&lt;br /&gt;
 services_exchange = foo&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Starting the Worker ====&lt;br /&gt;
&lt;br /&gt;
To start your Worker:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 python worker.py -c config.ini&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Automated System Tests ==&lt;br /&gt;
&lt;br /&gt;
''''' Not yet merged to dev_branch_0.8 '''''&lt;br /&gt;
&lt;br /&gt;
Automated system tests are available in ots.system_tests. They trigger various testruns with xmlrpc and check return value and log messages.&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
&lt;br /&gt;
* Fully functional OTS system with one worker.&lt;br /&gt;
* A SW Product &amp;quot;ots-system-tests&amp;quot; configured so that it defaults to the worker.&lt;br /&gt;
* A meego image with test-definition-tests and testrunner-lite-regression-tests.&lt;br /&gt;
* Django based advanced OTS setup.&lt;br /&gt;
* BeautifulSoup python library.&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
&lt;br /&gt;
* make the system test image available for the workers. (for example copy it to your apache static content directory /var/www/static/)&lt;br /&gt;
* Modify system_tests.conf in ots.system_tests directory to match your system.&lt;br /&gt;
* Make sure all the urls in system_tests.conf work.&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
&lt;br /&gt;
* System tests execute multiple full testruns. Running all tests can easily take more than 1.5 hours with N900 worker.&lt;br /&gt;
* Make sure there's no other activities ongoing in the system while running the tests.&lt;br /&gt;
* Some error handling tests expect certain devicegroups and sw products _not_ to be available. If these test cases fail you can remove those queues with ots tools.&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
&lt;br /&gt;
OTS is distributed under an LGPL license.&lt;br /&gt;
&lt;br /&gt;
== Contributions ==&lt;br /&gt;
&lt;br /&gt;
From [http://meego.gitorious.org/meego-quality-assurance/ qa-tools]&lt;br /&gt;
&lt;br /&gt;
== Wiki ==&lt;br /&gt;
&lt;br /&gt;
[[Quality/QA-tools/OTS | OTS Wiki Home]]&lt;br /&gt;
&lt;br /&gt;
== Source Code Documentation ==&lt;br /&gt;
&lt;br /&gt;
FIXME&lt;br /&gt;
&lt;br /&gt;
== Mailing List ==&lt;br /&gt;
&lt;br /&gt;
FIXME&lt;br /&gt;
&lt;br /&gt;
== IRC Channel ==&lt;br /&gt;
&lt;br /&gt;
The #meego-qa-tools irc channel in freenode&lt;br /&gt;
&lt;br /&gt;
== Bugs == &lt;br /&gt;
&lt;br /&gt;
The [http://bugs.meego.com/ Meego bugs page]&lt;br /&gt;
&lt;br /&gt;
== Platform Dependencies ==&lt;br /&gt;
&lt;br /&gt;
OTS is tested to run on Linux only. Productization environment is Ubuntu 8.04 LTS (Long Term Support).&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/DeveloperDocs/Components | Components]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/DeveloperDocs/Server | Server]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/DeveloperDocs/Plugins | Plugins]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/DeveloperDocs/DataFlow | DataFlow]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/DeveloperDocs/Behaviour | Behaviour]]&lt;br /&gt;
&lt;br /&gt;
== APIs ==&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/DeveloperDocs/OTS_Server_API | Server]]&lt;br /&gt;
&lt;br /&gt;
* [http://meego.gitorious.org/meego-quality-assurance/ots/blobs/dev_branch_0.8/ots.server/ots/server/distributor/api.py Distributor]&lt;br /&gt;
&lt;br /&gt;
* [http://meego.gitorious.org/meego-quality-assurance/ots/blobs/dev_branch_0.8/ots.results/ots/results/api.py Results]&lt;br /&gt;
&lt;br /&gt;
* [http://meego.gitorious.org/meego-quality-assurance/ots/blobs/dev_branch_0.8/ots.worker/ots/worker/api.py Worker]&lt;br /&gt;
&lt;br /&gt;
== Extending OTS ==&lt;br /&gt;
&lt;br /&gt;
You can extend OTS with your own [http://wiki.meego.com/Quality/QA-tools/OTS/CreatingAPublisher Publisher]&lt;br /&gt;
&lt;br /&gt;
== Experimental ==&lt;br /&gt;
&lt;br /&gt;
Documentation for experimental branches, spikes, WIPs etc. can be found in [[Quality/QA-tools/OTS/DeveloperDocs/Experimental]].&lt;br /&gt;
&lt;br /&gt;
== Analysis ==&lt;br /&gt;
&lt;br /&gt;
[[Quality/QA-tools/OTS/DeveloperDocs/ErrorSituations| OTS 0.1 Error Situations]]&lt;br /&gt;
&lt;br /&gt;
[[Quality/QA-tools/OTS/DeveloperDocs/TypicalUsage| Typical OTS users and usage scenarios]]&lt;br /&gt;
&lt;br /&gt;
== Project Planning ==&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/Roadmap | Roadmap]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/DevelopmentStatus | DevelopmentStatus]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/Meetings | Meetings]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/ReleaseChecklist | ReleaseChecklist]]&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/ReleasePractices | ReleasePractices]]&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus</id>
		<title>Quality/QA-tools/OTS/DevelopmentStatus</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus"/>
				<updated>2011-01-12T14:55:13Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Other Problems */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Release 0.8 unstable =&lt;br /&gt;
&lt;br /&gt;
== Application Framework ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Configuration&lt;br /&gt;
| Single configuration file and format, &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Plugins&lt;br /&gt;
| Runtime discoverable mechanism, with clear usage model&lt;br /&gt;
| In Progress (Spike completed)&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions&lt;br /&gt;
| An understandable exception handling model. Documented&lt;br /&gt;
| In Progress (Awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Logging&lt;br /&gt;
| A coherent distributed logging system&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Upgrade Capability &lt;br /&gt;
| Worker version management&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Function call&lt;br /&gt;
| Conductor should be function call not a process&lt;br /&gt;
| Postponed until next release&lt;br /&gt;
|-&lt;br /&gt;
| Properties &lt;br /&gt;
| Merge from 0.1 branch&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions, regression&lt;br /&gt;
| Check that all relevant exceptions from 0.1 are in place&lt;br /&gt;
| '''Not started'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Data Transfer Objects&lt;br /&gt;
| Taxonomy thereof. Pythonic APIs&lt;br /&gt;
| Completed (Awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| TestDefinition&lt;br /&gt;
| Removed&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| High Level API&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Hub&lt;br /&gt;
| High level procedural code &lt;br /&gt;
| In Progress&lt;br /&gt;
|-&lt;br /&gt;
| Disambiguation Datamodel&lt;br /&gt;
| Clear persistence and data management&lt;br /&gt;
| In Progress (Persistence parameters separated out)&lt;br /&gt;
|-&lt;br /&gt;
| Distributor&lt;br /&gt;
| Opaque Data Transfer&lt;br /&gt;
| Completed&lt;br /&gt;
|-&lt;br /&gt;
| Default Options&lt;br /&gt;
| Mapping of Default Options to SW product &lt;br /&gt;
| '''BROKEN. Default device options are not handled correctly. see options_factory unit tests'''&lt;br /&gt;
|- &lt;br /&gt;
| XMLRPC&lt;br /&gt;
| Add XMLRPC interface&lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Allocator&lt;br /&gt;
| API for custom Task allocation &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|- &lt;br /&gt;
| Publisher Plugins&lt;br /&gt;
| API and demos for 3rd party Publisher Plugins &lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Input Plugin&lt;br /&gt;
| Incorporate and mark as deprecated&lt;br /&gt;
| '''Not started''' It should be possible to implement this as a publisher. Reporting tools can handle getting target package information.&lt;br /&gt;
|- &lt;br /&gt;
| Allocator Entry Point&lt;br /&gt;
| Add appropriate extension point to allocator to allow custom distribution&lt;br /&gt;
| '''Awaiting merge'''&lt;br /&gt;
|- &lt;br /&gt;
| Parallel Testruns&lt;br /&gt;
| Trigger the same testrun on multiple targets&lt;br /&gt;
| In Progress&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Worker ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Integrate Conductor&lt;br /&gt;
| &lt;br /&gt;
| Full tool chain running&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Plugins ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| BIFH Plugin&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| In Progress (Spike completed awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Reporting Plugin&lt;br /&gt;
| Clear separation between test tool and reporting  &lt;br /&gt;
| In Progress (First pass API. Stubbed demo)&lt;br /&gt;
|-&lt;br /&gt;
| Email Plugin &lt;br /&gt;
| Email Plugin for Publisher API &lt;br /&gt;
| Requires system tests&lt;br /&gt;
|-&lt;br /&gt;
| QA Reports Plugin &lt;br /&gt;
| Publisher plugin for Meego QA Reports tool&lt;br /&gt;
| done&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Usability Issues ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Unittests run as sudo&lt;br /&gt;
| Queue size API calls&lt;br /&gt;
| Fixed&lt;br /&gt;
|-&lt;br /&gt;
| Developer Installation out-of-the-box&lt;br /&gt;
| Make as easy as possible. Clear instructions.   &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| API Documentation&lt;br /&gt;
| All component APIs documented &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
| You Tube Video&lt;br /&gt;
| Instruction Video  &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Other Problems ==&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;s&amp;gt;A testrun with invalid sw_product executes a testrun with sandbox-values. An error should be raised and no testrun should be executed.&amp;lt;/s&amp;gt;'''&lt;br /&gt;
* '''Exceptions are not handled and they hit the xmlrpc. request_sync() should always return PASS/FAIL/ERROR. nothing else.'''&lt;br /&gt;
* '''Incompatible worker version leaves worker in an unknown state and does not report the problem clearly.'''&lt;br /&gt;
&lt;br /&gt;
= Scheduled for 0.9 Release =&lt;br /&gt;
&lt;br /&gt;
== Organisation, maintenance and upgrades == &lt;br /&gt;
&lt;br /&gt;
* Component reorg (Assess a better representation of Components in code layout. Check impact on deployment)&lt;br /&gt;
&lt;br /&gt;
* Better unittest harvester (perhaps ''setup.py test'')&lt;br /&gt;
&lt;br /&gt;
* Evaluate status of dependencies (AMQP 1.0, minixsv supports Python 2.5, setuptools versus distribute etc)&lt;br /&gt;
&lt;br /&gt;
== Conductor ==&lt;br /&gt;
&lt;br /&gt;
* Python APIs&lt;br /&gt;
&lt;br /&gt;
* API stability&lt;br /&gt;
&lt;br /&gt;
* 6Pack integration&lt;br /&gt;
&lt;br /&gt;
* Automated reboot&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
* Remove InputPlugin&lt;br /&gt;
&lt;br /&gt;
* Lower level extension points on Result File Parsing&lt;br /&gt;
&lt;br /&gt;
* 6Pack Integration&lt;br /&gt;
&lt;br /&gt;
= Not scheduled items =&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
* HTTPS XML-RPC&lt;br /&gt;
&lt;br /&gt;
* AMQP connection using SSL encryption&lt;br /&gt;
&lt;br /&gt;
* OTS server and worker working in user mode&lt;br /&gt;
&lt;br /&gt;
* Define firewall settings for OTS server and worker&lt;br /&gt;
&lt;br /&gt;
* User authentication and access rights&lt;br /&gt;
&lt;br /&gt;
* Test request DDoS filter&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus</id>
		<title>Quality/QA-tools/OTS/DevelopmentStatus</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus"/>
				<updated>2011-01-12T14:52:42Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Application Framework */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Release 0.8 unstable =&lt;br /&gt;
&lt;br /&gt;
== Application Framework ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Configuration&lt;br /&gt;
| Single configuration file and format, &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Plugins&lt;br /&gt;
| Runtime discoverable mechanism, with clear usage model&lt;br /&gt;
| In Progress (Spike completed)&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions&lt;br /&gt;
| An understandable exception handling model. Documented&lt;br /&gt;
| In Progress (Awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Logging&lt;br /&gt;
| A coherent distributed logging system&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Upgrade Capability &lt;br /&gt;
| Worker version management&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Function call&lt;br /&gt;
| Conductor should be function call not a process&lt;br /&gt;
| Postponed until next release&lt;br /&gt;
|-&lt;br /&gt;
| Properties &lt;br /&gt;
| Merge from 0.1 branch&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions, regression&lt;br /&gt;
| Check that all relevant exceptions from 0.1 are in place&lt;br /&gt;
| '''Not started'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Data Transfer Objects&lt;br /&gt;
| Taxonomy thereof. Pythonic APIs&lt;br /&gt;
| Completed (Awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| TestDefinition&lt;br /&gt;
| Removed&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| High Level API&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Hub&lt;br /&gt;
| High level procedural code &lt;br /&gt;
| In Progress&lt;br /&gt;
|-&lt;br /&gt;
| Disambiguation Datamodel&lt;br /&gt;
| Clear persistence and data management&lt;br /&gt;
| In Progress (Persistence parameters separated out)&lt;br /&gt;
|-&lt;br /&gt;
| Distributor&lt;br /&gt;
| Opaque Data Transfer&lt;br /&gt;
| Completed&lt;br /&gt;
|-&lt;br /&gt;
| Default Options&lt;br /&gt;
| Mapping of Default Options to SW product &lt;br /&gt;
| '''BROKEN. Default device options are not handled correctly. see options_factory unit tests'''&lt;br /&gt;
|- &lt;br /&gt;
| XMLRPC&lt;br /&gt;
| Add XMLRPC interface&lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Allocator&lt;br /&gt;
| API for custom Task allocation &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|- &lt;br /&gt;
| Publisher Plugins&lt;br /&gt;
| API and demos for 3rd party Publisher Plugins &lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Input Plugin&lt;br /&gt;
| Incorporate and mark as deprecated&lt;br /&gt;
| '''Not started''' It should be possible to implement this as a publisher. Reporting tools can handle getting target package information.&lt;br /&gt;
|- &lt;br /&gt;
| Allocator Entry Point&lt;br /&gt;
| Add appropriate extension point to allocator to allow custom distribution&lt;br /&gt;
| '''Awaiting merge'''&lt;br /&gt;
|- &lt;br /&gt;
| Parallel Testruns&lt;br /&gt;
| Trigger the same testrun on multiple targets&lt;br /&gt;
| In Progress&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Worker ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Integrate Conductor&lt;br /&gt;
| &lt;br /&gt;
| Full tool chain running&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Plugins ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| BIFH Plugin&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| In Progress (Spike completed awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Reporting Plugin&lt;br /&gt;
| Clear separation between test tool and reporting  &lt;br /&gt;
| In Progress (First pass API. Stubbed demo)&lt;br /&gt;
|-&lt;br /&gt;
| Email Plugin &lt;br /&gt;
| Email Plugin for Publisher API &lt;br /&gt;
| Requires system tests&lt;br /&gt;
|-&lt;br /&gt;
| QA Reports Plugin &lt;br /&gt;
| Publisher plugin for Meego QA Reports tool&lt;br /&gt;
| done&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Usability Issues ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Unittests run as sudo&lt;br /&gt;
| Queue size API calls&lt;br /&gt;
| Fixed&lt;br /&gt;
|-&lt;br /&gt;
| Developer Installation out-of-the-box&lt;br /&gt;
| Make as easy as possible. Clear instructions.   &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| API Documentation&lt;br /&gt;
| All component APIs documented &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
| You Tube Video&lt;br /&gt;
| Instruction Video  &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Other Problems ==&lt;br /&gt;
&lt;br /&gt;
* '''A testrun with invalid sw_product executes a testrun with sandbox-values. An error should be raised and no testrun should be executed.'''&lt;br /&gt;
* '''Exceptions are not handled and they hit the xmlrpc. request_sync() should always return PASS/FAIL/ERROR. nothing else.'''&lt;br /&gt;
* '''Incompatible worker version leaves worker in an unknown state and does not report the problem clearly.'''&lt;br /&gt;
&lt;br /&gt;
= Scheduled for 0.9 Release =&lt;br /&gt;
&lt;br /&gt;
== Organisation, maintenance and upgrades == &lt;br /&gt;
&lt;br /&gt;
* Component reorg (Assess a better representation of Components in code layout. Check impact on deployment)&lt;br /&gt;
&lt;br /&gt;
* Better unittest harvester (perhaps ''setup.py test'')&lt;br /&gt;
&lt;br /&gt;
* Evaluate status of dependencies (AMQP 1.0, minixsv supports Python 2.5, setuptools versus distribute etc)&lt;br /&gt;
&lt;br /&gt;
== Conductor ==&lt;br /&gt;
&lt;br /&gt;
* Python APIs&lt;br /&gt;
&lt;br /&gt;
* API stability&lt;br /&gt;
&lt;br /&gt;
* 6Pack integration&lt;br /&gt;
&lt;br /&gt;
* Automated reboot&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
* Remove InputPlugin&lt;br /&gt;
&lt;br /&gt;
* Lower level extension points on Result File Parsing&lt;br /&gt;
&lt;br /&gt;
* 6Pack Integration&lt;br /&gt;
&lt;br /&gt;
= Not scheduled items =&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
* HTTPS XML-RPC&lt;br /&gt;
&lt;br /&gt;
* AMQP connection using SSL encryption&lt;br /&gt;
&lt;br /&gt;
* OTS server and worker working in user mode&lt;br /&gt;
&lt;br /&gt;
* Define firewall settings for OTS server and worker&lt;br /&gt;
&lt;br /&gt;
* User authentication and access rights&lt;br /&gt;
&lt;br /&gt;
* Test request DDoS filter&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/UserDocumentation/Installation</id>
		<title>Quality/QA-tools/OTS/UserDocumentation/Installation</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/UserDocumentation/Installation"/>
				<updated>2011-01-12T10:22:14Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: fixed example config file to avoid copypaste errors&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installation Instructions for OTS 0.1 ==&lt;br /&gt;
&lt;br /&gt;
These instructions have been tested with Ubuntu 10.04.&lt;br /&gt;
&lt;br /&gt;
=== Network Setup ===&lt;br /&gt;
&lt;br /&gt;
Using static IP addresses on all OTS machines is strongly recommended. It is possible to setup the system also with dynamic IP addresses but it might cause problems every now and then because IP's and hostnames change.&lt;br /&gt;
&lt;br /&gt;
All OTS machines need to be able to access other OTS machines based on their hostname.&lt;br /&gt;
&lt;br /&gt;
=== Server ===&lt;br /&gt;
&lt;br /&gt;
==== prerequisites ====&lt;br /&gt;
&lt;br /&gt;
* An smtp server is needed for OTS to be able to send result emails.&lt;br /&gt;
** You can use the smtp server provided by your ISP or organization&lt;br /&gt;
** Or you can setup your own. for example [http://my.opera.com/Contrid/blog/show.dml/478684 postfix]&lt;br /&gt;
&lt;br /&gt;
==== Basic Setup ====&lt;br /&gt;
&lt;br /&gt;
* Download and install RabbitMQ server from http://www.rabbitmq.com/server.html&lt;br /&gt;
&lt;br /&gt;
* Install dependencies from ubuntu repository:&lt;br /&gt;
 sudo apt-get update&lt;br /&gt;
 sudo apt-get install python-setuptools python-amqplib python-django&lt;br /&gt;
&lt;br /&gt;
* Install rest of the dependencies with easy_install:&lt;br /&gt;
 sudo easy_install minixsv&lt;br /&gt;
&lt;br /&gt;
* Get source code from http://meego.gitorious.org/meego-quality-assurance/ots/ (latest tag)&lt;br /&gt;
&lt;br /&gt;
* Install ots.common:&lt;br /&gt;
 cd ots/ots.common/&lt;br /&gt;
 sudo python setup.py install&lt;br /&gt;
&lt;br /&gt;
* Install ots.server:&lt;br /&gt;
 cd ots/ots.server/&lt;br /&gt;
 sudo python setup.py install&lt;br /&gt;
&lt;br /&gt;
* Install ots.tools: (Required only for triggering testruns easily from command line over xmlrpc)&lt;br /&gt;
 cd ots/ots.tools/&lt;br /&gt;
 sudo python setup.py install&lt;br /&gt;
&lt;br /&gt;
* Download and install test definition schema files from http://meego.gitorious.org/meego-quality-assurance/test-definition&lt;br /&gt;
&lt;br /&gt;
* Create a directory for testrun logs and make sure the user running ots.server has write permissions to it:&lt;br /&gt;
 sudo mkdir /var/log/ots&lt;br /&gt;
&lt;br /&gt;
* At this point it should be possible to trigger testruns from python shell if you have a worker already set up and configured to use this server. Here's an example ipython session:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
In [1]: from ots.server.xmlrpc.public import request_sync&lt;br /&gt;
&lt;br /&gt;
In [4]: program = &amp;quot;example_sw_product&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In [5]: request = &amp;quot;5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In [6]: notify_list = ['tvainio@localhost']&lt;br /&gt;
&lt;br /&gt;
In [7]: options = dict()&lt;br /&gt;
&lt;br /&gt;
In [8]: options['image'] = &amp;quot;http://somewhere/some_image.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In [9]: options['email'] = &amp;quot;off&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In [13]: options[&amp;quot;device&amp;quot;] = &amp;quot;devicegroup:default&amp;quot;            # Make this match the worker &lt;br /&gt;
&lt;br /&gt;
In [14]: request_sync(program, request, notify_list, options)&lt;br /&gt;
Out[14]: 'FAIL'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The result will be PASS/FAIL/ERROR. ERROR means that something went wrong in server side and testrun was not even started. FAIL means failed testrun and PASS means that everything went fine and all tests passed. Testrun logs with more information about the possible errors are available in /var/log/ots/&lt;br /&gt;
&lt;br /&gt;
==== Configuring the Server ====&lt;br /&gt;
&lt;br /&gt;
The previous example was not very useful. To get OTS server running as a real server you have two options. A simple xmlrpc server or a more advanced django based server. First thing you need to do is setup a custom config file.&lt;br /&gt;
&lt;br /&gt;
===== Custom Config File =====&lt;br /&gt;
&lt;br /&gt;
Ots server tries to import a configuration module ots_extensions.ots_config. If it does not succeed it uses the default from ots.server.testrun_host.default_ots_config. You can set up your own ots_config by following these instructions:&lt;br /&gt;
&lt;br /&gt;
* Create a directory for your extensions: &lt;br /&gt;
 mkdir my_ots_extensions&lt;br /&gt;
&lt;br /&gt;
* Add it to your python path&lt;br /&gt;
 export PYTHONPATH=/full/path/to/my_ots_extensions/:$PYTHONPATH&lt;br /&gt;
&lt;br /&gt;
* Create custom ots_extensions python package:&lt;br /&gt;
 mkdir my_ots_extensions/ots_extensions&lt;br /&gt;
 touch my_ots_extensions/ots_extensions/__init__.py&lt;br /&gt;
&lt;br /&gt;
* Copy the default config file from ots/ots.server/ots/server/testrun_host/default_ots_config.py to my_ots_extensions/ots_extensions/ots_config.py&lt;br /&gt;
&lt;br /&gt;
* Modify the file to suit your needs. Check at least the following settings:&lt;br /&gt;
** Email settings (The smtp server OTS uses to send testrun results)&lt;br /&gt;
** xmlrpc server config (if you are setting the simple xmlrpc server setup. More info below.)&lt;br /&gt;
** The default options for your sw product:&lt;br /&gt;
You can define default values for all options here. The example_sw_product contains and example how to define options. You cannot use an sw_product if it does not contain the default options in ots_config. Here's a small example. I'm developing a Meego based coffeemaker and creating custom software images for it. To automate the testing I create an sw_product called &amp;quot;my_meego_variant&amp;quot;:&lt;br /&gt;
'''TODO: Document all options'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#&lt;br /&gt;
# Defaults for my_meego_variant                             &lt;br /&gt;
#                                                                                                                                   &lt;br /&gt;
&lt;br /&gt;
# Lets start with the global_defaults&lt;br /&gt;
default_options[&amp;quot;my_meego_variant&amp;quot;] = global_defaults.copy()&lt;br /&gt;
&lt;br /&gt;
# The images work only on meego coffeemakers so the default devicegroup will be &amp;quot;meego_coffeemaker&amp;quot;&lt;br /&gt;
default_options[&amp;quot;my_meego_variant&amp;quot;]['device'] = {'devicegroup':'meego_coffeemaker'}&lt;br /&gt;
&lt;br /&gt;
# Coffeemaker needs to be fast so we define a 3 minutes global timeout for the test execution.&lt;br /&gt;
default_options[&amp;quot;my_meego_variant&amp;quot;]['timeout'] = 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Extension Points =====&lt;br /&gt;
&lt;br /&gt;
OTS uses plugins to do various things during the testrun. You can write your own plugins to add more functionality by implementing a module ots_extensions.extension_points. An example file can be found from ots/ots.server/ots/server/testrun_host/example_extension_points.py&lt;br /&gt;
&lt;br /&gt;
==== Simple XMLRPC Server ====&lt;br /&gt;
&lt;br /&gt;
* After you have implemented your custom config file and defined suitable xmlrpc_host and xmlrpc_port values you can start the simple xmlrpc server:&lt;br /&gt;
 ots_server&lt;br /&gt;
&lt;br /&gt;
* After that you can start testruns on your ots_server by calling the request_sync() method over xmlrpc just like we did locally in the example above. There's also a command line tool called ots_trigger in ots.tools package.&lt;br /&gt;
&lt;br /&gt;
* A testrun can be triggered from command line with ots_trigger:&lt;br /&gt;
&lt;br /&gt;
 ots_trigger -s your_xmlrpc_host:your_xmlrpc_port -b 333 -i url_to_dummyimage -p my_meego_variant -e your_email_address&lt;br /&gt;
&lt;br /&gt;
The result should be FAIL and if your email server settings are correct you should also receive an email.&lt;br /&gt;
&lt;br /&gt;
* If we look into the new testrun log file in /var/log/ots/ we should find something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2010-09-24 15:48:21,188  conductorengine ERROR    Device group 'meego_coffeemaker' does not exist&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;/usr/local/lib/python2.6/dist-packages/ots.server-0.1dev-py2.6.egg/ots/server/conductorengine/conductorengine.py&amp;quot;, line 150, in execute&lt;br /&gt;
    self._taskrunner.run()&lt;br /&gt;
  File &amp;quot;/usr/local/lib/python2.6/dist-packages/ots.server-0.1dev-py2.6.egg/ots/server/distributor/taskrunner.py&amp;quot;, line 417, in run&lt;br /&gt;
    (self._routing_key))&lt;br /&gt;
OtsQueueDoesNotExistError: No queue for meego_coffeemaker&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Next step is to set up an OTS worker into the devicegroup meego_coffeemaker. Instructions can be found below.&lt;br /&gt;
&lt;br /&gt;
==== Django Based Server ====&lt;br /&gt;
&lt;br /&gt;
With Django and Apache it's possible to set up a more advanced ots server.&lt;br /&gt;
&lt;br /&gt;
There's for example a global logger application available in ots.server.logger. By setting up the logger it is possible to get log messages for a specific testrun from all parts of the system (ots server, ots conductor and testrunner-lite). The logs are stored into database and can be accessed with a web UI. It's also easy to implement a result db and web views for the test results.&lt;br /&gt;
&lt;br /&gt;
If you are not familiar with Django you can study the basics from the tutorial: http://docs.djangoproject.com/en/1.2/intro/tutorial01/&lt;br /&gt;
&lt;br /&gt;
These instructions assume that you have already done the setup described in: [[http://wiki.meego.com/Quality/QA-tools/OTS/UserDocumentation/Installation#Server]]&lt;br /&gt;
&lt;br /&gt;
There is an example django project in ots.server.django_ots. It is possible to use that directly but in most cases you should create your own django project to be able to modify the settings.&lt;br /&gt;
&lt;br /&gt;
===== Installation Using the Default Django Project in ots.server.django_ots =====&lt;br /&gt;
&lt;br /&gt;
* Install required packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt-get install python-django python-setuptools rabbitmq-server python-amqplib&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Install django-xmlrpc from https://launchpad.net/django-xmlrpc to somewhere in your pythonpath&lt;br /&gt;
&lt;br /&gt;
* After that you should be able to execute tests for the ots django applications:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python ots/server/django_ots/manage.py test logger testrun_db&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create the database. The default ots django project uses sqlite. The DB file is located in /opt/ots.sqlite.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python ots/server/django_ots/manage.py syncdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The script asks about creating a superuser for the Django's auth system. OTS does not use the auth system at the moment but it might be useful to create the account if you start writing custom django applications or want to use django admin interface at some point.&lt;br /&gt;
&lt;br /&gt;
If you get errors like &amp;quot;unable to open database file&amp;quot; make sure your user has write permissions to /opt/&lt;br /&gt;
&lt;br /&gt;
* Install apache and mod-python: (OTS requires the prefork version of apache)&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install apache2-mpm-prefork libapache2-mod-python&lt;br /&gt;
&lt;br /&gt;
* Setup your custom ots_config and extension points&lt;br /&gt;
** Instructions are available in [[http://wiki.meego.com/Quality/QA-tools/OTS/UserDocumentation/Installation#Configuring_the_Server]]&lt;br /&gt;
** Use ots/server/django_ots/extension_points.py as the basis of your extension points. It takes the testrun_db into use.&lt;br /&gt;
** Changes http_loggin_enabled to True in your ots_config.py if you want to have global testrun logs:&lt;br /&gt;
 http_logging_enabled = True&lt;br /&gt;
&lt;br /&gt;
* Configure your django_ots to /etc/apache2/apache2.conf by adding the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Location &amp;quot;/&amp;quot;&amp;gt;&lt;br /&gt;
SetHandler python-program&lt;br /&gt;
PythonHandler django.core.handlers.modpython&lt;br /&gt;
SetEnv DJANGO_SETTINGS_MODULE ots.server.django_ots.settings&lt;br /&gt;
PythonDebug On&lt;br /&gt;
PythonPath &amp;quot;['ADD HERE THE PATH WHERE YOUR ots_extensions directory with CUSTOM OTS ENTRYPOINTS AND CONFIGFILE CAN BE FOUND'] + sys.path&amp;quot;&lt;br /&gt;
&amp;lt;/Location&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Open http://localhost/logger/view/ in your web browser. You should see an empty logging message page.&lt;br /&gt;
** If you get &amp;quot;Unable to open database file&amp;quot; make sure that the user apache is running on has read and write permissions to the db file (/opt/ots.sqlite).&lt;br /&gt;
* Try triggering a testrun with ots_trigger (note the /xmlrpc in server url):&lt;br /&gt;
 ots_trigger -s localhost/xmlrpc -b 333 -i url_to_dummyimage -p my_meego_variant -e your_email_address&lt;br /&gt;
&lt;br /&gt;
If everything went ok you should see a succesful testrun and logs from OTS server, OTS Worker.conductor and testrunner-lite appearing in the http://localhost/logger/view/ and http://localhost/logger/view/ots/&amp;lt;your_testrun_id&amp;gt;/&lt;br /&gt;
&lt;br /&gt;
If you only see log messages from your server most probably yuor hostnames are not set up correctly. The worker machine needs to be able to access the server by it's host name. Or you can try to play around with the &amp;quot;results_storage_config[&amp;quot;host&amp;quot;]&amp;quot; setting in ots_config.py. It is the hostname ots_server sends to worker to use for global logging.&lt;br /&gt;
&lt;br /&gt;
===== Installation Using a Custom Django Project =====&lt;br /&gt;
&lt;br /&gt;
If you want to use different django setup you can create a custom django project. You can use ots/server/django_ots/ as an example. Django documentation contains lots of information about the features and settings: http://www.djangoproject.com/&lt;br /&gt;
&lt;br /&gt;
The most important files are:&lt;br /&gt;
* settings.py - DB settings, installed django applications, email etc.&lt;br /&gt;
* urls.py - Url mappings. For example the &amp;quot;xmlrpc/&amp;quot; url is defined here.&lt;br /&gt;
&lt;br /&gt;
You also need to modify your apache configuration to point to your own django project instead of the default one. Also note that if you change your code, mod_python does not automatically reload the changed code so you need to restart apache to make sure you are using the right version of your code. If you do a full apache restart all ongoing testruns will fail. If you do a graceful restart (&amp;lt;code&amp;gt;&amp;quot;apache2ctl graceful&amp;quot;&amp;lt;/code&amp;gt;)the testruns won't fail but updated code is reloaded only after the testruns have fininshed.&lt;br /&gt;
&lt;br /&gt;
==== Uploading Results to Meego QA Reports Tool ====&lt;br /&gt;
&lt;br /&gt;
Starting from version 0.1.6 OTS can automatically upload results to Meego QA Reports tool.&lt;br /&gt;
&lt;br /&gt;
* Make sure ots.qareports_plugin is installed.&lt;br /&gt;
* Modify values in /etc/ots_qareports_plugin.conf to match your setup:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# More information about the options is available in&lt;br /&gt;
# http://wiki.meego.com/Quality/QA-tools/QAReports/API&lt;br /&gt;
&lt;br /&gt;
[ots.qareports_plugin]&lt;br /&gt;
host = &amp;quot;localhost&amp;quot;&lt;br /&gt;
url = &amp;quot;/api/import&amp;quot;&lt;br /&gt;
auth_token = &amp;quot;&amp;quot;&lt;br /&gt;
release_version = &amp;quot;1.0&amp;quot;&lt;br /&gt;
target = &amp;quot;Core&amp;quot;&lt;br /&gt;
testtype = &amp;quot;Acceptance&amp;quot;&lt;br /&gt;
hwproduct = &amp;quot;N900&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Modify &amp;quot;get_resultbackends()&amp;quot; in your custom extension_points.py to take QaReportsBackend into use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from ots.qareports_plugin.qareports_backend import QAReportsBackend&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def get_resultbackends(testrun):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Returns custom ResultBackends as a list&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return [QAReportsBackend()]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Dynamic Report Control =====&lt;br /&gt;
&lt;br /&gt;
Starting from OTS 0.1.7 it's possible to control reporting options dynamically when triggering a testrun with &amp;quot;--options&amp;quot; command line parameter in ots_trigger:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ots_trigger --options=&amp;quot;qa_hwproduct:&amp;lt;HWPRODUCT&amp;gt; qa_testtype:&amp;lt;TESTTYPE&amp;gt; qa_target:&amp;lt;TARGET&amp;gt; qa_release_version:&amp;lt;RELEASE_VERSION&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Worker ===&lt;br /&gt;
&lt;br /&gt;
* Install dependencies:&lt;br /&gt;
 sudo apt-get update&lt;br /&gt;
 sudo apt-get install python-setuptools python-amqplib&lt;br /&gt;
&lt;br /&gt;
* Get source code from http://meego.gitorious.org/meego-quality-assurance/ots/ (latest tag)&lt;br /&gt;
&lt;br /&gt;
* Install ots.common:&lt;br /&gt;
 cd ots/ots.common/&lt;br /&gt;
 sudo python setup.py install&lt;br /&gt;
&lt;br /&gt;
* Install ots.worker:&lt;br /&gt;
 cd ots/ots.worker/&lt;br /&gt;
 sudo python setup.py install&lt;br /&gt;
&lt;br /&gt;
* Configure the worker by editing devicegroup and server address in /etc/ots.ini:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
###########################################&lt;br /&gt;
# REPLACE `fix_me` WITH YOUR DEVICEGROUP&lt;br /&gt;
###########################################&lt;br /&gt;
[Device]&lt;br /&gt;
# Change this to the devicegroup this worker belongs to&lt;br /&gt;
devicegroup = fix_me&lt;br /&gt;
&lt;br /&gt;
#############################&lt;br /&gt;
# Optional device properties&lt;br /&gt;
#############################&lt;br /&gt;
&lt;br /&gt;
# Uncomment these if you want more detailed testrun routing &lt;br /&gt;
# See http://wiki.meego.com/Quality/QA-tools/OTS/Routing for details&lt;br /&gt;
&lt;br /&gt;
#devicename = name of the device type&lt;br /&gt;
#deviceid = Specific HW id of the device&lt;br /&gt;
&lt;br /&gt;
#############################&lt;br /&gt;
# ADVANCED CONFIGURATION&lt;br /&gt;
#############################&lt;br /&gt;
[Worker]&lt;br /&gt;
# Change this to your ots server address&lt;br /&gt;
host = your_server_address&lt;br /&gt;
vhost = /&lt;br /&gt;
port = 5672&lt;br /&gt;
username = guest&lt;br /&gt;
password = guest&lt;br /&gt;
log_file = /var/log/ots.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More info about testrun routing is available here: [[Quality/QA-tools/OTS/Routing]]&lt;br /&gt;
&lt;br /&gt;
* Start the worker:&lt;br /&gt;
&lt;br /&gt;
 sudo ots_worker&lt;br /&gt;
&lt;br /&gt;
* If everything went ok, you should see something like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2010-11-08 12:55:10,790 - ots.worker.worker - DEBUG - Initialising the server&lt;br /&gt;
2010-11-08 12:55:10,790 - ots.worker.connection - DEBUG - Connecting to RabbitMQ&lt;br /&gt;
2010-11-08 12:55:10,894 - amqplib - DEBUG - Start from server, version: 8.0, properties: {u'platform': 'Erlang/OTP', u'product': 'RabbitMQ', u'version': '2.1.0', u'copyright': 'Copyright (C) 2007-2010 LShift Ltd., Cohesive Financial Technologies LLC., and Rabbit Technologies Ltd.', u'information': 'Licensed under the MPL.  See http://www.rabbitmq.com/'}, mechanisms: ['PLAIN', 'AMQPLAIN'], locales: ['en_US']&lt;br /&gt;
2010-11-08 12:55:10,935 - amqplib - DEBUG - Open OK! known_hosts []&lt;br /&gt;
2010-11-08 12:55:10,935 - amqplib - DEBUG - using channel_id: 1&lt;br /&gt;
2010-11-08 12:55:10,937 - amqplib - DEBUG - Channel open&lt;br /&gt;
2010-11-08 12:55:10,938 - ots.worker.worker - DEBUG - Starting the worker. server: 192.168.1.102:5672, device_properties: {'devicegroup': 'meego_coffeemaker'}&lt;br /&gt;
2010-11-08 12:55:10,957 - ots.worker.task_broker - INFO - consume on queue: meego_coffeemaker&lt;br /&gt;
2010-11-08 12:55:10,958 - ots.worker.task_broker - DEBUG - Starting main loop...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* There's also an init script available in ots.worker/debian/python-ots-worker.ots-worker.init to make running the worker easier&lt;br /&gt;
&lt;br /&gt;
* After that the worker should be ready for receiving tasks. To make sure the actual test execution works please see the instructions for ots.worker.conductor: [[Quality/QA-tools/OTS/UserDocumentation/Conductor| Conductor]]&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus</id>
		<title>Quality/QA-tools/OTS/DevelopmentStatus</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus"/>
				<updated>2011-01-12T07:38:03Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Server */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Release 0.8 unstable =&lt;br /&gt;
&lt;br /&gt;
== Application Framework ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Configuration&lt;br /&gt;
| Single configuration file and format, &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Plugins&lt;br /&gt;
| Runtime discoverable mechanism, with clear usage model&lt;br /&gt;
| In Progress (Spike completed)&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions&lt;br /&gt;
| An understandable exception handling model. Documented&lt;br /&gt;
| In Progress (Awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Logging&lt;br /&gt;
| A coherent distributed logging system&lt;br /&gt;
| '''Not working properly. Debug level logging to file is missing and http logger needs to be configured to INFO level.'''&lt;br /&gt;
|-&lt;br /&gt;
| Upgrade Capability &lt;br /&gt;
| Worker version management&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Function call&lt;br /&gt;
| Conductor should be function call not a process&lt;br /&gt;
| Postponed until next release&lt;br /&gt;
|-&lt;br /&gt;
| Properties &lt;br /&gt;
| Merge from 0.1 branch&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions, regression&lt;br /&gt;
| Check that all relevant exceptions from 0.1 are in place&lt;br /&gt;
| '''Not started'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Data Transfer Objects&lt;br /&gt;
| Taxonomy thereof. Pythonic APIs&lt;br /&gt;
| Completed (Awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| TestDefinition&lt;br /&gt;
| Removed&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| High Level API&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Hub&lt;br /&gt;
| High level procedural code &lt;br /&gt;
| In Progress&lt;br /&gt;
|-&lt;br /&gt;
| Disambiguation Datamodel&lt;br /&gt;
| Clear persistence and data management&lt;br /&gt;
| In Progress (Persistence parameters separated out)&lt;br /&gt;
|-&lt;br /&gt;
| Distributor&lt;br /&gt;
| Opaque Data Transfer&lt;br /&gt;
| Completed&lt;br /&gt;
|-&lt;br /&gt;
| Default Options&lt;br /&gt;
| Mapping of Default Options to SW product &lt;br /&gt;
| '''BROKEN. Default device options are not handled correctly. see options_factory unit tests'''&lt;br /&gt;
|- &lt;br /&gt;
| XMLRPC&lt;br /&gt;
| Add XMLRPC interface&lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Allocator&lt;br /&gt;
| API for custom Task allocation &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|- &lt;br /&gt;
| Publisher Plugins&lt;br /&gt;
| API and demos for 3rd party Publisher Plugins &lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Input Plugin&lt;br /&gt;
| Incorporate and mark as deprecated&lt;br /&gt;
| '''Not started''' It should be possible to implement this as a publisher. Reporting tools can handle getting target package information.&lt;br /&gt;
|- &lt;br /&gt;
| Allocator Entry Point&lt;br /&gt;
| Add appropriate extension point to allocator to allow custom distribution&lt;br /&gt;
| '''Awaiting merge'''&lt;br /&gt;
|- &lt;br /&gt;
| Parallel Testruns&lt;br /&gt;
| Trigger the same testrun on multiple targets&lt;br /&gt;
| In Progress&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Worker ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Integrate Conductor&lt;br /&gt;
| &lt;br /&gt;
| Full tool chain running&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Plugins ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| BIFH Plugin&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| In Progress (Spike completed awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Reporting Plugin&lt;br /&gt;
| Clear separation between test tool and reporting  &lt;br /&gt;
| In Progress (First pass API. Stubbed demo)&lt;br /&gt;
|-&lt;br /&gt;
| Email Plugin &lt;br /&gt;
| Email Plugin for Publisher API &lt;br /&gt;
| Requires system tests&lt;br /&gt;
|-&lt;br /&gt;
| QA Reports Plugin &lt;br /&gt;
| Publisher plugin for Meego QA Reports tool&lt;br /&gt;
| done&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Usability Issues ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Unittests run as sudo&lt;br /&gt;
| Queue size API calls&lt;br /&gt;
| Fixed&lt;br /&gt;
|-&lt;br /&gt;
| Developer Installation out-of-the-box&lt;br /&gt;
| Make as easy as possible. Clear instructions.   &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| API Documentation&lt;br /&gt;
| All component APIs documented &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
| You Tube Video&lt;br /&gt;
| Instruction Video  &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Other Problems ==&lt;br /&gt;
&lt;br /&gt;
* '''A testrun with invalid sw_product executes a testrun with sandbox-values. An error should be raised and no testrun should be executed.'''&lt;br /&gt;
* '''Exceptions are not handled and they hit the xmlrpc. request_sync() should always return PASS/FAIL/ERROR. nothing else.'''&lt;br /&gt;
* '''Incompatible worker version leaves worker in an unknown state and does not report the problem clearly.'''&lt;br /&gt;
&lt;br /&gt;
= Scheduled for 0.9 Release =&lt;br /&gt;
&lt;br /&gt;
== Organisation, maintenance and upgrades == &lt;br /&gt;
&lt;br /&gt;
* Component reorg (Assess a better representation of Components in code layout. Check impact on deployment)&lt;br /&gt;
&lt;br /&gt;
* Better unittest harvester (perhaps ''setup.py test'')&lt;br /&gt;
&lt;br /&gt;
* Evaluate status of dependencies (AMQP 1.0, minixsv supports Python 2.5, setuptools versus distribute etc)&lt;br /&gt;
&lt;br /&gt;
== Conductor ==&lt;br /&gt;
&lt;br /&gt;
* Python APIs&lt;br /&gt;
&lt;br /&gt;
* API stability&lt;br /&gt;
&lt;br /&gt;
* 6Pack integration&lt;br /&gt;
&lt;br /&gt;
* Automated reboot&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
* Remove InputPlugin&lt;br /&gt;
&lt;br /&gt;
* Lower level extension points on Result File Parsing&lt;br /&gt;
&lt;br /&gt;
* 6Pack Integration&lt;br /&gt;
&lt;br /&gt;
= Not scheduled items =&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
* HTTPS XML-RPC&lt;br /&gt;
&lt;br /&gt;
* AMQP connection using SSL encryption&lt;br /&gt;
&lt;br /&gt;
* OTS server and worker working in user mode&lt;br /&gt;
&lt;br /&gt;
* Define firewall settings for OTS server and worker&lt;br /&gt;
&lt;br /&gt;
* User authentication and access rights&lt;br /&gt;
&lt;br /&gt;
* Test request DDoS filter&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/Logging</id>
		<title>Quality/QA-tools/OTS/Logging</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/Logging"/>
				<updated>2010-12-31T10:28:43Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Log Levels */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Logging =&lt;br /&gt;
&lt;br /&gt;
== Log Levels ==&lt;br /&gt;
&lt;br /&gt;
Different log levels are targeted for different user groups. See [[Quality/QA-tools/OTS/DeveloperDocs/TypicalUsage| Typical OTS users and usage scenarios]] for more information.&lt;br /&gt;
&lt;br /&gt;
=== For Basic Users ===&lt;br /&gt;
&lt;br /&gt;
''These are available in the centralized testrun http log.''&lt;br /&gt;
&lt;br /&gt;
* INFO shows what's happening in high level&lt;br /&gt;
** What parameters where used for the request&lt;br /&gt;
** What's happening right know. (Downloading image x from http://..., Flashing, Executing package asdf-tests.)&lt;br /&gt;
&lt;br /&gt;
* ERROR shows what went wrong.&lt;br /&gt;
** It needs to be explained so that the basic user can understand it&lt;br /&gt;
** Always think from the basic user point of view. What makes sense to you as a developer probably does not make sense for the user at all.&lt;br /&gt;
** Don't say &amp;quot;_get_file(&amp;quot;tests.xml&amp;quot;) failed!&amp;quot;, say &amp;quot;Testpackage asdf-tests is not in the image&amp;quot;.&lt;br /&gt;
** Tracebacks are always good if they provide additional information for debugging. Just make sure that the actual error message is still there. Most of the users don't know python and do not want to read tracebacks. Instead of &amp;quot;Error! Traceback follows:&amp;quot;, say &amp;quot;Custom flasher was not able to flash the image:&amp;quot;. Then the basic user gets a rough idea what's going on and system maintainer/ots developer can solve the issue by looking at the traceback.&lt;br /&gt;
&lt;br /&gt;
* WARNING warns if something is wrong but it's not critical&lt;br /&gt;
** For example user gives unknown input parameter. It might be a typo so the user should be warned.&lt;br /&gt;
&lt;br /&gt;
=== For Advanced User / Worker Maintainer and Server Maintainer ===&lt;br /&gt;
&lt;br /&gt;
''These logs are available in log files. Currently server debug log for each testrun is in /var/log/ots/. Conductor logs to ~/conductor.log in the worker machine. OTS worker process logs to /var/log/ots.log.''&lt;br /&gt;
&lt;br /&gt;
* DEBUG on worker components &lt;br /&gt;
** In most cases INFO and ERROR level messages should be enough but we expect worker maintainers to be able to follow also DEBUG level messages&lt;br /&gt;
** DEBUG messages should give enough information to sort out problems in the worker setup.&lt;br /&gt;
** Don't say &amp;quot;calling flasher...&amp;quot;. Say &amp;quot;executing command '/usr/bin/flasher -f imagefile'&amp;quot;&lt;br /&gt;
** Don't log too much. It makes reading the log difficult. Tracebacks should tell where we were when error happened.&lt;br /&gt;
** Input parameters and sub commands (parameters, return values, stdout, stderr) are likely to be valuable information when debugging.&lt;br /&gt;
==== How to Log Exceptions ====&lt;br /&gt;
&lt;br /&gt;
Logging record objects have exc_info field and that should be used. No need to format or include the exception in the actual log message. This way it's easy to format every exception properly in the logging handlers or views. Current http logger views use this.&lt;br /&gt;
* In exception handlers it's enough to do&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
log.exception(&amp;quot;Catastrophic error&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
log.debug(&amp;quot;Catastrophic error&amp;quot;, exc_info=True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If exception is received as an object, it can be logged properly like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
except Exception, err:&lt;br /&gt;
log.error(&amp;quot;Catastrophic error&amp;quot;, exc_info=err)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or if it's the common (Type, Value, Traceback) tuple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def __exit__(self, exception_type, value, tb):&lt;br /&gt;
    LOG.warning(&amp;quot;Error in plugin&amp;quot;, exc_info=(exception_type, value, tb))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
There are a number of ways to view the OTS testrun:&lt;br /&gt;
&lt;br /&gt;
=== Main Log ===&lt;br /&gt;
&lt;br /&gt;
The Main OTS log is written to &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/var/log/ots&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Server Log ===&lt;br /&gt;
&lt;br /&gt;
This is [http://docs.python.org/release/2.5.2/lib/logging-config-fileformat.html configurable] by the 'logging.conf' file in the root directory&lt;br /&gt;
&lt;br /&gt;
=== Worker Log ===&lt;br /&gt;
&lt;br /&gt;
The Worker can be configured to log to a file specified by the &amp;quot;log_file&amp;quot; parameter in the Worker config file. &lt;br /&gt;
&lt;br /&gt;
=== Conductor Log ===&lt;br /&gt;
&lt;br /&gt;
Writes to the &amp;lt;ahem&amp;gt; home directory &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/path/to/home/conductor.log&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Apache Log ===&lt;br /&gt;
&lt;br /&gt;
If you are running OTS with Apache:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/var/log/apache2/error.log&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Http Logger ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition there is an [http://wiki.meego.com/Quality/QA-tools/OTS/Plugins/HTTP_logger http_logger].&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus</id>
		<title>Quality/QA-tools/OTS/DevelopmentStatus</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus"/>
				<updated>2010-12-31T10:20:36Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Other Problems */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Release 0.8 unstable =&lt;br /&gt;
&lt;br /&gt;
== Application Framework ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Configuration&lt;br /&gt;
| Single configuration file and format, &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Plugins&lt;br /&gt;
| Runtime discoverable mechanism, with clear usage model&lt;br /&gt;
| In Progress (Spike completed)&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions&lt;br /&gt;
| An understandable exception handling model. Documented&lt;br /&gt;
| In Progress (Awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Logging&lt;br /&gt;
| A coherent distributed logging system&lt;br /&gt;
| '''Not working properly. Debug level logging to file is missing and http logger needs to be configured to INFO level.'''&lt;br /&gt;
|-&lt;br /&gt;
| Upgrade Capability &lt;br /&gt;
| Worker version management&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Function call&lt;br /&gt;
| Conductor should be function call not a process&lt;br /&gt;
| Postponed until next release&lt;br /&gt;
|-&lt;br /&gt;
| Properties &lt;br /&gt;
| Merge from 0.1 branch&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions, regression&lt;br /&gt;
| Check that all relevant exceptions from 0.1 are in place&lt;br /&gt;
| '''Not started'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Data Transfer Objects&lt;br /&gt;
| Taxonomy thereof. Pythonic APIs&lt;br /&gt;
| Completed (Awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| TestDefinition&lt;br /&gt;
| Removed&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| High Level API&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Hub&lt;br /&gt;
| High level procedural code &lt;br /&gt;
| In Progress&lt;br /&gt;
|-&lt;br /&gt;
| Disambiguation Datamodel&lt;br /&gt;
| Clear persistence and data management&lt;br /&gt;
| In Progress (Persistence parameters separated out)&lt;br /&gt;
|-&lt;br /&gt;
| Distributor&lt;br /&gt;
| Opaque Data Transfer&lt;br /&gt;
| Completed&lt;br /&gt;
|-&lt;br /&gt;
| Default Options&lt;br /&gt;
| Mapping of Default Options to SW product &lt;br /&gt;
| '''BROKEN. Default device options are not handled correctly. see options_factory unit tests'''&lt;br /&gt;
|- &lt;br /&gt;
| XMLRPC&lt;br /&gt;
| Add XMLRPC interface&lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Allocator&lt;br /&gt;
| API for custom Task allocation &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|- &lt;br /&gt;
| Publisher Plugins&lt;br /&gt;
| API and demos for 3rd party Publisher Plugins &lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Input Plugin&lt;br /&gt;
| Incorporate and mark as deprecated&lt;br /&gt;
| '''Not started''' It should be possible to implement this as a publisher. Reporting tools can handle getting target package information.&lt;br /&gt;
|- &lt;br /&gt;
| Allocator Entry Point&lt;br /&gt;
| Add appropriate extension point to allocator to allow custom distribution&lt;br /&gt;
| '''Awaiting merge'''&lt;br /&gt;
|- &lt;br /&gt;
| Parallel Testruns&lt;br /&gt;
| Trigger the same testrun on multiple targets&lt;br /&gt;
| '''Merge from 0.1'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Worker ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Integrate Conductor&lt;br /&gt;
| &lt;br /&gt;
| Full tool chain running&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Plugins ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| BIFH Plugin&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| In Progress (Spike completed awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Reporting Plugin&lt;br /&gt;
| Clear separation between test tool and reporting  &lt;br /&gt;
| In Progress (First pass API. Stubbed demo)&lt;br /&gt;
|-&lt;br /&gt;
| Email Plugin &lt;br /&gt;
| Email Plugin for Publisher API &lt;br /&gt;
| Requires system tests&lt;br /&gt;
|-&lt;br /&gt;
| QA Reports Plugin &lt;br /&gt;
| Publisher plugin for Meego QA Reports tool&lt;br /&gt;
| done&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Usability Issues ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Unittests run as sudo&lt;br /&gt;
| Queue size API calls&lt;br /&gt;
| Fixed&lt;br /&gt;
|-&lt;br /&gt;
| Developer Installation out-of-the-box&lt;br /&gt;
| Make as easy as possible. Clear instructions.   &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| API Documentation&lt;br /&gt;
| All component APIs documented &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
| You Tube Video&lt;br /&gt;
| Instruction Video  &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Other Problems ==&lt;br /&gt;
&lt;br /&gt;
* '''A testrun with invalid sw_product executes a testrun with sandbox-values. An error should be raised and no testrun should be executed.'''&lt;br /&gt;
* '''Exceptions are not handled and they hit the xmlrpc. request_sync() should always return PASS/FAIL/ERROR. nothing else.'''&lt;br /&gt;
* '''Incompatible worker version leaves worker in an unknown state and does not report the problem clearly.'''&lt;br /&gt;
&lt;br /&gt;
= Scheduled for 0.9 Release =&lt;br /&gt;
&lt;br /&gt;
== Organisation, maintenance and upgrades == &lt;br /&gt;
&lt;br /&gt;
* Component reorg (Assess a better representation of Components in code layout. Check impact on deployment)&lt;br /&gt;
&lt;br /&gt;
* Better unittest harvester (perhaps ''setup.py test'')&lt;br /&gt;
&lt;br /&gt;
* Evaluate status of dependencies (AMQP 1.0, minixsv supports Python 2.5, setuptools versus distribute etc)&lt;br /&gt;
&lt;br /&gt;
== Conductor ==&lt;br /&gt;
&lt;br /&gt;
* Python APIs&lt;br /&gt;
&lt;br /&gt;
* API stability&lt;br /&gt;
&lt;br /&gt;
* 6Pack integration&lt;br /&gt;
&lt;br /&gt;
* Automated reboot&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
* Remove InputPlugin&lt;br /&gt;
&lt;br /&gt;
* Lower level extension points on Result File Parsing&lt;br /&gt;
&lt;br /&gt;
* 6Pack Integration&lt;br /&gt;
&lt;br /&gt;
= Not scheduled items =&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
* HTTPS XML-RPC&lt;br /&gt;
&lt;br /&gt;
* AMQP connection using SSL encryption&lt;br /&gt;
&lt;br /&gt;
* OTS server and worker working in user mode&lt;br /&gt;
&lt;br /&gt;
* Define firewall settings for OTS server and worker&lt;br /&gt;
&lt;br /&gt;
* User authentication and access rights&lt;br /&gt;
&lt;br /&gt;
* Test request DDoS filter&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus</id>
		<title>Quality/QA-tools/OTS/DevelopmentStatus</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus"/>
				<updated>2010-12-31T09:17:07Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Release 0.8 unstable */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Release 0.8 unstable =&lt;br /&gt;
&lt;br /&gt;
== Application Framework ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Configuration&lt;br /&gt;
| Single configuration file and format, &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Plugins&lt;br /&gt;
| Runtime discoverable mechanism, with clear usage model&lt;br /&gt;
| In Progress (Spike completed)&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions&lt;br /&gt;
| An understandable exception handling model. Documented&lt;br /&gt;
| In Progress (Awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Logging&lt;br /&gt;
| A coherent distributed logging system&lt;br /&gt;
| '''Not working properly. Debug level logging to file is missing and http logger needs to be configured to INFO level.'''&lt;br /&gt;
|-&lt;br /&gt;
| Upgrade Capability &lt;br /&gt;
| Worker version management&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Function call&lt;br /&gt;
| Conductor should be function call not a process&lt;br /&gt;
| Postponed until next release&lt;br /&gt;
|-&lt;br /&gt;
| Properties &lt;br /&gt;
| Merge from 0.1 branch&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions, regression&lt;br /&gt;
| Check that all relevant exceptions from 0.1 are in place&lt;br /&gt;
| '''Not started'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Data Transfer Objects&lt;br /&gt;
| Taxonomy thereof. Pythonic APIs&lt;br /&gt;
| Completed (Awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| TestDefinition&lt;br /&gt;
| Removed&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| High Level API&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Hub&lt;br /&gt;
| High level procedural code &lt;br /&gt;
| In Progress&lt;br /&gt;
|-&lt;br /&gt;
| Disambiguation Datamodel&lt;br /&gt;
| Clear persistence and data management&lt;br /&gt;
| In Progress (Persistence parameters separated out)&lt;br /&gt;
|-&lt;br /&gt;
| Distributor&lt;br /&gt;
| Opaque Data Transfer&lt;br /&gt;
| Completed&lt;br /&gt;
|-&lt;br /&gt;
| Default Options&lt;br /&gt;
| Mapping of Default Options to SW product &lt;br /&gt;
| '''BROKEN. Default device options are not handled correctly. see options_factory unit tests'''&lt;br /&gt;
|- &lt;br /&gt;
| XMLRPC&lt;br /&gt;
| Add XMLRPC interface&lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Allocator&lt;br /&gt;
| API for custom Task allocation &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|- &lt;br /&gt;
| Publisher Plugins&lt;br /&gt;
| API and demos for 3rd party Publisher Plugins &lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Input Plugin&lt;br /&gt;
| Incorporate and mark as deprecated&lt;br /&gt;
| '''Not started''' It should be possible to implement this as a publisher. Reporting tools can handle getting target package information.&lt;br /&gt;
|- &lt;br /&gt;
| Allocator Entry Point&lt;br /&gt;
| Add appropriate extension point to allocator to allow custom distribution&lt;br /&gt;
| '''Awaiting merge'''&lt;br /&gt;
|- &lt;br /&gt;
| Parallel Testruns&lt;br /&gt;
| Trigger the same testrun on multiple targets&lt;br /&gt;
| '''Merge from 0.1'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Worker ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Integrate Conductor&lt;br /&gt;
| &lt;br /&gt;
| Full tool chain running&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Plugins ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| BIFH Plugin&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| In Progress (Spike completed awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Reporting Plugin&lt;br /&gt;
| Clear separation between test tool and reporting  &lt;br /&gt;
| In Progress (First pass API. Stubbed demo)&lt;br /&gt;
|-&lt;br /&gt;
| Email Plugin &lt;br /&gt;
| Email Plugin for Publisher API &lt;br /&gt;
| Requires system tests&lt;br /&gt;
|-&lt;br /&gt;
| QA Reports Plugin &lt;br /&gt;
| Publisher plugin for Meego QA Reports tool&lt;br /&gt;
| done&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Usability Issues ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Unittests run as sudo&lt;br /&gt;
| Queue size API calls&lt;br /&gt;
| Fixed&lt;br /&gt;
|-&lt;br /&gt;
| Developer Installation out-of-the-box&lt;br /&gt;
| Make as easy as possible. Clear instructions.   &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| API Documentation&lt;br /&gt;
| All component APIs documented &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
| You Tube Video&lt;br /&gt;
| Instruction Video  &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Other Problems ==&lt;br /&gt;
&lt;br /&gt;
* '''A testrun with invalid sw_product executes a testrun with sandbox-values. An error should be raised and no testrun should be executed.'''&lt;br /&gt;
* '''Exceptions are not handled and they hit the xmlrpc. request_sync() should always return PASS/FAIL/ERROR. nothing else.'''&lt;br /&gt;
* '''Host based testing does not work at all. It complains that no tests were executed.'''&lt;br /&gt;
&lt;br /&gt;
= Scheduled for 0.9 Release =&lt;br /&gt;
&lt;br /&gt;
== Organisation, maintenance and upgrades == &lt;br /&gt;
&lt;br /&gt;
* Component reorg (Assess a better representation of Components in code layout. Check impact on deployment)&lt;br /&gt;
&lt;br /&gt;
* Better unittest harvester (perhaps ''setup.py test'')&lt;br /&gt;
&lt;br /&gt;
* Evaluate status of dependencies (AMQP 1.0, minixsv supports Python 2.5, setuptools versus distribute etc)&lt;br /&gt;
&lt;br /&gt;
== Conductor ==&lt;br /&gt;
&lt;br /&gt;
* Python APIs&lt;br /&gt;
&lt;br /&gt;
* API stability&lt;br /&gt;
&lt;br /&gt;
* 6Pack integration&lt;br /&gt;
&lt;br /&gt;
* Automated reboot&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
* Remove InputPlugin&lt;br /&gt;
&lt;br /&gt;
* Lower level extension points on Result File Parsing&lt;br /&gt;
&lt;br /&gt;
* 6Pack Integration&lt;br /&gt;
&lt;br /&gt;
= Not scheduled items =&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
* HTTPS XML-RPC&lt;br /&gt;
&lt;br /&gt;
* AMQP connection using SSL encryption&lt;br /&gt;
&lt;br /&gt;
* OTS server and worker working in user mode&lt;br /&gt;
&lt;br /&gt;
* Define firewall settings for OTS server and worker&lt;br /&gt;
&lt;br /&gt;
* User authentication and access rights&lt;br /&gt;
&lt;br /&gt;
* Test request DDoS filter&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus</id>
		<title>Quality/QA-tools/OTS/DevelopmentStatus</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus"/>
				<updated>2010-12-31T09:13:31Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Server */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Release 0.8 unstable =&lt;br /&gt;
&lt;br /&gt;
== Application Framework ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Configuration&lt;br /&gt;
| Single configuration file and format, &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Plugins&lt;br /&gt;
| Runtime discoverable mechanism, with clear usage model&lt;br /&gt;
| In Progress (Spike completed)&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions&lt;br /&gt;
| An understandable exception handling model. Documented&lt;br /&gt;
| In Progress (Awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Logging&lt;br /&gt;
| A coherent distributed logging system&lt;br /&gt;
| '''Not working properly. Debug level logging to file is missing and http logger needs to be configured to INFO level.'''&lt;br /&gt;
|-&lt;br /&gt;
| Upgrade Capability &lt;br /&gt;
| Worker version management&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Function call&lt;br /&gt;
| Conductor should be function call not a process&lt;br /&gt;
| Postponed until next release&lt;br /&gt;
|-&lt;br /&gt;
| Properties &lt;br /&gt;
| Merge from 0.1 branch&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions, regression&lt;br /&gt;
| Check that all relevant exceptions from 0.1 are in place&lt;br /&gt;
| '''Not started'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Data Transfer Objects&lt;br /&gt;
| Taxonomy thereof. Pythonic APIs&lt;br /&gt;
| Completed (Awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| TestDefinition&lt;br /&gt;
| Removed&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| High Level API&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Hub&lt;br /&gt;
| High level procedural code &lt;br /&gt;
| In Progress&lt;br /&gt;
|-&lt;br /&gt;
| Disambiguation Datamodel&lt;br /&gt;
| Clear persistence and data management&lt;br /&gt;
| In Progress (Persistence parameters separated out)&lt;br /&gt;
|-&lt;br /&gt;
| Distributor&lt;br /&gt;
| Opaque Data Transfer&lt;br /&gt;
| Completed&lt;br /&gt;
|-&lt;br /&gt;
| Default Options&lt;br /&gt;
| Mapping of Default Options to SW product &lt;br /&gt;
| '''BROKEN. Default device options are not handled correctly. see options_factory unit tests'''&lt;br /&gt;
|- &lt;br /&gt;
| XMLRPC&lt;br /&gt;
| Add XMLRPC interface&lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Allocator&lt;br /&gt;
| API for custom Task allocation &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|- &lt;br /&gt;
| Publisher Plugins&lt;br /&gt;
| API and demos for 3rd party Publisher Plugins &lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Input Plugin&lt;br /&gt;
| Incorporate and mark as deprecated&lt;br /&gt;
| '''Not started''' It should be possible to implement this as a publisher. Reporting tools can handle getting target package information.&lt;br /&gt;
|- &lt;br /&gt;
| Allocator Entry Point&lt;br /&gt;
| Add appropriate extension point to allocator to allow custom distribution&lt;br /&gt;
| '''Awaiting merge'''&lt;br /&gt;
|- &lt;br /&gt;
| Parallel Testruns&lt;br /&gt;
| Trigger the same testrun on multiple targets&lt;br /&gt;
| '''Merge from 0.1'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Worker ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Integrate Conductor&lt;br /&gt;
| &lt;br /&gt;
| Full tool chain running&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Plugins ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| BIFH Plugin&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| In Progress (Spike completed awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Reporting Plugin&lt;br /&gt;
| Clear separation between test tool and reporting  &lt;br /&gt;
| In Progress (First pass API. Stubbed demo)&lt;br /&gt;
|-&lt;br /&gt;
| Email Plugin &lt;br /&gt;
| Email Plugin for Publisher API &lt;br /&gt;
| Requires system tests&lt;br /&gt;
|-&lt;br /&gt;
| QA Reports Plugin &lt;br /&gt;
| Publisher plugin for Meego QA Reports tool&lt;br /&gt;
| done&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Usability Issues ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Unittests run as sudo&lt;br /&gt;
| Queue size API calls&lt;br /&gt;
| Fixed&lt;br /&gt;
|-&lt;br /&gt;
| Developer Installation out-of-the-box&lt;br /&gt;
| Make as easy as possible. Clear instructions.   &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| API Documentation&lt;br /&gt;
| All component APIs documented &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
| You Tube Video&lt;br /&gt;
| Instruction Video  &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Scheduled for 0.9 Release =&lt;br /&gt;
&lt;br /&gt;
== Organisation, maintenance and upgrades == &lt;br /&gt;
&lt;br /&gt;
* Component reorg (Assess a better representation of Components in code layout. Check impact on deployment)&lt;br /&gt;
&lt;br /&gt;
* Better unittest harvester (perhaps ''setup.py test'')&lt;br /&gt;
&lt;br /&gt;
* Evaluate status of dependencies (AMQP 1.0, minixsv supports Python 2.5, setuptools versus distribute etc)&lt;br /&gt;
&lt;br /&gt;
== Conductor ==&lt;br /&gt;
&lt;br /&gt;
* Python APIs&lt;br /&gt;
&lt;br /&gt;
* API stability&lt;br /&gt;
&lt;br /&gt;
* 6Pack integration&lt;br /&gt;
&lt;br /&gt;
* Automated reboot&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
* Remove InputPlugin&lt;br /&gt;
&lt;br /&gt;
* Lower level extension points on Result File Parsing&lt;br /&gt;
&lt;br /&gt;
* 6Pack Integration&lt;br /&gt;
&lt;br /&gt;
= Not scheduled items =&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
* HTTPS XML-RPC&lt;br /&gt;
&lt;br /&gt;
* AMQP connection using SSL encryption&lt;br /&gt;
&lt;br /&gt;
* OTS server and worker working in user mode&lt;br /&gt;
&lt;br /&gt;
* Define firewall settings for OTS server and worker&lt;br /&gt;
&lt;br /&gt;
* User authentication and access rights&lt;br /&gt;
&lt;br /&gt;
* Test request DDoS filter&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus</id>
		<title>Quality/QA-tools/OTS/DevelopmentStatus</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus"/>
				<updated>2010-12-31T06:09:55Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Plugins */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Release 0.8 unstable =&lt;br /&gt;
&lt;br /&gt;
== Application Framework ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Configuration&lt;br /&gt;
| Single configuration file and format, &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Plugins&lt;br /&gt;
| Runtime discoverable mechanism, with clear usage model&lt;br /&gt;
| In Progress (Spike completed)&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions&lt;br /&gt;
| An understandable exception handling model. Documented&lt;br /&gt;
| In Progress (Awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Logging&lt;br /&gt;
| A coherent distributed logging system&lt;br /&gt;
| '''Not working properly. Debug level logging to file is missing and http logger needs to be configured to INFO level.'''&lt;br /&gt;
|-&lt;br /&gt;
| Upgrade Capability &lt;br /&gt;
| Worker version management&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Function call&lt;br /&gt;
| Conductor should be function call not a process&lt;br /&gt;
| Postponed until next release&lt;br /&gt;
|-&lt;br /&gt;
| Properties &lt;br /&gt;
| Merge from 0.1 branch&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions, regression&lt;br /&gt;
| Check that all relevant exceptions from 0.1 are in place&lt;br /&gt;
| '''Not started'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Data Transfer Objects&lt;br /&gt;
| Taxonomy thereof. Pythonic APIs&lt;br /&gt;
| Completed (Awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| TestDefinition&lt;br /&gt;
| Removed&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| High Level API&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Hub&lt;br /&gt;
| High level procedural code &lt;br /&gt;
| In Progress&lt;br /&gt;
|-&lt;br /&gt;
| Disambiguation Datamodel&lt;br /&gt;
| Clear persistence and data management&lt;br /&gt;
| In Progress (Persistence parameters separated out)&lt;br /&gt;
|-&lt;br /&gt;
| Distributor&lt;br /&gt;
| Opaque Data Transfer&lt;br /&gt;
| Completed&lt;br /&gt;
|-&lt;br /&gt;
| Default Options&lt;br /&gt;
| Mapping of Default Options to SW product &lt;br /&gt;
| In Progress (Functionality added config consistency needed)&lt;br /&gt;
|- &lt;br /&gt;
| XMLRPC&lt;br /&gt;
| Add XMLRPC interface&lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Allocator&lt;br /&gt;
| API for custom Task allocation &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|- &lt;br /&gt;
| Publisher Plugins&lt;br /&gt;
| API and demos for 3rd party Publisher Plugins &lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Input Plugin&lt;br /&gt;
| Incorporate and mark as deprecated&lt;br /&gt;
| '''Not started''' It should be possible to implement this as a publisher. Reporting tools can handle getting target package information.&lt;br /&gt;
|- &lt;br /&gt;
| Allocator Entry Point&lt;br /&gt;
| Add appropriate extension point to allocator to allow custom distribution&lt;br /&gt;
| '''Awaiting merge'''&lt;br /&gt;
|- &lt;br /&gt;
| Parallel Testruns&lt;br /&gt;
| Trigger the same testrun on multiple targets&lt;br /&gt;
| '''Merge from 0.1'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Worker ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Integrate Conductor&lt;br /&gt;
| &lt;br /&gt;
| Full tool chain running&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Plugins ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| BIFH Plugin&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| In Progress (Spike completed awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Reporting Plugin&lt;br /&gt;
| Clear separation between test tool and reporting  &lt;br /&gt;
| In Progress (First pass API. Stubbed demo)&lt;br /&gt;
|-&lt;br /&gt;
| Email Plugin &lt;br /&gt;
| Email Plugin for Publisher API &lt;br /&gt;
| Requires system tests&lt;br /&gt;
|-&lt;br /&gt;
| QA Reports Plugin &lt;br /&gt;
| Publisher plugin for Meego QA Reports tool&lt;br /&gt;
| done&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Usability Issues ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Unittests run as sudo&lt;br /&gt;
| Queue size API calls&lt;br /&gt;
| Fixed&lt;br /&gt;
|-&lt;br /&gt;
| Developer Installation out-of-the-box&lt;br /&gt;
| Make as easy as possible. Clear instructions.   &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| API Documentation&lt;br /&gt;
| All component APIs documented &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
| You Tube Video&lt;br /&gt;
| Instruction Video  &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Scheduled for 0.9 Release =&lt;br /&gt;
&lt;br /&gt;
== Organisation, maintenance and upgrades == &lt;br /&gt;
&lt;br /&gt;
* Component reorg (Assess a better representation of Components in code layout. Check impact on deployment)&lt;br /&gt;
&lt;br /&gt;
* Better unittest harvester (perhaps ''setup.py test'')&lt;br /&gt;
&lt;br /&gt;
* Evaluate status of dependencies (AMQP 1.0, minixsv supports Python 2.5, setuptools versus distribute etc)&lt;br /&gt;
&lt;br /&gt;
== Conductor ==&lt;br /&gt;
&lt;br /&gt;
* Python APIs&lt;br /&gt;
&lt;br /&gt;
* API stability&lt;br /&gt;
&lt;br /&gt;
* 6Pack integration&lt;br /&gt;
&lt;br /&gt;
* Automated reboot&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
* Remove InputPlugin&lt;br /&gt;
&lt;br /&gt;
* Lower level extension points on Result File Parsing&lt;br /&gt;
&lt;br /&gt;
* 6Pack Integration&lt;br /&gt;
&lt;br /&gt;
= Not scheduled items =&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
* HTTPS XML-RPC&lt;br /&gt;
&lt;br /&gt;
* AMQP connection using SSL encryption&lt;br /&gt;
&lt;br /&gt;
* OTS server and worker working in user mode&lt;br /&gt;
&lt;br /&gt;
* Define firewall settings for OTS server and worker&lt;br /&gt;
&lt;br /&gt;
* User authentication and access rights&lt;br /&gt;
&lt;br /&gt;
* Test request DDoS filter&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus</id>
		<title>Quality/QA-tools/OTS/DevelopmentStatus</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus"/>
				<updated>2010-12-30T15:23:28Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Plugins */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Release 0.8 unstable =&lt;br /&gt;
&lt;br /&gt;
== Application Framework ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Configuration&lt;br /&gt;
| Single configuration file and format, &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Plugins&lt;br /&gt;
| Runtime discoverable mechanism, with clear usage model&lt;br /&gt;
| In Progress (Spike completed)&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions&lt;br /&gt;
| An understandable exception handling model. Documented&lt;br /&gt;
| In Progress (Awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Logging&lt;br /&gt;
| A coherent distributed logging system&lt;br /&gt;
| '''Not working properly. Debug level logging to file is missing and http logger needs to be configured to INFO level.'''&lt;br /&gt;
|-&lt;br /&gt;
| Upgrade Capability &lt;br /&gt;
| Worker version management&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Function call&lt;br /&gt;
| Conductor should be function call not a process&lt;br /&gt;
| Postponed until next release&lt;br /&gt;
|-&lt;br /&gt;
| Properties &lt;br /&gt;
| Merge from 0.1 branch&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions, regression&lt;br /&gt;
| Check that all relevant exceptions from 0.1 are in place&lt;br /&gt;
| '''Not started'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Data Transfer Objects&lt;br /&gt;
| Taxonomy thereof. Pythonic APIs&lt;br /&gt;
| Completed (Awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| TestDefinition&lt;br /&gt;
| Removed&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| High Level API&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Hub&lt;br /&gt;
| High level procedural code &lt;br /&gt;
| In Progress&lt;br /&gt;
|-&lt;br /&gt;
| Disambiguation Datamodel&lt;br /&gt;
| Clear persistence and data management&lt;br /&gt;
| In Progress (Persistence parameters separated out)&lt;br /&gt;
|-&lt;br /&gt;
| Distributor&lt;br /&gt;
| Opaque Data Transfer&lt;br /&gt;
| Completed&lt;br /&gt;
|-&lt;br /&gt;
| Default Options&lt;br /&gt;
| Mapping of Default Options to SW product &lt;br /&gt;
| In Progress (Functionality added config consistency needed)&lt;br /&gt;
|- &lt;br /&gt;
| XMLRPC&lt;br /&gt;
| Add XMLRPC interface&lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Allocator&lt;br /&gt;
| API for custom Task allocation &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|- &lt;br /&gt;
| Publisher Plugins&lt;br /&gt;
| API and demos for 3rd party Publisher Plugins &lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Input Plugin&lt;br /&gt;
| Incorporate and mark as deprecated&lt;br /&gt;
| '''Not started''' It should be possible to implement this as a publisher. Reporting tools can handle getting target package information.&lt;br /&gt;
|- &lt;br /&gt;
| Allocator Entry Point&lt;br /&gt;
| Add appropriate extension point to allocator to allow custom distribution&lt;br /&gt;
| '''Awaiting merge'''&lt;br /&gt;
|- &lt;br /&gt;
| Parallel Testruns&lt;br /&gt;
| Trigger the same testrun on multiple targets&lt;br /&gt;
| '''Merge from 0.1'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Worker ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Integrate Conductor&lt;br /&gt;
| &lt;br /&gt;
| Full tool chain running&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Plugins ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| BIFH Plugin&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| In Progress (Spike completed awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Reporting Plugin&lt;br /&gt;
| Clear separation between test tool and reporting  &lt;br /&gt;
| In Progress (First pass API. Stubbed demo)&lt;br /&gt;
|-&lt;br /&gt;
| Email Plugin &lt;br /&gt;
| Email Plugin for Publisher API &lt;br /&gt;
| Requires system tests&lt;br /&gt;
|-&lt;br /&gt;
| QA Reports Plugin &lt;br /&gt;
| Publisher plugin for Meego QA Reports tool&lt;br /&gt;
| '''In progress'''&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Usability Issues ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Unittests run as sudo&lt;br /&gt;
| Queue size API calls&lt;br /&gt;
| Fixed&lt;br /&gt;
|-&lt;br /&gt;
| Developer Installation out-of-the-box&lt;br /&gt;
| Make as easy as possible. Clear instructions.   &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| API Documentation&lt;br /&gt;
| All component APIs documented &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
| You Tube Video&lt;br /&gt;
| Instruction Video  &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Scheduled for 0.9 Release =&lt;br /&gt;
&lt;br /&gt;
== Organisation, maintenance and upgrades == &lt;br /&gt;
&lt;br /&gt;
* Component reorg (Assess a better representation of Components in code layout. Check impact on deployment)&lt;br /&gt;
&lt;br /&gt;
* Better unittest harvester (perhaps ''setup.py test'')&lt;br /&gt;
&lt;br /&gt;
* Evaluate status of dependencies (AMQP 1.0, minixsv supports Python 2.5, setuptools versus distribute etc)&lt;br /&gt;
&lt;br /&gt;
== Conductor ==&lt;br /&gt;
&lt;br /&gt;
* Python APIs&lt;br /&gt;
&lt;br /&gt;
* API stability&lt;br /&gt;
&lt;br /&gt;
* 6Pack integration&lt;br /&gt;
&lt;br /&gt;
* Automated reboot&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
* Remove InputPlugin&lt;br /&gt;
&lt;br /&gt;
* Lower level extension points on Result File Parsing&lt;br /&gt;
&lt;br /&gt;
* 6Pack Integration&lt;br /&gt;
&lt;br /&gt;
= Not scheduled items =&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
* HTTPS XML-RPC&lt;br /&gt;
&lt;br /&gt;
* AMQP connection using SSL encryption&lt;br /&gt;
&lt;br /&gt;
* OTS server and worker working in user mode&lt;br /&gt;
&lt;br /&gt;
* Define firewall settings for OTS server and worker&lt;br /&gt;
&lt;br /&gt;
* User authentication and access rights&lt;br /&gt;
&lt;br /&gt;
* Test request DDoS filter&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus</id>
		<title>Quality/QA-tools/OTS/DevelopmentStatus</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus"/>
				<updated>2010-12-30T15:17:24Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Application Framework */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Release 0.8 unstable =&lt;br /&gt;
&lt;br /&gt;
== Application Framework ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Configuration&lt;br /&gt;
| Single configuration file and format, &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Plugins&lt;br /&gt;
| Runtime discoverable mechanism, with clear usage model&lt;br /&gt;
| In Progress (Spike completed)&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions&lt;br /&gt;
| An understandable exception handling model. Documented&lt;br /&gt;
| In Progress (Awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Logging&lt;br /&gt;
| A coherent distributed logging system&lt;br /&gt;
| '''Not working properly. Debug level logging to file is missing and http logger needs to be configured to INFO level.'''&lt;br /&gt;
|-&lt;br /&gt;
| Upgrade Capability &lt;br /&gt;
| Worker version management&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Function call&lt;br /&gt;
| Conductor should be function call not a process&lt;br /&gt;
| Postponed until next release&lt;br /&gt;
|-&lt;br /&gt;
| Properties &lt;br /&gt;
| Merge from 0.1 branch&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions, regression&lt;br /&gt;
| Check that all relevant exceptions from 0.1 are in place&lt;br /&gt;
| '''Not started'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Data Transfer Objects&lt;br /&gt;
| Taxonomy thereof. Pythonic APIs&lt;br /&gt;
| Completed (Awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| TestDefinition&lt;br /&gt;
| Removed&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| High Level API&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Hub&lt;br /&gt;
| High level procedural code &lt;br /&gt;
| In Progress&lt;br /&gt;
|-&lt;br /&gt;
| Disambiguation Datamodel&lt;br /&gt;
| Clear persistence and data management&lt;br /&gt;
| In Progress (Persistence parameters separated out)&lt;br /&gt;
|-&lt;br /&gt;
| Distributor&lt;br /&gt;
| Opaque Data Transfer&lt;br /&gt;
| Completed&lt;br /&gt;
|-&lt;br /&gt;
| Default Options&lt;br /&gt;
| Mapping of Default Options to SW product &lt;br /&gt;
| In Progress (Functionality added config consistency needed)&lt;br /&gt;
|- &lt;br /&gt;
| XMLRPC&lt;br /&gt;
| Add XMLRPC interface&lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Allocator&lt;br /&gt;
| API for custom Task allocation &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|- &lt;br /&gt;
| Publisher Plugins&lt;br /&gt;
| API and demos for 3rd party Publisher Plugins &lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Input Plugin&lt;br /&gt;
| Incorporate and mark as deprecated&lt;br /&gt;
| '''Not started''' It should be possible to implement this as a publisher. Reporting tools can handle getting target package information.&lt;br /&gt;
|- &lt;br /&gt;
| Allocator Entry Point&lt;br /&gt;
| Add appropriate extension point to allocator to allow custom distribution&lt;br /&gt;
| '''Awaiting merge'''&lt;br /&gt;
|- &lt;br /&gt;
| Parallel Testruns&lt;br /&gt;
| Trigger the same testrun on multiple targets&lt;br /&gt;
| '''Merge from 0.1'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Worker ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Integrate Conductor&lt;br /&gt;
| &lt;br /&gt;
| Full tool chain running&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Plugins ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| BIFH Plugin&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| In Progress (Spike completed awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Reporting Plugin&lt;br /&gt;
| Clear separation between test tool and reporting  &lt;br /&gt;
| In Progress (First pass API. Stubbed demo)&lt;br /&gt;
|-&lt;br /&gt;
| Email Plugin &lt;br /&gt;
| Email Plugin for Publisher API &lt;br /&gt;
| Requires system tests&lt;br /&gt;
|-&lt;br /&gt;
| QA Reports Plugin &lt;br /&gt;
| Publisher plugin for Meego QA Reports tool&lt;br /&gt;
| '''merge from OTS 0.1 and write the plugin wrapper'''&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Usability Issues ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Unittests run as sudo&lt;br /&gt;
| Queue size API calls&lt;br /&gt;
| Fixed&lt;br /&gt;
|-&lt;br /&gt;
| Developer Installation out-of-the-box&lt;br /&gt;
| Make as easy as possible. Clear instructions.   &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| API Documentation&lt;br /&gt;
| All component APIs documented &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
| You Tube Video&lt;br /&gt;
| Instruction Video  &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Scheduled for 0.9 Release =&lt;br /&gt;
&lt;br /&gt;
== Organisation, maintenance and upgrades == &lt;br /&gt;
&lt;br /&gt;
* Component reorg (Assess a better representation of Components in code layout. Check impact on deployment)&lt;br /&gt;
&lt;br /&gt;
* Better unittest harvester (perhaps ''setup.py test'')&lt;br /&gt;
&lt;br /&gt;
* Evaluate status of dependencies (AMQP 1.0, minixsv supports Python 2.5, setuptools versus distribute etc)&lt;br /&gt;
&lt;br /&gt;
== Conductor ==&lt;br /&gt;
&lt;br /&gt;
* Python APIs&lt;br /&gt;
&lt;br /&gt;
* API stability&lt;br /&gt;
&lt;br /&gt;
* 6Pack integration&lt;br /&gt;
&lt;br /&gt;
* Automated reboot&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
* Remove InputPlugin&lt;br /&gt;
&lt;br /&gt;
* Lower level extension points on Result File Parsing&lt;br /&gt;
&lt;br /&gt;
* 6Pack Integration&lt;br /&gt;
&lt;br /&gt;
= Not scheduled items =&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
* HTTPS XML-RPC&lt;br /&gt;
&lt;br /&gt;
* AMQP connection using SSL encryption&lt;br /&gt;
&lt;br /&gt;
* OTS server and worker working in user mode&lt;br /&gt;
&lt;br /&gt;
* Define firewall settings for OTS server and worker&lt;br /&gt;
&lt;br /&gt;
* User authentication and access rights&lt;br /&gt;
&lt;br /&gt;
* Test request DDoS filter&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus</id>
		<title>Quality/QA-tools/OTS/DevelopmentStatus</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus"/>
				<updated>2010-12-30T08:37:10Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Plugins */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Release 0.8 unstable =&lt;br /&gt;
&lt;br /&gt;
== Application Framework ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Configuration&lt;br /&gt;
| Single configuration file and format, &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Plugins&lt;br /&gt;
| Runtime discoverable mechanism, with clear usage model&lt;br /&gt;
| In Progress (Spike completed)&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions&lt;br /&gt;
| An understandable exception handling model. Documented&lt;br /&gt;
| In Progress (Awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Logging&lt;br /&gt;
| A coherent distributed logging system&lt;br /&gt;
| '''Not working properly. HTTP logger does not receive server side log messages from the components that are imported before publisher plugins are loaded'''&lt;br /&gt;
|-&lt;br /&gt;
| Upgrade Capability &lt;br /&gt;
| Worker version management&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Function call&lt;br /&gt;
| Conductor should be function call not a process&lt;br /&gt;
| Postponed until next release&lt;br /&gt;
|-&lt;br /&gt;
| Properties &lt;br /&gt;
| Merge from 0.1 branch&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions, regression&lt;br /&gt;
| Check that all relevant exceptions from 0.1 are in place&lt;br /&gt;
| '''Not started'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Data Transfer Objects&lt;br /&gt;
| Taxonomy thereof. Pythonic APIs&lt;br /&gt;
| Completed (Awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| TestDefinition&lt;br /&gt;
| Removed&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| High Level API&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Hub&lt;br /&gt;
| High level procedural code &lt;br /&gt;
| In Progress&lt;br /&gt;
|-&lt;br /&gt;
| Disambiguation Datamodel&lt;br /&gt;
| Clear persistence and data management&lt;br /&gt;
| In Progress (Persistence parameters separated out)&lt;br /&gt;
|-&lt;br /&gt;
| Distributor&lt;br /&gt;
| Opaque Data Transfer&lt;br /&gt;
| Completed&lt;br /&gt;
|-&lt;br /&gt;
| Default Options&lt;br /&gt;
| Mapping of Default Options to SW product &lt;br /&gt;
| In Progress (Functionality added config consistency needed)&lt;br /&gt;
|- &lt;br /&gt;
| XMLRPC&lt;br /&gt;
| Add XMLRPC interface&lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Allocator&lt;br /&gt;
| API for custom Task allocation &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|- &lt;br /&gt;
| Publisher Plugins&lt;br /&gt;
| API and demos for 3rd party Publisher Plugins &lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Input Plugin&lt;br /&gt;
| Incorporate and mark as deprecated&lt;br /&gt;
| '''Not started''' It should be possible to implement this as a publisher. Reporting tools can handle getting target package information.&lt;br /&gt;
|- &lt;br /&gt;
| Allocator Entry Point&lt;br /&gt;
| Add appropriate extension point to allocator to allow custom distribution&lt;br /&gt;
| '''Awaiting merge'''&lt;br /&gt;
|- &lt;br /&gt;
| Parallel Testruns&lt;br /&gt;
| Trigger the same testrun on multiple targets&lt;br /&gt;
| '''Merge from 0.1'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Worker ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Integrate Conductor&lt;br /&gt;
| &lt;br /&gt;
| Full tool chain running&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Plugins ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| BIFH Plugin&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| In Progress (Spike completed awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Reporting Plugin&lt;br /&gt;
| Clear separation between test tool and reporting  &lt;br /&gt;
| In Progress (First pass API. Stubbed demo)&lt;br /&gt;
|-&lt;br /&gt;
| Email Plugin &lt;br /&gt;
| Email Plugin for Publisher API &lt;br /&gt;
| Requires system tests&lt;br /&gt;
|-&lt;br /&gt;
| QA Reports Plugin &lt;br /&gt;
| Publisher plugin for Meego QA Reports tool&lt;br /&gt;
| '''merge from OTS 0.1 and write the plugin wrapper'''&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Usability Issues ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Unittests run as sudo&lt;br /&gt;
| Queue size API calls&lt;br /&gt;
| Fixed&lt;br /&gt;
|-&lt;br /&gt;
| Developer Installation out-of-the-box&lt;br /&gt;
| Make as easy as possible. Clear instructions.   &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| API Documentation&lt;br /&gt;
| All component APIs documented &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
| You Tube Video&lt;br /&gt;
| Instruction Video  &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Scheduled for 0.9 Release =&lt;br /&gt;
&lt;br /&gt;
== Organisation, maintenance and upgrades == &lt;br /&gt;
&lt;br /&gt;
* Component reorg (Assess a better representation of Components in code layout. Check impact on deployment)&lt;br /&gt;
&lt;br /&gt;
* Better unittest harvester (perhaps ''setup.py test'')&lt;br /&gt;
&lt;br /&gt;
* Evaluate status of dependencies (AMQP 1.0, minixsv supports Python 2.5, setuptools versus distribute etc)&lt;br /&gt;
&lt;br /&gt;
== Conductor ==&lt;br /&gt;
&lt;br /&gt;
* Python APIs&lt;br /&gt;
&lt;br /&gt;
* API stability&lt;br /&gt;
&lt;br /&gt;
* 6Pack integration&lt;br /&gt;
&lt;br /&gt;
* Automated reboot&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
* Remove InputPlugin&lt;br /&gt;
&lt;br /&gt;
* Lower level extension points on Result File Parsing&lt;br /&gt;
&lt;br /&gt;
* 6Pack Integration&lt;br /&gt;
&lt;br /&gt;
= Not scheduled items =&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
* HTTPS XML-RPC&lt;br /&gt;
&lt;br /&gt;
* AMQP connection using SSL encryption&lt;br /&gt;
&lt;br /&gt;
* OTS server and worker working in user mode&lt;br /&gt;
&lt;br /&gt;
* Define firewall settings for OTS server and worker&lt;br /&gt;
&lt;br /&gt;
* User authentication and access rights&lt;br /&gt;
&lt;br /&gt;
* Test request DDoS filter&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus</id>
		<title>Quality/QA-tools/OTS/DevelopmentStatus</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus"/>
				<updated>2010-12-30T08:36:08Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Server */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Release 0.8 unstable =&lt;br /&gt;
&lt;br /&gt;
== Application Framework ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Configuration&lt;br /&gt;
| Single configuration file and format, &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Plugins&lt;br /&gt;
| Runtime discoverable mechanism, with clear usage model&lt;br /&gt;
| In Progress (Spike completed)&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions&lt;br /&gt;
| An understandable exception handling model. Documented&lt;br /&gt;
| In Progress (Awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Logging&lt;br /&gt;
| A coherent distributed logging system&lt;br /&gt;
| '''Not working properly. HTTP logger does not receive server side log messages from the components that are imported before publisher plugins are loaded'''&lt;br /&gt;
|-&lt;br /&gt;
| Upgrade Capability &lt;br /&gt;
| Worker version management&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Function call&lt;br /&gt;
| Conductor should be function call not a process&lt;br /&gt;
| Postponed until next release&lt;br /&gt;
|-&lt;br /&gt;
| Properties &lt;br /&gt;
| Merge from 0.1 branch&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions, regression&lt;br /&gt;
| Check that all relevant exceptions from 0.1 are in place&lt;br /&gt;
| '''Not started'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Data Transfer Objects&lt;br /&gt;
| Taxonomy thereof. Pythonic APIs&lt;br /&gt;
| Completed (Awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| TestDefinition&lt;br /&gt;
| Removed&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| High Level API&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Hub&lt;br /&gt;
| High level procedural code &lt;br /&gt;
| In Progress&lt;br /&gt;
|-&lt;br /&gt;
| Disambiguation Datamodel&lt;br /&gt;
| Clear persistence and data management&lt;br /&gt;
| In Progress (Persistence parameters separated out)&lt;br /&gt;
|-&lt;br /&gt;
| Distributor&lt;br /&gt;
| Opaque Data Transfer&lt;br /&gt;
| Completed&lt;br /&gt;
|-&lt;br /&gt;
| Default Options&lt;br /&gt;
| Mapping of Default Options to SW product &lt;br /&gt;
| In Progress (Functionality added config consistency needed)&lt;br /&gt;
|- &lt;br /&gt;
| XMLRPC&lt;br /&gt;
| Add XMLRPC interface&lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Allocator&lt;br /&gt;
| API for custom Task allocation &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|- &lt;br /&gt;
| Publisher Plugins&lt;br /&gt;
| API and demos for 3rd party Publisher Plugins &lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Input Plugin&lt;br /&gt;
| Incorporate and mark as deprecated&lt;br /&gt;
| '''Not started''' It should be possible to implement this as a publisher. Reporting tools can handle getting target package information.&lt;br /&gt;
|- &lt;br /&gt;
| Allocator Entry Point&lt;br /&gt;
| Add appropriate extension point to allocator to allow custom distribution&lt;br /&gt;
| '''Awaiting merge'''&lt;br /&gt;
|- &lt;br /&gt;
| Parallel Testruns&lt;br /&gt;
| Trigger the same testrun on multiple targets&lt;br /&gt;
| '''Merge from 0.1'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Worker ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Integrate Conductor&lt;br /&gt;
| &lt;br /&gt;
| Full tool chain running&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Plugins ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| BIFH Plugin&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| In Progress (Spike completed awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Reporting Plugin&lt;br /&gt;
| Clear separation between test tool and reporting  &lt;br /&gt;
| In Progress (First pass API. Stubbed demo)&lt;br /&gt;
|-&lt;br /&gt;
| Email Plugin &lt;br /&gt;
| Email Plugin for Publisher API &lt;br /&gt;
| Requires system tests&lt;br /&gt;
|-&lt;br /&gt;
| QA Reports Plugin &lt;br /&gt;
| Publisher plugin for Meego QA Reports tool&lt;br /&gt;
| merge from OTS 0.1 and write the plugin wrapper&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Usability Issues ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Unittests run as sudo&lt;br /&gt;
| Queue size API calls&lt;br /&gt;
| Fixed&lt;br /&gt;
|-&lt;br /&gt;
| Developer Installation out-of-the-box&lt;br /&gt;
| Make as easy as possible. Clear instructions.   &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| API Documentation&lt;br /&gt;
| All component APIs documented &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
| You Tube Video&lt;br /&gt;
| Instruction Video  &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Scheduled for 0.9 Release =&lt;br /&gt;
&lt;br /&gt;
== Organisation, maintenance and upgrades == &lt;br /&gt;
&lt;br /&gt;
* Component reorg (Assess a better representation of Components in code layout. Check impact on deployment)&lt;br /&gt;
&lt;br /&gt;
* Better unittest harvester (perhaps ''setup.py test'')&lt;br /&gt;
&lt;br /&gt;
* Evaluate status of dependencies (AMQP 1.0, minixsv supports Python 2.5, setuptools versus distribute etc)&lt;br /&gt;
&lt;br /&gt;
== Conductor ==&lt;br /&gt;
&lt;br /&gt;
* Python APIs&lt;br /&gt;
&lt;br /&gt;
* API stability&lt;br /&gt;
&lt;br /&gt;
* 6Pack integration&lt;br /&gt;
&lt;br /&gt;
* Automated reboot&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
* Remove InputPlugin&lt;br /&gt;
&lt;br /&gt;
* Lower level extension points on Result File Parsing&lt;br /&gt;
&lt;br /&gt;
* 6Pack Integration&lt;br /&gt;
&lt;br /&gt;
= Not scheduled items =&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
* HTTPS XML-RPC&lt;br /&gt;
&lt;br /&gt;
* AMQP connection using SSL encryption&lt;br /&gt;
&lt;br /&gt;
* OTS server and worker working in user mode&lt;br /&gt;
&lt;br /&gt;
* Define firewall settings for OTS server and worker&lt;br /&gt;
&lt;br /&gt;
* User authentication and access rights&lt;br /&gt;
&lt;br /&gt;
* Test request DDoS filter&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus</id>
		<title>Quality/QA-tools/OTS/DevelopmentStatus</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus"/>
				<updated>2010-12-30T08:32:05Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Application Framework */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Release 0.8 unstable =&lt;br /&gt;
&lt;br /&gt;
== Application Framework ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Configuration&lt;br /&gt;
| Single configuration file and format, &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Plugins&lt;br /&gt;
| Runtime discoverable mechanism, with clear usage model&lt;br /&gt;
| In Progress (Spike completed)&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions&lt;br /&gt;
| An understandable exception handling model. Documented&lt;br /&gt;
| In Progress (Awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Logging&lt;br /&gt;
| A coherent distributed logging system&lt;br /&gt;
| '''Not working properly. HTTP logger does not receive server side log messages from the components that are imported before publisher plugins are loaded'''&lt;br /&gt;
|-&lt;br /&gt;
| Upgrade Capability &lt;br /&gt;
| Worker version management&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Function call&lt;br /&gt;
| Conductor should be function call not a process&lt;br /&gt;
| Postponed until next release&lt;br /&gt;
|-&lt;br /&gt;
| Properties &lt;br /&gt;
| Merge from 0.1 branch&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions, regression&lt;br /&gt;
| Check that all relevant exceptions from 0.1 are in place&lt;br /&gt;
| '''Not started'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Data Transfer Objects&lt;br /&gt;
| Taxonomy thereof. Pythonic APIs&lt;br /&gt;
| Completed (Awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| TestDefinition&lt;br /&gt;
| Removed&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| High Level API&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Hub&lt;br /&gt;
| High level procedural code &lt;br /&gt;
| In Progress&lt;br /&gt;
|-&lt;br /&gt;
| Disambiguation Datamodel&lt;br /&gt;
| Clear persistence and data management&lt;br /&gt;
| In Progress (Persistence parameters separated out)&lt;br /&gt;
|-&lt;br /&gt;
| Distributor&lt;br /&gt;
| Opaque Data Transfer&lt;br /&gt;
| Completed&lt;br /&gt;
|-&lt;br /&gt;
| Default Options&lt;br /&gt;
| Mapping of Default Options to SW product &lt;br /&gt;
| In Progress (Functionality added config consistency needed)&lt;br /&gt;
|- &lt;br /&gt;
| XMLRPC&lt;br /&gt;
| Add XMLRPC interface&lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Allocator&lt;br /&gt;
| API for custom Task allocation &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|- &lt;br /&gt;
| Publisher Plugins&lt;br /&gt;
| API and demos for 3rd party Publisher Plugins &lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Input Plugin&lt;br /&gt;
| Incorporate and mark as deprecated&lt;br /&gt;
| '''Not started'''&lt;br /&gt;
|- &lt;br /&gt;
| Allocator Entry Point&lt;br /&gt;
| Add appropriate extension point to allocator to allow custom distribution&lt;br /&gt;
| '''Awaiting merge'''&lt;br /&gt;
|- &lt;br /&gt;
| Parallel Testruns&lt;br /&gt;
| Trigger the same testrun on multiple targets&lt;br /&gt;
| '''Merge from 0.1'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Worker ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Integrate Conductor&lt;br /&gt;
| &lt;br /&gt;
| Full tool chain running&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Plugins ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| BIFH Plugin&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| In Progress (Spike completed awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Reporting Plugin&lt;br /&gt;
| Clear separation between test tool and reporting  &lt;br /&gt;
| In Progress (First pass API. Stubbed demo)&lt;br /&gt;
|-&lt;br /&gt;
| Email Plugin &lt;br /&gt;
| Email Plugin for Publisher API &lt;br /&gt;
| Requires system tests&lt;br /&gt;
|-&lt;br /&gt;
| QA Reports Plugin &lt;br /&gt;
| Publisher plugin for Meego QA Reports tool&lt;br /&gt;
| merge from OTS 0.1 and write the plugin wrapper&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Usability Issues ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Unittests run as sudo&lt;br /&gt;
| Queue size API calls&lt;br /&gt;
| Fixed&lt;br /&gt;
|-&lt;br /&gt;
| Developer Installation out-of-the-box&lt;br /&gt;
| Make as easy as possible. Clear instructions.   &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| API Documentation&lt;br /&gt;
| All component APIs documented &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
| You Tube Video&lt;br /&gt;
| Instruction Video  &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Scheduled for 0.9 Release =&lt;br /&gt;
&lt;br /&gt;
== Organisation, maintenance and upgrades == &lt;br /&gt;
&lt;br /&gt;
* Component reorg (Assess a better representation of Components in code layout. Check impact on deployment)&lt;br /&gt;
&lt;br /&gt;
* Better unittest harvester (perhaps ''setup.py test'')&lt;br /&gt;
&lt;br /&gt;
* Evaluate status of dependencies (AMQP 1.0, minixsv supports Python 2.5, setuptools versus distribute etc)&lt;br /&gt;
&lt;br /&gt;
== Conductor ==&lt;br /&gt;
&lt;br /&gt;
* Python APIs&lt;br /&gt;
&lt;br /&gt;
* API stability&lt;br /&gt;
&lt;br /&gt;
* 6Pack integration&lt;br /&gt;
&lt;br /&gt;
* Automated reboot&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
* Remove InputPlugin&lt;br /&gt;
&lt;br /&gt;
* Lower level extension points on Result File Parsing&lt;br /&gt;
&lt;br /&gt;
* 6Pack Integration&lt;br /&gt;
&lt;br /&gt;
= Not scheduled items =&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
* HTTPS XML-RPC&lt;br /&gt;
&lt;br /&gt;
* AMQP connection using SSL encryption&lt;br /&gt;
&lt;br /&gt;
* OTS server and worker working in user mode&lt;br /&gt;
&lt;br /&gt;
* Define firewall settings for OTS server and worker&lt;br /&gt;
&lt;br /&gt;
* User authentication and access rights&lt;br /&gt;
&lt;br /&gt;
* Test request DDoS filter&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus</id>
		<title>Quality/QA-tools/OTS/DevelopmentStatus</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DevelopmentStatus"/>
				<updated>2010-12-30T06:37:12Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Plugins */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Release 0.8 unstable =&lt;br /&gt;
&lt;br /&gt;
== Application Framework ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Configuration&lt;br /&gt;
| Single configuration file and format, &lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Plugins&lt;br /&gt;
| Runtime discoverable mechanism, with clear usage model&lt;br /&gt;
| In Progress (Spike completed)&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions&lt;br /&gt;
| An understandable exception handling model. Documented&lt;br /&gt;
| In Progress (Awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Logging&lt;br /&gt;
| A coherent distributed logging system&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Upgrade Capability &lt;br /&gt;
| Worker version management&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Function call&lt;br /&gt;
| Conductor should be function call not a process&lt;br /&gt;
| Postponed until next release&lt;br /&gt;
|-&lt;br /&gt;
| Properties &lt;br /&gt;
| Merge from 0.1 branch&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Exceptions, regression&lt;br /&gt;
| Check that all relevant exceptions from 0.1 are in place&lt;br /&gt;
| '''Not started'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Data Transfer Objects&lt;br /&gt;
| Taxonomy thereof. Pythonic APIs&lt;br /&gt;
| Completed (Awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| TestDefinition&lt;br /&gt;
| Removed&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| High Level API&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| Hub&lt;br /&gt;
| High level procedural code &lt;br /&gt;
| In Progress&lt;br /&gt;
|-&lt;br /&gt;
| Disambiguation Datamodel&lt;br /&gt;
| Clear persistence and data management&lt;br /&gt;
| In Progress (Persistence parameters separated out)&lt;br /&gt;
|-&lt;br /&gt;
| Distributor&lt;br /&gt;
| Opaque Data Transfer&lt;br /&gt;
| Completed&lt;br /&gt;
|-&lt;br /&gt;
| Default Options&lt;br /&gt;
| Mapping of Default Options to SW product &lt;br /&gt;
| In Progress (Functionality added config consistency needed)&lt;br /&gt;
|- &lt;br /&gt;
| XMLRPC&lt;br /&gt;
| Add XMLRPC interface&lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Allocator&lt;br /&gt;
| API for custom Task allocation &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|- &lt;br /&gt;
| Publisher Plugins&lt;br /&gt;
| API and demos for 3rd party Publisher Plugins &lt;br /&gt;
| Completed&lt;br /&gt;
|- &lt;br /&gt;
| Input Plugin&lt;br /&gt;
| Incorporate and mark as deprecated&lt;br /&gt;
| '''Not started'''&lt;br /&gt;
|- &lt;br /&gt;
| Allocator Entry Point&lt;br /&gt;
| Add appropriate extension point to allocator to allow custom distribution&lt;br /&gt;
| '''Awaiting merge'''&lt;br /&gt;
|- &lt;br /&gt;
| Parallel Testruns&lt;br /&gt;
| Trigger the same testrun on multiple targets&lt;br /&gt;
| '''Merge from 0.1'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Worker ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Integrate Conductor&lt;br /&gt;
| &lt;br /&gt;
| Full tool chain running&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Plugins ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| BIFH Plugin&lt;br /&gt;
| Client facing interface&lt;br /&gt;
| In Progress (Spike completed awaiting review)&lt;br /&gt;
|-&lt;br /&gt;
| Reporting Plugin&lt;br /&gt;
| Clear separation between test tool and reporting  &lt;br /&gt;
| In Progress (First pass API. Stubbed demo)&lt;br /&gt;
|-&lt;br /&gt;
| Email Plugin &lt;br /&gt;
| Email Plugin for Publisher API &lt;br /&gt;
| Requires system tests&lt;br /&gt;
|-&lt;br /&gt;
| QA Reports Plugin &lt;br /&gt;
| Publisher plugin for Meego QA Reports tool&lt;br /&gt;
| merge from OTS 0.1 and write the plugin wrapper&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Usability Issues ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Description&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Unittests run as sudo&lt;br /&gt;
| Queue size API calls&lt;br /&gt;
| Fixed&lt;br /&gt;
|-&lt;br /&gt;
| Developer Installation out-of-the-box&lt;br /&gt;
| Make as easy as possible. Clear instructions.   &lt;br /&gt;
| Awaiting review&lt;br /&gt;
|-&lt;br /&gt;
| API Documentation&lt;br /&gt;
| All component APIs documented &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
| You Tube Video&lt;br /&gt;
| Instruction Video  &lt;br /&gt;
| In Progress &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Scheduled for 0.9 Release =&lt;br /&gt;
&lt;br /&gt;
== Organisation, maintenance and upgrades == &lt;br /&gt;
&lt;br /&gt;
* Component reorg (Assess a better representation of Components in code layout. Check impact on deployment)&lt;br /&gt;
&lt;br /&gt;
* Better unittest harvester (perhaps ''setup.py test'')&lt;br /&gt;
&lt;br /&gt;
* Evaluate status of dependencies (AMQP 1.0, minixsv supports Python 2.5, setuptools versus distribute etc)&lt;br /&gt;
&lt;br /&gt;
== Conductor ==&lt;br /&gt;
&lt;br /&gt;
* Python APIs&lt;br /&gt;
&lt;br /&gt;
* API stability&lt;br /&gt;
&lt;br /&gt;
* 6Pack integration&lt;br /&gt;
&lt;br /&gt;
* Automated reboot&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
* Remove InputPlugin&lt;br /&gt;
&lt;br /&gt;
* Lower level extension points on Result File Parsing&lt;br /&gt;
&lt;br /&gt;
* 6Pack Integration&lt;br /&gt;
&lt;br /&gt;
= Not scheduled items =&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
* HTTPS XML-RPC&lt;br /&gt;
&lt;br /&gt;
* AMQP connection using SSL encryption&lt;br /&gt;
&lt;br /&gt;
* OTS server and worker working in user mode&lt;br /&gt;
&lt;br /&gt;
* Define firewall settings for OTS server and worker&lt;br /&gt;
&lt;br /&gt;
* User authentication and access rights&lt;br /&gt;
&lt;br /&gt;
* Test request DDoS filter&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/ErrorSituations</id>
		<title>Quality/QA-tools/OTS/DeveloperDocs/ErrorSituations</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/ErrorSituations"/>
				<updated>2010-12-29T14:21:12Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* /ots/server/testrun_host/testrun_host.py:451: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OTS 0.1 Error Situations =&lt;br /&gt;
&lt;br /&gt;
OTS 0.1 has 2 ways of handling error information. The testrun has a specific &amp;quot;set_error_info() and set_error_code()&amp;quot; mechanism for critical errors. This is the main mechanism. In addition to that error messages are printed to http log. The error info mechanism is a legacy thing from the old days we didn't have global http logging or amqp.&lt;br /&gt;
&lt;br /&gt;
In OTS 0.8 we have the same http logging. The set_error_info() stuff is gone but it is replaced by exceptions that can be sent over the wire with amqp.&lt;br /&gt;
&lt;br /&gt;
== Critical Errors ==&lt;br /&gt;
&lt;br /&gt;
These cause the testrun to end with result ERROR&lt;br /&gt;
&lt;br /&gt;
=== /ots/common/results/resultjudge.py:169: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	self.testrun.set_error_info(&amp;quot;No test packages defined nor found.&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if user didn't specify test packages and conductor couldn't found any.&lt;br /&gt;
* This should practically never happen. Conductor should raise other errors before this if image does not contain packages.&lt;br /&gt;
&lt;br /&gt;
=== /ots/common/results/resultjudge.py:179: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
self.testrun.set_error_info(&amp;quot;Results missing from: %s&amp;quot; \&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if server didn't receive results.xml for all testpackages this.&lt;br /&gt;
* This can happen for example if global timeout happens. (Conductor detects timeouts and raises Timeout error so this shouldn't happen anymore?)&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:252: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            return ots_config.default_options[sw_product]&lt;br /&gt;
        except (KeyError, ValueError):&lt;br /&gt;
            raise Exception(&amp;quot;Unknown sw_product %s&amp;quot; % sw_product)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if user tries to use sw product that is not defined in the config file&lt;br /&gt;
* '''System test: log_tests.TestErrorConditions.test_non_existing_devicegroup'''&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:392: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        for package in test_packages:&lt;br /&gt;
            if not (package.endswith(&amp;quot;-tests&amp;quot;)\&lt;br /&gt;
            or package.endswith(&amp;quot;-test&amp;quot;)\&lt;br /&gt;
            or package.endswith(&amp;quot;-benchmark&amp;quot;)):&lt;br /&gt;
                invalid_packages.append(package)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* error_msg = &amp;quot;Invalid testpackage(s): %s&amp;quot; % invalid_packages&lt;br /&gt;
* This is raised if user input contains test packages that do not end -test, -tests, -benchmark&lt;br /&gt;
* '''System test: log_tests.TestErrorConditions.test_bad_testpackage_names&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:410: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        if not (self.testrun.get_rootstrap_url() \&lt;br /&gt;
                    or self.testrun.get_image_url()):&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* error_msg = &amp;quot;No image url or rootstrap url defined.&amp;quot;&lt;br /&gt;
* Raised if image url is not defined in input. (rootstrap is deprecated!)&lt;br /&gt;
* '''System test: log_tests.TestErrorConditions.test_no_image_url&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:420: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        if not self.testrun.get_image_url() and \&lt;br /&gt;
                self.testrun.get_host_testpackages():&lt;br /&gt;
&lt;br /&gt;
            error_msg = &amp;quot;Image url missing. Executing host based tests &amp;quot;+\&lt;br /&gt;
                        &amp;quot;requires image url.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Deprecated! Image url is mandatory always so this will never happen. The previous error will be raised first.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:443: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        valid_values = ['default', 'perpackage']&lt;br /&gt;
        for model in custom_models:&lt;br /&gt;
            valid_values.append(model[0])&lt;br /&gt;
        model = self.testrun.get_option('distribution_model')&lt;br /&gt;
&lt;br /&gt;
        if model not in valid_values:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* error_msg = &amp;quot;Invalid distribution model: %s&amp;quot; % model&lt;br /&gt;
* Raised if user gives unknown distribution model parameter. (Extension points can introduce custom distribution models in addition to the default values shown.)&lt;br /&gt;
* '''System test: log_tests.TestErrorConditions.test_bad_distribution_model&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:451: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        if model == 'perpackage' and len(self.testrun.get_testpackages()) == 0:&lt;br /&gt;
            error_msg = &amp;quot;Test packages must be defined for specified &amp;quot;\&lt;br /&gt;
                        +&amp;quot;distribution model '%s'&amp;quot; % model&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if user tries to use perpackage distribution model but does not explicitly specify testpackages.&lt;br /&gt;
* '''System test: log_tests.TestErrorConditions.test_perpackage_distribution_no_packages&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/conductorengine/conductorengine.py:168: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        except OtsQueueDoesNotExistError:&lt;br /&gt;
            error_info = &amp;quot;Queue '%s' does not exist&amp;quot; \&lt;br /&gt;
                % (self._routing_key)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Raised if requested worker queue is not available in amqp server. (No suitable workers have ever been added to the system)&lt;br /&gt;
* '''System test: log_tests.TestErrorConditions.test_non_existing_devicegroup'''&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/conductorengine/conductorengine.py:176: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            error_info = (&amp;quot;Server side timeout. (Worker went offline during &amp;quot;+\&lt;br /&gt;
                              &amp;quot;testrun or some tasks were not started in time)&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Raised if server side global timeout is hit. See timeouts section in wiki for more details.&lt;br /&gt;
* This should be very rare. (but might still happen)&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/conductorengine/conductorengine.py:182: === &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        except OtsConnectionError:&lt;br /&gt;
            error_info = &amp;quot;A connectivity issue was encountered&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if amqp connection fails&lt;br /&gt;
* Should be very rare&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/conductorengine/conductorengine.py:190: === &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        except OtsQueueTimeoutError, exception:&lt;br /&gt;
            error_info = (&amp;quot;The job was not started within %s minutes. &amp;quot;+\&lt;br /&gt;
                &amp;quot;A worker in that devicegroup may be down or there may be &amp;quot;+\&lt;br /&gt;
                &amp;quot;exceptional demand&amp;quot;) % str(exception.timeout_length / 60)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Queue timeout. Raised if a worker does not take the task from the queue in time.&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/conductorengine/conductorengine.py:196: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        except Exception:&lt;br /&gt;
            error_info = &amp;quot;A miscellaneous error was encountered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Generic ots distributor error. This is bad!&lt;br /&gt;
&lt;br /&gt;
=== /ots/worker/conductor/executor.py:277: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    def _test_execution_error_handler(self, error_info, error_code):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        Handler for testrun timed out errors and ConductorError exceptions&lt;br /&gt;
        that are raised during test execution.&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.log.error(&amp;quot;Test execution error: %s &amp;quot; % error_info)&lt;br /&gt;
        if not self.stand_alone:&lt;br /&gt;
            self.responseclient.set_error(error_info, error_code)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Generic conductor test execution &amp;amp; timeout handler.&lt;br /&gt;
* More detailed analysis is part of ots 0.9. For 0.8 just make sure these are sent to server and communicated to user properly.&lt;br /&gt;
* '''System test: log_tests.TestErrorConditions.test_timeout'''&lt;br /&gt;
&lt;br /&gt;
=== /ots/worker/conductor/conductor.py:371: === &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    except ConductorError, exc:&lt;br /&gt;
        log.error(&amp;quot;%s (ots error code: %s)&amp;quot; % (exc.error_info, exc.error_code))&lt;br /&gt;
        if not stand_alone:&lt;br /&gt;
            responseclient.set_error(exc.error_info, exc.error_code)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Generic conductor exception handler.&lt;br /&gt;
* More detailed analysis is part of ots 0.9. For 0.8 just make sure these are sent to server and communicated to user properly.&lt;br /&gt;
&lt;br /&gt;
=== /ots/worker/conductor/conductor.py:378: === &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    except:&lt;br /&gt;
        log.error(&amp;quot;Unknown error when trying to execute tests.&amp;quot;)&lt;br /&gt;
        log.error(&amp;quot;Traceback follows:&amp;quot;, exc_info = True)&lt;br /&gt;
        if not stand_alone:&lt;br /&gt;
            responseclient.set_error(str(sys.exc_info()[1]), &amp;quot;999&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Conductor last resport try-except.&lt;br /&gt;
&lt;br /&gt;
=== /ots.worker/ots/worker/task_broker.py:206: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            self._dispatch(command)&lt;br /&gt;
&lt;br /&gt;
        except (CommandFailed):&lt;br /&gt;
            LOGGER.error(&amp;quot;Process failed&amp;quot;)&lt;br /&gt;
            error_info = &amp;quot;Task execution failed&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if the task command process (=conductor) returns something else than 0.&lt;br /&gt;
&lt;br /&gt;
== Noncritical Errors ==&lt;br /&gt;
&lt;br /&gt;
These produce an error message to log but do not affect the testrun result. These should be warnings.&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/testrun_host/testrun_host.py:185: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            if not ots_config.debug_mode:&lt;br /&gt;
                for text, url in self.testrun.get_result_links():&lt;br /&gt;
                    self.input_plugin.store_url(url, text)&lt;br /&gt;
        except:&lt;br /&gt;
              self.log.error(&amp;quot;Publishing result url failed. &amp;quot;\&lt;br /&gt;
                           &amp;quot;Traceback follows:&amp;quot;, exc_info = True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* OTS tries to publish the result url with input plugin and fails.&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/testrun_host/testrun_host.py:192: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            if self.testrun.email_enabled() and self.emailbackend:&lt;br /&gt;
                self.emailbackend.send_mail()&lt;br /&gt;
           self.log.error(&amp;quot;Sending result email failed. Traceback follows:&amp;quot;, &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* OTS fails to send result email&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/testrun_host/testrun_host.py:269: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        self.log.info(&amp;quot;Publishing testrun log link&amp;quot;)&lt;br /&gt;
        try:&lt;br /&gt;
            if not ots_config.debug_mode:&lt;br /&gt;
                self.input_plugin.store_url(url, text)&lt;br /&gt;
        except:&lt;br /&gt;
           self.log.error(&amp;quot;Publishing testrun log link failed. &amp;quot;\&lt;br /&gt;
                           &amp;quot;Traceback follows:&amp;quot;, exc_info = True)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Another input plugin warning&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/testrun_host/testrun_host.py:461: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            target_packages = self.input_plugin.get_changed_packages(build_id)&lt;br /&gt;
        except:&lt;br /&gt;
            self.log.error(&amp;quot;Getting target packages failed. &amp;quot;\&lt;br /&gt;
                           &amp;quot;Traceback follows:&amp;quot;, exc_info = True)&lt;br /&gt;
            target_packages = []&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* OTS tries to fetch information about the target packages changed in the build request and fails.&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/email_backend/mailmessage.py:145: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            attach_as_zip_file(msg, result_files, unique_id)&lt;br /&gt;
        except:&lt;br /&gt;
            LOG.error(&amp;quot;Something went wrong when creating email attachment. &amp;quot;\&lt;br /&gt;
                      &amp;quot;Traceback follows:&amp;quot;, exc_info = True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Creating the attachment zip package failed.&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/email_backend/email_backend.py:92: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        if not (type(to_address_list) == type(list()) \&lt;br /&gt;
                or type(to_address_list) == type(&amp;quot;&amp;quot;)):&lt;br /&gt;
            self.log.error(&amp;quot;Error in sending mail: expected list or string in &amp;quot;\&lt;br /&gt;
                           &amp;quot;to_address_list: %s &amp;quot; % str(to_address_list))&lt;br /&gt;
            return&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Bad email address input&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/email_backend/email_backend.py:121: ===          &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 self.log.error(&amp;quot;Error in sending mail to following addresses:&amp;quot;)&lt;br /&gt;
 self.log.error(str(failed_addresses)) &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== /ots.qareports_plugin/ots/qareports_plugin/qareports_client.py:60: === &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      LOG.error(&amp;quot;Upload failed. Server returned: %s&amp;quot; % response)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Failed to send test results to Meego QA Reports reporting tool.&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/ErrorSituations</id>
		<title>Quality/QA-tools/OTS/DeveloperDocs/ErrorSituations</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/ErrorSituations"/>
				<updated>2010-12-29T14:16:16Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Critical Errors */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OTS 0.1 Error Situations =&lt;br /&gt;
&lt;br /&gt;
OTS 0.1 has 2 ways of handling error information. The testrun has a specific &amp;quot;set_error_info() and set_error_code()&amp;quot; mechanism for critical errors. This is the main mechanism. In addition to that error messages are printed to http log. The error info mechanism is a legacy thing from the old days we didn't have global http logging or amqp.&lt;br /&gt;
&lt;br /&gt;
In OTS 0.8 we have the same http logging. The set_error_info() stuff is gone but it is replaced by exceptions that can be sent over the wire with amqp.&lt;br /&gt;
&lt;br /&gt;
== Critical Errors ==&lt;br /&gt;
&lt;br /&gt;
These cause the testrun to end with result ERROR&lt;br /&gt;
&lt;br /&gt;
=== /ots/common/results/resultjudge.py:169: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	self.testrun.set_error_info(&amp;quot;No test packages defined nor found.&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if user didn't specify test packages and conductor couldn't found any.&lt;br /&gt;
* This should practically never happen. Conductor should raise other errors before this if image does not contain packages.&lt;br /&gt;
&lt;br /&gt;
=== /ots/common/results/resultjudge.py:179: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
self.testrun.set_error_info(&amp;quot;Results missing from: %s&amp;quot; \&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if server didn't receive results.xml for all testpackages this.&lt;br /&gt;
* This can happen for example if global timeout happens. (Conductor detects timeouts and raises Timeout error so this shouldn't happen anymore?)&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:252: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            return ots_config.default_options[sw_product]&lt;br /&gt;
        except (KeyError, ValueError):&lt;br /&gt;
            raise Exception(&amp;quot;Unknown sw_product %s&amp;quot; % sw_product)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if user tries to use sw product that is not defined in the config file&lt;br /&gt;
* '''System test: log_tests.TestErrorConditions.test_non_existing_devicegroup'''&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:392: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        for package in test_packages:&lt;br /&gt;
            if not (package.endswith(&amp;quot;-tests&amp;quot;)\&lt;br /&gt;
            or package.endswith(&amp;quot;-test&amp;quot;)\&lt;br /&gt;
            or package.endswith(&amp;quot;-benchmark&amp;quot;)):&lt;br /&gt;
                invalid_packages.append(package)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* error_msg = &amp;quot;Invalid testpackage(s): %s&amp;quot; % invalid_packages&lt;br /&gt;
* This is raised if user input contains test packages that do not end -test, -tests, -benchmark&lt;br /&gt;
* '''System test: log_tests.TestErrorConditions.test_bad_testpackage_names&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:410: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        if not (self.testrun.get_rootstrap_url() \&lt;br /&gt;
                    or self.testrun.get_image_url()):&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* error_msg = &amp;quot;No image url or rootstrap url defined.&amp;quot;&lt;br /&gt;
* Raised if image url is not defined in input. (rootstrap is deprecated!)&lt;br /&gt;
* '''System test: log_tests.TestErrorConditions.test_no_image_url&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:420: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        if not self.testrun.get_image_url() and \&lt;br /&gt;
                self.testrun.get_host_testpackages():&lt;br /&gt;
&lt;br /&gt;
            error_msg = &amp;quot;Image url missing. Executing host based tests &amp;quot;+\&lt;br /&gt;
                        &amp;quot;requires image url.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Deprecated! Image url is mandatory always so this will never happen. The previous error will be raised first.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:443: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        valid_values = ['default', 'perpackage']&lt;br /&gt;
        for model in custom_models:&lt;br /&gt;
            valid_values.append(model[0])&lt;br /&gt;
        model = self.testrun.get_option('distribution_model')&lt;br /&gt;
&lt;br /&gt;
        if model not in valid_values:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* error_msg = &amp;quot;Invalid distribution model: %s&amp;quot; % model&lt;br /&gt;
* Raised if user gives unknown distribution model parameter. (Extension points can introduce custom distribution models in addition to the default values shown.)&lt;br /&gt;
* '''System test: log_tests.TestErrorConditions.test_bad_distribution_model&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:451: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        if model == 'perpackage' and len(self.testrun.get_testpackages()) == 0:&lt;br /&gt;
            error_msg = &amp;quot;Test packages must be defined for specified &amp;quot;\&lt;br /&gt;
                        +&amp;quot;distribution model '%s'&amp;quot; % model&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if user tries to use perpackage distribution model but does not explicitly specify testpackages.&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/conductorengine/conductorengine.py:168: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        except OtsQueueDoesNotExistError:&lt;br /&gt;
            error_info = &amp;quot;Queue '%s' does not exist&amp;quot; \&lt;br /&gt;
                % (self._routing_key)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Raised if requested worker queue is not available in amqp server. (No suitable workers have ever been added to the system)&lt;br /&gt;
* '''System test: log_tests.TestErrorConditions.test_non_existing_devicegroup'''&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/conductorengine/conductorengine.py:176: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            error_info = (&amp;quot;Server side timeout. (Worker went offline during &amp;quot;+\&lt;br /&gt;
                              &amp;quot;testrun or some tasks were not started in time)&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Raised if server side global timeout is hit. See timeouts section in wiki for more details.&lt;br /&gt;
* This should be very rare. (but might still happen)&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/conductorengine/conductorengine.py:182: === &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        except OtsConnectionError:&lt;br /&gt;
            error_info = &amp;quot;A connectivity issue was encountered&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if amqp connection fails&lt;br /&gt;
* Should be very rare&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/conductorengine/conductorengine.py:190: === &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        except OtsQueueTimeoutError, exception:&lt;br /&gt;
            error_info = (&amp;quot;The job was not started within %s minutes. &amp;quot;+\&lt;br /&gt;
                &amp;quot;A worker in that devicegroup may be down or there may be &amp;quot;+\&lt;br /&gt;
                &amp;quot;exceptional demand&amp;quot;) % str(exception.timeout_length / 60)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Queue timeout. Raised if a worker does not take the task from the queue in time.&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/conductorengine/conductorengine.py:196: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        except Exception:&lt;br /&gt;
            error_info = &amp;quot;A miscellaneous error was encountered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Generic ots distributor error. This is bad!&lt;br /&gt;
&lt;br /&gt;
=== /ots/worker/conductor/executor.py:277: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    def _test_execution_error_handler(self, error_info, error_code):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        Handler for testrun timed out errors and ConductorError exceptions&lt;br /&gt;
        that are raised during test execution.&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.log.error(&amp;quot;Test execution error: %s &amp;quot; % error_info)&lt;br /&gt;
        if not self.stand_alone:&lt;br /&gt;
            self.responseclient.set_error(error_info, error_code)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Generic conductor test execution &amp;amp; timeout handler.&lt;br /&gt;
* More detailed analysis is part of ots 0.9. For 0.8 just make sure these are sent to server and communicated to user properly.&lt;br /&gt;
* '''System test: log_tests.TestErrorConditions.test_timeout'''&lt;br /&gt;
&lt;br /&gt;
=== /ots/worker/conductor/conductor.py:371: === &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    except ConductorError, exc:&lt;br /&gt;
        log.error(&amp;quot;%s (ots error code: %s)&amp;quot; % (exc.error_info, exc.error_code))&lt;br /&gt;
        if not stand_alone:&lt;br /&gt;
            responseclient.set_error(exc.error_info, exc.error_code)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Generic conductor exception handler.&lt;br /&gt;
* More detailed analysis is part of ots 0.9. For 0.8 just make sure these are sent to server and communicated to user properly.&lt;br /&gt;
&lt;br /&gt;
=== /ots/worker/conductor/conductor.py:378: === &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    except:&lt;br /&gt;
        log.error(&amp;quot;Unknown error when trying to execute tests.&amp;quot;)&lt;br /&gt;
        log.error(&amp;quot;Traceback follows:&amp;quot;, exc_info = True)&lt;br /&gt;
        if not stand_alone:&lt;br /&gt;
            responseclient.set_error(str(sys.exc_info()[1]), &amp;quot;999&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Conductor last resport try-except.&lt;br /&gt;
&lt;br /&gt;
=== /ots.worker/ots/worker/task_broker.py:206: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            self._dispatch(command)&lt;br /&gt;
&lt;br /&gt;
        except (CommandFailed):&lt;br /&gt;
            LOGGER.error(&amp;quot;Process failed&amp;quot;)&lt;br /&gt;
            error_info = &amp;quot;Task execution failed&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if the task command process (=conductor) returns something else than 0.&lt;br /&gt;
&lt;br /&gt;
== Noncritical Errors ==&lt;br /&gt;
&lt;br /&gt;
These produce an error message to log but do not affect the testrun result. These should be warnings.&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/testrun_host/testrun_host.py:185: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            if not ots_config.debug_mode:&lt;br /&gt;
                for text, url in self.testrun.get_result_links():&lt;br /&gt;
                    self.input_plugin.store_url(url, text)&lt;br /&gt;
        except:&lt;br /&gt;
              self.log.error(&amp;quot;Publishing result url failed. &amp;quot;\&lt;br /&gt;
                           &amp;quot;Traceback follows:&amp;quot;, exc_info = True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* OTS tries to publish the result url with input plugin and fails.&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/testrun_host/testrun_host.py:192: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            if self.testrun.email_enabled() and self.emailbackend:&lt;br /&gt;
                self.emailbackend.send_mail()&lt;br /&gt;
           self.log.error(&amp;quot;Sending result email failed. Traceback follows:&amp;quot;, &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* OTS fails to send result email&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/testrun_host/testrun_host.py:269: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        self.log.info(&amp;quot;Publishing testrun log link&amp;quot;)&lt;br /&gt;
        try:&lt;br /&gt;
            if not ots_config.debug_mode:&lt;br /&gt;
                self.input_plugin.store_url(url, text)&lt;br /&gt;
        except:&lt;br /&gt;
           self.log.error(&amp;quot;Publishing testrun log link failed. &amp;quot;\&lt;br /&gt;
                           &amp;quot;Traceback follows:&amp;quot;, exc_info = True)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Another input plugin warning&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/testrun_host/testrun_host.py:461: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            target_packages = self.input_plugin.get_changed_packages(build_id)&lt;br /&gt;
        except:&lt;br /&gt;
            self.log.error(&amp;quot;Getting target packages failed. &amp;quot;\&lt;br /&gt;
                           &amp;quot;Traceback follows:&amp;quot;, exc_info = True)&lt;br /&gt;
            target_packages = []&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* OTS tries to fetch information about the target packages changed in the build request and fails.&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/email_backend/mailmessage.py:145: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            attach_as_zip_file(msg, result_files, unique_id)&lt;br /&gt;
        except:&lt;br /&gt;
            LOG.error(&amp;quot;Something went wrong when creating email attachment. &amp;quot;\&lt;br /&gt;
                      &amp;quot;Traceback follows:&amp;quot;, exc_info = True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Creating the attachment zip package failed.&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/email_backend/email_backend.py:92: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        if not (type(to_address_list) == type(list()) \&lt;br /&gt;
                or type(to_address_list) == type(&amp;quot;&amp;quot;)):&lt;br /&gt;
            self.log.error(&amp;quot;Error in sending mail: expected list or string in &amp;quot;\&lt;br /&gt;
                           &amp;quot;to_address_list: %s &amp;quot; % str(to_address_list))&lt;br /&gt;
            return&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Bad email address input&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/email_backend/email_backend.py:121: ===          &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 self.log.error(&amp;quot;Error in sending mail to following addresses:&amp;quot;)&lt;br /&gt;
 self.log.error(str(failed_addresses)) &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== /ots.qareports_plugin/ots/qareports_plugin/qareports_client.py:60: === &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      LOG.error(&amp;quot;Upload failed. Server returned: %s&amp;quot; % response)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Failed to send test results to Meego QA Reports reporting tool.&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/ErrorSituations</id>
		<title>Quality/QA-tools/OTS/DeveloperDocs/ErrorSituations</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/ErrorSituations"/>
				<updated>2010-12-29T14:08:52Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Critical Errors */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OTS 0.1 Error Situations =&lt;br /&gt;
&lt;br /&gt;
OTS 0.1 has 2 ways of handling error information. The testrun has a specific &amp;quot;set_error_info() and set_error_code()&amp;quot; mechanism for critical errors. This is the main mechanism. In addition to that error messages are printed to http log. The error info mechanism is a legacy thing from the old days we didn't have global http logging or amqp.&lt;br /&gt;
&lt;br /&gt;
In OTS 0.8 we have the same http logging. The set_error_info() stuff is gone but it is replaced by exceptions that can be sent over the wire with amqp.&lt;br /&gt;
&lt;br /&gt;
== Critical Errors ==&lt;br /&gt;
&lt;br /&gt;
These cause the testrun to end with result ERROR&lt;br /&gt;
&lt;br /&gt;
=== /ots/common/results/resultjudge.py:169: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	self.testrun.set_error_info(&amp;quot;No test packages defined nor found.&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if user didn't specify test packages and conductor couldn't found any.&lt;br /&gt;
* This should practically never happen. Conductor should raise other errors before this if image does not contain packages.&lt;br /&gt;
&lt;br /&gt;
=== /ots/common/results/resultjudge.py:179: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
self.testrun.set_error_info(&amp;quot;Results missing from: %s&amp;quot; \&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if server didn't receive results.xml for all testpackages this.&lt;br /&gt;
* This can happen for example if global timeout happens. (Conductor detects timeouts and raises Timeout error so this shouldn't happen anymore?)&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:252: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            return ots_config.default_options[sw_product]&lt;br /&gt;
        except (KeyError, ValueError):&lt;br /&gt;
            raise Exception(&amp;quot;Unknown sw_product %s&amp;quot; % sw_product)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if user tries to use sw product that is not defined in the config file&lt;br /&gt;
* '''System test: log_tests.TestErrorConditions.test_non_existing_devicegroup'''&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:392: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        for package in test_packages:&lt;br /&gt;
            if not (package.endswith(&amp;quot;-tests&amp;quot;)\&lt;br /&gt;
            or package.endswith(&amp;quot;-test&amp;quot;)\&lt;br /&gt;
            or package.endswith(&amp;quot;-benchmark&amp;quot;)):&lt;br /&gt;
                invalid_packages.append(package)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* error_msg = &amp;quot;Invalid testpackage(s): %s&amp;quot; % invalid_packages&lt;br /&gt;
* This is raised if user input contains test packages that do not end -test, -tests, -benchmark&lt;br /&gt;
* '''System test: log_tests.TestErrorConditions.test_bad_testpackage_names&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:410: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        if not (self.testrun.get_rootstrap_url() \&lt;br /&gt;
                    or self.testrun.get_image_url()):&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* error_msg = &amp;quot;No image url or rootstrap url defined.&amp;quot;&lt;br /&gt;
* Raised if image url is not defined in input. (rootstrap is deprecated!)&lt;br /&gt;
* '''System test: log_tests.TestErrorConditions.test_no_image_url&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:420: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        if not self.testrun.get_image_url() and \&lt;br /&gt;
                self.testrun.get_host_testpackages():&lt;br /&gt;
&lt;br /&gt;
            error_msg = &amp;quot;Image url missing. Executing host based tests &amp;quot;+\&lt;br /&gt;
                        &amp;quot;requires image url.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Deprecated! Image url is mandatory always so this will never happen. The previous error will be raised first.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:443: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        valid_values = ['default', 'perpackage']&lt;br /&gt;
        for model in custom_models:&lt;br /&gt;
            valid_values.append(model[0])&lt;br /&gt;
        model = self.testrun.get_option('distribution_model')&lt;br /&gt;
&lt;br /&gt;
        if model not in valid_values:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* error_msg = &amp;quot;Invalid distribution model: %s&amp;quot; % model&lt;br /&gt;
* Raised if user gives unknown distribution model parameter. (Extension points can introduce custom distribution models in addition to the default values shown.)&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:451: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        if model == 'perpackage' and len(self.testrun.get_testpackages()) == 0:&lt;br /&gt;
            error_msg = &amp;quot;Test packages must be defined for specified &amp;quot;\&lt;br /&gt;
                        +&amp;quot;distribution model '%s'&amp;quot; % model&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if user tries to use perpackage distribution model but does not explicitly specify testpackages.&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/conductorengine/conductorengine.py:168: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        except OtsQueueDoesNotExistError:&lt;br /&gt;
            error_info = &amp;quot;Queue '%s' does not exist&amp;quot; \&lt;br /&gt;
                % (self._routing_key)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Raised if requested worker queue is not available in amqp server. (No suitable workers have ever been added to the system)&lt;br /&gt;
* '''System test: log_tests.TestErrorConditions.test_non_existing_devicegroup'''&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/conductorengine/conductorengine.py:176: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            error_info = (&amp;quot;Server side timeout. (Worker went offline during &amp;quot;+\&lt;br /&gt;
                              &amp;quot;testrun or some tasks were not started in time)&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Raised if server side global timeout is hit. See timeouts section in wiki for more details.&lt;br /&gt;
* This should be very rare. (but might still happen)&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/conductorengine/conductorengine.py:182: === &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        except OtsConnectionError:&lt;br /&gt;
            error_info = &amp;quot;A connectivity issue was encountered&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if amqp connection fails&lt;br /&gt;
* Should be very rare&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/conductorengine/conductorengine.py:190: === &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        except OtsQueueTimeoutError, exception:&lt;br /&gt;
            error_info = (&amp;quot;The job was not started within %s minutes. &amp;quot;+\&lt;br /&gt;
                &amp;quot;A worker in that devicegroup may be down or there may be &amp;quot;+\&lt;br /&gt;
                &amp;quot;exceptional demand&amp;quot;) % str(exception.timeout_length / 60)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Queue timeout. Raised if a worker does not take the task from the queue in time.&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/conductorengine/conductorengine.py:196: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        except Exception:&lt;br /&gt;
            error_info = &amp;quot;A miscellaneous error was encountered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Generic ots distributor error. This is bad!&lt;br /&gt;
&lt;br /&gt;
=== /ots/worker/conductor/executor.py:277: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    def _test_execution_error_handler(self, error_info, error_code):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        Handler for testrun timed out errors and ConductorError exceptions&lt;br /&gt;
        that are raised during test execution.&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.log.error(&amp;quot;Test execution error: %s &amp;quot; % error_info)&lt;br /&gt;
        if not self.stand_alone:&lt;br /&gt;
            self.responseclient.set_error(error_info, error_code)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Generic conductor test execution &amp;amp; timeout handler.&lt;br /&gt;
* More detailed analysis is part of ots 0.9. For 0.8 just make sure these are sent to server and communicated to user properly.&lt;br /&gt;
* '''System test: log_tests.TestErrorConditions.test_timeout'''&lt;br /&gt;
&lt;br /&gt;
=== /ots/worker/conductor/conductor.py:371: === &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    except ConductorError, exc:&lt;br /&gt;
        log.error(&amp;quot;%s (ots error code: %s)&amp;quot; % (exc.error_info, exc.error_code))&lt;br /&gt;
        if not stand_alone:&lt;br /&gt;
            responseclient.set_error(exc.error_info, exc.error_code)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Generic conductor exception handler.&lt;br /&gt;
* More detailed analysis is part of ots 0.9. For 0.8 just make sure these are sent to server and communicated to user properly.&lt;br /&gt;
&lt;br /&gt;
=== /ots/worker/conductor/conductor.py:378: === &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    except:&lt;br /&gt;
        log.error(&amp;quot;Unknown error when trying to execute tests.&amp;quot;)&lt;br /&gt;
        log.error(&amp;quot;Traceback follows:&amp;quot;, exc_info = True)&lt;br /&gt;
        if not stand_alone:&lt;br /&gt;
            responseclient.set_error(str(sys.exc_info()[1]), &amp;quot;999&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Conductor last resport try-except.&lt;br /&gt;
&lt;br /&gt;
=== /ots.worker/ots/worker/task_broker.py:206: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            self._dispatch(command)&lt;br /&gt;
&lt;br /&gt;
        except (CommandFailed):&lt;br /&gt;
            LOGGER.error(&amp;quot;Process failed&amp;quot;)&lt;br /&gt;
            error_info = &amp;quot;Task execution failed&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if the task command process (=conductor) returns something else than 0.&lt;br /&gt;
&lt;br /&gt;
== Noncritical Errors ==&lt;br /&gt;
&lt;br /&gt;
These produce an error message to log but do not affect the testrun result. These should be warnings.&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/testrun_host/testrun_host.py:185: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            if not ots_config.debug_mode:&lt;br /&gt;
                for text, url in self.testrun.get_result_links():&lt;br /&gt;
                    self.input_plugin.store_url(url, text)&lt;br /&gt;
        except:&lt;br /&gt;
              self.log.error(&amp;quot;Publishing result url failed. &amp;quot;\&lt;br /&gt;
                           &amp;quot;Traceback follows:&amp;quot;, exc_info = True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* OTS tries to publish the result url with input plugin and fails.&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/testrun_host/testrun_host.py:192: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            if self.testrun.email_enabled() and self.emailbackend:&lt;br /&gt;
                self.emailbackend.send_mail()&lt;br /&gt;
           self.log.error(&amp;quot;Sending result email failed. Traceback follows:&amp;quot;, &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* OTS fails to send result email&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/testrun_host/testrun_host.py:269: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        self.log.info(&amp;quot;Publishing testrun log link&amp;quot;)&lt;br /&gt;
        try:&lt;br /&gt;
            if not ots_config.debug_mode:&lt;br /&gt;
                self.input_plugin.store_url(url, text)&lt;br /&gt;
        except:&lt;br /&gt;
           self.log.error(&amp;quot;Publishing testrun log link failed. &amp;quot;\&lt;br /&gt;
                           &amp;quot;Traceback follows:&amp;quot;, exc_info = True)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Another input plugin warning&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/testrun_host/testrun_host.py:461: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            target_packages = self.input_plugin.get_changed_packages(build_id)&lt;br /&gt;
        except:&lt;br /&gt;
            self.log.error(&amp;quot;Getting target packages failed. &amp;quot;\&lt;br /&gt;
                           &amp;quot;Traceback follows:&amp;quot;, exc_info = True)&lt;br /&gt;
            target_packages = []&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* OTS tries to fetch information about the target packages changed in the build request and fails.&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/email_backend/mailmessage.py:145: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            attach_as_zip_file(msg, result_files, unique_id)&lt;br /&gt;
        except:&lt;br /&gt;
            LOG.error(&amp;quot;Something went wrong when creating email attachment. &amp;quot;\&lt;br /&gt;
                      &amp;quot;Traceback follows:&amp;quot;, exc_info = True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Creating the attachment zip package failed.&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/email_backend/email_backend.py:92: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        if not (type(to_address_list) == type(list()) \&lt;br /&gt;
                or type(to_address_list) == type(&amp;quot;&amp;quot;)):&lt;br /&gt;
            self.log.error(&amp;quot;Error in sending mail: expected list or string in &amp;quot;\&lt;br /&gt;
                           &amp;quot;to_address_list: %s &amp;quot; % str(to_address_list))&lt;br /&gt;
            return&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Bad email address input&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/email_backend/email_backend.py:121: ===          &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 self.log.error(&amp;quot;Error in sending mail to following addresses:&amp;quot;)&lt;br /&gt;
 self.log.error(str(failed_addresses)) &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== /ots.qareports_plugin/ots/qareports_plugin/qareports_client.py:60: === &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      LOG.error(&amp;quot;Upload failed. Server returned: %s&amp;quot; % response)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Failed to send test results to Meego QA Reports reporting tool.&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/ErrorSituations</id>
		<title>Quality/QA-tools/OTS/DeveloperDocs/ErrorSituations</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/ErrorSituations"/>
				<updated>2010-12-29T14:01:03Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Critical Errors */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OTS 0.1 Error Situations =&lt;br /&gt;
&lt;br /&gt;
OTS 0.1 has 2 ways of handling error information. The testrun has a specific &amp;quot;set_error_info() and set_error_code()&amp;quot; mechanism for critical errors. This is the main mechanism. In addition to that error messages are printed to http log. The error info mechanism is a legacy thing from the old days we didn't have global http logging or amqp.&lt;br /&gt;
&lt;br /&gt;
In OTS 0.8 we have the same http logging. The set_error_info() stuff is gone but it is replaced by exceptions that can be sent over the wire with amqp.&lt;br /&gt;
&lt;br /&gt;
== Critical Errors ==&lt;br /&gt;
&lt;br /&gt;
These cause the testrun to end with result ERROR&lt;br /&gt;
&lt;br /&gt;
=== /ots/common/results/resultjudge.py:169: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	self.testrun.set_error_info(&amp;quot;No test packages defined nor found.&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if user didn't specify test packages and conductor couldn't found any.&lt;br /&gt;
* This should practically never happen. Conductor should raise other errors before this if image does not contain packages.&lt;br /&gt;
&lt;br /&gt;
=== /ots/common/results/resultjudge.py:179: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
self.testrun.set_error_info(&amp;quot;Results missing from: %s&amp;quot; \&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if server didn't receive results.xml for all testpackages this.&lt;br /&gt;
* This can happen for example if global timeout happens. (Conductor detects timeouts and raises Timeout error so this shouldn't happen anymore?)&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:252: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            return ots_config.default_options[sw_product]&lt;br /&gt;
        except (KeyError, ValueError):&lt;br /&gt;
            raise Exception(&amp;quot;Unknown sw_product %s&amp;quot; % sw_product)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if user tries to use sw product that is not defined in the config file&lt;br /&gt;
* '''System test: log_tests.TestErrorConditions.test_non_existing_devicegroup'''&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:392: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        for package in test_packages:&lt;br /&gt;
            if not (package.endswith(&amp;quot;-tests&amp;quot;)\&lt;br /&gt;
            or package.endswith(&amp;quot;-test&amp;quot;)\&lt;br /&gt;
            or package.endswith(&amp;quot;-benchmark&amp;quot;)):&lt;br /&gt;
                invalid_packages.append(package)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* error_msg = &amp;quot;Invalid testpackage(s): %s&amp;quot; % invalid_packages&lt;br /&gt;
* This is raised if user input contains test packages that do not end -test, -tests, -benchmark&lt;br /&gt;
* '''System test: log_tests.TestErrorConditions.test_bad_testpackage_names&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:410: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        if not (self.testrun.get_rootstrap_url() \&lt;br /&gt;
                    or self.testrun.get_image_url()):&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* error_msg = &amp;quot;No image url or rootstrap url defined.&amp;quot;&lt;br /&gt;
* Raised if image url is not defined in input. (rootstrap is deprecated!)&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:420: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        if not self.testrun.get_image_url() and \&lt;br /&gt;
                self.testrun.get_host_testpackages():&lt;br /&gt;
&lt;br /&gt;
            error_msg = &amp;quot;Image url missing. Executing host based tests &amp;quot;+\&lt;br /&gt;
                        &amp;quot;requires image url.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Deprecated! Image url is mandatory always so this will never happen. The previous error will be raised first.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:443: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        valid_values = ['default', 'perpackage']&lt;br /&gt;
        for model in custom_models:&lt;br /&gt;
            valid_values.append(model[0])&lt;br /&gt;
        model = self.testrun.get_option('distribution_model')&lt;br /&gt;
&lt;br /&gt;
        if model not in valid_values:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* error_msg = &amp;quot;Invalid distribution model: %s&amp;quot; % model&lt;br /&gt;
* Raised if user gives unknown distribution model parameter. (Extension points can introduce custom distribution models in addition to the default values shown.)&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:451: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        if model == 'perpackage' and len(self.testrun.get_testpackages()) == 0:&lt;br /&gt;
            error_msg = &amp;quot;Test packages must be defined for specified &amp;quot;\&lt;br /&gt;
                        +&amp;quot;distribution model '%s'&amp;quot; % model&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if user tries to use perpackage distribution model but does not explicitly specify testpackages.&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/conductorengine/conductorengine.py:168: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        except OtsQueueDoesNotExistError:&lt;br /&gt;
            error_info = &amp;quot;Queue '%s' does not exist&amp;quot; \&lt;br /&gt;
                % (self._routing_key)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Raised if requested worker queue is not available in amqp server. (No suitable workers have ever been added to the system)&lt;br /&gt;
* '''System test: log_tests.TestErrorConditions.test_non_existing_devicegroup'''&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/conductorengine/conductorengine.py:176: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            error_info = (&amp;quot;Server side timeout. (Worker went offline during &amp;quot;+\&lt;br /&gt;
                              &amp;quot;testrun or some tasks were not started in time)&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Raised if server side global timeout is hit. See timeouts section in wiki for more details.&lt;br /&gt;
* This should be very rare. (but might still happen)&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/conductorengine/conductorengine.py:182: === &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        except OtsConnectionError:&lt;br /&gt;
            error_info = &amp;quot;A connectivity issue was encountered&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if amqp connection fails&lt;br /&gt;
* Should be very rare&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/conductorengine/conductorengine.py:190: === &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        except OtsQueueTimeoutError, exception:&lt;br /&gt;
            error_info = (&amp;quot;The job was not started within %s minutes. &amp;quot;+\&lt;br /&gt;
                &amp;quot;A worker in that devicegroup may be down or there may be &amp;quot;+\&lt;br /&gt;
                &amp;quot;exceptional demand&amp;quot;) % str(exception.timeout_length / 60)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Queue timeout. Raised if a worker does not take the task from the queue in time.&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/conductorengine/conductorengine.py:196: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        except Exception:&lt;br /&gt;
            error_info = &amp;quot;A miscellaneous error was encountered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Generic ots distributor error. This is bad!&lt;br /&gt;
&lt;br /&gt;
=== /ots/worker/conductor/executor.py:277: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    def _test_execution_error_handler(self, error_info, error_code):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        Handler for testrun timed out errors and ConductorError exceptions&lt;br /&gt;
        that are raised during test execution.&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.log.error(&amp;quot;Test execution error: %s &amp;quot; % error_info)&lt;br /&gt;
        if not self.stand_alone:&lt;br /&gt;
            self.responseclient.set_error(error_info, error_code)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Generic conductor test execution &amp;amp; timeout handler.&lt;br /&gt;
* More detailed analysis is part of ots 0.9. For 0.8 just make sure these are sent to server and communicated to user properly.&lt;br /&gt;
* '''System test: log_tests.TestErrorConditions.test_timeout'''&lt;br /&gt;
&lt;br /&gt;
=== /ots/worker/conductor/conductor.py:371: === &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    except ConductorError, exc:&lt;br /&gt;
        log.error(&amp;quot;%s (ots error code: %s)&amp;quot; % (exc.error_info, exc.error_code))&lt;br /&gt;
        if not stand_alone:&lt;br /&gt;
            responseclient.set_error(exc.error_info, exc.error_code)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Generic conductor exception handler.&lt;br /&gt;
* More detailed analysis is part of ots 0.9. For 0.8 just make sure these are sent to server and communicated to user properly.&lt;br /&gt;
&lt;br /&gt;
=== /ots/worker/conductor/conductor.py:378: === &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    except:&lt;br /&gt;
        log.error(&amp;quot;Unknown error when trying to execute tests.&amp;quot;)&lt;br /&gt;
        log.error(&amp;quot;Traceback follows:&amp;quot;, exc_info = True)&lt;br /&gt;
        if not stand_alone:&lt;br /&gt;
            responseclient.set_error(str(sys.exc_info()[1]), &amp;quot;999&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Conductor last resport try-except.&lt;br /&gt;
&lt;br /&gt;
=== /ots.worker/ots/worker/task_broker.py:206: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            self._dispatch(command)&lt;br /&gt;
&lt;br /&gt;
        except (CommandFailed):&lt;br /&gt;
            LOGGER.error(&amp;quot;Process failed&amp;quot;)&lt;br /&gt;
            error_info = &amp;quot;Task execution failed&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if the task command process (=conductor) returns something else than 0.&lt;br /&gt;
&lt;br /&gt;
== Noncritical Errors ==&lt;br /&gt;
&lt;br /&gt;
These produce an error message to log but do not affect the testrun result. These should be warnings.&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/testrun_host/testrun_host.py:185: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            if not ots_config.debug_mode:&lt;br /&gt;
                for text, url in self.testrun.get_result_links():&lt;br /&gt;
                    self.input_plugin.store_url(url, text)&lt;br /&gt;
        except:&lt;br /&gt;
              self.log.error(&amp;quot;Publishing result url failed. &amp;quot;\&lt;br /&gt;
                           &amp;quot;Traceback follows:&amp;quot;, exc_info = True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* OTS tries to publish the result url with input plugin and fails.&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/testrun_host/testrun_host.py:192: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            if self.testrun.email_enabled() and self.emailbackend:&lt;br /&gt;
                self.emailbackend.send_mail()&lt;br /&gt;
           self.log.error(&amp;quot;Sending result email failed. Traceback follows:&amp;quot;, &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* OTS fails to send result email&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/testrun_host/testrun_host.py:269: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        self.log.info(&amp;quot;Publishing testrun log link&amp;quot;)&lt;br /&gt;
        try:&lt;br /&gt;
            if not ots_config.debug_mode:&lt;br /&gt;
                self.input_plugin.store_url(url, text)&lt;br /&gt;
        except:&lt;br /&gt;
           self.log.error(&amp;quot;Publishing testrun log link failed. &amp;quot;\&lt;br /&gt;
                           &amp;quot;Traceback follows:&amp;quot;, exc_info = True)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Another input plugin warning&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/testrun_host/testrun_host.py:461: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            target_packages = self.input_plugin.get_changed_packages(build_id)&lt;br /&gt;
        except:&lt;br /&gt;
            self.log.error(&amp;quot;Getting target packages failed. &amp;quot;\&lt;br /&gt;
                           &amp;quot;Traceback follows:&amp;quot;, exc_info = True)&lt;br /&gt;
            target_packages = []&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* OTS tries to fetch information about the target packages changed in the build request and fails.&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/email_backend/mailmessage.py:145: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            attach_as_zip_file(msg, result_files, unique_id)&lt;br /&gt;
        except:&lt;br /&gt;
            LOG.error(&amp;quot;Something went wrong when creating email attachment. &amp;quot;\&lt;br /&gt;
                      &amp;quot;Traceback follows:&amp;quot;, exc_info = True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Creating the attachment zip package failed.&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/email_backend/email_backend.py:92: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        if not (type(to_address_list) == type(list()) \&lt;br /&gt;
                or type(to_address_list) == type(&amp;quot;&amp;quot;)):&lt;br /&gt;
            self.log.error(&amp;quot;Error in sending mail: expected list or string in &amp;quot;\&lt;br /&gt;
                           &amp;quot;to_address_list: %s &amp;quot; % str(to_address_list))&lt;br /&gt;
            return&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Bad email address input&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/email_backend/email_backend.py:121: ===          &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 self.log.error(&amp;quot;Error in sending mail to following addresses:&amp;quot;)&lt;br /&gt;
 self.log.error(str(failed_addresses)) &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== /ots.qareports_plugin/ots/qareports_plugin/qareports_client.py:60: === &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      LOG.error(&amp;quot;Upload failed. Server returned: %s&amp;quot; % response)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Failed to send test results to Meego QA Reports reporting tool.&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/UserDocumentation/Installation</id>
		<title>Quality/QA-tools/OTS/UserDocumentation/Installation</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/UserDocumentation/Installation"/>
				<updated>2010-12-29T13:53:57Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installation Instructions for OTS 0.1 ==&lt;br /&gt;
&lt;br /&gt;
These instructions have been tested with Ubuntu 10.04.&lt;br /&gt;
&lt;br /&gt;
=== Network Setup ===&lt;br /&gt;
&lt;br /&gt;
Using static IP addresses on all OTS machines is strongly recommended. It is possible to setup the system also with dynamic IP addresses but it might cause problems every now and then because IP's and hostnames change.&lt;br /&gt;
&lt;br /&gt;
All OTS machines need to be able to access other OTS machines based on their hostname.&lt;br /&gt;
&lt;br /&gt;
=== Server ===&lt;br /&gt;
&lt;br /&gt;
==== prerequisites ====&lt;br /&gt;
&lt;br /&gt;
* An smtp server is needed for OTS to be able to send result emails.&lt;br /&gt;
** You can use the smtp server provided by your ISP or organization&lt;br /&gt;
** Or you can setup your own. for example [http://my.opera.com/Contrid/blog/show.dml/478684 postfix]&lt;br /&gt;
&lt;br /&gt;
==== Basic Setup ====&lt;br /&gt;
&lt;br /&gt;
* Download and install RabbitMQ server from http://www.rabbitmq.com/server.html&lt;br /&gt;
&lt;br /&gt;
* Install dependencies from ubuntu repository:&lt;br /&gt;
 sudo apt-get update&lt;br /&gt;
 sudo apt-get install python-setuptools python-amqplib python-django&lt;br /&gt;
&lt;br /&gt;
* Install rest of the dependencies with easy_install:&lt;br /&gt;
 sudo easy_install minixsv&lt;br /&gt;
&lt;br /&gt;
* Get source code from http://meego.gitorious.org/meego-quality-assurance/ots/ (latest tag)&lt;br /&gt;
&lt;br /&gt;
* Install ots.common:&lt;br /&gt;
 cd ots/ots.common/&lt;br /&gt;
 sudo python setup.py install&lt;br /&gt;
&lt;br /&gt;
* Install ots.server:&lt;br /&gt;
 cd ots/ots.server/&lt;br /&gt;
 sudo python setup.py install&lt;br /&gt;
&lt;br /&gt;
* Install ots.tools: (Required only for triggering testruns easily from command line over xmlrpc)&lt;br /&gt;
 cd ots/ots.tools/&lt;br /&gt;
 sudo python setup.py install&lt;br /&gt;
&lt;br /&gt;
* Download and install test definition schema files from http://meego.gitorious.org/meego-quality-assurance/test-definition&lt;br /&gt;
&lt;br /&gt;
* Create a directory for testrun logs and make sure the user running ots.server has write permissions to it:&lt;br /&gt;
 sudo mkdir /var/log/ots&lt;br /&gt;
&lt;br /&gt;
* At this point it should be possible to trigger testruns from python shell if you have a worker already set up and configured to use this server. Here's an example ipython session:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
In [1]: from ots.server.xmlrpc.public import request_sync&lt;br /&gt;
&lt;br /&gt;
In [4]: program = &amp;quot;example_sw_product&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In [5]: request = &amp;quot;5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In [6]: notify_list = ['tvainio@localhost']&lt;br /&gt;
&lt;br /&gt;
In [7]: options = dict()&lt;br /&gt;
&lt;br /&gt;
In [8]: options['image'] = &amp;quot;http://somewhere/some_image.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In [9]: options['email'] = &amp;quot;off&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In [13]: options[&amp;quot;device&amp;quot;] = &amp;quot;devicegroup:default&amp;quot;            # Make this match the worker &lt;br /&gt;
&lt;br /&gt;
In [14]: request_sync(program, request, notify_list, options)&lt;br /&gt;
Out[14]: 'FAIL'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The result will be PASS/FAIL/ERROR. ERROR means that something went wrong in server side and testrun was not even started. FAIL means failed testrun and PASS means that everything went fine and all tests passed. Testrun logs with more information about the possible errors are available in /var/log/ots/&lt;br /&gt;
&lt;br /&gt;
==== Configuring the Server ====&lt;br /&gt;
&lt;br /&gt;
The previous example was not very useful. To get OTS server running as a real server you have two options. A simple xmlrpc server or a more advanced django based server. First thing you need to do is setup a custom config file.&lt;br /&gt;
&lt;br /&gt;
===== Custom Config File =====&lt;br /&gt;
&lt;br /&gt;
Ots server tries to import a configuration module ots_extensions.ots_config. If it does not succeed it uses the default from ots.server.testrun_host.default_ots_config. You can set up your own ots_config by following these instructions:&lt;br /&gt;
&lt;br /&gt;
* Create a directory for your extensions: &lt;br /&gt;
 mkdir my_ots_extensions&lt;br /&gt;
&lt;br /&gt;
* Add it to your python path&lt;br /&gt;
 export PYTHONPATH=/full/path/to/my_ots_extensions/:$PYTHONPATH&lt;br /&gt;
&lt;br /&gt;
* Create custom ots_extensions python package:&lt;br /&gt;
 mkdir my_ots_extensions/ots_extensions&lt;br /&gt;
 touch my_ots_extensions/ots_extensions/__init__.py&lt;br /&gt;
&lt;br /&gt;
* Copy the default config file from ots/ots.server/ots/server/testrun_host/default_ots_config.py to my_ots_extensions/ots_extensions/ots_config.py&lt;br /&gt;
&lt;br /&gt;
* Modify the file to suit your needs. Check at least the following settings:&lt;br /&gt;
** Email settings (The smtp server OTS uses to send testrun results)&lt;br /&gt;
** xmlrpc server config (if you are setting the simple xmlrpc server setup. More info below.)&lt;br /&gt;
** The default options for your sw product:&lt;br /&gt;
You can define default values for all options here. The example_sw_product contains and example how to define options. You cannot use an sw_product if it does not contain the default options in ots_config. Here's a small example. I'm developing a Meego based coffeemaker and creating custom software images for it. To automate the testing I create an sw_product called &amp;quot;my_meego_variant&amp;quot;:&lt;br /&gt;
'''TODO: Document all options'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#&lt;br /&gt;
# Defaults for my_meego_variant                             &lt;br /&gt;
#                                                                                                                                   &lt;br /&gt;
&lt;br /&gt;
# Lets start with the global_defaults&lt;br /&gt;
default_options[&amp;quot;my_meego_variant&amp;quot;] = global_defaults.copy()&lt;br /&gt;
&lt;br /&gt;
# The images work only on meego coffeemakers so the default devicegroup will be &amp;quot;meego_coffeemaker&amp;quot;&lt;br /&gt;
default_options[&amp;quot;my_meego_variant&amp;quot;]['device'] = {'devicegroup':'meego_coffeemaker'}&lt;br /&gt;
&lt;br /&gt;
# Coffeemaker needs to be fast so we define a 3 minutes global timeout for the test execution.&lt;br /&gt;
default_options[&amp;quot;my_meego_variant&amp;quot;]['timeout'] = 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Extension Points =====&lt;br /&gt;
&lt;br /&gt;
OTS uses plugins to do various things during the testrun. You can write your own plugins to add more functionality by implementing a module ots_extensions.extension_points. An example file can be found from ots/ots.server/ots/server/testrun_host/example_extension_points.py&lt;br /&gt;
&lt;br /&gt;
==== Simple XMLRPC Server ====&lt;br /&gt;
&lt;br /&gt;
* After you have implemented your custom config file and defined suitable xmlrpc_host and xmlrpc_port values you can start the simple xmlrpc server:&lt;br /&gt;
 ots_server&lt;br /&gt;
&lt;br /&gt;
* After that you can start testruns on your ots_server by calling the request_sync() method over xmlrpc just like we did locally in the example above. There's also a command line tool called ots_trigger in ots.tools package.&lt;br /&gt;
&lt;br /&gt;
* A testrun can be triggered from command line with ots_trigger:&lt;br /&gt;
&lt;br /&gt;
 ots_trigger -s your_xmlrpc_host:your_xmlrpc_port -b 333 -i url_to_dummyimage -p my_meego_variant -e your_email_address&lt;br /&gt;
&lt;br /&gt;
The result should be FAIL and if your email server settings are correct you should also receive an email.&lt;br /&gt;
&lt;br /&gt;
* If we look into the new testrun log file in /var/log/ots/ we should find something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2010-09-24 15:48:21,188  conductorengine ERROR    Device group 'meego_coffeemaker' does not exist&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;/usr/local/lib/python2.6/dist-packages/ots.server-0.1dev-py2.6.egg/ots/server/conductorengine/conductorengine.py&amp;quot;, line 150, in execute&lt;br /&gt;
    self._taskrunner.run()&lt;br /&gt;
  File &amp;quot;/usr/local/lib/python2.6/dist-packages/ots.server-0.1dev-py2.6.egg/ots/server/distributor/taskrunner.py&amp;quot;, line 417, in run&lt;br /&gt;
    (self._routing_key))&lt;br /&gt;
OtsQueueDoesNotExistError: No queue for meego_coffeemaker&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Next step is to set up an OTS worker into the devicegroup meego_coffeemaker. Instructions can be found below.&lt;br /&gt;
&lt;br /&gt;
==== Django Based Server ====&lt;br /&gt;
&lt;br /&gt;
With Django and Apache it's possible to set up a more advanced ots server.&lt;br /&gt;
&lt;br /&gt;
There's for example a global logger application available in ots.server.logger. By setting up the logger it is possible to get log messages for a specific testrun from all parts of the system (ots server, ots conductor and testrunner-lite). The logs are stored into database and can be accessed with a web UI. It's also easy to implement a result db and web views for the test results.&lt;br /&gt;
&lt;br /&gt;
If you are not familiar with Django you can study the basics from the tutorial: http://docs.djangoproject.com/en/1.2/intro/tutorial01/&lt;br /&gt;
&lt;br /&gt;
These instructions assume that you have already done the setup described in: [[http://wiki.meego.com/Quality/QA-tools/OTS/UserDocumentation/Installation#Server]]&lt;br /&gt;
&lt;br /&gt;
There is an example django project in ots.server.django_ots. It is possible to use that directly but in most cases you should create your own django project to be able to modify the settings.&lt;br /&gt;
&lt;br /&gt;
===== Installation Using the Default Django Project in ots.server.django_ots =====&lt;br /&gt;
&lt;br /&gt;
* Install required packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt-get install python-django python-setuptools rabbitmq-server python-amqplib&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Install django-xmlrpc from https://launchpad.net/django-xmlrpc to somewhere in your pythonpath&lt;br /&gt;
&lt;br /&gt;
* After that you should be able to execute tests for the ots django applications:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python ots/server/django_ots/manage.py test logger testrun_db&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create the database. The default ots django project uses sqlite. The DB file is located in /opt/ots.sqlite.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python ots/server/django_ots/manage.py syncdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The script asks about creating a superuser for the Django's auth system. OTS does not use the auth system at the moment but it might be useful to create the account if you start writing custom django applications or want to use django admin interface at some point.&lt;br /&gt;
&lt;br /&gt;
If you get errors like &amp;quot;unable to open database file&amp;quot; make sure your user has write permissions to /opt/&lt;br /&gt;
&lt;br /&gt;
* Install apache and mod-python: (OTS requires the prefork version of apache)&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install apache2-mpm-prefork libapache2-mod-python&lt;br /&gt;
&lt;br /&gt;
* Setup your custom ots_config and extension points&lt;br /&gt;
** Instructions are available in [[http://wiki.meego.com/Quality/QA-tools/OTS/UserDocumentation/Installation#Configuring_the_Server]]&lt;br /&gt;
** Use ots/server/django_ots/extension_points.py as the basis of your extension points. It takes the testrun_db into use.&lt;br /&gt;
** Changes http_loggin_enabled to True in your ots_config.py if you want to have global testrun logs:&lt;br /&gt;
 http_logging_enabled = True&lt;br /&gt;
&lt;br /&gt;
* Configure your django_ots to /etc/apache2/apache2.conf by adding the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Location &amp;quot;/&amp;quot;&amp;gt;&lt;br /&gt;
SetHandler python-program&lt;br /&gt;
PythonHandler django.core.handlers.modpython&lt;br /&gt;
SetEnv DJANGO_SETTINGS_MODULE ots.server.django_ots.settings&lt;br /&gt;
PythonDebug On&lt;br /&gt;
PythonPath &amp;quot;['ADD HERE THE PATH WHERE YOUR ots_extensions directory with CUSTOM OTS ENTRYPOINTS AND CONFIGFILE CAN BE FOUND'] + sys.path&amp;quot;&lt;br /&gt;
&amp;lt;/Location&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Open http://localhost/logger/view/ in your web browser. You should see an empty logging message page.&lt;br /&gt;
** If you get &amp;quot;Unable to open database file&amp;quot; make sure that the user apache is running on has read and write permissions to the db file (/opt/ots.sqlite).&lt;br /&gt;
* Try triggering a testrun with ots_trigger (note the /xmlrpc in server url):&lt;br /&gt;
 ots_trigger -s localhost/xmlrpc -b 333 -i url_to_dummyimage -p my_meego_variant -e your_email_address&lt;br /&gt;
&lt;br /&gt;
If everything went ok you should see a succesful testrun and logs from OTS server, OTS Worker.conductor and testrunner-lite appearing in the http://localhost/logger/view/ and http://localhost/logger/view/ots/&amp;lt;your_testrun_id&amp;gt;/&lt;br /&gt;
&lt;br /&gt;
If you only see log messages from your server most probably yuor hostnames are not set up correctly. The worker machine needs to be able to access the server by it's host name. Or you can try to play around with the &amp;quot;results_storage_config[&amp;quot;host&amp;quot;]&amp;quot; setting in ots_config.py. It is the hostname ots_server sends to worker to use for global logging.&lt;br /&gt;
&lt;br /&gt;
===== Installation Using a Custom Django Project =====&lt;br /&gt;
&lt;br /&gt;
If you want to use different django setup you can create a custom django project. You can use ots/server/django_ots/ as an example. Django documentation contains lots of information about the features and settings: http://www.djangoproject.com/&lt;br /&gt;
&lt;br /&gt;
The most important files are:&lt;br /&gt;
* settings.py - DB settings, installed django applications, email etc.&lt;br /&gt;
* urls.py - Url mappings. For example the &amp;quot;xmlrpc/&amp;quot; url is defined here.&lt;br /&gt;
&lt;br /&gt;
You also need to modify your apache configuration to point to your own django project instead of the default one. Also note that if you change your code, mod_python does not automatically reload the changed code so you need to restart apache to make sure you are using the right version of your code. If you do a full apache restart all ongoing testruns will fail. If you do a graceful restart (&amp;lt;code&amp;gt;&amp;quot;apache2ctl graceful&amp;quot;&amp;lt;/code&amp;gt;)the testruns won't fail but updated code is reloaded only after the testruns have fininshed.&lt;br /&gt;
&lt;br /&gt;
==== Uploading Results to Meego QA Reports Tool ====&lt;br /&gt;
&lt;br /&gt;
Starting from version 0.1.6 OTS can automatically upload results to Meego QA Reports tool.&lt;br /&gt;
&lt;br /&gt;
* Make sure ots.qareports_plugin is installed.&lt;br /&gt;
* Modify values in /etc/ots_qareports_plugin.conf to match your setup:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# More information about the options is available in&lt;br /&gt;
# http://wiki.meego.com/Quality/QA-tools/QAReports/API&lt;br /&gt;
&lt;br /&gt;
[ots.qareports_plugin]&lt;br /&gt;
host = &amp;quot;localhost&amp;quot;&lt;br /&gt;
url = &amp;quot;/api/import&amp;quot;&lt;br /&gt;
auth_token = &amp;quot;&amp;quot;&lt;br /&gt;
release_version = &amp;quot;1.0&amp;quot;&lt;br /&gt;
target = &amp;quot;Core&amp;quot;&lt;br /&gt;
testtype = &amp;quot;Acceptance&amp;quot;&lt;br /&gt;
hwproduct = &amp;quot;N900&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Modify &amp;quot;get_resultbackends()&amp;quot; in your custom extension_points.py to take QaReportsBackend into use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from ots.qareports_plugin.qareports_backend import QAReportsBackend&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def get_resultbackends(testrun):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Returns custom ResultBackends as a list&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return [QAReportsBackend()]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Dynamic Report Control =====&lt;br /&gt;
&lt;br /&gt;
Starting from OTS 0.1.7 it's possible to control reporting options dynamically when triggering a testrun with &amp;quot;--options&amp;quot; command line parameter in ots_trigger:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ots_trigger --options=&amp;quot;qa_hwproduct:&amp;lt;HWPRODUCT&amp;gt; qa_testtype:&amp;lt;TESTTYPE&amp;gt; qa_target:&amp;lt;TARGET&amp;gt; qa_release_version:&amp;lt;RELEASE_VERSION&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Worker ===&lt;br /&gt;
&lt;br /&gt;
* Install dependencies:&lt;br /&gt;
 sudo apt-get update&lt;br /&gt;
 sudo apt-get install python-setuptools python-amqplib&lt;br /&gt;
&lt;br /&gt;
* Get source code from http://meego.gitorious.org/meego-quality-assurance/ots/ (latest tag)&lt;br /&gt;
&lt;br /&gt;
* Install ots.common:&lt;br /&gt;
 cd ots/ots.common/&lt;br /&gt;
 sudo python setup.py install&lt;br /&gt;
&lt;br /&gt;
* Install ots.worker:&lt;br /&gt;
 cd ots/ots.worker/&lt;br /&gt;
 sudo python setup.py install&lt;br /&gt;
&lt;br /&gt;
* Configure the worker by editing devicegroup and server address in /etc/ots.ini:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
###########################################&lt;br /&gt;
# REPLACE `fix_me` WITH YOUR DEVICEGROUP&lt;br /&gt;
###########################################&lt;br /&gt;
[Device]&lt;br /&gt;
devicegroup = fix_me                     # Change this to the devicegroup this worker belongs to&lt;br /&gt;
&lt;br /&gt;
#############################&lt;br /&gt;
# Optional device properties&lt;br /&gt;
#############################&lt;br /&gt;
&lt;br /&gt;
#devicename = name of the device type    # Uncomment these if you want more detailed testrun routing&lt;br /&gt;
#deviceid = Specific HW id of the device # See http://wiki.meego.com/Quality/QA-tools/OTS/Routing for details&lt;br /&gt;
&lt;br /&gt;
#############################&lt;br /&gt;
# ADVANCED CONFIGURATION&lt;br /&gt;
#############################&lt;br /&gt;
[Worker]&lt;br /&gt;
host = your_server_address               # Change this to your ots server address&lt;br /&gt;
vhost = /&lt;br /&gt;
port = 5672&lt;br /&gt;
username = guest&lt;br /&gt;
password = guest&lt;br /&gt;
log_file = /var/log/ots.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More info about testrun routing is available here: [[Quality/QA-tools/OTS/Routing]]&lt;br /&gt;
&lt;br /&gt;
* Start the worker:&lt;br /&gt;
&lt;br /&gt;
 sudo ots_worker&lt;br /&gt;
&lt;br /&gt;
* If everything went ok, you should see something like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2010-11-08 12:55:10,790 - ots.worker.worker - DEBUG - Initialising the server&lt;br /&gt;
2010-11-08 12:55:10,790 - ots.worker.connection - DEBUG - Connecting to RabbitMQ&lt;br /&gt;
2010-11-08 12:55:10,894 - amqplib - DEBUG - Start from server, version: 8.0, properties: {u'platform': 'Erlang/OTP', u'product': 'RabbitMQ', u'version': '2.1.0', u'copyright': 'Copyright (C) 2007-2010 LShift Ltd., Cohesive Financial Technologies LLC., and Rabbit Technologies Ltd.', u'information': 'Licensed under the MPL.  See http://www.rabbitmq.com/'}, mechanisms: ['PLAIN', 'AMQPLAIN'], locales: ['en_US']&lt;br /&gt;
2010-11-08 12:55:10,935 - amqplib - DEBUG - Open OK! known_hosts []&lt;br /&gt;
2010-11-08 12:55:10,935 - amqplib - DEBUG - using channel_id: 1&lt;br /&gt;
2010-11-08 12:55:10,937 - amqplib - DEBUG - Channel open&lt;br /&gt;
2010-11-08 12:55:10,938 - ots.worker.worker - DEBUG - Starting the worker. server: 192.168.1.102:5672, device_properties: {'devicegroup': 'meego_coffeemaker'}&lt;br /&gt;
2010-11-08 12:55:10,957 - ots.worker.task_broker - INFO - consume on queue: meego_coffeemaker&lt;br /&gt;
2010-11-08 12:55:10,958 - ots.worker.task_broker - DEBUG - Starting main loop...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* There's also an init script available in ots.worker/debian/python-ots-worker.ots-worker.init to make running the worker easier&lt;br /&gt;
&lt;br /&gt;
* After that the worker should be ready for receiving tasks. To make sure the actual test execution works please see the instructions for ots.worker.conductor: [[Quality/QA-tools/OTS/UserDocumentation/Conductor| Conductor]]&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/ErrorSituations</id>
		<title>Quality/QA-tools/OTS/DeveloperDocs/ErrorSituations</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/ErrorSituations"/>
				<updated>2010-12-29T13:44:20Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Critical Errors */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OTS 0.1 Error Situations =&lt;br /&gt;
&lt;br /&gt;
OTS 0.1 has 2 ways of handling error information. The testrun has a specific &amp;quot;set_error_info() and set_error_code()&amp;quot; mechanism for critical errors. This is the main mechanism. In addition to that error messages are printed to http log. The error info mechanism is a legacy thing from the old days we didn't have global http logging or amqp.&lt;br /&gt;
&lt;br /&gt;
In OTS 0.8 we have the same http logging. The set_error_info() stuff is gone but it is replaced by exceptions that can be sent over the wire with amqp.&lt;br /&gt;
&lt;br /&gt;
== Critical Errors ==&lt;br /&gt;
&lt;br /&gt;
These cause the testrun to end with result ERROR&lt;br /&gt;
&lt;br /&gt;
=== /ots/common/results/resultjudge.py:169: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	self.testrun.set_error_info(&amp;quot;No test packages defined nor found.&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if user didn't specify test packages and conductor couldn't found any.&lt;br /&gt;
* This should practically never happen. Conductor should raise other errors before this if image does not contain packages.&lt;br /&gt;
&lt;br /&gt;
=== /ots/common/results/resultjudge.py:179: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
self.testrun.set_error_info(&amp;quot;Results missing from: %s&amp;quot; \&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if server didn't receive results.xml for all testpackages this.&lt;br /&gt;
* This can happen for example if global timeout happens. (Conductor detects timeouts and raises Timeout error so this shouldn't happen anymore?)&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:252: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            return ots_config.default_options[sw_product]&lt;br /&gt;
        except (KeyError, ValueError):&lt;br /&gt;
            raise Exception(&amp;quot;Unknown sw_product %s&amp;quot; % sw_product)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if user tries to use sw product that is not defined in the config file&lt;br /&gt;
* '''System test: log_tests.TestErrorConditions.test_non_existing_devicegroup'''&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:392: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        for package in test_packages:&lt;br /&gt;
            if not (package.endswith(&amp;quot;-tests&amp;quot;)\&lt;br /&gt;
            or package.endswith(&amp;quot;-test&amp;quot;)\&lt;br /&gt;
            or package.endswith(&amp;quot;-benchmark&amp;quot;)):&lt;br /&gt;
                invalid_packages.append(package)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* error_msg = &amp;quot;Invalid testpackage(s): %s&amp;quot; % invalid_packages&lt;br /&gt;
* This is raised if user input contains test packages that do not end -test, -tests, -benchmark&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:410: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        if not (self.testrun.get_rootstrap_url() \&lt;br /&gt;
                    or self.testrun.get_image_url()):&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* error_msg = &amp;quot;No image url or rootstrap url defined.&amp;quot;&lt;br /&gt;
* Raised if image url is not defined in input. (rootstrap is deprecated!)&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:420: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        if not self.testrun.get_image_url() and \&lt;br /&gt;
                self.testrun.get_host_testpackages():&lt;br /&gt;
&lt;br /&gt;
            error_msg = &amp;quot;Image url missing. Executing host based tests &amp;quot;+\&lt;br /&gt;
                        &amp;quot;requires image url.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Deprecated! Image url is mandatory always so this will never happen. The previous error will be raised first.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:443: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        valid_values = ['default', 'perpackage']&lt;br /&gt;
        for model in custom_models:&lt;br /&gt;
            valid_values.append(model[0])&lt;br /&gt;
        model = self.testrun.get_option('distribution_model')&lt;br /&gt;
&lt;br /&gt;
        if model not in valid_values:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* error_msg = &amp;quot;Invalid distribution model: %s&amp;quot; % model&lt;br /&gt;
* Raised if user gives unknown distribution model parameter. (Extension points can introduce custom distribution models in addition to the default values shown.)&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/testrun_host/testrun_host.py:451: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        if model == 'perpackage' and len(self.testrun.get_testpackages()) == 0:&lt;br /&gt;
            error_msg = &amp;quot;Test packages must be defined for specified &amp;quot;\&lt;br /&gt;
                        +&amp;quot;distribution model '%s'&amp;quot; % model&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if user tries to use perpackage distribution model but does not explicitly specify testpackages.&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/conductorengine/conductorengine.py:168: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        except OtsQueueDoesNotExistError:&lt;br /&gt;
            error_info = &amp;quot;Queue '%s' does not exist&amp;quot; \&lt;br /&gt;
                % (self._routing_key)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Raised if requested worker queue is not available in amqp server. (No suitable workers have ever been added to the system)&lt;br /&gt;
* '''System test: log_tests.TestErrorConditions.test_non_existing_devicegroup'''&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/conductorengine/conductorengine.py:176: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            error_info = (&amp;quot;Server side timeout. (Worker went offline during &amp;quot;+\&lt;br /&gt;
                              &amp;quot;testrun or some tasks were not started in time)&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Raised if server side global timeout is hit. See timeouts section in wiki for more details.&lt;br /&gt;
* This should be very rare. (but might still happen)&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/conductorengine/conductorengine.py:182: === &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        except OtsConnectionError:&lt;br /&gt;
            error_info = &amp;quot;A connectivity issue was encountered&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if amqp connection fails&lt;br /&gt;
* Should be very rare&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/conductorengine/conductorengine.py:190: === &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        except OtsQueueTimeoutError, exception:&lt;br /&gt;
            error_info = (&amp;quot;The job was not started within %s minutes. &amp;quot;+\&lt;br /&gt;
                &amp;quot;A worker in that devicegroup may be down or there may be &amp;quot;+\&lt;br /&gt;
                &amp;quot;exceptional demand&amp;quot;) % str(exception.timeout_length / 60)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Queue timeout. Raised if a worker does not take the task from the queue in time.&lt;br /&gt;
&lt;br /&gt;
=== /ots/server/conductorengine/conductorengine.py:196: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        except Exception:&lt;br /&gt;
            error_info = &amp;quot;A miscellaneous error was encountered&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Generic ots distributor error. This is bad!&lt;br /&gt;
&lt;br /&gt;
=== /ots/worker/conductor/executor.py:277: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    def _test_execution_error_handler(self, error_info, error_code):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        Handler for testrun timed out errors and ConductorError exceptions&lt;br /&gt;
        that are raised during test execution.&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.log.error(&amp;quot;Test execution error: %s &amp;quot; % error_info)&lt;br /&gt;
        if not self.stand_alone:&lt;br /&gt;
            self.responseclient.set_error(error_info, error_code)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Generic conductor test execution &amp;amp; timeout handler.&lt;br /&gt;
* More detailed analysis is part of ots 0.9. For 0.8 just make sure these are sent to server and communicated to user properly.&lt;br /&gt;
* '''System test: log_tests.TestErrorConditions.test_timeout'''&lt;br /&gt;
&lt;br /&gt;
=== /ots/worker/conductor/conductor.py:371: === &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    except ConductorError, exc:&lt;br /&gt;
        log.error(&amp;quot;%s (ots error code: %s)&amp;quot; % (exc.error_info, exc.error_code))&lt;br /&gt;
        if not stand_alone:&lt;br /&gt;
            responseclient.set_error(exc.error_info, exc.error_code)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Generic conductor exception handler.&lt;br /&gt;
* More detailed analysis is part of ots 0.9. For 0.8 just make sure these are sent to server and communicated to user properly.&lt;br /&gt;
&lt;br /&gt;
=== /ots/worker/conductor/conductor.py:378: === &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    except:&lt;br /&gt;
        log.error(&amp;quot;Unknown error when trying to execute tests.&amp;quot;)&lt;br /&gt;
        log.error(&amp;quot;Traceback follows:&amp;quot;, exc_info = True)&lt;br /&gt;
        if not stand_alone:&lt;br /&gt;
            responseclient.set_error(str(sys.exc_info()[1]), &amp;quot;999&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Conductor last resport try-except.&lt;br /&gt;
&lt;br /&gt;
=== /ots.worker/ots/worker/task_broker.py:206: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            self._dispatch(command)&lt;br /&gt;
&lt;br /&gt;
        except (CommandFailed):&lt;br /&gt;
            LOGGER.error(&amp;quot;Process failed&amp;quot;)&lt;br /&gt;
            error_info = &amp;quot;Task execution failed&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Raised if the task command process (=conductor) returns something else than 0.&lt;br /&gt;
&lt;br /&gt;
== Noncritical Errors ==&lt;br /&gt;
&lt;br /&gt;
These produce an error message to log but do not affect the testrun result. These should be warnings.&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/testrun_host/testrun_host.py:185: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            if not ots_config.debug_mode:&lt;br /&gt;
                for text, url in self.testrun.get_result_links():&lt;br /&gt;
                    self.input_plugin.store_url(url, text)&lt;br /&gt;
        except:&lt;br /&gt;
              self.log.error(&amp;quot;Publishing result url failed. &amp;quot;\&lt;br /&gt;
                           &amp;quot;Traceback follows:&amp;quot;, exc_info = True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* OTS tries to publish the result url with input plugin and fails.&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/testrun_host/testrun_host.py:192: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            if self.testrun.email_enabled() and self.emailbackend:&lt;br /&gt;
                self.emailbackend.send_mail()&lt;br /&gt;
           self.log.error(&amp;quot;Sending result email failed. Traceback follows:&amp;quot;, &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* OTS fails to send result email&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/testrun_host/testrun_host.py:269: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        self.log.info(&amp;quot;Publishing testrun log link&amp;quot;)&lt;br /&gt;
        try:&lt;br /&gt;
            if not ots_config.debug_mode:&lt;br /&gt;
                self.input_plugin.store_url(url, text)&lt;br /&gt;
        except:&lt;br /&gt;
           self.log.error(&amp;quot;Publishing testrun log link failed. &amp;quot;\&lt;br /&gt;
                           &amp;quot;Traceback follows:&amp;quot;, exc_info = True)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Another input plugin warning&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/testrun_host/testrun_host.py:461: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            target_packages = self.input_plugin.get_changed_packages(build_id)&lt;br /&gt;
        except:&lt;br /&gt;
            self.log.error(&amp;quot;Getting target packages failed. &amp;quot;\&lt;br /&gt;
                           &amp;quot;Traceback follows:&amp;quot;, exc_info = True)&lt;br /&gt;
            target_packages = []&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* OTS tries to fetch information about the target packages changed in the build request and fails.&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/email_backend/mailmessage.py:145: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        try:&lt;br /&gt;
            attach_as_zip_file(msg, result_files, unique_id)&lt;br /&gt;
        except:&lt;br /&gt;
            LOG.error(&amp;quot;Something went wrong when creating email attachment. &amp;quot;\&lt;br /&gt;
                      &amp;quot;Traceback follows:&amp;quot;, exc_info = True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Creating the attachment zip package failed.&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/email_backend/email_backend.py:92: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        if not (type(to_address_list) == type(list()) \&lt;br /&gt;
                or type(to_address_list) == type(&amp;quot;&amp;quot;)):&lt;br /&gt;
            self.log.error(&amp;quot;Error in sending mail: expected list or string in &amp;quot;\&lt;br /&gt;
                           &amp;quot;to_address_list: %s &amp;quot; % str(to_address_list))&lt;br /&gt;
            return&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Bad email address input&lt;br /&gt;
&lt;br /&gt;
=== /ots.server/ots/server/email_backend/email_backend.py:121: ===          &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 self.log.error(&amp;quot;Error in sending mail to following addresses:&amp;quot;)&lt;br /&gt;
 self.log.error(str(failed_addresses)) &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== /ots.qareports_plugin/ots/qareports_plugin/qareports_client.py:60: === &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      LOG.error(&amp;quot;Upload failed. Server returned: %s&amp;quot; % response)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Failed to send test results to Meego QA Reports reporting tool.&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/TypicalUsage</id>
		<title>Quality/QA-tools/OTS/DeveloperDocs/TypicalUsage</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/TypicalUsage"/>
				<updated>2010-12-29T09:59:06Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Users */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Typical OTS Usage ==&lt;br /&gt;
&lt;br /&gt;
This page tries to describe how end users typically use OTS. The motivation for this page is to gain common understanding about the problem domain.&lt;br /&gt;
&lt;br /&gt;
=== Users ===&lt;br /&gt;
&lt;br /&gt;
Most of the users can be grouped to one of these 3 groups.&lt;br /&gt;
&lt;br /&gt;
==== Basic User ====&lt;br /&gt;
&lt;br /&gt;
Typically a test engineer or mobile SW developer.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;I want to execute my tests on real target device.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Expected Knowledge =====&lt;br /&gt;
&lt;br /&gt;
* Knows test definition and test packaging&lt;br /&gt;
* Knows his/her particular application/test area in detailed level&lt;br /&gt;
* Knows what SW product he/she is developing&lt;br /&gt;
* Understands OTS testrun in a rough level. (Download and flash the image, execute tests over ssh.)&lt;br /&gt;
* Knows some of the OTS input parameters. For example email address, timeout, SW Product&lt;br /&gt;
&lt;br /&gt;
* Does not know python&lt;br /&gt;
* Does not know details about the particular OTS system setup (devicegroups or workers available)&lt;br /&gt;
&lt;br /&gt;
===== OTS Usage =====&lt;br /&gt;
&lt;br /&gt;
In most cases does not directly interact with OTS. Uses OTS service provided by others.&lt;br /&gt;
&lt;br /&gt;
* Testrun from build machine&lt;br /&gt;
** User makes changes to Testpackage or target SW package.&lt;br /&gt;
** User creates image with build machine.&lt;br /&gt;
** Build machine triggers automatic testrun for the new image containing new version of user's software or tests.&lt;br /&gt;
** OTS uses default parameters for the particular SW Product. (User does not define devicegroup or other parameters. User knows only the SW Product.)&lt;br /&gt;
** User follows testrun process from html log page.&lt;br /&gt;
** User receives test results as an email. They are also available in a reporting tool.&lt;br /&gt;
** If there was errors in the testrun, the testrun log gives clear explanation what went wrong. (Flashing failed, Testpackage missing from the image, Unknown SW Product etc.)&lt;br /&gt;
&lt;br /&gt;
* Nightly testruns&lt;br /&gt;
** User makes changes to Testpackage or target SW package.&lt;br /&gt;
** Build machine automatically builds a nightly image with new changes included.&lt;br /&gt;
** Build machine triggers automatic testrun for the new version of user's packages.&lt;br /&gt;
** OTS parameters for nightly build are defined by an advanced user responsible for the nightly testruns. (Basic user does not define devicegroup or other parameters)&lt;br /&gt;
** User receives test results as an email. They are also available in a reporting tool.&lt;br /&gt;
** If there was errors in the testrun, the testrun log gives clear explanation what went wrong. (Flashing failed, Testpackage missing from the image, Unknown SW Product etc.)&lt;br /&gt;
&lt;br /&gt;
==== Advanced User / Worker Maintainer ====&lt;br /&gt;
&lt;br /&gt;
Typically a test engineer or mobile SW developer. Has own device and worker pc connected to the OTS system. Motivation for own worker might be that the test cases require a specific environment or the user just wants to see what's happening while tests are executed.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;I want to execute my tests in my own environment.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Expected Knowledge =====&lt;br /&gt;
&lt;br /&gt;
In addition to the basic user knowledge:&lt;br /&gt;
&lt;br /&gt;
* Knows how to set up and configure OTS worker.&lt;br /&gt;
* Knows the device properties and how to use the own device for a testrun&lt;br /&gt;
&lt;br /&gt;
===== OTS Usage =====&lt;br /&gt;
&lt;br /&gt;
Uses OTS service provided by others.&lt;br /&gt;
&lt;br /&gt;
In addition to the basic user use cases, defines the device group (or device parameters) in the test run parameters so that testrun is routed to the specific worker.&lt;br /&gt;
&lt;br /&gt;
* Local conductor run&lt;br /&gt;
** Executes conductor from command line with custom built image.&lt;br /&gt;
** Follows testrun from conductor output &amp;amp; log.&lt;br /&gt;
** Result files are available in file system. (~/conductor/)&lt;br /&gt;
** If errors or failures happen, the logs/output gives enough data for debugging&lt;br /&gt;
&lt;br /&gt;
==== OTS System Maintainer ====&lt;br /&gt;
&lt;br /&gt;
A system administrator is responsible for the OTS server and the whole testing system instance.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;I want to provide a common test environment for my peers.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Expected Knowledge =====&lt;br /&gt;
&lt;br /&gt;
In addition to the Advanced User / Worker Maintainer:&lt;br /&gt;
&lt;br /&gt;
* Knows how to set up and configure OTS server&lt;br /&gt;
* Knows all OTS input parameters and how to trigger runs from command line&lt;br /&gt;
* Knows the common device pool setup&lt;br /&gt;
* Knows the default settings for each SW Product&lt;br /&gt;
* Knows testrun process in detailed level. Is able to debug problems in the system.&lt;br /&gt;
* Some python knowledge. Can read tracebacks and understands some of the common exceptions (import errors etc.)&lt;br /&gt;
* Is able to make detailed bug reports&lt;br /&gt;
&lt;br /&gt;
===== OTS Usage =====&lt;br /&gt;
&lt;br /&gt;
Provides OTS service for others.&lt;br /&gt;
&lt;br /&gt;
* Setup&lt;br /&gt;
** Installs ots server and common workers&lt;br /&gt;
** Defines supported SW products for the particular OTS instance.&lt;br /&gt;
** Defines device parameters for the common devices.&lt;br /&gt;
** Defines default values for supported SW products so that the basic user does not need to know any details about the system.&lt;br /&gt;
*** Basic users can just trigger a run and everything goes right thanks to the default values.&lt;br /&gt;
*** For example the test run will be routed to a suitable device because default devicegroup is defined in the config by the system maintainer.&lt;br /&gt;
*** The testrun result is reported correctly in the reporting tool because the system maintainer has defined correct reporting category in the config file and that will be automatically used when communicating with reporting tool.&lt;br /&gt;
&lt;br /&gt;
* Debug a testrun&lt;br /&gt;
** A testrun triggered by a user ends with errors. User is not able to solve the problem so system maintainer is asked for help.&lt;br /&gt;
** System maintainer studies the logs and debugs the problem&lt;br /&gt;
*** System maintainer can re-trigger the testrun for debugging purposes by checking the exact input parameters from the log.&lt;br /&gt;
** System maintainer files bugs against OTS SW component if needed&lt;br /&gt;
** System maintainer fixes problems in the OTS setup if needed&lt;br /&gt;
** System maintainer instructs the user in OTS usage if needed&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/Logging</id>
		<title>Quality/QA-tools/OTS/Logging</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/Logging"/>
				<updated>2010-12-29T09:22:59Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Log Levels */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Logging =&lt;br /&gt;
&lt;br /&gt;
== Log Levels ==&lt;br /&gt;
&lt;br /&gt;
Different log levels are targeted for different user groups. See [[Quality/QA-tools/OTS/DeveloperDocs/TypicalUsage| Typical OTS users and usage scenarios]] for more information.&lt;br /&gt;
&lt;br /&gt;
=== For Basic Users ===&lt;br /&gt;
&lt;br /&gt;
''These are available in the centralized testrun http log.''&lt;br /&gt;
&lt;br /&gt;
* INFO shows what's happening in high level&lt;br /&gt;
** What parameters where used for the request&lt;br /&gt;
** What's happening right know. (Downloading image x from http://..., Flashing, Executing package asdf-tests.)&lt;br /&gt;
&lt;br /&gt;
* ERROR shows what went wrong.&lt;br /&gt;
** It needs to be explained so that the basic user can understand it&lt;br /&gt;
** Always think from the basic user point of view. What makes sense to you as a developer probably does not make sense for the user at all.&lt;br /&gt;
** Don't say &amp;quot;_get_file(&amp;quot;tests.xml&amp;quot;) failed!&amp;quot;, say &amp;quot;Testpackage asdf-tests is not in the image&amp;quot;.&lt;br /&gt;
** Tracebacks are always good if they provide additional information for debugging. Just make sure that the actual error message is still there. Most of the users don't know python and do not want to read tracebacks. Instead of &amp;quot;Error! Traceback follows:&amp;quot;, say &amp;quot;Custom flasher was not able to flash the image:&amp;quot;. Then the basic user gets a rough idea what's going on and system maintainer/ots developer can solve the issue by looking at the traceback.&lt;br /&gt;
&lt;br /&gt;
* WARNING warns if something is wrong but it's not critical&lt;br /&gt;
** For example user gives unknown input parameter. It might be a typo so the user should be warned.&lt;br /&gt;
&lt;br /&gt;
=== For Advanced User / Worker Maintainer and Server Maintainer ===&lt;br /&gt;
&lt;br /&gt;
''These logs are available in log files. Currently server debug log for each testrun is in /var/log/ots/. Conductor logs to ~/conductor.log in the worker machine. OTS worker process logs to /var/log/ots.log.''&lt;br /&gt;
&lt;br /&gt;
* DEBUG on worker components &lt;br /&gt;
** In most cases INFO and ERROR level messages should be enough but we expect worker maintainers to be able to follow also DEBUG level messages&lt;br /&gt;
** DEBUG messages should give enough information to sort out problems in the worker setup.&lt;br /&gt;
** Don't say &amp;quot;calling flasher...&amp;quot;. Say &amp;quot;executing command '/usr/bin/flasher -f imagefile'&amp;quot;&lt;br /&gt;
** Don't log too much. It makes reading the log difficult. Tracebacks should tell where we were when error happened.&lt;br /&gt;
** Input parameters and sub commands (parameters, return values, stdout, stderr) are likely to be valuable information when debugging.&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
There are a number of ways to view the OTS testrun:&lt;br /&gt;
&lt;br /&gt;
=== Main Log ===&lt;br /&gt;
&lt;br /&gt;
The Main OTS log is written to &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/var/log/ots&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Server Log ===&lt;br /&gt;
&lt;br /&gt;
This is [http://docs.python.org/release/2.5.2/lib/logging-config-fileformat.html configurable] by the 'logging.conf' file in the root directory&lt;br /&gt;
&lt;br /&gt;
=== Worker Log ===&lt;br /&gt;
&lt;br /&gt;
The Worker can be configured to log to a file specified by the &amp;quot;log_file&amp;quot; parameter in the Worker config file. &lt;br /&gt;
&lt;br /&gt;
=== Conductor Log ===&lt;br /&gt;
&lt;br /&gt;
Writes to the &amp;lt;ahem&amp;gt; home directory &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/path/to/home/conductor.log&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Apache Log ===&lt;br /&gt;
&lt;br /&gt;
If you are running OTS with Apache:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/var/log/apache2/error.log&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Http Logger ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition there is an [http://wiki.meego.com/Quality/QA-tools/OTS/Plugins/HTTP_logger http_logger].&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/Logging</id>
		<title>Quality/QA-tools/OTS/Logging</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/Logging"/>
				<updated>2010-12-29T09:20:28Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Log Levels */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Logging =&lt;br /&gt;
&lt;br /&gt;
== Log Levels ==&lt;br /&gt;
&lt;br /&gt;
Different log levels are targeted for different user groups. See [[Quality/QA-tools/OTS/DeveloperDocs/TypicalUsage| Typical OTS users and usage scenarios]] for more information.&lt;br /&gt;
&lt;br /&gt;
=== For Basic Users ===&lt;br /&gt;
&lt;br /&gt;
''These are available in the centralized http log.''&lt;br /&gt;
&lt;br /&gt;
* INFO shows what's happening in high level&lt;br /&gt;
** What parameters where used for the request&lt;br /&gt;
** What's happening right know. (Downloading image x from http://..., Flashing, Executing package asdf-tests.)&lt;br /&gt;
&lt;br /&gt;
* ERROR shows what went wrong.&lt;br /&gt;
** It needs to be explained so that the basic user can understand it&lt;br /&gt;
** Always think from the basic user point of view. What makes sense to you as a developer probably does not make sense for the user at all.&lt;br /&gt;
** Don't say &amp;quot;_get_file(&amp;quot;tests.xml&amp;quot;) failed!&amp;quot;, say &amp;quot;Testpackage asdf-tests is not in the image&amp;quot;.&lt;br /&gt;
** Tracebacks are always good if they provide additional information for debugging. Just make sure that the actual error message is still there. Most of the users don't know python and do not want to read tracebacks. Instead of &amp;quot;Error! Traceback follows:&amp;quot;, say &amp;quot;Custom flasher was not able to flash the image:&amp;quot;. Then the basic user gets a rough idea what's going on and system maintainer/ots developer can solve the issue by looking at the traceback.&lt;br /&gt;
&lt;br /&gt;
* WARNING warns if something is wrong but it's not critical&lt;br /&gt;
** For example user gives unknown input parameter. It might be a typo so the user should be warned.&lt;br /&gt;
&lt;br /&gt;
=== For Advanced User / Worker Maintainer and Server Maintainer ===&lt;br /&gt;
&lt;br /&gt;
''These logs are available in log files. Currently server debug log for each testrun is in /var/log/ots/. Conductor logs to ~/conductor.log in the worker machine. OTS worker process logs to /var/log/ots.log.''&lt;br /&gt;
&lt;br /&gt;
* DEBUG on worker components &lt;br /&gt;
** In most cases INFO and ERROR level messages should be enough but we expect worker maintainers to be able to follow also DEBUG level messages&lt;br /&gt;
** DEBUG messages should give enough information to sort out problems in the worker setup.&lt;br /&gt;
** Don't say &amp;quot;calling flasher...&amp;quot;. Say &amp;quot;executing command '/usr/bin/flasher -f imagefile'&amp;quot;&lt;br /&gt;
** Don't log too much. It makes reading the log difficult. Tracebacks should tell where we were when error happened.&lt;br /&gt;
** Input parameters and sub commands (parameters, return values, stdout, stderr) are likely to be valuable information when debugging.&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
There are a number of ways to view the OTS testrun:&lt;br /&gt;
&lt;br /&gt;
=== Main Log ===&lt;br /&gt;
&lt;br /&gt;
The Main OTS log is written to &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/var/log/ots&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Server Log ===&lt;br /&gt;
&lt;br /&gt;
This is [http://docs.python.org/release/2.5.2/lib/logging-config-fileformat.html configurable] by the 'logging.conf' file in the root directory&lt;br /&gt;
&lt;br /&gt;
=== Worker Log ===&lt;br /&gt;
&lt;br /&gt;
The Worker can be configured to log to a file specified by the &amp;quot;log_file&amp;quot; parameter in the Worker config file. &lt;br /&gt;
&lt;br /&gt;
=== Conductor Log ===&lt;br /&gt;
&lt;br /&gt;
Writes to the &amp;lt;ahem&amp;gt; home directory &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/path/to/home/conductor.log&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Apache Log ===&lt;br /&gt;
&lt;br /&gt;
If you are running OTS with Apache:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/var/log/apache2/error.log&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Http Logger ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition there is an [http://wiki.meego.com/Quality/QA-tools/OTS/Plugins/HTTP_logger http_logger].&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/Logging</id>
		<title>Quality/QA-tools/OTS/Logging</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/Logging"/>
				<updated>2010-12-29T09:19:25Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Logging */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Logging =&lt;br /&gt;
&lt;br /&gt;
== Log Levels ==&lt;br /&gt;
&lt;br /&gt;
Different log levels are targeted for different user groups.&lt;br /&gt;
&lt;br /&gt;
=== For Basic Users ===&lt;br /&gt;
&lt;br /&gt;
''These are available in the centralized http log.''&lt;br /&gt;
&lt;br /&gt;
* INFO shows what's happening in high level&lt;br /&gt;
** What parameters where used for the request&lt;br /&gt;
** What's happening right know. (Downloading image x from http://..., Flashing, Executing package asdf-tests.)&lt;br /&gt;
&lt;br /&gt;
* ERROR shows what went wrong.&lt;br /&gt;
** It needs to be explained so that the basic user can understand it&lt;br /&gt;
** Always think from the basic user point of view. What makes sense to you as a developer probably does not make sense for the user at all.&lt;br /&gt;
** Don't say &amp;quot;_get_file(&amp;quot;tests.xml&amp;quot;) failed!&amp;quot;, say &amp;quot;Testpackage asdf-tests is not in the image&amp;quot;.&lt;br /&gt;
** Tracebacks are always good if they provide additional information for debugging. Just make sure that the actual error message is still there. Most of the users don't know python and do not want to read tracebacks. Instead of &amp;quot;Error! Traceback follows:&amp;quot;, say &amp;quot;Custom flasher was not able to flash the image:&amp;quot;. Then the basic user gets a rough idea what's going on and system maintainer/ots developer can solve the issue by looking at the traceback.&lt;br /&gt;
&lt;br /&gt;
* WARNING warns if something is wrong but it's not critical&lt;br /&gt;
** For example user gives unknown input parameter. It might be a typo so the user should be warned.&lt;br /&gt;
&lt;br /&gt;
=== For Advanced User / Worker Maintainer and Server Maintainer ===&lt;br /&gt;
&lt;br /&gt;
''These logs are available in log files. Currently server debug log for each testrun is in /var/log/ots/. Conductor logs to ~/conductor.log in the worker machine. OTS worker process logs to /var/log/ots.log.''&lt;br /&gt;
&lt;br /&gt;
* DEBUG on worker components &lt;br /&gt;
** In most cases INFO and ERROR level messages should be enough but we expect worker maintainers to be able to follow also DEBUG level messages&lt;br /&gt;
** DEBUG messages should give enough information to sort out problems in the worker setup.&lt;br /&gt;
** Don't say &amp;quot;calling flasher...&amp;quot;. Say &amp;quot;executing command '/usr/bin/flasher -f imagefile'&amp;quot;&lt;br /&gt;
** Don't log too much. It makes reading the log difficult. Tracebacks should tell where we were when error happened.&lt;br /&gt;
** Input parameters and sub commands (parameters, return values, stdout, stderr) are likely to be valuable information when debugging.&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
There are a number of ways to view the OTS testrun:&lt;br /&gt;
&lt;br /&gt;
=== Main Log ===&lt;br /&gt;
&lt;br /&gt;
The Main OTS log is written to &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/var/log/ots&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Server Log ===&lt;br /&gt;
&lt;br /&gt;
This is [http://docs.python.org/release/2.5.2/lib/logging-config-fileformat.html configurable] by the 'logging.conf' file in the root directory&lt;br /&gt;
&lt;br /&gt;
=== Worker Log ===&lt;br /&gt;
&lt;br /&gt;
The Worker can be configured to log to a file specified by the &amp;quot;log_file&amp;quot; parameter in the Worker config file. &lt;br /&gt;
&lt;br /&gt;
=== Conductor Log ===&lt;br /&gt;
&lt;br /&gt;
Writes to the &amp;lt;ahem&amp;gt; home directory &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/path/to/home/conductor.log&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Apache Log ===&lt;br /&gt;
&lt;br /&gt;
If you are running OTS with Apache:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/var/log/apache2/error.log&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Http Logger ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition there is an [http://wiki.meego.com/Quality/QA-tools/OTS/Plugins/HTTP_logger http_logger].&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/TypicalUsage</id>
		<title>Quality/QA-tools/OTS/DeveloperDocs/TypicalUsage</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs/TypicalUsage"/>
				<updated>2010-12-29T09:17:33Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: Created page with &amp;quot;== Typical OTS Usage ==  This page tries to describe how end users typically use OTS. The motivation for this page is to gain common understanding about the problem domain.  === …&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Typical OTS Usage ==&lt;br /&gt;
&lt;br /&gt;
This page tries to describe how end users typically use OTS. The motivation for this page is to gain common understanding about the problem domain.&lt;br /&gt;
&lt;br /&gt;
=== Users ===&lt;br /&gt;
&lt;br /&gt;
==== Basic User ====&lt;br /&gt;
&lt;br /&gt;
Typically a test engineer or mobile SW developer.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;I want to execute my tests on real target device.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Expected Knowledge =====&lt;br /&gt;
&lt;br /&gt;
* Knows test definition and test packaging&lt;br /&gt;
* Knows his/her particular application/test area in detailed level&lt;br /&gt;
* Knows what SW product he/she is developing&lt;br /&gt;
* Understands OTS testrun in a rough level. (Download and flash the image, execute tests over ssh.)&lt;br /&gt;
* Knows some of the OTS input parameters. For example email address, timeout, SW Product&lt;br /&gt;
&lt;br /&gt;
* Does not know python&lt;br /&gt;
* Does not know details about the particular OTS system setup (devicegroups or workers available)&lt;br /&gt;
&lt;br /&gt;
===== OTS Usage =====&lt;br /&gt;
&lt;br /&gt;
In most cases does not directly interact with OTS. &lt;br /&gt;
&lt;br /&gt;
* Testrun from build machine&lt;br /&gt;
** User makes changes to Testpackage or target SW package.&lt;br /&gt;
** User creates image with build machine.&lt;br /&gt;
** Build machine triggers automatic testrun for the new image containing new version of user's software or tests.&lt;br /&gt;
** OTS uses default parameters for the particular SW Product. (User does not define devicegroup or other parameters. User knows only the SW Product.)&lt;br /&gt;
** User follows testrun process from html log page.&lt;br /&gt;
** User receives test results as an email. They are also available in a reporting tool.&lt;br /&gt;
** If there was errors in the testrun, the testrun log gives clear explanation what went wrong. (Flashing failed, Testpackage missing from the image, Unknown SW Product etc.)&lt;br /&gt;
&lt;br /&gt;
* Nightly testruns&lt;br /&gt;
** User makes changes to Testpackage or target SW package.&lt;br /&gt;
** Build machine automatically builds a nightly image with new changes included.&lt;br /&gt;
** Build machine triggers automatic testrun for the new version of user's packages.&lt;br /&gt;
** OTS parameters for nightly build are defined by an advanced user responsible for the nightly testruns. (Basic user does not define devicegroup or other parameters)&lt;br /&gt;
** User receives test results as an email. They are also available in a reporting tool.&lt;br /&gt;
** If there was errors in the testrun, the testrun log gives clear explanation what went wrong. (Flashing failed, Testpackage missing from the image, Unknown SW Product etc.)&lt;br /&gt;
&lt;br /&gt;
==== Advanced User / Worker Maintainer ====&lt;br /&gt;
&lt;br /&gt;
Typically a test engineer or mobile SW developer. Has own device and worker pc connected to the OTS system. Motivation for own worker might be that the test cases require a specific environment or the user just wants to see what's happening while tests are executed.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;I want to execute my tests in my own environment.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Expected Knowledge =====&lt;br /&gt;
&lt;br /&gt;
In addition to the basic user knowledge:&lt;br /&gt;
&lt;br /&gt;
* Knows how to set up and configure OTS worker.&lt;br /&gt;
* Knows the device properties and how to use the own device for a testrun&lt;br /&gt;
&lt;br /&gt;
===== OTS Usage =====&lt;br /&gt;
&lt;br /&gt;
*In addition to the basic user use cases, defines the device group (or device parameters) in the test run parameters so that testrun is routed to the specific worker.&lt;br /&gt;
&lt;br /&gt;
* Local conductor run&lt;br /&gt;
** Executes conductor from command line with custom built image.&lt;br /&gt;
** Follows testrun from conductor output &amp;amp; log.&lt;br /&gt;
** Result files are available in file system. (~/conductor/)&lt;br /&gt;
** If errors or failures happen, the logs/output gives enough data for debugging&lt;br /&gt;
&lt;br /&gt;
==== OTS System Maintainer ====&lt;br /&gt;
&lt;br /&gt;
A system administrator is responsible for the OTS server and the whole testing system instance.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;I want to provide a common test environment for my peers.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Expected Knowledge =====&lt;br /&gt;
&lt;br /&gt;
In addition to the Advanced User / Worker Maintainer:&lt;br /&gt;
&lt;br /&gt;
* Knows how to set up and configure OTS server&lt;br /&gt;
* Knows all OTS input parameters and how to trigger runs from command line&lt;br /&gt;
* Knows the common device pool setup&lt;br /&gt;
* Knows the default settings for each SW Product&lt;br /&gt;
* Knows testrun process in detailed level. Is able to debug problems in the system.&lt;br /&gt;
* Some python knowledge. Can read tracebacks and understands some of the common exceptions (import errors etc.)&lt;br /&gt;
* Is able to make detailed bug reports&lt;br /&gt;
&lt;br /&gt;
===== OTS Usage =====&lt;br /&gt;
&lt;br /&gt;
* Setup&lt;br /&gt;
** Installs ots server and common workers&lt;br /&gt;
** Defines supported SW products for the particular OTS instance.&lt;br /&gt;
** Defines device parameters for the common devices.&lt;br /&gt;
** Defines default values for supported SW products so that the basic user does not need to know any details about the system.&lt;br /&gt;
*** Basic users can just trigger a run and everything goes right thanks to the default values.&lt;br /&gt;
*** For example the test run will be routed to a suitable device because default devicegroup is defined in the config by the system maintainer.&lt;br /&gt;
*** The testrun result is reported correctly in the reporting tool because the system maintainer has defined correct reporting category in the config file and that will be automatically used when communicating with reporting tool.&lt;br /&gt;
&lt;br /&gt;
* Debug a testrun&lt;br /&gt;
** A testrun triggered by a user ends with errors. User is not able to solve the problem so system maintainer is asked for help.&lt;br /&gt;
** System maintainer studies the logs and debugs the problem&lt;br /&gt;
*** System maintainer can re-trigger the testrun for debugging purposes by checking the exact input parameters from the log.&lt;br /&gt;
** System maintainer files bugs against OTS SW component if needed&lt;br /&gt;
** System maintainer fixes problems in the OTS setup if needed&lt;br /&gt;
** System maintainer instructs the user in OTS usage if needed&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs</id>
		<title>Quality/QA-tools/OTS/DeveloperDocs</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs"/>
				<updated>2010-12-29T09:00:45Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Analysis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OTS - Open Testing Service =&lt;br /&gt;
&lt;br /&gt;
== Related Documentation ==&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/Architecture]]&lt;br /&gt;
* [[Quality/QA-tools/OTS/Glossary]]&lt;br /&gt;
&lt;br /&gt;
== Synopsis ==&lt;br /&gt;
&lt;br /&gt;
OTS is a Distributed Test System that takes a Data Driven Approach using XML Files to allow parallel testing of Applications on evolving Hardware platforms.  &lt;br /&gt;
&lt;br /&gt;
Design has been driven by the need for a language neutral test platform that allows testing under different device architectures in parallel.&lt;br /&gt;
&lt;br /&gt;
== High Level Overview ==  &lt;br /&gt;
&lt;br /&gt;
OTS allows a Test Sequence to be fanned out from a hub known as a '''Distributor''' to a remote machine known as a '''Worker'''. &lt;br /&gt;
Each '''Worker''' has a '''Device Group''' associated with it, this is defined in the configuration. The Tests are routed to the '''Worker''' &lt;br /&gt;
on the basis of the '''Device Group'''.&lt;br /&gt;
&lt;br /&gt;
An XML '''Test Definition File''' describes the Tests that are run. The results are returned to the '''Distributor''' in an XML '''Results File'''.&lt;br /&gt;
 &lt;br /&gt;
The '''Distributor''' takes a '''Device Group''' and '''Timeout''' as inputs, as well as the '''Command''' for running '''Tasks'''. Tests are run within a '''Task''' which  &lt;br /&gt;
is currently run as a process. The '''Command''' will typically take a path to the '''Test Definition File''' as an input. &lt;br /&gt;
If the process exceeds the '''Timeout''' the '''Task''' is stopped (the process is killed). &lt;br /&gt;
&lt;br /&gt;
A number of '''Tasks''' can be added to a '''Testrun'''. The '''Testrun''' will normally wait for all '''Tasks''' to finish before completion. &lt;br /&gt;
&lt;br /&gt;
Data (status, error and results) are communicated back from the '''Task''' to the '''Worker'''.  The '''Results Object''' is a container for the files outputted: '''Test Definition File''',  '''Results File''' &lt;br /&gt;
and any other files produced by the test as well as metadata relating to the run. &lt;br /&gt;
&lt;br /&gt;
== Technology ==&lt;br /&gt;
&lt;br /&gt;
OTS is written in Python 2.5.&lt;br /&gt;
&lt;br /&gt;
OTS has the following FIXME (provided as separate PDF)&lt;br /&gt;
&lt;br /&gt;
=== XmlFileFormats ===&lt;br /&gt;
&lt;br /&gt;
The XML file formats provide the datum for the system.&lt;br /&gt;
&lt;br /&gt;
Download [http://meego.gitorious.org/meego-quality-assurance/test-definition/trees/master them] and add the path to the '''results_xsd''' parameter in your [http://meego.gitorious.org/meego-quality-assurance/ots/blobs/dev_branch_0.8/ots.server/ots/server/ots_server.ini ots_server.ini] file&lt;br /&gt;
&lt;br /&gt;
=== Third Party Dependencies ===&lt;br /&gt;
&lt;br /&gt;
==== RabbitMQ ====&lt;br /&gt;
&lt;br /&gt;
You need to install [http://www.rabbitmq.com/server.html RabbitMQ]. &lt;br /&gt;
&lt;br /&gt;
===== Managing the Queues =====&lt;br /&gt;
&lt;br /&gt;
If you need to delete or empty the queues there are [http://meego.gitorious.org/meego-quality-assurance/ots/trees/master/ots.server/ots/server/distributor/dev_utils utilities] to help with this.&lt;br /&gt;
&lt;br /&gt;
==== Python Packages ====&lt;br /&gt;
&lt;br /&gt;
The following python packages are needed&lt;br /&gt;
&lt;br /&gt;
* [http://pypi.python.org/pypi/setuptools setuptools]&lt;br /&gt;
&lt;br /&gt;
* [http://www.voidspace.org.uk/python/configobj.html configobj]&lt;br /&gt;
 &lt;br /&gt;
* [http://pypi.python.org/pypi/multiprocessing multiprocessing]&lt;br /&gt;
&lt;br /&gt;
* [http://barryp.org/software/py-amqplib/ pyamqplib]&lt;br /&gt;
&lt;br /&gt;
* [http://www.familieleuthe.de/DownloadMiniXsv.html minixsv]&lt;br /&gt;
&lt;br /&gt;
* [http://www.djangoproject.com/download/1.1.2/tarball/ django]&lt;br /&gt;
&lt;br /&gt;
* [http://code.google.com/p/python-nose/ nose]&lt;br /&gt;
&lt;br /&gt;
== Diving In ==&lt;br /&gt;
&lt;br /&gt;
The following steps show how to get a Development Environment up and running&lt;br /&gt;
&lt;br /&gt;
=== 1. Install Dependencies ===&lt;br /&gt;
&lt;br /&gt;
* Install the Third Party Dependencies&lt;br /&gt;
&lt;br /&gt;
* Get the XML File Formats and set the OTS_TESTDEFINITION environment variable&lt;br /&gt;
&lt;br /&gt;
=== 2. Build the Eggs === &lt;br /&gt;
&lt;br /&gt;
From the root directory&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ./setup.sh&lt;br /&gt;
 source ./paths.sh&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Unittests ===&lt;br /&gt;
&lt;br /&gt;
Run the unittests from the root directory&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ./nose.sh&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Component Tests ===&lt;br /&gt;
&lt;br /&gt;
Component Tests run high level tests on an OTS Component using Mocks of the dependencies.&lt;br /&gt;
&lt;br /&gt;
You can run these with the component_tests shell script in the root directory. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ./component_tests.sh&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. Hello OTS World ===&lt;br /&gt;
&lt;br /&gt;
The source contains a simple demonstration of the way the key elements work. &lt;br /&gt;
&lt;br /&gt;
==== 1. Open two terminal windows. ====&lt;br /&gt;
&lt;br /&gt;
==== 2. In the first window run the server ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 cd $SERVER&lt;br /&gt;
 cd hub/demos&lt;br /&gt;
 python demo_hub.py&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3. You should see this: ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 &amp;lt;snip&amp;gt;&lt;br /&gt;
 20XX-XX-XX XX:XX:XX,XXX - ots.server.distributor.taskrunner - DEBUG - Sending command '['echo', 'hello world']' with key 'foo'&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4. In the second window run the worker ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 cd $WORKER&lt;br /&gt;
 python worker.py -c config.ini&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5. Now in the Server terminal the command should run to completion. You should see the following line in the logs: ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  20XX-XX-XX XX:XX:XX,XXX - ots.worker.command - DEBUG - process.communicate() returned echo hello world&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It will raise a PackageException. This is normal as no Tasks that are run return Packages to the Server&lt;br /&gt;
&lt;br /&gt;
==== 6. And on the logs on the Worker side should contain: ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 XXXX-XX-XX XX:XX:XX,XXX - ots.worker.command - DEBUG - process.communicate() returned echo hello world&lt;br /&gt;
 XXXX-XX-XX XX:XX:XX,XXX - ots.worker.task_broker - DEBUG - Task in state: 'finish'&lt;br /&gt;
 XXXX-XX-XX XX:XX:XX,XXX - ots.worker.task_broker - INFO - Recommence consume on queue: foo&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation == &lt;br /&gt;
&lt;br /&gt;
It is intended that the '''Distributor''' and each '''Worker''' should be installed to separate machines.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Distributor ===&lt;br /&gt;
&lt;br /&gt;
The format of the configuration file is as follows. &lt;br /&gt;
&lt;br /&gt;
The `host` is the name of the RabbitMQ server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [Client]&lt;br /&gt;
 host =  localhost&lt;br /&gt;
 vhost = / &lt;br /&gt;
 port = 5672&lt;br /&gt;
 username = guest&lt;br /&gt;
 password = guest&lt;br /&gt;
 queue = FIXME&lt;br /&gt;
 consumer_tag = worker&lt;br /&gt;
 services_exchange = services&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Worker ===&lt;br /&gt;
&lt;br /&gt;
Edit your config.ini so that the &lt;br /&gt;
&lt;br /&gt;
 * `queue`&lt;br /&gt;
 * `routing_key`&lt;br /&gt;
 * `services_exchange` &lt;br /&gt;
&lt;br /&gt;
Are set for your '''Device Group'''. &lt;br /&gt;
&lt;br /&gt;
And the `host` is the name of your RabbitMQ server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [Worker]&lt;br /&gt;
 host =  localhost&lt;br /&gt;
 vhost = / &lt;br /&gt;
 port = 5672&lt;br /&gt;
 username = guest&lt;br /&gt;
 password = guest&lt;br /&gt;
 queue = foo&lt;br /&gt;
 routing_key = foo&lt;br /&gt;
 services_exchange = foo&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Starting the Worker ====&lt;br /&gt;
&lt;br /&gt;
To start your Worker:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 python worker.py -c config.ini&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Automated System Tests ==&lt;br /&gt;
&lt;br /&gt;
''''' Not yet merged to dev_branch_0.8 '''''&lt;br /&gt;
&lt;br /&gt;
Automated system tests are available in ots.system_tests. They trigger various testruns with xmlrpc and check return value and log messages.&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
&lt;br /&gt;
* Fully functional OTS system with one worker.&lt;br /&gt;
* A SW Product &amp;quot;ots-system-tests&amp;quot; configured so that it defaults to the worker.&lt;br /&gt;
* A meego image with test-definition-tests and testrunner-lite-regression-tests.&lt;br /&gt;
* Django based advanced OTS setup.&lt;br /&gt;
* BeautifulSoup python library.&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
&lt;br /&gt;
* make the system test image available for the workers. (for example copy it to your apache static content directory /var/www/static/)&lt;br /&gt;
* Modify system_tests.conf in ots.system_tests directory to match your system.&lt;br /&gt;
* Make sure all the urls in system_tests.conf work.&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
&lt;br /&gt;
* System tests execute multiple full testruns. Running all tests can easily take more than 1.5 hours with N900 worker.&lt;br /&gt;
* Make sure there's no other activities ongoing in the system while running the tests.&lt;br /&gt;
* Some error handling tests expect certain devicegroups and sw products _not_ to be available. If these test cases fail you can remove those queues with ots tools.&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
&lt;br /&gt;
OTS is distributed under an LGPL license.&lt;br /&gt;
&lt;br /&gt;
== Contributions ==&lt;br /&gt;
&lt;br /&gt;
From [http://meego.gitorious.org/meego-quality-assurance/ qa-tools]&lt;br /&gt;
&lt;br /&gt;
== Wiki ==&lt;br /&gt;
&lt;br /&gt;
[[Quality/QA-tools/OTS | OTS Wiki Home]]&lt;br /&gt;
&lt;br /&gt;
== Source Code Documentation ==&lt;br /&gt;
&lt;br /&gt;
FIXME&lt;br /&gt;
&lt;br /&gt;
== Mailing List ==&lt;br /&gt;
&lt;br /&gt;
FIXME&lt;br /&gt;
&lt;br /&gt;
== IRC Channel ==&lt;br /&gt;
&lt;br /&gt;
The #meego-qa-tools irc channel in freenode&lt;br /&gt;
&lt;br /&gt;
== Bugs == &lt;br /&gt;
&lt;br /&gt;
The [http://bugs.meego.com/ Meego bugs page]&lt;br /&gt;
&lt;br /&gt;
== Platform Dependencies ==&lt;br /&gt;
&lt;br /&gt;
OTS is tested to run on Linux only. Productization environment is Ubuntu 8.04 LTS (Long Term Support).&lt;br /&gt;
&lt;br /&gt;
== Experimental ==&lt;br /&gt;
&lt;br /&gt;
Documentation for experimental branches, spikes, WIPs etc. can be found in [[Quality/QA-tools/OTS/DeveloperDocs/Experimental]].&lt;br /&gt;
&lt;br /&gt;
== Analysis ==&lt;br /&gt;
&lt;br /&gt;
[[Quality/QA-tools/OTS/DeveloperDocs/ErrorSituations| OTS 0.1 Error Situations]]&lt;br /&gt;
&lt;br /&gt;
[[Quality/QA-tools/OTS/DeveloperDocs/TypicalUsage| Typical OTS users and usage scenarios]]&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	<entry>
		<id>http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs</id>
		<title>Quality/QA-tools/OTS/DeveloperDocs</title>
		<link rel="alternate" type="text/html" href="http://wiki.meego.com/Quality/QA-tools/OTS/DeveloperDocs"/>
				<updated>2010-12-29T09:00:31Z</updated>
		
		<summary type="html">&lt;p&gt;Tvainio: /* Analysis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OTS - Open Testing Service =&lt;br /&gt;
&lt;br /&gt;
== Related Documentation ==&lt;br /&gt;
&lt;br /&gt;
* [[Quality/QA-tools/OTS/Architecture]]&lt;br /&gt;
* [[Quality/QA-tools/OTS/Glossary]]&lt;br /&gt;
&lt;br /&gt;
== Synopsis ==&lt;br /&gt;
&lt;br /&gt;
OTS is a Distributed Test System that takes a Data Driven Approach using XML Files to allow parallel testing of Applications on evolving Hardware platforms.  &lt;br /&gt;
&lt;br /&gt;
Design has been driven by the need for a language neutral test platform that allows testing under different device architectures in parallel.&lt;br /&gt;
&lt;br /&gt;
== High Level Overview ==  &lt;br /&gt;
&lt;br /&gt;
OTS allows a Test Sequence to be fanned out from a hub known as a '''Distributor''' to a remote machine known as a '''Worker'''. &lt;br /&gt;
Each '''Worker''' has a '''Device Group''' associated with it, this is defined in the configuration. The Tests are routed to the '''Worker''' &lt;br /&gt;
on the basis of the '''Device Group'''.&lt;br /&gt;
&lt;br /&gt;
An XML '''Test Definition File''' describes the Tests that are run. The results are returned to the '''Distributor''' in an XML '''Results File'''.&lt;br /&gt;
 &lt;br /&gt;
The '''Distributor''' takes a '''Device Group''' and '''Timeout''' as inputs, as well as the '''Command''' for running '''Tasks'''. Tests are run within a '''Task''' which  &lt;br /&gt;
is currently run as a process. The '''Command''' will typically take a path to the '''Test Definition File''' as an input. &lt;br /&gt;
If the process exceeds the '''Timeout''' the '''Task''' is stopped (the process is killed). &lt;br /&gt;
&lt;br /&gt;
A number of '''Tasks''' can be added to a '''Testrun'''. The '''Testrun''' will normally wait for all '''Tasks''' to finish before completion. &lt;br /&gt;
&lt;br /&gt;
Data (status, error and results) are communicated back from the '''Task''' to the '''Worker'''.  The '''Results Object''' is a container for the files outputted: '''Test Definition File''',  '''Results File''' &lt;br /&gt;
and any other files produced by the test as well as metadata relating to the run. &lt;br /&gt;
&lt;br /&gt;
== Technology ==&lt;br /&gt;
&lt;br /&gt;
OTS is written in Python 2.5.&lt;br /&gt;
&lt;br /&gt;
OTS has the following FIXME (provided as separate PDF)&lt;br /&gt;
&lt;br /&gt;
=== XmlFileFormats ===&lt;br /&gt;
&lt;br /&gt;
The XML file formats provide the datum for the system.&lt;br /&gt;
&lt;br /&gt;
Download [http://meego.gitorious.org/meego-quality-assurance/test-definition/trees/master them] and add the path to the '''results_xsd''' parameter in your [http://meego.gitorious.org/meego-quality-assurance/ots/blobs/dev_branch_0.8/ots.server/ots/server/ots_server.ini ots_server.ini] file&lt;br /&gt;
&lt;br /&gt;
=== Third Party Dependencies ===&lt;br /&gt;
&lt;br /&gt;
==== RabbitMQ ====&lt;br /&gt;
&lt;br /&gt;
You need to install [http://www.rabbitmq.com/server.html RabbitMQ]. &lt;br /&gt;
&lt;br /&gt;
===== Managing the Queues =====&lt;br /&gt;
&lt;br /&gt;
If you need to delete or empty the queues there are [http://meego.gitorious.org/meego-quality-assurance/ots/trees/master/ots.server/ots/server/distributor/dev_utils utilities] to help with this.&lt;br /&gt;
&lt;br /&gt;
==== Python Packages ====&lt;br /&gt;
&lt;br /&gt;
The following python packages are needed&lt;br /&gt;
&lt;br /&gt;
* [http://pypi.python.org/pypi/setuptools setuptools]&lt;br /&gt;
&lt;br /&gt;
* [http://www.voidspace.org.uk/python/configobj.html configobj]&lt;br /&gt;
 &lt;br /&gt;
* [http://pypi.python.org/pypi/multiprocessing multiprocessing]&lt;br /&gt;
&lt;br /&gt;
* [http://barryp.org/software/py-amqplib/ pyamqplib]&lt;br /&gt;
&lt;br /&gt;
* [http://www.familieleuthe.de/DownloadMiniXsv.html minixsv]&lt;br /&gt;
&lt;br /&gt;
* [http://www.djangoproject.com/download/1.1.2/tarball/ django]&lt;br /&gt;
&lt;br /&gt;
* [http://code.google.com/p/python-nose/ nose]&lt;br /&gt;
&lt;br /&gt;
== Diving In ==&lt;br /&gt;
&lt;br /&gt;
The following steps show how to get a Development Environment up and running&lt;br /&gt;
&lt;br /&gt;
=== 1. Install Dependencies ===&lt;br /&gt;
&lt;br /&gt;
* Install the Third Party Dependencies&lt;br /&gt;
&lt;br /&gt;
* Get the XML File Formats and set the OTS_TESTDEFINITION environment variable&lt;br /&gt;
&lt;br /&gt;
=== 2. Build the Eggs === &lt;br /&gt;
&lt;br /&gt;
From the root directory&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ./setup.sh&lt;br /&gt;
 source ./paths.sh&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Unittests ===&lt;br /&gt;
&lt;br /&gt;
Run the unittests from the root directory&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ./nose.sh&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Component Tests ===&lt;br /&gt;
&lt;br /&gt;
Component Tests run high level tests on an OTS Component using Mocks of the dependencies.&lt;br /&gt;
&lt;br /&gt;
You can run these with the component_tests shell script in the root directory. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ./component_tests.sh&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. Hello OTS World ===&lt;br /&gt;
&lt;br /&gt;
The source contains a simple demonstration of the way the key elements work. &lt;br /&gt;
&lt;br /&gt;
==== 1. Open two terminal windows. ====&lt;br /&gt;
&lt;br /&gt;
==== 2. In the first window run the server ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 cd $SERVER&lt;br /&gt;
 cd hub/demos&lt;br /&gt;
 python demo_hub.py&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3. You should see this: ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 &amp;lt;snip&amp;gt;&lt;br /&gt;
 20XX-XX-XX XX:XX:XX,XXX - ots.server.distributor.taskrunner - DEBUG - Sending command '['echo', 'hello world']' with key 'foo'&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4. In the second window run the worker ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 cd $WORKER&lt;br /&gt;
 python worker.py -c config.ini&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5. Now in the Server terminal the command should run to completion. You should see the following line in the logs: ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  20XX-XX-XX XX:XX:XX,XXX - ots.worker.command - DEBUG - process.communicate() returned echo hello world&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It will raise a PackageException. This is normal as no Tasks that are run return Packages to the Server&lt;br /&gt;
&lt;br /&gt;
==== 6. And on the logs on the Worker side should contain: ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 XXXX-XX-XX XX:XX:XX,XXX - ots.worker.command - DEBUG - process.communicate() returned echo hello world&lt;br /&gt;
 XXXX-XX-XX XX:XX:XX,XXX - ots.worker.task_broker - DEBUG - Task in state: 'finish'&lt;br /&gt;
 XXXX-XX-XX XX:XX:XX,XXX - ots.worker.task_broker - INFO - Recommence consume on queue: foo&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation == &lt;br /&gt;
&lt;br /&gt;
It is intended that the '''Distributor''' and each '''Worker''' should be installed to separate machines.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Distributor ===&lt;br /&gt;
&lt;br /&gt;
The format of the configuration file is as follows. &lt;br /&gt;
&lt;br /&gt;
The `host` is the name of the RabbitMQ server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [Client]&lt;br /&gt;
 host =  localhost&lt;br /&gt;
 vhost = / &lt;br /&gt;
 port = 5672&lt;br /&gt;
 username = guest&lt;br /&gt;
 password = guest&lt;br /&gt;
 queue = FIXME&lt;br /&gt;
 consumer_tag = worker&lt;br /&gt;
 services_exchange = services&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Worker ===&lt;br /&gt;
&lt;br /&gt;
Edit your config.ini so that the &lt;br /&gt;
&lt;br /&gt;
 * `queue`&lt;br /&gt;
 * `routing_key`&lt;br /&gt;
 * `services_exchange` &lt;br /&gt;
&lt;br /&gt;
Are set for your '''Device Group'''. &lt;br /&gt;
&lt;br /&gt;
And the `host` is the name of your RabbitMQ server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [Worker]&lt;br /&gt;
 host =  localhost&lt;br /&gt;
 vhost = / &lt;br /&gt;
 port = 5672&lt;br /&gt;
 username = guest&lt;br /&gt;
 password = guest&lt;br /&gt;
 queue = foo&lt;br /&gt;
 routing_key = foo&lt;br /&gt;
 services_exchange = foo&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Starting the Worker ====&lt;br /&gt;
&lt;br /&gt;
To start your Worker:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 python worker.py -c config.ini&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Automated System Tests ==&lt;br /&gt;
&lt;br /&gt;
''''' Not yet merged to dev_branch_0.8 '''''&lt;br /&gt;
&lt;br /&gt;
Automated system tests are available in ots.system_tests. They trigger various testruns with xmlrpc and check return value and log messages.&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
&lt;br /&gt;
* Fully functional OTS system with one worker.&lt;br /&gt;
* A SW Product &amp;quot;ots-system-tests&amp;quot; configured so that it defaults to the worker.&lt;br /&gt;
* A meego image with test-definition-tests and testrunner-lite-regression-tests.&lt;br /&gt;
* Django based advanced OTS setup.&lt;br /&gt;
* BeautifulSoup python library.&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
&lt;br /&gt;
* make the system test image available for the workers. (for example copy it to your apache static content directory /var/www/static/)&lt;br /&gt;
* Modify system_tests.conf in ots.system_tests directory to match your system.&lt;br /&gt;
* Make sure all the urls in system_tests.conf work.&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
&lt;br /&gt;
* System tests execute multiple full testruns. Running all tests can easily take more than 1.5 hours with N900 worker.&lt;br /&gt;
* Make sure there's no other activities ongoing in the system while running the tests.&lt;br /&gt;
* Some error handling tests expect certain devicegroups and sw products _not_ to be available. If these test cases fail you can remove those queues with ots tools.&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
&lt;br /&gt;
OTS is distributed under an LGPL license.&lt;br /&gt;
&lt;br /&gt;
== Contributions ==&lt;br /&gt;
&lt;br /&gt;
From [http://meego.gitorious.org/meego-quality-assurance/ qa-tools]&lt;br /&gt;
&lt;br /&gt;
== Wiki ==&lt;br /&gt;
&lt;br /&gt;
[[Quality/QA-tools/OTS | OTS Wiki Home]]&lt;br /&gt;
&lt;br /&gt;
== Source Code Documentation ==&lt;br /&gt;
&lt;br /&gt;
FIXME&lt;br /&gt;
&lt;br /&gt;
== Mailing List ==&lt;br /&gt;
&lt;br /&gt;
FIXME&lt;br /&gt;
&lt;br /&gt;
== IRC Channel ==&lt;br /&gt;
&lt;br /&gt;
The #meego-qa-tools irc channel in freenode&lt;br /&gt;
&lt;br /&gt;
== Bugs == &lt;br /&gt;
&lt;br /&gt;
The [http://bugs.meego.com/ Meego bugs page]&lt;br /&gt;
&lt;br /&gt;
== Platform Dependencies ==&lt;br /&gt;
&lt;br /&gt;
OTS is tested to run on Linux only. Productization environment is Ubuntu 8.04 LTS (Long Term Support).&lt;br /&gt;
&lt;br /&gt;
== Experimental ==&lt;br /&gt;
&lt;br /&gt;
Documentation for experimental branches, spikes, WIPs etc. can be found in [[Quality/QA-tools/OTS/DeveloperDocs/Experimental]].&lt;br /&gt;
&lt;br /&gt;
== Analysis ==&lt;br /&gt;
&lt;br /&gt;
[[Quality/QA-tools/OTS/DeveloperDocs/ErrorSituations| OTS 0.1 Error Situations]]&lt;br /&gt;
[[Quality/QA-tools/OTS/DeveloperDocs/TypicalUsage| Typical OTS users and usage scenarios]]&lt;/div&gt;</summary>
		<author><name>Tvainio</name></author>	</entry>

	</feed>