<!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>