<!doctype html>
<html lang="en">

	<head>
		<meta charset="utf-8">

		<title>OPNFV presentation</title>

		<meta name="description" content="Test API">
		<meta name="author" content="Serena Feng">

		<meta name="apple-mobile-web-app-capable" content="yes" />
		<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />

		<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui">

		<link rel="stylesheet" href="../css/reveal.css">
		<link rel="stylesheet" href="../css/theme/OPNFV-Berlin.css" id="theme">

		<!-- Code syntax highlighting -->
		<link rel="stylesheet" href="../lib/css/zenburn.css">

		<!-- Printing and PDF exports -->
		<script>
			var link = document.createElement( 'link' );
			link.rel = 'stylesheet';
			link.type = 'text/css';
			link.href = window.location.search.match( /print-pdf/gi ) ? '../css/print/pdf.css' : '../css/print/paper.css';
			document.getElementsByTagName( 'head' )[0].appendChild( link );
		</script>

		<!--[if lt IE 9]>
		<script src="lib/js/html5shiv.js"></script>
		<![endif]-->
	</head>

	<body>

		<div class="reveal">
			<!-- Any section element inside of this container is displayed as a slide -->
			<div class="slides">

				<section data-background="../img/title-bg-berlin.png" data-background-transition="none">
					<br><br><br><br><br>
					<h1>Test API</h1>
					<h3>Clean, Easy, Complete</h3>
					<br>
						<h4>OPNFV testing community</h4>
						<h5>OPNFV Design Summit, 20/6/2016, Berlin</h5>
					<br>
				</section>

				<section data-markdown>
					# Agenda
					* testAPI: what for?
					* API overview
					* API evolution
					* Roadmap
				</section>

				<section>
					<section data-markdown>
						# test API: what for?
					</section>
					<section data-markdown>
						## Consistant view for
						* Resources (Pods)
						* Projects
						* Test cases
						* Results
					</section>
	
					<section data-markdown>
						## Status Currently
						* From many projects
						* Many formats (log, html, json, ..)
						* Many locations (in VM, Jumphost, external DB,...)
					</section>
					<section data-markdown>
						## Achieve using testAPI
						* Uniform API: testAPI
						* Uniform format: JSON
						* Universal Location: http://testresults.opnfv.org
					</section>
	
					<section data-markdown>
						## Help building
						* Dashboards
						* Automatic reporting
					</section>
				</section>

				<section>
					<section data-markdown>
						# API overview
					</section>
					<section data-markdown>
						## Storage structure
						![testapi](https://wiki.opnfv.org/download/attachments/2926452/results_collection_structure.png?version=1&modificationDate=1459196347000&api=v2 "OPNFV API page")
					</section>
					<section data-markdown>
						## API in Brahmaputra
						![testapi](../img/testapi0.png)
						https://wiki.opnfv.org/display/functest/Collection+Of+Test+Results
					</section>

					<section data-markdown>
						## API status in Brahmaputra
						* Simple data models aggreed with the testing group
						* No unit tests
						* Wiki and rst documentation
					</section>

					<section data-markdown>
						## Lessons learned in B.
						* Painful wiki documentation
						* Simple result model
						 * Misuse version as scenario
						 * No version actually
						 * No overall criteria (PASS/FAIL)
						* Difficult refactoring
					</section>
					<section>
						<h2>Colorado refactoring</h2>
						<ul>Unit tests
						<li>Update of the data model</li>
						<li>Swagger tornado framework for the doc</li>
						<li>URL and MongoDB collection renaming</li>
						<li>Scripts to support backup/restore/update DB</li>
						<li>Support installation</li>
                        </ul>
                        <p class="fragment fade-up"><b>All done in Colorado!</b></p>
					</section>						
				</section>

				<section>
					<section data-markdown>
						# API Evoluation
					</section>
					
					<section>
						<h2> URI changes...</h2>
						<div style="text-align:left""> 
							<p> testresults.opnfv.org/test/testapi => <br>testresults.opnfv.org/test/api/v1 </p>
			
							<p> http://testresults.opnfv.org/test/api/v1/<b>pods</b></p>
							<p> http://testresults.opnfv.org/test/api/v1/<b>projects</b></p>
							<p> http://testresults.opnfv.org/test/api/v1/projects/qtip/<b>cases</b></p>
							<p> http://testresults.opnfv.org/test/api/v1/<b>results</b></p>
						</div>
					</section>
					<section data-markdown>
						## One new field for pods
						| Field | Colorado |
						| :--- | :--- |
						| role | community_pod, ci_pod, .. |
					</section>
					<section data-markdown>
						## Changed fields for results
						| Item | Brahmaputra | Colorado |
						| :--- | :--- | :--- |
						| date | creation_date | start_date and stop_date |
						| version | used as scenario | git version |
					</section>
					<section data-markdown>
						## New fields for results
						| Item | Colorado |
						| :--- | :--- |
						| scenario | used for scenario |
						| criteria | Pass/Failed |
						| trust_indicator | between 0 and 1|
					</section>
					<section data-markdown>
						## One new filter for results
						| Item | Colorado |
						| :--- | :--- |
						| last | get last N results|
					</section>
					<section data-markdown>
						http://testresults.opnfv.org/test/swagger/spec.html
						![alt text](../img/testapi1.png "Test API swagger interface")
					</section>
					<section>
						<h2>unit tests</h2>
						<pre><code class="hljs" data-trim contenteditable>
umry8364@umry8364-Latitude-E6400:~/Dev/OPNFV/releng/utils/test/result_collection_api$ ./run_test.sh 
Tests running...
WARNING:tornado.general:404 GET /dashboard/v1/results?case=vPing&pod=zte-pod1&version=C&installer=fuel&period=5 (127.0.0.1): Project name missing
WARNING:tornado.access:404 GET /dashboard/v1/results?case=vPing&pod=zte-pod1&version=C&installer=fuel&period=5 (127.0.0.1) 2.30ms
WARNING:tornado.general:400 POST /api/v1/projects (127.0.0.1): name missing
............
WARNING:tornado.access:400 POST /api/v1/projects (127.0.0.1) 1.13ms
WARNING:tornado.access:403 PUT /api/v1/projects/functest/cases/vping_1 (127.0.0.1) 2.95ms
WARNING:tornado.general:404 PUT /api/v1/projects/functest/cases/notFound (127.0.0.1): {'project_name': u'functest', 'name': u'notFound'} could not be found in table [testcases]
WARNING:tornado.access:404 PUT /api/v1/projects/functest/cases/notFound (127.0.0.1) 2.85ms

Ran 74 tests in 1.848s
OK
						</code></pre>
					</section>
				</section>

				<section>
					<section data-markdown>
						# Roadmap
					</section>
					<section data-markdown>
						## Roadmap
						* Dockerized testAPI
						* Integration with Kibana
						* Command Line Interface
						* Automatic update for pods/projects/testcases
					</section>
					<section data-markdown>
						# suggestions ...
					</section>
					<section>
						<h3>Thank you</h3>
						<img width="600"  data-src="../img/colorado.png" alt="tests">
					</section>
				</section>
			</div>
			<div class='footer'>
				 <img src="../img/logo-OPNFV-Berlin.png" alt="OPNFV logo">
			</div>
		</div>

		<script src="../lib/js/head.min.js"></script>
		<script src="../js/reveal.js"></script>

		<script>

			// Full list of configuration options available at:
			// https://github.com/hakimel/reveal.js#configuration
			Reveal.initialize({
				controls: true,
				progress: true,
				history: true,
				center: true,

				transition: 'slide', // none/fade/slide/convex/concave/zoom

				// Optional reveal.js plugins
				dependencies: [
					{ src: '../lib/js/classList.js', condition: function() { return !document.body.classList; } },
					{ src: '../plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
					{ src: '../plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
					{ src: '../plugin/highlight/highlight.js', async: true, condition: function() { return !!document.querySelector( 'pre code' ); }, callback: function() { hljs.initHighlightingOnLoad(); } },
					{ src: '../plugin/zoom-js/zoom.js', async: true },
					{ src: '../plugin/notes/notes.js', async: true }
				]
			});

		</script>

	</body>
</html>