diff options
Diffstat (limited to 'docs/com/pres/Summit')
-rwxr-xr-x | docs/com/pres/Summit/Berlin-2016/conversation.html | 251 | ||||
-rwxr-xr-x | docs/com/pres/Summit/Berlin-2016/summit-Berlin.html | 313 | ||||
-rwxr-xr-x | docs/com/pres/Summit/Berlin-2016/testapi.html | 274 |
3 files changed, 838 insertions, 0 deletions
diff --git a/docs/com/pres/Summit/Berlin-2016/conversation.html b/docs/com/pres/Summit/Berlin-2016/conversation.html new file mode 100755 index 00000000..b56b1e10 --- /dev/null +++ b/docs/com/pres/Summit/Berlin-2016/conversation.html @@ -0,0 +1,251 @@ +<!doctype html> +<html lang="en"> + + <head> + <meta charset="utf-8"> + + <title>OPNFV presentation</title> + + <meta name="description" content="Conversation with the Testing community"> + <meta name="author" content="OPNFV Testing Worjing Group"> + + <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>Conversation with the Testing Community</h1> + <br><br> + <h4>OPNFV testing community</h4> + <h5>OPNFV Design Summit, 20/6/2016, Berlin</h5> + <br> + + </section> + + <section data-markdown> + >“You make experiments and I make theories. Do you know the difference? A theory is something nobody believes, except the person who made it. An experiment is something everybody believes, except the person who made it." A.Einstein + </section> + + <section data-markdown> + # Agenda + * Who are we? + * Upstream, Upstream, Upstream + * Towards Telco Cloud KPI + </section> + + <section data-markdown> + # Who are we? + ![team](../../../img/OPNFV_testing_group.png) + This is a representation...not a governance! + </section> + <section> + <section> + <h3>The test projects</h3> + <table> + <thead> + <tr> + <th>Test case</th> + <th>Description</th> + </tr> + </thead> + <tbody> + <tr> + <td>Functest</td> + <td>Umbrella project for Functional testing</td> + </tr> + <tr> + <td>Yardstick</td> + <td>Umbrella project for performance/qualification testing</td> + </tr> + <tr> + <td>CPerf</td> + <td>SDN controller performance testing</td> + </tr> + <tr> + <td>StorPerf</td> + <td>Storage performance testing</td> + </tr> + <tr> + <td>VSPerf</td> + <td>VSwitch qualification</td> + </tr> + <tr> + <td>Bottlenecks</td> + <td>Detect possible bottlenecks</td> + </tr> + <tr> + <td>QTIP</td> + <td>Benchmark to boost performance</td> + </tr> + </tbody> + </table> + </section> + + <section data-markdown> + # Functest + * Functional testing to validate scenarios + * Contributors (raise your hands) + * Functest presentation (here...1h ago :)) + * breakout sessions + * Today 3.10PM-3.40PM (vIMS evolution) 4PM (feature project integration), 5PM (Colorado status) + * tomorrow 11AM (API, test collection), 1PM (work Upstream), 3.15PM (D Release)(to be confirmed...) + </section> + <section data-markdown> + # Yardstick + * Performance testing framework and NFVI Validation + * [Contributors](https://wiki.opnfv.org/display/yardstick/People) + * Yardstick presentation + * How to Do a Pre-deployment NFVI Validation Quickly and Efficiently? Wednesday, June 22, 4:00 PM - 4:30 PM + * Yardstick: A Pre-deployment NFVI Validation Tool. Thursday, June 23, 3:10 PM - 3:30 PM + * breakout sessions + * Tomorrow 2PM (Yardstick in C) + </section> + <section data-markdown> + # CPerf + * SDN Controller Performance Testing + * Upstream test experts + standards/metrics experts + * Goal: Cross-controller perf tests in CI against realistic deployments + </section> + <section data-markdown> + # StorPerf + * Cinder Volume Performance Testing + * Based on SNIA's SSD Test Specification + * Presentation + * StorPerf: Cinder Storage Performance Measurement. + Wednesday, June 22, 3:40 PM - 3:55 PM + * Breakout Session + * Tomorrow 10:15 (StorPerf Test Results Working Session) + </section> + <section data-markdown> + # VSPerf + </section> + <section data-markdown> + # Bottlenecks + </section> + <section data-markdown> + # QTIP + + ## OPNFV Platform Benchmark + + - Bottom up + - testing baremetal components first + - More than result + - comparing against reference + - Setup-Test-Diagnose-Improve + - a closed loop to boost platform performance + + ## Breakout session + + - 14:30~15:45, June 21st/Tuesday + - Room Tegel + </section> + </section> + <section> + <section data-markdown> + # Upstream, upstream, upstream.. + </section> + <section data-markdown> + ## We are on the shoulders of the giants + * Rally (OpenStack) + * ODL, ONOS, ... + * RobotFramework, Teston + * ..... + </section> + <section data-markdown> + ## Time to give back + ### How to improve work with testing upstream community + </section> + + </section> + + <section> + + <section data-markdown> + # Towards Telco Cloud KPI? + </section> + + <section data-markdown> + # Testing group goals + * Define common needs (naming, rules, tools...) + * Unify result collection, reporting, dashboarding, documentation + * Share best practice: docker, CLI, .. + * Identify testing domains + * Encourage testing in poorly covered areas + </section> + + <section data-markdown> + # The ultimate goal: define Telco Cloud KPIs + * Provide methodology and test suites to qualify a Telco Cloud + * Provide reference benchs for plugfest/third party integration: compare apple with apple + </section> + + </section> + + <section data-markdown> + # Thank you + </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> diff --git a/docs/com/pres/Summit/Berlin-2016/summit-Berlin.html b/docs/com/pres/Summit/Berlin-2016/summit-Berlin.html new file mode 100755 index 00000000..4173a86a --- /dev/null +++ b/docs/com/pres/Summit/Berlin-2016/summit-Berlin.html @@ -0,0 +1,313 @@ +<!doctype html> +<html lang="en"> + + <head> + <meta charset="utf-8"> + + <title>OPNFV presentation</title> + + <meta name="description" content="Functest: Many rivers to cross"> + <meta name="author" content="Morgan Richomme and Functest contributors"> + + <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>From Arno to Colorado</h1> + <h3>Functest: Many rivers to cross</h3> + <br> + <h4>Functest contributors</h4> + <h5>OPNFV Design Summit, 20/6/2016, Berlin</h5> + <br> + + </section> + + <section> + <blockquote> + “Bad programmers have all the answers. Good testers have all the questions. Gil Zilberfeld - ” + </blockquote> + </section> + + <section data-markdown> + # Agenda + * Functest + * Arno + * Brahmaputra + * Colorado + * D, E, F rivers and beyond + </section> + + <section data-markdown> + # The dream team + ![team](../../../img/teamSummitBerlin.png) + </section> + + <section> + <section data-markdown> + # Functest: what for? + </section> + <section data-markdown> + ## Our goals + ### make sure OPNFV works...... + </section> + <section data-markdown> + ## so concretely... + * Validate scenarios for the release + * Give confidence on OPNFV fresh releases + * Ensure consistancy towards installers + * Ensure End to End interoperability + </section> + <section data-markdown> + ## and also + * Provide functional test suites to be replayed + * ~ post install sanity check + * usable for plugfests + * coherent with ETSI and Telco needs + * Provide test tools + * run tests + * collect info + * create dashboard + </section> + <section data-markdown> + ## Our goals are not.... + * Performance testing (yardstick, Xperf ) + * Re-do tests done in specific projects + * storage/storeperf + * infra audit/qtip + * Compare results + </section> + + <section data-markdown> + ## Our rules + * Re-use as much as possible upstream suites (Rally, Tempest, Robot, testOn..) + * Keep it simple... + * Automate (if not it is not a test...) + * Create new suites only if tests not covered + * Consider fields not addressed by existing test projects + </section> + + <section data-markdown> + ## Our rules + * Installer neutral + * Controller neutral + * Black box approach + </section> + + </section> + + <section> + <section data-markdown> + # Arno + </section> + <section data-markdown> + ## Proof of concept + * 4 Testcases: vPing (userdata), Tempest, Rally, ODL + * 1 scenario: os-odl_l2-nofeature-ha + * 2 installers: Foreman/Fuel + * Lots of manual operations (reporting, documentation) + </section> + </section> + <section> + <section data-markdown> + # Brahmaputra + </section> + <section data-markdown> + ## More everything.... + * 7 Testcases: vPing (ssh), ONOS, vIMS, Tempest and Rally extended + * 3 feature projects: doctor, promise, sdnvpn + * 13 Scenarios + * 4 Installers (Apex, Compass, Fuel, Joid) + * Test result collection + * Automatic dashboard + </section> + <section> + <h3>Jiras</h3> + <img height="200" data-src="../../../img/jiras.png" alt="Jiras"> + <img height="200" data-src="../../../img/jiras2.png" alt="Jiras"> + </section> + + <section> + <h3>Brahmaputra Scenario matrix</h3> + <img width="800" data-src="../../../img/matrix.png" alt="Jiras"> + </section> + + <section> + Comparison odl_l2-nofeature-ha scenario + <table> + <thead> + <tr> + <th>Project</th> + <th>Apex</th> + <th>Compass</th> + <th>Fuel</th> + <th>Joid</th> + </tr> + </thead> + <tbody> + <tr> + <td>POD</td> + <td>LF POD1</td> + <td>Huawei US</td> + <td>Ericsson POD2</td> + <td>Orange POD2</td> + </tr> + <tr> + <td>Functest</td> + <td>2h50</td> + <td>1h45</td> + <td>2h35</td> + <td>2h30</td> + </tr> + <tr> + <td>Yardstick</td> + <td>1h05</td> + <td>1h00</td> + <td>1h00</td> + <td>0h55</td> + </tr> + </tbody> + </table> + * difference of duration due to POD and test suites + </section> + + <section data-markdown> + ## Lessons learned + * Tempest/Rally + * harmonizing installer related OpenStack configuration differences + * creating customized test lists + * main challenge was resolving SDN controller interworking problems + * vIMS + * complete but complex test case + * very interesting to automate (pre MANO, most of Telco needs met there) + </section> + + </section> + + <section> + <section data-markdown> + # Colorado + </section> + + <section data-markdown> + ## What's new? + * New internal test cases: healthcheck, security + * New controler: OpenContrail? + * New feature projects (domino, multisites, movie, parser, moon, copper, models, onos-sfc...) + * ARM Support (congratulations to ENEA team!) + * Simplified feature project integration journey + </section> + + <section data-markdown> + ## What's new? + * Slicing of the tests (healthcheck / Smoke / SDN controllers / Features / Components / VNFs) + * Better Test duration management + * Refactoring (repo, case management, test API) + * Automatic reporting + * Dashboard evolution to ELK + * CLI + </section> + + + <section> + <h3>Automatic reporting</h3> + <img height="400" data-src="../../../img/reporting.png" alt="Reporting"> + <br><a href="http://testresults.opnfv.org/reporting/functest/release/master/index-status-fuel.html">Validated scenarios for Colorado</a> + </section> + + </section> + + <section> + <section data-markdown> + # Many rivers to cross + ## Functest beyond Colorado + </section> + <section data-markdown> + ## More test cases + * New VNFs (vEPC, vCDN, vWhatever...) + * Multi sites (e.g bgpvpn with different back ends) + * Better test coverage + </section> + <section data-markdown> + ## A Functional testing As a Service framework + * Scenario owner can select their relevant test cases + * Test duration estimation + * Agile dashboarding + * Analytics + </section> + <section data-markdown> + ## Upstream + * Rally: time to give back more + * Functest description for ETSI? + </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-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> diff --git a/docs/com/pres/Summit/Berlin-2016/testapi.html b/docs/com/pres/Summit/Berlin-2016/testapi.html new file mode 100755 index 00000000..7035d71d --- /dev/null +++ b/docs/com/pres/Summit/Berlin-2016/testapi.html @@ -0,0 +1,274 @@ +<!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> + <script type='text/template'> + ## Achieve using testAPI + * Uniform API: testAPI + * Uniform format: JSON + * Universal Location: http://testresults.opnfv.org + <aside class='notes'> + By using testAPI, we hope to provide a uniform way of collection and saving test results to a universal location + </aside> + </script> + </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> + <li>Unit tests</li> + <li>Update of the data model</li> + <li>Tornado_swagger for the documentation</li> + <li>URL and MongoDB collection renaming</li> + <li>Scripts to support databse backup/restore/update</li> + <li>Support installation</li> + <aside class='notes'> + So you can discover and understand the capabilities of the service without + access to source code, documentation, or through network traffic inspection, + and also you can interact with the testAPI directly through swagger website. + </aside> + </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/<span style="color:lightblue">testapi</span> => <br>testresults.opnfv.org/<span style="color:yellow">test/api/v1</span> </p> + + <p> /test/api/v1/<b>pods</b></p> + <p> /test/api/v1/<b>projects</b></p> + <p> /test/api/v1/projects/qtip/<b>cases</b></p> + <p> /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 | opnfv release version | + </section> + <section data-markdown> + <script type='text/template'> + ## New fields for results + | Item | Colorado | + | :--- | :--- | + | scenario | used for scenario | + | criteria | PASS/FAILED | + | trust_indicator | between 0 and 1| + <aside class='notes'> + to detect if the test case is stable over time and further more to avoid + running it systematically and saving time for other long duration test cases + </aside> + </script> + </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 + * Dockerize testAPI + * Automatic update of testAPI + * 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> |