1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
\r
2 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
\r
3 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
\r
5 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
\r
6 <meta name="generator" content="AsciiDoc 8.6.4" />
\r
7 <title>kantan(8)</title>
\r
8 <style type="text/css">
\r
9 /* Sans-serif font. */
\r
10 h1, h2, h3, h4, h5, h6,
\r
11 div.title, caption.title,
\r
12 thead, p.table.header,
\r
14 span#author, span#revnumber, span#revdate, span#revremark,
\r
16 font-family: Arial,Helvetica,sans-serif;
\r
21 font-family: Georgia,"Times New Roman",Times,serif;
\r
24 /* Monospace font. */
\r
30 margin: 1em 5% 1em 5%;
\r
35 text-decoration: underline;
\r
56 h1, h2, h3, h4, h5, h6 {
\r
59 margin-bottom: 0.5em;
\r
64 border-bottom: 2px solid silver;
\r
81 border: 1px solid silver;
\r
86 margin-bottom: 0.5em;
\r
92 ul > li { color: #aaa; }
\r
93 ul > li > * { color: black; }
\r
107 span#revnumber, span#revdate, span#revremark {
\r
112 border-top: 2px solid silver;
\r
113 padding-top: 0.5em;
\r
118 padding-bottom: 0.5em;
\r
120 div#footer-badges {
\r
122 padding-bottom: 0.5em;
\r
127 margin-bottom: 1.5em;
\r
129 div.tableblock, div.imageblock, div.exampleblock, div.verseblock,
\r
130 div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
\r
131 div.admonitionblock {
\r
133 margin-bottom: 1.5em;
\r
135 div.admonitionblock {
\r
137 margin-bottom: 2.0em;
\r
142 div.content { /* Block element content. */
\r
146 /* Block element titles. */
\r
147 div.title, caption.title {
\r
152 margin-bottom: 0.5em;
\r
158 td div.title:first-child {
\r
161 div.content div.title:first-child {
\r
164 div.content + div.title {
\r
168 div.sidebarblock > div.content {
\r
169 background: #ffffee;
\r
170 border: 1px solid #dddddd;
\r
171 border-left: 4px solid #f0f0f0;
\r
175 div.listingblock > div.content {
\r
176 border: 1px solid #dddddd;
\r
177 border-left: 5px solid #f0f0f0;
\r
178 background: #f8f8f8;
\r
182 div.quoteblock, div.verseblock {
\r
183 padding-left: 1.0em;
\r
184 margin-left: 1.0em;
\r
186 border-left: 5px solid #f0f0f0;
\r
190 div.quoteblock > div.attribution {
\r
191 padding-top: 0.5em;
\r
195 div.verseblock > pre.content {
\r
196 font-family: inherit;
\r
197 font-size: inherit;
\r
199 div.verseblock > div.attribution {
\r
200 padding-top: 0.75em;
\r
203 /* DEPRECATED: Pre version 8.2.7 verse style literal block. */
\r
204 div.verseblock + div.attribution {
\r
208 div.admonitionblock .icon {
\r
209 vertical-align: top;
\r
212 text-decoration: underline;
\r
214 padding-right: 0.5em;
\r
216 div.admonitionblock td.content {
\r
217 padding-left: 0.5em;
\r
218 border-left: 3px solid #dddddd;
\r
221 div.exampleblock > div.content {
\r
222 border-left: 3px solid #dddddd;
\r
223 padding-left: 0.5em;
\r
226 div.imageblock div.content { padding-left: 0; }
\r
227 span.image img { border-style: none; }
\r
228 a.image:visited { color: white; }
\r
232 margin-bottom: 0.8em;
\r
237 font-style: normal;
\r
240 dd > *:first-child {
\r
245 list-style-position: outside;
\r
248 list-style-type: decimal;
\r
251 list-style-type: lower-alpha;
\r
254 list-style-type: upper-alpha;
\r
257 list-style-type: lower-roman;
\r
260 list-style-type: upper-roman;
\r
263 div.compact ul, div.compact ol,
\r
264 div.compact p, div.compact p,
\r
265 div.compact div, div.compact div {
\r
267 margin-bottom: 0.1em;
\r
270 div.tableblock > table {
\r
271 border: 3px solid #527bbd;
\r
273 thead, p.table.header {
\r
286 /* Because the table frame attribute is overriden by CSS in most browsers. */
\r
287 div.tableblock > table[frame="void"] {
\r
288 border-style: none;
\r
290 div.tableblock > table[frame="hsides"] {
\r
291 border-left-style: none;
\r
292 border-right-style: none;
\r
294 div.tableblock > table[frame="vsides"] {
\r
295 border-top-style: none;
\r
296 border-bottom-style: none;
\r
302 margin-bottom: 0.8em;
\r
305 padding-bottom: 15px;
\r
307 dt.hdlist1.strong, td.hdlist1.strong {
\r
311 vertical-align: top;
\r
312 font-style: normal;
\r
313 padding-right: 0.8em;
\r
317 vertical-align: top;
\r
319 div.hdlist.compact tr {
\r
325 background: yellow;
\r
328 .footnote, .footnoteref {
\r
332 span.footnote, span.footnoteref {
\r
333 vertical-align: super;
\r
337 margin: 20px 0 20px 0;
\r
338 padding: 7px 0 0 0;
\r
341 #footnotes div.footnote {
\r
347 border-top: 1px solid silver;
\r
356 padding-right: 0.5em;
\r
357 padding-bottom: 0.3em;
\r
358 vertical-align: top;
\r
360 div.colist td img {
\r
365 div#footer-badges { display: none; }
\r
369 margin-bottom: 2.5em;
\r
377 margin-bottom: 0.1em;
\r
380 div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
\r
397 span.aqua { color: aqua; }
\r
398 span.black { color: black; }
\r
399 span.blue { color: blue; }
\r
400 span.fuchsia { color: fuchsia; }
\r
401 span.gray { color: gray; }
\r
402 span.green { color: green; }
\r
403 span.lime { color: lime; }
\r
404 span.maroon { color: maroon; }
\r
405 span.navy { color: navy; }
\r
406 span.olive { color: olive; }
\r
407 span.purple { color: purple; }
\r
408 span.red { color: red; }
\r
409 span.silver { color: silver; }
\r
410 span.teal { color: teal; }
\r
411 span.white { color: white; }
\r
412 span.yellow { color: yellow; }
\r
414 span.aqua-background { background: aqua; }
\r
415 span.black-background { background: black; }
\r
416 span.blue-background { background: blue; }
\r
417 span.fuchsia-background { background: fuchsia; }
\r
418 span.gray-background { background: gray; }
\r
419 span.green-background { background: green; }
\r
420 span.lime-background { background: lime; }
\r
421 span.maroon-background { background: maroon; }
\r
422 span.navy-background { background: navy; }
\r
423 span.olive-background { background: olive; }
\r
424 span.purple-background { background: purple; }
\r
425 span.red-background { background: red; }
\r
426 span.silver-background { background: silver; }
\r
427 span.teal-background { background: teal; }
\r
428 span.white-background { background: white; }
\r
429 span.yellow-background { background: yellow; }
\r
431 span.big { font-size: 2em; }
\r
432 span.small { font-size: 0.6em; }
\r
434 <script type="text/javascript">
\r
436 window.onload = function(){asciidoc.footnotes(); asciidoc.toc(2);}
\r
437 var asciidoc = { // Namespace.
\r
439 /////////////////////////////////////////////////////////////////////
\r
440 // Table Of Contents generator
\r
441 /////////////////////////////////////////////////////////////////////
\r
443 /* Author: Mihai Bazon, September 2002
\r
444 * http://students.infoiasi.ro/~mishoo
\r
446 * Table Of Content generator
\r
449 * Feel free to use this script under the terms of the GNU General Public
\r
450 * License, as long as you do not remove or alter this notice.
\r
453 /* modified by Troy D. Hanson, September 2006. License: GPL */
\r
454 /* modified by Stuart Rackham, 2006, 2009. License: GPL */
\r
456 // toclevels = 1..4.
\r
457 toc: function (toclevels) {
\r
459 function getText(el) {
\r
461 for (var i = el.firstChild; i != null; i = i.nextSibling) {
\r
462 if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
\r
464 else if (i.firstChild != null)
\r
465 text += getText(i);
\r
470 function TocEntry(el, text, toclevel) {
\r
473 this.toclevel = toclevel;
\r
476 function tocEntries(el, toclevels) {
\r
477 var result = new Array;
\r
478 var re = new RegExp('[hH]([2-'+(toclevels+1)+'])');
\r
479 // Function that scans the DOM tree for header elements (the DOM2
\r
480 // nodeIterator API would be a better technique but not supported by all
\r
482 var iterate = function (el) {
\r
483 for (var i = el.firstChild; i != null; i = i.nextSibling) {
\r
484 if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
\r
485 var mo = re.exec(i.tagName);
\r
486 if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
\r
487 result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
\r
497 var toc = document.getElementById("toc");
\r
498 var entries = tocEntries(document.getElementById("content"), toclevels);
\r
499 for (var i = 0; i < entries.length; ++i) {
\r
500 var entry = entries[i];
\r
501 if (entry.element.id == "")
\r
502 entry.element.id = "_toc_" + i;
\r
503 var a = document.createElement("a");
\r
504 a.href = "#" + entry.element.id;
\r
505 a.appendChild(document.createTextNode(entry.text));
\r
506 var div = document.createElement("div");
\r
507 div.appendChild(a);
\r
508 div.className = "toclevel" + entry.toclevel;
\r
509 toc.appendChild(div);
\r
511 if (entries.length == 0)
\r
512 toc.parentNode.removeChild(toc);
\r
516 /////////////////////////////////////////////////////////////////////
\r
517 // Footnotes generator
\r
518 /////////////////////////////////////////////////////////////////////
\r
520 /* Based on footnote generation code from:
\r
521 * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
\r
524 footnotes: function () {
\r
525 var cont = document.getElementById("content");
\r
526 var noteholder = document.getElementById("footnotes");
\r
527 var spans = cont.getElementsByTagName("span");
\r
530 for (i=0; i<spans.length; i++) {
\r
531 if (spans[i].className == "footnote") {
\r
533 // Use [\s\S] in place of . so multi-line matches work.
\r
534 // Because JavaScript has no s (dotall) regex flag.
\r
535 note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
\r
536 noteholder.innerHTML +=
\r
537 "<div class='footnote' id='_footnote_" + n + "'>" +
\r
538 "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
\r
539 n + "</a>. " + note + "</div>";
\r
540 spans[i].innerHTML =
\r
541 "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
\r
542 "' title='View footnote' class='footnote'>" + n + "</a>]";
\r
543 var id =spans[i].getAttribute("id");
\r
544 if (id != null) refs["#"+id] = n;
\r
548 noteholder.parentNode.removeChild(noteholder);
\r
550 // Process footnoterefs.
\r
551 for (i=0; i<spans.length; i++) {
\r
552 if (spans[i].className == "footnoteref") {
\r
553 var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
\r
554 href = href.match(/#.*/)[0]; // Because IE return full URL.
\r
556 spans[i].innerHTML =
\r
557 "[<a href='#_footnote_" + n +
\r
558 "' title='View footnote' class='footnote'>" + n + "</a>]";
\r
568 <body class="article">
\r
572 <div id="toctitle">Table of Contents</div>
573 <noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
577 <div class="sect1">
\r
578 <h2 id="_name">1. Name</h2>
\r
579 <div class="sectionbody">
\r
580 <div class="paragraph"><p>kantan - simple test suite for autotesting software using Grml and KVM</p></div>
\r
583 <div class="sect1">
\r
584 <h2 id="synopsis">2. Synopsis</h2>
\r
585 <div class="sectionbody">
\r
586 <div class="paragraph"><p>For the server (main) instance:</p></div>
\r
587 <div class="literalblock">
\r
588 <div class="content">
\r
589 <pre><tt>kantan server <disk.img> <grml.iso> </mnt/point/of/iso/> [kvm_arguments]</tt></pre>
\r
591 <div class="paragraph"><p>or for client(s):</p></div>
\r
592 <div class="literalblock">
\r
593 <div class="content">
\r
594 <pre><tt>kantan client <disk.img> <name> [kvm_arguments]</tt></pre>
\r
596 <div class="paragraph"><p>For further details please see section <a href="#options">[options]</a> and <a href="#setup">[setup]</a>.</p></div>
\r
599 <div class="sect1">
\r
600 <h2 id="options">3. Options</h2>
\r
601 <div class="sectionbody">
\r
602 <div class="paragraph"><p>Options for <em>kantan server</em>:</p></div>
\r
603 <div class="literalblock">
\r
604 <div class="content">
\r
605 <pre><tt><disk.img> <grml.iso> </mnt/point/of/iso/> [kvm_arguments]</tt></pre>
\r
607 <div class="paragraph"><p>where <em>disk.img</em> is an existing image file (created e.g. via <em>qemu-img create
\r
608 disk.img 3G</em>), grml.iso is an a Grml ISO (<a href="http://grml.org/">http://grml.org/</a>),
\r
609 /mnt/point/of/iso/ refers to the mount point where the specified Grml ISO is
\r
610 mounted to (e.g. <em>mount -o loop grml-medium_sid_latest.iso /mnt/test</em>) and
\r
611 <em>kvm_arguments</em> are optional and can be used to add additional arguments to the
\r
612 KVM commandline, like <em>vga=791</em>.</p></div>
\r
613 <div class="admonitionblock">
\r
616 <img src="./images/icons/tip.png" alt="Tip" />
\r
618 <td class="content">The </mnt/point/of/iso/> doesn’t necessarily need to be a real mountpoint.
\r
619 It’s fine if you just copy linux26 and initrd.gz from /boot/* of the Grml
\r
620 ISO to </path/to/foobar/boot/> and specify </path/to/foobar/> as mountpoint
\r
621 directory then.</td>
\r
624 <div class="paragraph"><p>Options for <em>kantan client</em>:</p></div>
\r
625 <div class="literalblock">
\r
626 <div class="content">
\r
627 <pre><tt><disk.img> <name> [kvm_arguments]</tt></pre>
\r
629 <div class="paragraph"><p>where <em>disk.img</em> is an existing image file (created e.g. via <em>qemu-img create
\r
630 disk.img 3G</em>), <em>name</em> assigns the virtual instance a name (for reading
\r
631 /etc/kantan/name.cfg iff the file exists). The <em>kvm_arguments</em> are optional and
\r
632 can be used to add additional arguments to the KVM commandline, like <em>-boot d</em>
\r
633 for booting from the ISO.</p></div>
\r
636 <div class="sect1">
\r
637 <h2 id="description">4. Description</h2>
\r
638 <div class="sectionbody">
\r
639 <div class="paragraph"><p><span class="image">
\r
640 <a class="image" href="kantan-screenshot.png">
\r
641 <img src="kantan-screenshot.jpg" alt="kantan-screenshot.jpg" />
\r
644 <div class="paragraph"><p>Kantan is a set of scripts to automatically test software using KVM
\r
645 (<a href="http://www.linux-kvm.org/">http://www.linux-kvm.org/</a>) and the Debian based Linux live system Grml
\r
646 (<a href="http://grml.org/">http://grml.org/</a>). You don’t have to set up neither tons of software packages
\r
647 nor a complex environment but just follow some simple <a href="#setup">setup instructions</a>.</p></div>
\r
648 <div class="paragraph"><p>It was originally developed to provide a simple way for autotesting specific
\r
649 versions of FAI (<a href="http://fai-project.org/">http://fai-project.org/</a>) but is expected to provide a
\r
650 simple-to-use test suite for autotesting any Linux based software.</p></div>
\r
651 <div class="paragraph"><p>The concept of Kantan is to boot one virtual machine (the main instance, <em>kantan
\r
652 server …</em>) which is supposed to be able to serve as installation server for
\r
653 further virtual machines if needed. This concept for example allows to
\r
654 automatically set up a <a href="http://fai-project.org/">FAI</a> server which then
\r
655 deploys further started virtual machines (the clients, <em>kantan client …</em>).</p></div>
\r
656 <div class="paragraph"><p>Kantan is meant to be a prototype implementation to show how automated testing
\r
657 could be realised. In the long run the author would like to get a suite to
\r
658 automatically test:</p></div>
\r
659 <div class="ulist"><ul>
\r
662 complete Debian installations
\r
667 testing Debian packages within current state of Debian suites
\r
672 software configurations that are required to run on more than one host
\r
673 (installation procedures with dependencies between different systems during
\r
674 installation, cluster + HA setups,…)
\r
679 live systems with their flexible boot options, specific features and services
\r
689 software packages that provide unit tests
\r
694 low-level tools like partitioning, LVM, mdadm,…
\r
699 filesystems (crash, repair, mount,…)
\r
703 <div class="admonitionblock">
\r
706 <img src="./images/icons/caution.png" alt="Caution" />
\r
708 <td class="content">This software is WIP, though released in an early stage to gain feedback,
\r
709 testers and developers. It’s a prototype implementation mainly in shellscript
\r
710 but is expected to be rewritten in a real scripting language like python.</td>
\r
715 <div class="sect1">
\r
716 <h2 id="requirements">5. Requirements</h2>
\r
717 <div class="sectionbody">
\r
718 <div class="paragraph"><p>What you need to be able to use Kantan:</p></div>
\r
719 <div class="ulist"><ul>
\r
722 a Debian (based) system (any other Linux system might do it as well, but
\r
723 the scripts and docs are optimised for Debian (based) systems for now)
\r
728 a system running i386 or amd64 architecture (to smoothly use KVM)
\r
733 at least 2GB of RAM are recommended
\r
738 at least 4GB of harddisk space for >=2 virtual disk images
\r
743 a Grml ISO (see instructions below)
\r
749 <div class="sect1">
\r
750 <h2 id="setup">6. Setup and Usage Instructions</h2>
\r
751 <div class="sectionbody">
\r
752 <div class="paragraph"><p>Install the kantan Debian package, which for now is available from
\r
753 <a href="http://people.debian.org/~mika/kantan/">http://people.debian.org/~mika/kantan/</a></p></div>
\r
754 <div class="paragraph"><p>Grab a Grml ISO and mount it somewhere:</p></div>
\r
755 <div class="literalblock">
\r
756 <div class="content">
\r
757 <pre><tt>% wget download.grml.org/grml64-medium_2010.04.iso
\r
758 % wget download.grml.org/grml64-medium_2010.04.iso.md5
\r
759 % md5sum -c grml64-medium_2010.04.iso.md5
\r
760 % sudo mount -o loop grml64-medium_2010.04.iso /mnt/test</tt></pre>
\r
762 <div class="paragraph"><p>If necessary adjust /etc/kantan/server.cfg according to your needs.</p></div>
\r
763 <div class="paragraph"><p>Create image files for use as /srv within FAI server and as harddisk for the FAI
\r
764 client (qemu-img is available from qemu-utils):</p></div>
\r
765 <div class="literalblock">
\r
766 <div class="content">
\r
767 <pre><tt>% qemu-img create fai-server.img 3G
\r
768 % qemu-img create fai-client.img 3G</tt></pre>
\r
770 <div class="paragraph"><p>If you want to provide any local Debian packages to the FAI server instance
\r
771 (like for example a specific version of FAI you’d like to test) just create the
\r
772 directory <em>debs</em> in the current working directory (being the one where you’ll
\r
773 invoke kantan later on), like for example:</p></div>
\r
774 <div class="literalblock">
\r
775 <div class="content">
\r
776 <pre><tt>% mkdir debs
\r
777 % dget -u -d http://fai-project.org/download/squeeze/fai_3.4.4_amd64.changes
\r
778 % mv fai*.deb debs/</tt></pre>
\r
780 <div class="paragraph"><p>Finally execute the kantan script as $USER for the server instance, providing
\r
781 the path to the generated image file, the Grml-ISO and the mountpoint where the
\r
782 Grml ISO is mounted on:</p></div>
\r
783 <div class="literalblock">
\r
784 <div class="content">
\r
785 <pre><tt>% kantan server fai-server.img grml64-medium_2010.04.iso /mnt/test</tt></pre>
\r
787 <div class="paragraph"><p>Finally start the FAI client instance (the one that should be installed by the
\r
788 kantan server VM), specifying <em>grml</em> as client name (so /etc/kantan/grml.cfg
\r
789 would be read if it exists) and "-boot d" as boot option for KVM so it uses the
\r
790 PXE ISO for booting (just drop "-boot d" then when installation of client has
\r
791 finished):</p></div>
\r
792 <div class="literalblock">
\r
793 <div class="content">
\r
794 <pre><tt>% kantan client fai-client.img grml "-boot d"</tt></pre>
\r
796 <div class="paragraph"><p>That’s it! :) Further usage scenarious and tests will follow.</p></div>
\r
799 <div class="sect1">
\r
800 <h2 id="faq">7. FAQ</h2>
\r
801 <div class="sectionbody">
\r
802 <div class="sect2">
\r
803 <h3 id="why_kantan">7.1. Why Kantan?</h3>
\r
804 <div class="paragraph"><p>The author of Kantan thinks that lack of proper Q/A is one of the most annoying
\r
805 issues in the open source world. So let’s do something against that.</p></div>
\r
807 <div class="sect2">
\r
808 <h3 id="what_does_kantan_mean">7.2. What does Kantan mean?</h3>
\r
809 <div class="paragraph"><p>The author of Kantan is a friend of the
\r
810 <a href="http://en.wikipedia.org/wiki/Kanban">Kanban</a> concept and created the word
\r
811 Kantan based on "the Kanban of testing". Amusingly according to
\r
812 <a href="http://www.cjvlang.com/Writing/writjpn/signs/kantan.html">http://www.cjvlang.com/Writing/writjpn/signs/kantan.html</a> "Kantan is a
\r
813 Chinese-style compound (on-reading) meaning <em>simple</em>." which represents the idea
\r
814 of Kantan: provide a <em>simple</em> method for testing software.</p></div>
\r
816 <div class="sect2">
\r
817 <h3 id="kantan_vs_chroot">7.3. Why use a VM and not just a chroot?</h3>
\r
818 <div class="paragraph"><p>Chroots provide a nice way for testing stuff like package installations. But
\r
819 they are limited to some restricted actions. Chroots don’t properly support
\r
820 testing kernel versions, bootoptions, partitioning tools, LVM, mdadm,… in a
\r
821 reasonable environment.</p></div>
\r
823 <div class="sect2">
\r
824 <h3 id="external_system">7.4. How can I use Kantan with physical machines?</h3>
\r
825 <div class="paragraph"><p>By default Kantan uses vde_switch for network configuration. This provides a
\r
826 working network setup between the server and the client(s) machines without
\r
827 having to configure anything. But if you want to use external, physical machines
\r
828 this does not work any longer. Instead just set up tap devices so you can
\r
829 install clients on real[tm] hardware.</p></div>
\r
830 <div class="paragraph"><p>Assume the following setup: the Kantan server is the server where you’re executing
\r
831 "kantan server …". The test client is the machine where you want to boot
\r
832 the system which would be corresponding to "kantan client …" (but instead of
\r
833 executing "kantan client …" as virtual guest you’re running it on physical
\r
834 machine). NIC eth0 is providing internet access (WAN). NIC eth1 is the network
\r
835 link between the server and the client machine.</p></div>
\r
836 <div class="literalblock">
\r
837 <div class="content">
\r
838 <pre><tt>+----------------+
\r
839 | Kantan ,-----|----- eth0 ----- [ Internet/WAN ]
\r
843 | `-----|----- eth1 ----- [ Test client ]
\r
844 +----------------+</tt></pre>
\r
846 <div class="paragraph"><p>Then the following configuration should do the trick for you:</p></div>
\r
847 <div class="literalblock">
\r
848 <div class="content">
\r
849 <pre><tt># example config for /etc/network/interfaces
\r
850 iface vnet inet static
\r
851 post-up tunctl -u grml -g grml -t tap1 ; brctl addif vnet tap1 ; ip link set up dev tap1
\r
852 post-up brctl addif vnet eth1
\r
853 pre-down ip link set down dev tap1 ; tunctl -d tap1
\r
855 address 192.168.10.2
\r
856 netmask 255.255.255.0</tt></pre>
\r
858 <div class="paragraph"><p>Configure /etc/kantan/server.cfg:</p></div>
\r
859 <div class="literalblock">
\r
860 <div class="content">
\r
861 <pre><tt>VLAN1_DEVICE='tap1'</tt></pre>
\r
863 <div class="paragraph"><p>Then execute:</p></div>
\r
864 <div class="literalblock">
\r
865 <div class="content">
\r
867 echo 1 > /proc/sys/net/ipv4/ip_forward
\r
868 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE</tt></pre>
\r
870 <div class="paragraph"><p>To forward DNS requests from the clients to the physical net use dnsmasq:</p></div>
\r
871 <div class="literalblock">
\r
872 <div class="content">
\r
873 <pre><tt>/etc/init.d/dnsmasq start || apt-get install dnsmasq</tt></pre>
\r
878 <div class="sect1">
\r
879 <h2 id="todos">8. TODOs</h2>
\r
880 <div class="sectionbody">
\r
881 <div class="sect2">
\r
882 <h3 id="_known_todos">8.1. Known todos</h3>
\r
883 <div class="ulist"><ul>
\r
886 provide test features and tests from
\r
887 <a href="http://git.grml.org/?p=grml-unittests.git;a=summary">grml-unittests</a>
\r
892 better logging and data sharing support to collect data and status report
\r
893 and control data flow between different virtual machines
\r
898 make sure vnc and serial console display the same things during
\r
899 execution within Grml
\r
906 <div class="ulist"><ul>
\r
909 support svn/git/… config space retrieval
\r
914 improve arch and suite support through base.tgz
\r
919 support canceling the script and getting a debugshell
\r
926 <div class="sect2">
\r
927 <h3 id="_checkout">8.2. Checkout</h3>
\r
928 <div class="ulist"><ul>
\r
931 use kvm’s monitor support for sharing/controlling data?
\r
936 investigate and combine/merge features/ideas/approaches from:
\r
938 <div class="ulist"><ul>
\r
941 <a href="http://kvm.et.redhat.com/page/KVM-Autotest">http://kvm.et.redhat.com/page/KVM-Autotest</a>
\r
946 <a href="http://lizards.opensuse.org/2010/05/25/automated-opensuse-testing/">http://lizards.opensuse.org/2010/05/25/automated-opensuse-testing/</a>
\r
951 <a href="http://git.grml.org/?p=grml-unittests.git;a=summary">http://git.grml.org/?p=grml-unittests.git;a=summary</a>
\r
956 <a href="http://www.mozilla.org/projects/testopia/">http://www.mozilla.org/projects/testopia/</a>
\r
961 <a href="https://wiki.ubuntu.com/AutomatedTesting">https://wiki.ubuntu.com/AutomatedTesting</a>
\r
966 <a href="https://wiki.ubuntu.com/AutomatedTestingDeployment">https://wiki.ubuntu.com/AutomatedTestingDeployment</a>
\r
971 <a href="https://wiki.ubuntu.com/Testing/ISO/Procedures">https://wiki.ubuntu.com/Testing/ISO/Procedures</a>
\r
976 <a href="https://wiki.edubuntu.org/VirtFeatureVerification">https://wiki.edubuntu.org/VirtFeatureVerification</a>
\r
981 <a href="http://wiki.virtualsquare.org/wiki/index.php/VDE_Basic_Networking#Dump_or_Monitor_switch_traffic">http://wiki.virtualsquare.org/wiki/index.php/VDE_Basic_Networking#Dump_or_Monitor_switch_traffic</a>
\r
986 <a href="http://developer.amd.com/zones/opensource/AMDTapper/Pages/default.aspx">http://developer.amd.com/zones/opensource/AMDTapper/Pages/default.aspx</a>
\r
993 tools that might help in automated testing:
\r
995 <div class="ulist"><ul>
\r
998 <a href="http://ldtp.freedesktop.org/wiki/">GNU LDTP</a>
\r
1003 <a href="http://seleniumhq.org/">Selenium</a>
\r
1008 <a href="http://shunit.sourceforge.net/">ShUnit</a>
\r
1013 <a href="http://groups.csail.mit.edu/uid/sikuli/">Sikuli</a>
\r
1018 <a href="http://synflood.at/programs.html">Tuitest</a>
\r
1023 <a href="http://hoopajoo.net/projects/xautomation.html">Xautomation</a>
\r
1028 <a href="http://pythonpaste.org/webtest/">WebTest</a>
\r
1033 <a href="http://en.wikipedia.org/wiki/List_of_GUI_testing_tools">http://en.wikipedia.org/wiki/List_of_GUI_testing_tools</a>
\r
1042 <div class="sect1">
\r
1043 <h2 id="bugs">9. Bugs</h2>
\r
1044 <div class="sectionbody">
\r
1045 <div class="paragraph"><p>Probably. We just need a test suite for Kantan for testing.</p></div>
\r
1048 <div class="sect1">
\r
1049 <h2 id="author">10. Author</h2>
\r
1050 <div class="sectionbody">
\r
1051 <div class="paragraph"><p>Michael Prokop <<a href="mailto:mika@grml.org">mika@grml.org</a>></p></div>
\r
1055 <div id="footnotes"><hr /></div>
\r
1057 <div id="footer-text">
\r
1058 Last updated 2011-04-18 15:29:52 CEST
\r