<!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.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.png" data-background-transition="none">
                     <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
					* A test API: what for?
					* API overview
					* API evolution
				</section>

                <section>
                    <section data-markdown>
                    # A test API: what for?
                    </section>
                    <section data-markdown>
                    ## Give a consistant view for
                    * Test resources (Pods)
                    * Test projects
                    * Test cases
                    * Test results
                    </section>

                    <section data-markdown>
                    ## Unify result display
                    * From many projects
                    * Many formats (log, html, json, ..)
                    * Many locations (in VM, Jumphost, external DB,...)
                    </section>

                    <section data-markdown>
                    ## Help building
                    * Dashboards
                    * Automatic reporting
                    </section>
                </section>

                <section>
                    <section data-markdown>
                    # API overview
                    </section>
                    <section data-markdown>
					## API 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 in Brahmaputra
                    * Tornado + MongoDB
                    * Simple data models aggreed with the testing group
                    * No unit tests
                    * Wiki and rst documentation
                    </section>

                    <section data-markdown>
                    ## Lessons learned in B.
                    * Wiki documentation is painful
                    * Result model too simple
                     * version used instead of scenario
                     * no version
                     * no overall criteria (PASS/FAIL)
                    * need unit tests for data model evolution
                    </section>
                    <section data-markdown>
                    ## Colorado refactoring
                    * Done by Serena Feng (ZTE)
                    * Update of the data model (based on lessons learned)
                    * New swagger tornado framework for the doc
                    * URL and Mongo collection renaming
                    * Scripts to manage backup/restore/DB update
                    * Setup scripts
                    * Unit tests
                    </section>
                </section>

                <section>
                    <section data-markdown>
						# Result management changes
                    </section>
                    
                    <section data-markdown>
						## main changes
						An URI change...
						
						testresults.opnfv.org/test/testapi => testresults.opnfv.org/test/api/v1
						
						http://testresults.opnfv.org/test/api/v1/projects
						http://testresults.opnfv.org/test/api/v1/projects/qtip/cases
						http://testresults.opnfv.org/test/api/v1/results?case=Tempest&period=1
						</section>
						<section>
						<h3>One new field for pods</h3>
						<table>
							<thead>
								<tr>
									<th>Field</th>
									<th>Brahmaputra</th>
									<th>Colorado</th>
								</tr>
							</thead>
							<tbody>
								<tr>
									<td>role</td>
									<td>N.R</td>
									<td>community_pod, ci_pod, ..</td>
								</tr>
							</tbody>
						</table>                        
						</section>
                        <section>
						<h3>New fields and filters for results</h3>
						<table>
							<thead>
								<tr>
									<th>Item</th>
									<th>Brahmaputra</th>
									<th>Colorado</th>
								</tr>
							</thead>
							<tbody>
								<tr>
									<td>date</td>
									<td>creation_date</td>
									<td>start_date and stop_date</td>
								</tr>
								<tr>
									<td>version</td>
									<td>used as scenario</td>
									<td>git version</td>
								</tr>
								<tr>
									<td>scenario</td>
									<td>N.R</td>
									<td>used for scenario</td>
								</tr>
								<tr>
									<td>criteria</td>
									<td>N.R</td>
									<td>PASS/FAILED</td>
								</tr>
								<tr>
									<td>trust_indicator</td>
									<td>N.R</td>
									<td>between 0 and 1</td>
								</tr>
								<tr>
									<td>last</td>
									<td>N.R</td>
									<td>get last N results</td>
								</tr>
							</tbody>
						</table>
					</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>
					<h3>Thank you</h3>
					<img width="600"  data-src="../img/colorado.png" alt="tests">
				</section>

			</div>
            <div class='footer'>
				 <img src="../img/logo-OPNFV.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>