From a9508ba2cd124789b683fba112e395832b1bf3e3 Mon Sep 17 00:00:00 2001 From: Miruna Paun Date: Mon, 10 Jun 2019 12:33:41 +0200 Subject: Added the System Test Spec Doc. Change-Id: I532d2f343e5c6a0ddb7bf06961b6f889e9108952 --- doc/Makefile | 2 +- .../doc/book.xml | 27 + .../doc/configuration.xml | 32 + .../doc/eltf_params_template.xml | 151 ++++ .../doc/eltf_params_updated.xml | 286 +++++++ .../eltf_params_updated_template_how_to_use.txt | 320 ++++++++ .../doc/overview.xml | 125 +++ .../doc/sample_test_cases.xml | 855 +++++++++++++++++++++ .../swcomp.mk | 10 + 9 files changed, 1807 insertions(+), 1 deletion(-) create mode 100644 doc/book-enea-nfv-access-system-test-specification/doc/book.xml create mode 100644 doc/book-enea-nfv-access-system-test-specification/doc/configuration.xml create mode 100644 doc/book-enea-nfv-access-system-test-specification/doc/eltf_params_template.xml create mode 100644 doc/book-enea-nfv-access-system-test-specification/doc/eltf_params_updated.xml create mode 100755 doc/book-enea-nfv-access-system-test-specification/doc/eltf_params_updated_template_how_to_use.txt create mode 100644 doc/book-enea-nfv-access-system-test-specification/doc/overview.xml create mode 100644 doc/book-enea-nfv-access-system-test-specification/doc/sample_test_cases.xml create mode 100755 doc/book-enea-nfv-access-system-test-specification/swcomp.mk diff --git a/doc/Makefile b/doc/Makefile index 2cf6e28..b9e7bac 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -50,7 +50,7 @@ DOCBOOK_TO_BOOKDIR ?= yes DOCBOOK_CLEANTMP ?= yes #Components (books) in this subsystem. Now use all books found here -COMPONENTS := book-enea-nfv-access-example-usecases book-enea-nfv-access-getting-started book-enea-nfv-access-open-source book-enea-nfv-access-release-info book-enea-nfv-access-vnf-onboarding-guide book-enea-nfv-access-reference-guide-intel book-enea-nfv-access-auto-fw-th-user-guide +COMPONENTS := book-enea-nfv-access-example-usecases book-enea-nfv-access-getting-started book-enea-nfv-access-open-source book-enea-nfv-access-release-info book-enea-nfv-access-vnf-onboarding-guide book-enea-nfv-access-reference-guide-intel book-enea-nfv-access-auto-fw-th-user-guide book-enea-nfv-access-system-test-specification # COMPONENTS += #book-enea-linux-eclipse-open-source #book-enea-nfv-access-dev-hardening-guide diff --git a/doc/book-enea-nfv-access-system-test-specification/doc/book.xml b/doc/book-enea-nfv-access-system-test-specification/doc/book.xml new file mode 100644 index 0000000..d1b0cae --- /dev/null +++ b/doc/book-enea-nfv-access-system-test-specification/doc/book.xml @@ -0,0 +1,27 @@ + + +]> + + <trademark class="registered">Enea</trademark> NFV Access System Test Specification + + Release Version + + + + + + + + + + + + diff --git a/doc/book-enea-nfv-access-system-test-specification/doc/configuration.xml b/doc/book-enea-nfv-access-system-test-specification/doc/configuration.xml new file mode 100644 index 0000000..d1415c2 --- /dev/null +++ b/doc/book-enea-nfv-access-system-test-specification/doc/configuration.xml @@ -0,0 +1,32 @@ + + + Configuration + +
+ Test Objects + + The test objects for the Test Harness are considered to be the Enea + NFV Access and Enea uCPE Manager installations performed as indicated in + chapter 3 of the Enea NFV Access Automation Framework and Test Harness + User Guide. +
+ +
+ Test Environment + + To setup the required Test Harness environment please refer to the + "Environment" chapter from the Enea NFV Access Automation Framework and + Test Harness User Guide. +
+ +
+ Preconditions and Execution Steps + + Please refer to the "Prerequisites" and "Installation and Initial + Setup" chapters from Enea NFV Access Automation Framework and Test Harness + User Guide. + + For detailed execution steps of the sample test cases included with + the Test Harness please see chapter 3 in this document. +
+
\ No newline at end of file diff --git a/doc/book-enea-nfv-access-system-test-specification/doc/eltf_params_template.xml b/doc/book-enea-nfv-access-system-test-specification/doc/eltf_params_template.xml new file mode 100644 index 0000000..eaa7ebd --- /dev/null +++ b/doc/book-enea-nfv-access-system-test-specification/doc/eltf_params_template.xml @@ -0,0 +1,151 @@ + + +
+ File with Parameters in the Book Auto-updated by ELFT + + + See the eltf_params_updated_template_howto_use.txt text + file for description of how to create the final eltf_params_updated.xml from this template and for + all REQUIREMENTS. Use the command + "make eltf" to extract a full list of all + ELTF variables, which always begins with ELTF_ and don't only rely on the + howto text file list! The plan is that ELTF will auto-update this when + needed. + + +
+ Common Parameters + + A programlisting, ID + "eltf-prereq-apt-get-commands-host" + + ELTF_PL_HOST_PREREQ + + A programlisting, ID + "eltf-getting-repo-install-command" + + ELTF_PL_GET_REPO + + Several phrase elements, various IDs. Ensure EL_REL_VER is + correct also compared to the "previous" REL VER in pardoc-distro.xml + "prev_baseline". + + ELTF_EL_REL_VER + + ELTF_YOCTO_VER + + ELTF_YOCTO_NAME + + ELTF_YOCTO_PROJ_DOWNLOAD_TXTURL + + ELTF_EL_DOWNLOAD_TXTURL + + A programlisting, ID "eltf-repo-cloning-enea-linux". Use + $MACHINE/default.xml as parameter, where MACHINE is one of the target + directory names in the manifest. + + ELTF_PL_CLONE_W_REPO + + A table with ONE row, only the row with ID + "eltf-eclipse-version-row" is included in the book. MANUALLY BOTH in the + template.xml and in the updated.xml, set condition hidden on the + <row>, if eclipse is not in the release. + + + + + + Eclipse version ELTF_ECLIPSE_VERSION plus command line + development tools are included in this Enea NFV Access release. + + + + + + Below is one big section with title "Supported Targets with + Parameters". The entire section is included completely in the book via ID + "eltf-target-tables-section" and shall be LAST in the template. The + template contains ONE target subsection. COPY/APPEND it, if multiple + targets exist in the release and optionally add rows with additional + target parameters in each target subsection table. +
+ +
+ Supported Targets with Parameters + + The tables below describes the target(s) supported in this Enea + NFV Access release. + +
+ MACHINE ELTF_T_MANIFEST_DIR - Information + + + + + + + + + + Target official name + + ELTF_T_NAME + + + + Architecture and Description + + ELTF_T_ARC_DESC + + + + Link to target datasheet + + See ELTF_T_DS_TXTURL + + + + Poky version + + ELTF_T_POKY_VER + + + + GCC version + + ELTF_T_GCC_VER + + + + Linux Kernel Version + + ELTF_T_KERN_VER + + + + Supported Drivers + + ELTF_T_DRIVERS + + + + Enea rpm folder for downloading RPM packages for this + target + + ELTF_T_EL_RPM_TXTURL + + + + +
+ + +
+
\ No newline at end of file diff --git a/doc/book-enea-nfv-access-system-test-specification/doc/eltf_params_updated.xml b/doc/book-enea-nfv-access-system-test-specification/doc/eltf_params_updated.xml new file mode 100644 index 0000000..feabc9f --- /dev/null +++ b/doc/book-enea-nfv-access-system-test-specification/doc/eltf_params_updated.xml @@ -0,0 +1,286 @@ + + +
+ File with Parameters in the Book Auto-updated by ELFT + + + See the eltf_params_updated_template_howto_use.txt text + file for description of how to create the final eltf_params_updated.xml from this template and for + all REQUIREMENTS. Use the command + "make eltf" to extract a full list of all + ELTF variables, which always begins with ELTF_ and don't only rely on the + howto text file list! The plan is that ELTF will auto-update this when + needed. + + +
+ Common Parameters + + A programlisting, ID + "eltf-prereq-apt-get-commands-host" + + # Host Ubuntu 16.04 LTS 64bit +sudo apt-get -y update +sudo apt-get -y install sed wget subversion git-core coreutils unzip texi2html \ + texinfo libsdl1.2-dev docbook-utils fop gawk python-pysqlite2 diffstat \ + make gcc build-essential xsltproc g++ desktop-file-utils chrpath \ + libgl1-mesa-dev libglu1-mesa-dev autoconf automake groff libtool xterm \ + libxml-parser-perl + + A programlisting, ID + "eltf-getting-repo-install-command" + + mkdir -p ~/bin +curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo +chmod a+x ~/bin/repo +export PATH=~/bin:$PATH + + Several phrase elements, various IDs. Ensure EL_REL_VER is + correct also compared to the "previous" REL VER in pardoc-distro.xml + "prev_baseline". + + 2.2.1 + + 2.4 + + rocko + + http://www.yoctoproject.org/downloads + + https://linux.enea.com/6 + + A programlisting, ID "eltf-repo-cloning-enea-linux". Use + $MACHINE/default.xml as parameter, where MACHINE is one of the target + directory names in the manifest. + + mkdir enea-linux +cd enea-linux +repo init -u git@git.enea.com:linux/manifests/el_manifests-virtualization.git \ + -b refs/tags/EL6 -m $MACHINE/default.xml +repo sync + + A table with ONE row, only the row with ID + "eltf-eclipse-version-row" is included in the book. MANUALLY in book, set + condition hidden if eclipse is not in the release. Do this both in + template.xml and updated.xml. + + + + + + Eclipse version 4.3 (Mars) plus command line development + tools are included in this Enea NFV Access release. + + + + + + Below is one big section with title "Supported Targets with + Parameters". The entire section is included completely in the book via ID + "eltf-target-tables-section" and shall be LAST in the template. The + template contains ONE target subsection. COPY/APPEND it, if multiple + targets exist in the release and optionally add rows with additional + target parameters in each target subsection table. +
+ +
+ Supported Reference Boards with Parameters + + The table(s) below describes the target(s) supported in this Enea + NFV Access release. + + + MACHINE Information Intel Xeon D + + + + + + + Component + + Description + + + + + + Target official name + + Intel Xeon D + + + + Architecture and Description + + x86-64 + + + + Link to target datasheet + + Intel's + datasheet + + + + Poky version + + Git-commit-id: + 7e7ee662f5dea4d090293045f7498093322802cc + + + + GCC version + + 7.3 + + + + Linux Kernel Version + + 4.14 + + + + Supported Drivers + + Ethernet, RTC, UART + + + +
+ + + MACHINE Information Intel Atom C3000 + + + + + + + Component + + Description + + + + + + Target official name + + Intel Atom C3000 + + + + Architecture and Description + + x86-64 + + + + Link to target datasheet + + Intel's + datasheet + + + + Poky version + + Git-commit-id: + 7e7ee662f5dea4d090293045f7498093322802cc + + + + GCC version + + 7.3 + + + + Linux Kernel Version + + 4.14 + + + + Supported Drivers + + Ethernet, RTC, UART + + + +
+ + + MACHINE Information + + + + + + + Component + + Description + + + + + + Target official name + + OCTEON TX™ cn8304 + + + + Architecture and Description + + arm64 + + + + Link to target datasheet + + OCTEON + TX™ cn8304 datasheet + + + + Poky version + + Git-commit-id: + f01b909a266498853e6b3f10e6b39f2d95148129 + + + + GCC version + + 5.3FIXME + + + + Linux Kernel Version + + 3.12FIXME + + + + Supported Drivers + + Ethernet, RTC, UART + + + +
+
+
\ No newline at end of file diff --git a/doc/book-enea-nfv-access-system-test-specification/doc/eltf_params_updated_template_how_to_use.txt b/doc/book-enea-nfv-access-system-test-specification/doc/eltf_params_updated_template_how_to_use.txt new file mode 100755 index 0000000..62e5d02 --- /dev/null +++ b/doc/book-enea-nfv-access-system-test-specification/doc/eltf_params_updated_template_how_to_use.txt @@ -0,0 +1,320 @@ +eltf_params_template_updated_howto_use.txt + +This is a way to collect all parameters for an Enea NFV Access release +in one parameter file, easy to automatically update by ELTF regularly. + +NOTE: Both the release info AND the open source books use parameters from + here, but the XML file is inside the release info book directory. + +NOTE: The manifest_conf.mk, or overridden by the environment variable + MANIFESTHASH, contains the full tag (or hashvalue) for downloading + the manifest when the books are built. The list of target + directories are fetched from the manifest into the book. + The eltf_params_updates.xml can all the time contain + the final next complete tag e.g. refs/tags/EL6 or similar + in the ELTF_PL_CLONE_W_REPO parameter command lines. + +The ordinary book XML files use xi:include statements to include elements +from this parameter file. The book XML files can thus be manually edited. +Before editing, you must run "make init". +Any other text in the template or updated.xml file, outside the parts that +are included in the book, are not used but still all must be correct +DocBook XML files. + +ELTF work: + template => ELTF replaces ALL ELTF_xxx variables => updated XML file + => push to git only if changed + + +eltf_params_template.xml (in git) + File used by ELTF to autocreate/update the real parameter + file eltf_params_updated.xml. + +eltf_params_updated.xml (in git) + Real parameter file where ELTF has replaced all ELTF_xx variables with + strings, in several cases with multiline strings. + No spaces or linefeed allowed in beginning or end of the variable values! + + +xi:include: Each parameter is xi:include'ed in various book files, using + the IDs existing in the parameter files. + In most cases the 1:st element inside an element with an ID is included + using a format like eltf-prereq-apt-get-commands-host/1. + In very few cases the element with the ID is included in the book, one + example is the target section which has an ID, but which contains + multiple subsections, one per target. + All IDs in a book must be unique. + +DocBook XML: All XML files must be correct DocBook XML files. + +Do NOT edit/save the real *updated.xml file with XMLmind to avoid changes + not done by ELTF. But it is OK to open the real file in XMLmind to + check that the format is correct. + +ELTF should autocreate a temporary "real" file but only replace + and push the eltf_params_updated.xml if it is changed. + + +make eltf + This lists all ELTF_xxx variables and some rules how to treat them + +DocBook Format: All elements - rules: + Several strict generic XML rules apply for all strings: + 1. No TABs allowed or any other control chr than "linefeed" + 2. Only 7-bit ASCII + 3. Any < > & must be converted to < > and & + Similar for any other non-7-bit-ASCII but avoid those! + 4. No leading spaces or linefeeds when replacing the ELTF_* variable + 5. No trailing spaces or linefeeds when replacing the ELTF_* variable + 6. Note: Keep existing spaces before/efter ELTF_* in a few cases. + +DocBook Format: - rules: ELTF*PL* variables + Several strict rules apply for the multiline string in programlisting + in addition to the general XML rules above: + 7. Max line length < 80 char + 8. Use backslash (\) to break longer lines + 9. Use spaces (e.g. 4) to indent continuation lines in programlistings + 10. No trailing spaces on any line + 11. No spaces or linefeed immediately after leading + 12. No spaces or linefeed before trailing + +DocBook Format: - rules: ELTF_*URL* variables + 13. ELTF_*URL and corresponding ELTF_*TXTURL shall be identical strings + 14. Only if the URL is extremely long, the TXTURL can be a separate string + +Each target has one section with target parameters: +
+ MACHINE ELTF_T_MANIFEST_DIR - Information + ..... with many ELTF_ variables .... +
+ + 15. If there is only one target. ELTF just replaces ELTF parameters + + 16. It there are multiple targets. ELTF copies the section and appends the + section the required number of times. + Each section ID will become unique: eltf-target-table-ELTF_T_MANIFEST_DIR + Each section title will become unique + +Tables with target parameters in each target section: + 17. It is possible for ELTF to append more rows with one parameter each + to these tables, because the entire tables are included in the book + +Special - NOT YET READY DEFINED how to handle the optionally included + Eclipse and its version, but this is a first suggestion: + 18. Just now ELTF can define ELFT_ECLIPSE_VERSION as a full string + with both version number and name, + 19. MANUALLY if Eclipse is NOT included in the release, + the release manager should manually set condition="hidden" on + the entire section in the book XML about Eclipse + + + +BELOW WE TRY TO EXPLAIN EACH ELTF_* variable, but always check with make eltf +if there are more new variables, missing in this description file. + +_____________________________________________________________________________ +ELTF_PL_HOST_PREREQ Multiline list of host prerequisites, e.g. commands + like sudo apt-get install xxxx or similar. + First line = comment with the complete host name! + It is possible to include multiple hosts by just + adding an empty line, comment with host name, etc. + xi:include eltf-prereq-apt-get-commands-host/1 + This is a ... + Example: +# Host Ubuntu 14.04.5 LTS 64bit +sudo apt-get update +sudo apt-get install sed wget subversion git-core coreutils unzip texi2html \ + texinfo libsdl1.2-dev docbook-utils fop gawk python-pysqlite2 diffstat \ + make gcc build-essential xsltproc g++ desktop-file-utils chrpath \ + libgl1-mesa-dev libglu1-mesa-dev autoconf automake groff libtool xterm \ + libxml-parser-perl + +_____________________________________________________________________________ +ELTF_PL_GET_REPO Multiline commands to download the repo tool + xi:include eltf-getting-repo-install-command/1 + This is a ... + Example: +mkdir -p ~/bin +curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo +chmod a+x ~/bin/repo +export PATH=~/bin:$PATH + +_____________________________________________________________________________ +ELTF_EL_REL_VER General parameter string: The version of this Enea + NFV Access release. Major version and optional .Minor + Typically created from MAJOR and MINOR in enea.conf + MINOR in enea.conf is empty or contains a dot+minor + xi_include EneaLinux_REL_VER/1 + This is a X.x used in many places. + Examples: +6 + or +6.1 + +_____________________________________________________________________________ +ELTF_YOCTO_VER General parameter string: Yocto version, created + from DISTRO in poky.ent + xi:include Yocto_VER/1 + This is a X.x used in many places. + Example: +2.1 + +_____________________________________________________________________________ +ELTF_YOCTO_NAME General parameter string: Yocto name (branch), created + from DISTRO_NAME_NO_CAP in poky.ent + xi:include Yocto_NAME/1 + This is a X.x used in many places. + Example: +krogoth + +_____________________________________________________________________________ +ELTF_YOCTO_PROJ_DOWNLOAD_TXTURL General parameters. These two are IDENTICAL +ELTF_YOCTO_PROJ_DOWNLOAD_URL strings with correct Yocto version string + at the end, typically without "dot". + xi:include ULINK_YOCTO_PROJECT_DOWNLOAD/1 + This is an ... + Example: +http://www.yoctoproject.org/downloads/core/krogoth/21 + +_____________________________________________________________________________ +ELTF_EL_DOWNLOAD_TXTURL General parameters. These two are IDENTICAL strings +ELTF_EL_DOWNLOAD_URL and shall be the http:/..... address where + Enea NFV Access can be downloaded + Often containing same version as in ELTF_EL_REL_VER + xi:include ULINK_ENEA_LINUX_URL/1 + This is an ... + Example: +http://linux.enea.com/6 + +_____________________________________________________________________________ +ELTF_PL_CLONE_W_REPO Multiline commands to run repo to clone everything. + Use the variable $MACHINE/default.xml (the text in + the book will list the avaiable values of MACHINE, + taken from the manifest repository) + xi:include eltf-repo-cloning-enea-linux/1 + This is a ... + Example: +mkdir enea-linux +cd enea-linux +repo init -u git@git.enea.com:linux/manifests/el_manifests-virtualization.git \ + -b refs/tags/EL6 -m $MACHINE/default.xml +repo sync + +_____________________________________________________________________________ +ELTF_ECLIPSE_VERSION Optional general parameter string. + NOT YET READY DEFINED + Just now a release manage must manually set + condition="hidden" on the Eclipse section, + if Eclipse is not included in the release. + ELTF just replaces ELTF_ECLIPSE_VERSION with a full + string with "X.Y (name)" + It includes the ID and can only be ONCE in the book. + xi:include eltf-eclipse-version-row + Example. +4.5 (Mars) + + +_____________________________________________________________________________ +ELTF_T_* All these are in each target (MACHINE) and ELTF + must separately replace them with strings for + each target + NOTE: All (except the MANIFEST_DIR) are in rows + in a table and ELTF can select to append + more parameters by adding more rows + +_____________________________________________________________________________ +ELTF_T_MANIFEST_DIR This happens to be in two places. Must be exactly +ELTF_T_MANIFEST_DIR the directory name in the manifest, e.g. same + as the MACHINE names in $MACHINE/default.xml. + In book: a) Part of section ID + b) Part of section title + Examples: +p2041rgb + or +ls1021aiot + or +qemuarm + +_____________________________________________________________________________ +ELTF_T_NAME Target specific: "Target Official Name" + NOT same as the target directory name in most cases. + In book: An element in a row + Examples: +P2041RGB + or +LS1021a-IoT + or +qemuarm + +_____________________________________________________________________________ +ELTF_T_ARC_DESC Target specific: "Architecture and Description" + It can be a short identification string or + it can be a longer descriptive sentence. + In book: An element in a row + Examples: +Power, e500mc + or +ARM Cortex-A7 + +_____________________________________________________________________________ +ELTF_T_DS_TXTURL Target specific: "Link to target datasheet. These +ELTF_T_DS_URL two usually are IDENTICAL strings with correct + hyperlink to the target's official datasheet. + In book: an ... + Only if the link is VERY LONG, the text part shall + instead be a descriptive string (see 2:nd example). + NOTE: Also here no spaces or line-feeds! + Examples: +url="http://wiki.qemu.org">http://wiki.qemu.org +or +url="http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/qoriq-arm-processors/qoriq-ls1021a-iot-gateway-reference-design:LS1021A-IoT">link to NXP's datasheet + +_____________________________________________________________________________ +ELTF_T_POKY_VER Target specific: "Poky version" created either + from POKYVERSION in poky.ent + or using a hashvalue with a leading string, in + which case it may be different per target. + In book: An in a row + Examples: +15.0.0 +or +Git commit id: 75ca53211488a3e268037a44ee2a7ac5c7181bd2 + +_____________________________________________________________________________ +ELTF_T_GCC_VER Target specific: "GCC Version". Should be in poky + but not easy to find among various parameters. + ELTF would extract it from build logs building SDK + and it is possibly different per target. + In book: An in a row + Example: +5.3 + +_____________________________________________________________________________ +ELTF_T_KERN_VER Target specific: "Linux Kernel Version". Often + different per target. + In book: An in a row + Example: +3.12 + +_____________________________________________________________________________ +ELTF_T_DRIVERS Target specific: "Supported Drivers". This is a + comma-separated list of driver names. + ELTF should create the list in same order for each + target, e.g. alphabetic migth be OK. + In book: An in a row + Example: +Ethernet, I2C, SPI, PCI, USB, SD/SDHC/SDXC + + +_____________________________________________________________________________ +ELTF_T_EL_RPM_TXTURL Target specific: "Enea rpm folder for downloading +ELTF_T_EL_RPM_URL RPM packages for this target". These two are + INDENTICAL strings with hyperlink to the web site + at Enea where the customer can download RPMs + Note: Often the ELFT_EL_REL_VER value and + the ELTF_T_MANIFEST_DIR are used in the link. + In book: an ... + Example: +url="https://linux.enea.com/6/ls1021aiot/rpm">https://linux.enea.com/6/ls1021aiot/rpm + +_____________________________________________________________________________ diff --git a/doc/book-enea-nfv-access-system-test-specification/doc/overview.xml b/doc/book-enea-nfv-access-system-test-specification/doc/overview.xml new file mode 100644 index 0000000..7df9acc --- /dev/null +++ b/doc/book-enea-nfv-access-system-test-specification/doc/overview.xml @@ -0,0 +1,125 @@ + + + Overview + + This document specifies a Sample Test Suite for System Testing of the + Enea NFV Access Solution. It also provides information regarding the + necessary steps to run these tests. + +
+ Scope + + The scope of this document is to describe the Test Harness (TH) + sample test cases for System Testing of the Enea NFV Access Solution. + Furthermore, this document shall also describe the necessary environment + setup to run these tests successfully. +
+ +
+ Definitions and Acronyms + + + Definitions + + + + + + + Component + + Description + + + + + + Enea NFV Access Solution + + Enea NFV Access (with ODM) Runtime Platform and Enea uCPE + Manager. + + + + Enea Portal + + https://portal.enea.com + + + +
+ + + Acronyms + + + + + + + Component + + Description + + + + + + AF + + Automation Framework for Enea NFV Access. + + + + JSON + + JavaScript Object Notation. + + + + NIC + + Network Interface Card. + + + + NFV + + Network Functions Virtualization. + + + + ODM + + Enea Element On Device Management. + + + + OVS + + Open vSwitch. + + + + TH + + Test Harness for Enea NFV Access. + + + + uCPE Manager + + Enea Universal Customer Premises Equipment Manager. + + + + VNF + + Virtualized Network Function. + + + +
+
+
\ No newline at end of file diff --git a/doc/book-enea-nfv-access-system-test-specification/doc/sample_test_cases.xml b/doc/book-enea-nfv-access-system-test-specification/doc/sample_test_cases.xml new file mode 100644 index 0000000..50907ca --- /dev/null +++ b/doc/book-enea-nfv-access-system-test-specification/doc/sample_test_cases.xml @@ -0,0 +1,855 @@ + + + Sample Test Cases + + The test cases specified in this chapter are implemented as a Sample + Test Suite included in the TH. + +
+ VNF, Device and Network Smoke Test Cases + + The following is an automated test suite that acts as basic smoke + tests for the Enea NFV Access Solution and as a sanity-check test suite + for the AF and TH. + +
+ VNF - Onboard_VNF_Image + + Description: Onboarding a VNF + Image into the uCPE Manager. For details please refer to: + + <AF-TH-install-dir>/playbooks/onboardVNFImage.yml + + <AF-TH-install-dir>/automation_framework/vnf/onboardVNFRaw.py + + Preconditions: + + + + Add the VNF Image in the vnf_image folder + in QCOW2 format: <AF-TH-install-dir>/vnf_image/<VNF-Image-name>.qcow2 + + + + A VNF Image JSON configuration file is created: + <AF-TH-install-dir>/vnf_config/<VNF-Descriptor-name>/<VNF-Descriptor-name>.json. + + Example:<AF-TH-install-dir>/vnf_config/fortigateImage/fortigateImage.json + + + + Action: Run the + onboardVNFImage.yml Ansible Playbook with the + <VNF-Image-name> and the + <VNF-Descriptor-name> as extra-vars: + ansible-playbook playbooks/onboardVNFImage.yml -e "vnfb=<VNF-Image-name> \ +vnfd=<VNF-Descriptor-name>" + + Result: Output of the test case + run using the Test Harness: # Onboard VNF Image task result +<VNF-Descriptor-name> successfully onboarded!Note: The test will not fail if the VNF Image is + already onboarded. The output will instead contain: # debug <VNF-Descriptor-name> already onboarded! +
+ +
+ VNF - Onboard_VNF_Bundle<remark>since we're removing mention of + bundles is this section still relevant?</remark> + + Description: Onboarding a VNF + Bundle into the uCPE Manager. For details please refer to: + + <AF-TH-install-dir>/playbooks/onboardVNFBundle.yml + + <AF-TH-install-dir>/automation_framework/vnf/onboardVNF.py + + Precondition: Add the VNF Bundle + in the vnf_image folder in the zip format: + <AF-TH-install-dir>/vnf_image/<VNF-Bundle-name>.zip. + + Action: Run the + onboardVNFBundle.yml Ansible Playbook with the + <VNF-Bundle-name> as extra-vars: + ansible-playbook playbooks/onboardVNFBundle.yml -e "vnfb=<VNF-Bundle-name>" + + Result: Output of the test case + run using the Test Harness: # Onboard VNF Bundle task result +<VNF-Bundle-name> successfully onboarded!Note: The test will not fail if the VNF Bundle is + already onboarded. The output will instead contain: # debug <VNF-Bundle-name> already onboarded! +
+ +
+ VNF - Offboard_VNF + + Description: Removing a VNF + Descriptor from the uCPE Manager. For details please refer to: + + <AF-TH-install-dir>/playbooks/offboardVNF.yml + + <AF-TH-install-dir>/automation_framework/vnf/offboardVNF.py. + + Precondition: The VNF has been + previously onboarded in the uCPE Manager instance. + + Action: Run the + offboardVNF.yml Ansible Playbook with the + <VNF-Descriptor-name> as extra-vars: + ansible-playbook playbooks/offboardVNF.yml -e "vnfd=<VNF-Descriptor-name>" + + Result: Output of the test case + run using the Test Harness: # Remove Descriptor task result +<VNF-Descriptor-name> was removed!Note: The test will not fail if the VNF + Descriptor does not exist. The output will instead contain: + # debug No Descriptor with name <VNF-Descriptor-name>! +
+ +
+ Device - Add_Device + + Description: Adding a uCPE device + to the uCPE Manager. For details please refer to: + + <AF-TH-install-dir>/playbooks/addDevice.yml + + <AF-TH-install-dir>/automation_framework/device/addDevice.py. + + Precondition: A device JSON + configuration file must be created: + <AF-TH-install-dir>/lab_config/<Device-name>/<Device-name>.json. + + Example: <AF-TH-install-dir>/lab_config/intelc3850-2/intelc3850-2.json + + Action: Run the + addDevice.yml Ansible playbook with the + <Device-name> as extra-vars: ansible-playbook playbooks/addDevice.yml -e "device=<Device-name>" + + Result: Output of the test case + run using the Test Harness: # Add Device task result +<Device-name> device was added!Note: The test will not fail if the device + already exists. The output will instead contain: # debug +<Device-name> device already exists! +
+ +
+ Device - Remove_Device + + Description: Removing a uCPE + device from the uCPE Manager. For details please refer to: + + <AF-TH-install-dir>/playbooks/removeDevice.yml + + <AF-TH-install-dir>/automation_framework/device/removeDevice.py. + + Preconditions: + + + + The device has to be previously added to the uCPE Manager + instance. + + + + The device JSON configuration file must exist: + <AF-TH-install-dir>/lab_config/<Device-name>/<Device-name>.json + + + + Action: Run the + removeDevice.yml Ansible Playbook with the + <Device-name> as extra-vars: ansible-playbook playbooks/removeDevice.yml -e "device=<Device-name>" + + Result: Output of the test case + run using the Test Harness:# Remove Device task result +<Device-name> device was removed! Note: The test will not fail if the device does + not exist. The output will contain: # debug +<Device-name> device was not found! +
+ +
+ Network - Bind_NIC + + Description: Binding a physical + network interface (NIC) to a device. For details please refer to: + + <AF-TH-install-dir>/playbooks/bindNIC.yml + + <AF-TH-install-dir>/automation_framework/network/bindNetworkInterface.py. + + Preconditions: + + + + A device must have been previously added to the uCPE Manager + instance. + + + + A NIC JSON configuration file must exist: + <AF-TH-install-dir>/lab_config/<Device-name>/<NIC>.json. + + Example: <AF-TH-install-dir>/lab_config/intelc3850-2/wan_nic.json +<AF-TH-install-dir>/lab_config/intelc3850-2/lan_nic.json + + + + Action: Run the + bindNIC.yml Ansible Playbook with the + <Device-name> and + <NIC> as extra-vars: ansible-playbook playbooks/bindNIC.yml -e "device=<Device-name> nic=<NIC>" + + Result: Output of the test case + run using the Test Harness: # Bind NIC task result +<NIC> binded successfully! Note: The test will not fail if the NIC is + already bound, it will be unbound and bound again with the provided + configuration. +
+ +
+ Network - Unbind_NIC + + Description: Unbinding a physical + network interface (NIC) from a device. For details please refer + to: + + <AF-TH-install-dir>/playbooks/unbindNIC.yml + + <AF-TH-install-dir>/automation_framework/network/unbindNetworkInterface.py. + + Preconditions: + + + + A NIC is bound to a device in a uCPE Manager instance. + + + + A NIC JSON configuration file exists: + <AF-TH-install-dir>/lab_config/<Device-name>/<NIC>.json + + + + Action: Run the + unbindNIC.yml Ansible Playbook with the + <Device-name> and + <NIC> as extra-vars: ansible-playbook playbooks/unbindNIC.yml -e "device=<Device-name> nic=<NIC>" + + Result: Output of the test case + run using the Test Harness: # Unbind NIC task result +<NIC> unbinded! Note: + The test will not fail if the NIC is not bound. The output will instead + contain:# debug +<NIC> is not binded! +
+ +
+ Network - Create_Bridge + + Description: Creating an OVS + network bridge on a uCPE device. For details please refer to: + + <AF-TH-install-dir>/playbooks/addBridge.yml + + <AF-TH-install-dir>/automation_framework/network/newNetworkBridge.py. + + Precondition: + + A NIC is bound to a device in a uCPE Manager + instance. + + + + A Bridge JSON configuration file is created: + <AF-TH-install-dir>/lab_config/<Device-name>/<Bridge-name>.json + + Example:<AF-TH-install-dir>/lab_config/intelc3850-2/wan_br.json +<AF-TH-install-dir>/lab_config/intelc3850-2/lan_br.json + + + + Action: Run the + addBridge.yml Ansible Playbook with the + <Device-name> and the + <Bridge-name> as extra-vars: ansible-playbook playbooks/addBridge.yml -e "device=<Device-name> bridge=<Bridge-name>" + + Result: Output of the test case + run using the Test Harness: # Add Bridge task result +<Bridge-name> network bridge was added!Note: The test will not fail if there already + exists a bridge with the same name, it will be deleted and the bridge + will be created again with the provided configuration. +
+ +
+ Network - Remove_Bridge + + Description: Removing an OVS + network bridge from a uCPE device. For details please refer to: + + <AF-TH-install-dir>/playbooks/deleteBridge.yml + + <AF-TH-install-dir>/automation_framework/network/delNetworkBridge.py. + + Preconditions: + + A Bridge is created in a uCPE Manager instance. + + + + A Bridge JSON configuration file exists: + <AF-TH-install-dir>/lab_config/<Device-name>/<Bridge-name>.json. + + Action: Run the + deleteBridge.yml Ansible Playbook with the + <Device-name> and the + <Bridge-name> as extra-vars: ansible-playbook playbooks/deleteBridge.yml -e "device=<Device-name> \ +bridge=<Bridge-name>" + + Result: Output of the test case + run using the Test Harness: # Delete Bridge task result +<Bridge-name> network bridge was deleted!Note: The test will not fail if the bridge does + not exist: # debug +<Bridge-name> bridge not found! +
+
+ +
+ VNF Deployment and Lifecycle + + The following details the automated suite that handles the testing + of the instantiation, lifecycle and destruction of a VNF for the Enea NFV + Access Solution. + +
+ Instantiate_VNFI + + Description: Creating a VNF + instance on a uCPE device. For details please refer to: + + <AF-TH-install-dir>/playbooks/instantiateVNFI.yml + + <AF-TH-install-dir>/automation_framework/vnf/instantiateVNFI.py. + + Preconditions: + + A VNF Image is onboarded and a device is added to the uCPE + Manager. Depending on the VNF, other steps may be required. + + + + A VNFI JSON configuration file is created: + <AF-TH-install-dir>/vnf_config/<VNF-Descriptor-name>/<VNFI-name>.json + + Example: <AF-TH-install-dir>/vnf_config/fortigateImage/fortigateFWInstance.json + + + + Action: Run the + instantiateVNFI.yml Ansible Playbook with the + <Device-name>, + <VNF-Descriptor-name> and the + <VNFI-name> as extra-vars: ansible-playbook playbooks/instantiateVNFI.yml -e "device=<Device-name> \ +vnfd=<VNF-Descriptor-name> vnfi=<VNFI-name>" + + Result: Output of the test case + run using the Test Harness: # Instantiate VNF task result +<VNFI-name> was instantiated!Note: The test will not fail when the VNF + instance already exists. The output will contain: # debug +<VNFI-name> already exists! +
+ +
+ Control_VNFI + + Description: Changing the status + of a VNF instance (Pause, Resume, Stop, Start). For details please refer + to: + + <AF-TH-install-dir>/playbooks/controlVNFI.yml + + <AF-TH-install-dir>/automation_framework/vnf/controlVNFI.py. + + Precondition: A VNF is + instantiated on a uCPE device. + + Action: Run the + controlVNFI.yml Ansible Playbook with the + <Device-name>, + <VNFI-name> and the + <Command> as extra-vars: ansible-playbook playbooks/controlVNFI.yml -e "device=<Device-name> \ +vnfi=<VNFI-name> status=<Command>"Where Command = + { pause | resume | stop | start } + + Result: Output of the test case + run using the Test Harness: # Change VNFI Status task result +<VNFI-name> status was set to <Command>Note: The test will not fail if the VNF instance + does not exist or when the specified command is not valid. Depending on + the case, the output will contain: # debug +<VNFI-name> was not found!# debug +Invalid VNF Instance control command specified - <Command> +
+ +
+ Destroy_VNFI + + Description: Destroying a VNF + instance from a uCPE device. For details please refer to: + + <AF-TH-install-dir>/playbooks/destroyVNFI.yml + + <AF-TH-install-dir>/automation_framework/vnf/destroyVNFI.py. + + Precondition: A VNF is + instantiated on a uCPE device. + + Action: Run the + destroyVNFI.yml Ansible Playbook with the + <Device-name> and the + <VNFI-name> as extra-vars: ansible-playbook playbooks/destroyVNFI.yml -e "device=<Device-name> vnfi=<VNFI-name>"Result: Output of the test case run using the + Test Harness:# Destroy VNFI task result +<VNFI-name> was destroyed!Note: The test will not fail when the VNF + instance does not exist. The output will contain: # debug +<VNFI-name> was not found! +
+
+ +
+ Service Creation and Lifecycle + + This test suite contains more complex test cases designed to verify + service creation and service lifecycle management. These test cases also + serve as examples of how different services can be deployed using the + Automation Framework (AF) and the Test Harness (TH). + +
+ Fortigate_VNF_as_a_Firewall + + This test case was implemented in 2 different ways to exemplify + both methods supported by the AF and TH to deploy such services. + + Prerequisites needed in order to deploy the FortiGate VNF as a + Firewall: + + + + Onboard the FortiGate VNF Image. + + + + Add a device. + + + + Bind 2 physical interfaces, wan_nic (this + physical interface has to be connected to Lab Network) and + lan_nic. + + + + Create 2 bridges, wan_br (using + wan_nic interface) and lan_br + (using lan_nic interface). + + + + Instantiate the FortiGate VNF using the basic Firewall + configuration and the FortiGate License. + + + + For more information please refer to "FortiGate VNF as a Firewall" + chapter from the "Enea NFV Access Example Use-cases" manual. + The license and configuration files for the FortiGate VNF are + not included in the TH and should be obtained from the user's Enea + Portal account. + + +
+ FortigateFWInstance Test + + Description: Instantiate the + FortiGate VNF as a Firewall and test it using isolated network + namespace. + + This example was implemented with the "Test Harness" method, + based on Ansible Playbooks. For details please refer to: + + + + <AF-TH-install-dir>/playbooks/fortigateFWService/instantiateFortigateFW.yml + + + + <AF-TH-install-dir>/playbooks/fortigateFWService/testFortigateFWInstance.yml + + + + <AF-TH-install-dir>/playbooks/fortigateFWService/cleanupTestFortigateFWInstance.yml + + + + <AF-TH-install-dir>/playbooks/fortigateFWService/cleanupFortigateFWInstance.yml + + + + Preconditions: + + + + Add the Fortigate VNF Image + (fortios.qcow2) to the + vnf_image folder. + + + + Device JSON configuration file is created: + <AF-TH-install-dir>/lab_config/<Device-name>/<Device-name>.json. + + + + Add device settings in the hosts Ansible + inventory file under [fortigateFW] and remove + the intelc3850-2 example. + + Example: intelc3850-2 ansible_host=172.24.12.114 ansible_port=22 \ +ansible_user=root ansible_pass=root + + + + NIC JSON configuration files are created: + + <AF-TH-install-dir>/lab_config/<Device-name>/wan_nic.json + + <AF-TH-install-dir>/lab_config/<Device-name>/lan_nic.json + + + + Bridge JSON configuration files are created: + + <AF-TH-install-dir>/lab_config/<Device-name>/wan_br.json + + <AF-TH-install-dir>/lab_config/<Device-name>/lan_br.json + + + + Download the FortiGate VNF Firewall basic configuration from + the Enea Portal, copy it into the + <AF-TH-install-dir>/vnf_config/fortigateImage + directory and rename it to + fortigateFW.conf. + + + + Retrieve the FortiGate VNF license from Fortinet or the Enea + Portal, copy it into the + <AF-TH-install-dir>/vnf_config/fortigateImage + directory and rename it to + fortigateLicense.lic. + + Please refer to "FortiGate VNF as a Firewall" chapter from + the Enea NFV Access Example Use-cases manual. + + + + Action: Run the instantiateFortigateFW.yml Ansible Playbook + with the <Device-name> as + extra-vars:ansible-playbook playbooks/fortigateFWService/instantiateFortigateFW.yml \ +-e "device=<Device-name>" + + Result: Output of the test case + run using the Test Harness: # Test FortigateFWInstance task result +FortigateFWInstance tested successfully! + + Cleanup: Run the + cleanupFortigateFWInstance.yml Ansible Playbook + with the <Device-name> as extra-vars: + ansible-playbook playbooks/fortigateFWService/cleanupFortigateFWInstance.yml \ +-e "device=<Device-name>" +
+ +
+ DeployFortigateFW Scenario + + Description: Deploy the + Fortigate VNF as a Firewall. This example was implemented with the + "Automation Framework" method, based on the + unittestSuite.py Python module. + + For details please refer to: + + + + <AF-TH-install-dir>/playbooks/unittestSuiteTest/deployFortigateFWScenario.yml + + + + <AF-TH-install-dir>/playbooks/unittestSuiteTest/cleanupFortigateFWScenario.yml + + + + <AF-TH-install-dir>/automation_framework/unittestSuite + directory. + + + + Preconditions: + + + + Add the FortiGate VNF Image + (fortios.qcow2) to the + vnf_image folder. + + + + Device JSON configuration file is created: + + + <AF-TH-install-dir>/lab_config/<Device-name>/<Device-name>.json. + + + + NIC JSON configuration files are created: + + <AF-TH-install-dir>/lab_config/<Device-name>/wan_nic.json + + <AF-TH-install-dir>/lab_config/<Device-name>/lan_nic.json + + + + Bridge JSON configuration files are created: + + <AF-TH-install-dir>/lab_config/<Device-name>/wan_br.json + + <AF-TH-install-dir>/lab_config/<Device-name>/lan_br.json + + + + Download the FortiGate VNF Firewall basic configuration from + the Enea Portal, copy it into the + <AF-TH-install-dir>/vnf_config/fortigateImage + directory and rename it to + fortigateFW.conf. + + + + Retrieve the FortiGate VNF license file from Fortinet or the + Enea Portal, copy it into the + <AF-TH-install-dir>/vnf_config/fortigateImage + directory and rename it to + fortigateLicense.lic. + + For more details, please refer to: + + + + The "FortiGate VNF as a Firewall" chapter from the Enea + NFV Access Example Use-cases manual. + + + + The "Python Unit-Test Suite" chapter from the Enea NFV + Access Automation Framework and Test Harness User + Guide. + + + + + + Action: Run the + deployFortigateFWScenario.yml Ansible Playbook + with the <Device-name> as extra-vars: + ansible-playbook playbooks/unittestSuiteTest/deployFortigateFWScenario.yml \ +-e "device=<Device-name>" + + Result: Output of the test case + run using the Test Harness: # unittestSuite Deploy Test task result +FortigateFW Scenario deployed successfully! + + Cleanup: Run the + cleanupFortigateFWScenario.yml Ansible Playbook + with the <Device-name> as extra-vars: + ansible-playbook playbooks/unittestSuiteTest/cleanupFortigateFWScenario.yml \ +-e "device=<Device-name>" +
+
+ +
+ chainedVNFsService + + Description: This sample test + case corresponds to the "VNF Chaining Example Use-case" from the Enea + NFV Access Example Use-cases manual. + + For details please refer to: + + + + <AF-TH-install-dir>/playbooks/chainedVNFsService/chainedVNFsService.yml + + + + <AF-TH-install-dir>/playbooks/chainedVNFsService/testChainedVNFsService.yml + + + + <AF-TH-install-dir>/playbooks/chainedVNFsService/cleanupChainedVNFsService.yml + + + + Preconditions: + + + + Add the Fortigate VNF Image + (fortios.qcow2) to the + vnf_image folder. + + + + Add the Juniper vSRX VNF Image + (juniper.qcow2) to the + vnf_image folder. + + + + Devices JSON configuration files are created, e.g.: + + <AF-TH-install-dir>/lab_config/<Device-name>/<Device-name>.json. + + + + Add device settings in the hosts Ansible + inventory file under [chainedVNFs], keeping both + devices, the "site1" and "site2" entries, and updating the values + for ansible_host, + ansible_port, ansible_user and + ansible_pass, as applicable. + + Example: + + site1 ansible_host=172.24.14.157 ansible_port=22 ansible_user=root \ +ansible_pass=root + + site2 ansible_host=172.24.14.50 ansible_port=22 ansible_user=root \ +ansible_pass=root + + + + NIC JSON configuration files are created for each of the + devices, where mgmt_nic is connected to the DHCP + from the Lab Network and wan_nic is connected + back to back to the other device: + + + + <AF-TH-install-dir>/lab_config/<Device-name>/mgmt_nic.json + + + + <AF-TH-install-dir>/lab_config/<Device-name>/wan_nic.json + + + + <AF-TH-install-dir>/lab_config/<Device-name>/lan_nic.json + + + + + + Bridge JSON configuration files are created for each of the + devices: + + + + <AF-TH-install-dir>/lab_config/<Device-name>/vnf_mgmt_br.json + + + + <AF-TH-install-dir>/lab_config/<Device-name>/sfc_br.json + + + + <AF-TH-install-dir>/lab_config/<Device-name>/wan_br.json + + + + <AF-TH-install-dir>/lab_config/<Device-name>/lan_br.json + + + + Note that sample configuration files needed for devices' NICs + and bridges can be found in: + <AF-TH-install-dir>/lab_config/inteld1521-1 + and + <AF-TH-install-dir>/lab_config/inteld1521-2. + + + + Download the FortiGate VNF Firewall basic configuration files + from the Enea Portal (FortiFW-Site1.conf and + FortiFW-Site2.conf), and copy them into the + <AF-TH-install-dir>/vnf_config/fortigateFWImage + directory. + + + + Retrieve the FortiGate VNF license from Fortinet or the Enea + Portal, copy it into the + <AF-TH-install-dir>/vnf_config/fortigateFWImage + directory and rename it to + fortigateLicense.lic. + + + + Download the Juniper vSRX basic configuration files from the + Enea Portal (vSRX-Site1.iso and + vSRX-Site2.iso), and copy them into the + <AF-TH-install-dir>/vnf_config/junipervSRXImage + directory. + + + + Download vSRX-domain-update-script from + the Enea Portal and copy it into the + junipervSRXImage directory. + + Please refer to the "VNF Chaining Example Use-case" chapter + from the Enea NFV Access Example Use-cases manual for additional + information about the preconditions. + + + + Action: Run the + chainedVNFsService.yml Ansible Playbook as follows: + ansible-playbook playbooks/chainedVNFsService/chainedVNFsService.yml \ +-e "site1=inteld1521-1 site2=inteld1521-2 arch=XeonD" + + Note that "arch" may either be { XeonD | AtomC } depending on the + target set chosen. + + Result: Output of the test case + run using the Test Harness: # testChainedVNFsService task result +****************************************************************************** + * site1 - changed=False ---------------------------------------------- +---- +<site1_lan-ip> ---> <site2_lan-ip> +LAN-to-LAN connectivity (through VPN tunnel)tested successfully! + + Cleanup: Run the + cleanupChainedVNFsService.yml Ansible Playbook as + follows: ansible-playbook playbooks/chainedVNFsService/cleanupChainedVNFsService.yml \ +-e "site1=inteld1521-1 site2=inteld1521-2 arch=XeonD" +
+
+
\ No newline at end of file diff --git a/doc/book-enea-nfv-access-system-test-specification/swcomp.mk b/doc/book-enea-nfv-access-system-test-specification/swcomp.mk new file mode 100755 index 0000000..aea86ca --- /dev/null +++ b/doc/book-enea-nfv-access-system-test-specification/swcomp.mk @@ -0,0 +1,10 @@ +# Component build specification + +# Version of THIS book +BOOK_VER ?= $(REL_VER)-dev + +DOCBOOK_SRC := $(COMP)/swcomp.mk $(COMP)/doc/book.xml $(shell find $(COMP)/doc -type f \( -name "*.xml" -o -name "*.svg" -o -name "*.png" \) ! -name "book.xml" -print) + +BOOKPACKAGES := book-enea-nfv-access-system-test-specification +BOOKDESC_$(BOOKPACKAGES) := "Enea NFV Access $(PROD_VER) System Test Specification" +BOOKDEFAULTCONDITION := $(DEFAULTCONDITIONS) -- cgit v1.2.3-54-g00ecf