diff options
3 files changed, 128 insertions, 50 deletions
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 index 1be36cb..98ac9ff 100644 --- a/doc/book-enea-nfv-access-system-test-specification/doc/configuration.xml +++ b/doc/book-enea-nfv-access-system-test-specification/doc/configuration.xml | |||
| @@ -6,28 +6,43 @@ | |||
| 6 | <title>Test Objects</title> | 6 | <title>Test Objects</title> |
| 7 | 7 | ||
| 8 | <para>The test objects for the Test Harness are the Enea NFV Access and | 8 | <para>The test objects for the Test Harness are the Enea NFV Access and |
| 9 | Enea uCPE Manager installations performed as indicated in chapter 3 of the | 9 | Enea uCPE Manager installations performed as indicated in the <olink |
| 10 | Enea NFV Access Automation Framework and Test Harness User | 10 | targetdoc="book_enea_nfv_access_auto_fw_th_user_guide" |
| 11 | Guide.<remark>olink needed.</remark></para> | 11 | targetptr="components">Components chapter of <xi:include |
| 12 | href="../../s_docbuild/olinkdb/pardoc-names.xml" | ||
| 13 | xmlns:xi="http://www.w3.org/2001/XInclude" | ||
| 14 | xpointer="element(book_enea_nfv_access_auto_fw_th_user_guide/1)" /></olink>.</para> | ||
| 12 | </section> | 15 | </section> |
| 13 | 16 | ||
| 14 | <section id="test_env"> | 17 | <section id="test_env"> |
| 15 | <title>Test Environment</title> | 18 | <title>Test Environment</title> |
| 16 | 19 | ||
| 17 | <para>To set up the required Test Harness environment please refer to the | 20 | <para>To set up the required Test Harness environment please refer to |
| 18 | "Environment" chapter from the Enea NFV Access Automation Framework and | 21 | section <olink targetdoc="book_enea_nfv_access_auto_fw_th_user_guide" |
| 19 | Test Harness User Guide.<remark>olink needed.</remark></para> | 22 | targetptr="envrion">Envrionment in the <xi:include |
| 23 | href="../../s_docbuild/olinkdb/pardoc-names.xml" | ||
| 24 | xmlns:xi="http://www.w3.org/2001/XInclude" | ||
| 25 | xpointer="element(book_enea_nfv_access_auto_fw_th_user_guide/1)" /></olink> | ||
| 26 | .</para> | ||
| 20 | </section> | 27 | </section> |
| 21 | 28 | ||
| 22 | <section id="precon_exe_steps"> | 29 | <section id="precon_exe_steps"> |
| 23 | <title>Preconditions and Execution</title> | 30 | <title>Preconditions and Execution</title> |
| 24 | 31 | ||
| 25 | <para>Please refer to the "Prerequisites" and "Installation and Initial | 32 | <para>Please refer to section <olink |
| 26 | Setup" chapters from Enea NFV Access Automation Framework and Test Harness | 33 | targetdoc="book_enea_nfv_access_auto_fw_th_user_guide" |
| 27 | User Guide <remark>olinks needed.</remark> for more details.</para> | 34 | targetptr="prerequisites">Prerequisites in the <xi:include |
| 35 | href="../../s_docbuild/olinkdb/pardoc-names.xml" | ||
| 36 | xmlns:xi="http://www.w3.org/2001/XInclude" | ||
| 37 | xpointer="element(book_enea_nfv_access_auto_fw_th_user_guide/1)" /></olink> | ||
| 38 | and section <olink targetdoc="book_enea_nfv_access_auto_fw_th_user_guide" | ||
| 39 | targetptr="initial_setup">Installation and Initial Setup in the<xi:include | ||
| 40 | href="../../s_docbuild/olinkdb/pardoc-names.xml" | ||
| 41 | xmlns:xi="http://www.w3.org/2001/XInclude" | ||
| 42 | xpointer="element(book_enea_nfv_access_auto_fw_th_user_guide/1)" /></olink> | ||
| 43 | for more details.</para> | ||
| 28 | 44 | ||
| 29 | <para>For detailed execution steps of the sample test cases included with | 45 | <para>For detailed execution steps of the sample test cases included with |
| 30 | the Test Harness please see chapter 3 in this document. <remark>xref to | 46 | the Test Harness please see the following chapter.</para> |
| 31 | the next chapter needed.</remark></para> | ||
| 32 | </section> | 47 | </section> |
| 33 | </chapter> \ No newline at end of file | 48 | </chapter> \ No newline at end of file |
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 index d23a073..7afbfb6 100644 --- a/doc/book-enea-nfv-access-system-test-specification/doc/overview.xml +++ b/doc/book-enea-nfv-access-system-test-specification/doc/overview.xml | |||
| @@ -13,7 +13,7 @@ | |||
| 13 | <title>Definitions</title> | 13 | <title>Definitions</title> |
| 14 | 14 | ||
| 15 | <tgroup cols="2"> | 15 | <tgroup cols="2"> |
| 16 | <colspec align="center" /> | 16 | <colspec align="left" /> |
| 17 | 17 | ||
| 18 | <thead> | 18 | <thead> |
| 19 | <row> | 19 | <row> |
| @@ -38,7 +38,7 @@ | |||
| 38 | <title>Acronyms</title> | 38 | <title>Acronyms</title> |
| 39 | 39 | ||
| 40 | <tgroup cols="2"> | 40 | <tgroup cols="2"> |
| 41 | <colspec align="center" /> | 41 | <colspec align="left" /> |
| 42 | 42 | ||
| 43 | <thead> | 43 | <thead> |
| 44 | <row> | 44 | <row> |
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 index fb8ff8d..95d45ce 100644 --- 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 | |||
| @@ -13,9 +13,7 @@ | |||
| 13 | TH.</para> | 13 | TH.</para> |
| 14 | 14 | ||
| 15 | <section id="onb_vnf_image"> | 15 | <section id="onb_vnf_image"> |
| 16 | <title>VNF - Onboard a VNF Image<remark>all titles are formated with | 16 | <title>VNF - Onboard a VNF Image</title> |
| 17 | underscores can this be changed or should it be left as | ||
| 18 | is?</remark></title> | ||
| 19 | 17 | ||
| 20 | <para><emphasis role="bold">Description: </emphasis>Onboarding a VNF | 18 | <para><emphasis role="bold">Description: </emphasis>Onboarding a VNF |
| 21 | Image into the uCPE Manager. For details please refer to:</para> | 19 | Image into the uCPE Manager. For details please refer to:</para> |
| @@ -127,8 +125,8 @@ vnfd=<VNF-Descriptor-name>"</programlisting></para> | |||
| 127 | <section id="device_upload_image"> | 125 | <section id="device_upload_image"> |
| 128 | <title>Device - Upload a NFV Access image</title> | 126 | <title>Device - Upload a NFV Access image</title> |
| 129 | 127 | ||
| 130 | <para><emphasis role="bold">Description:</emphasis> Upload a NFV Access image | 128 | <para><emphasis role="bold">Description:</emphasis> Upload a NFV Access |
| 131 | file onto the uCPE Manager. For details please refer to:</para> | 129 | image file onto the uCPE Manager. For details please refer to:</para> |
| 132 | 130 | ||
| 133 | <itemizedlist> | 131 | <itemizedlist> |
| 134 | <listitem> | 132 | <listitem> |
| @@ -174,7 +172,8 @@ A file with the same name is already uploaded.</programlisting></para> | |||
| 174 | <title>Device - Delete Upgraded File</title> | 172 | <title>Device - Delete Upgraded File</title> |
| 175 | 173 | ||
| 176 | <para><emphasis role="bold">Description:</emphasis> Deleting an uploaded | 174 | <para><emphasis role="bold">Description:</emphasis> Deleting an uploaded |
| 177 | NFV Access image file from the uCPE Manager. For details please refer to:</para> | 175 | NFV Access image file from the uCPE Manager. For details please refer |
| 176 | to:</para> | ||
| 178 | 177 | ||
| 179 | <itemizedlist> | 178 | <itemizedlist> |
| 180 | <listitem> | 179 | <listitem> |
| @@ -243,8 +242,8 @@ localhost : ok=1 changed=1 unreachable=0 failed=0</pro | |||
| 243 | <title>Device - Install and Activate a NFV Access image</title> | 242 | <title>Device - Install and Activate a NFV Access image</title> |
| 244 | 243 | ||
| 245 | <para><emphasis role="bold">Description:</emphasis> Installing and | 244 | <para><emphasis role="bold">Description:</emphasis> Installing and |
| 246 | Activating a NFV Access image on a uCPE device from the uCPE Manager. For | 245 | Activating a NFV Access image on a uCPE device from the uCPE Manager. |
| 247 | details please refer to:</para> | 246 | For details please refer to:</para> |
| 248 | 247 | ||
| 249 | <itemizedlist> | 248 | <itemizedlist> |
| 250 | <listitem> | 249 | <listitem> |
| @@ -296,12 +295,12 @@ Duplicate entry - Release already installed</programlisting></para> | |||
| 296 | </section> | 295 | </section> |
| 297 | 296 | ||
| 298 | <section id="dev_upload_inst_activ"> | 297 | <section id="dev_upload_inst_activ"> |
| 299 | <title>Device - Upload, Install and Activate a NFV Access image on a uCPE | 298 | <title>Device - Upload, Install and Activate a NFV Access image on a |
| 300 | device</title> | 299 | uCPE device</title> |
| 301 | 300 | ||
| 302 | <para><emphasis role="bold">Description:</emphasis> Upload, install and | 301 | <para><emphasis role="bold">Description:</emphasis> Upload, install and |
| 303 | activate a NFV Access image on a uCPE device from the uCPE Manager. For details | 302 | activate a NFV Access image on a uCPE device from the uCPE Manager. For |
| 304 | please refer to:</para> | 303 | details please refer to:</para> |
| 305 | 304 | ||
| 306 | <itemizedlist> | 305 | <itemizedlist> |
| 307 | <listitem> | 306 | <listitem> |
| @@ -364,6 +363,48 @@ image_name="<Image-name>" -e upgrade_type="<Upgrade-type>"</programl | |||
| 364 | imported playbook fails:<programlisting>ok=0 changed=0 unreachable=0 failed=1</programlisting></para> | 363 | imported playbook fails:<programlisting>ok=0 changed=0 unreachable=0 failed=1</programlisting></para> |
| 365 | </section> | 364 | </section> |
| 366 | 365 | ||
| 366 | <section id="wait_dev"> | ||
| 367 | <title>Device - Wait a Device</title> | ||
| 368 | |||
| 369 | <para><emphasis role="bold">Description:</emphasis> Wait for a uCPE | ||
| 370 | device to connect to the uCPE Manager. For details please refer | ||
| 371 | to:</para> | ||
| 372 | |||
| 373 | <itemizedlist> | ||
| 374 | <listitem> | ||
| 375 | <para><filename><AF-TH-install-dir>/playbooks/waitDeviceUp.yml</filename></para> | ||
| 376 | </listitem> | ||
| 377 | |||
| 378 | <listitem> | ||
| 379 | <para><filename><AF-TH-install-dir>/automation_framework/device/waitDeviceUp.py</filename></para> | ||
| 380 | </listitem> | ||
| 381 | </itemizedlist> | ||
| 382 | |||
| 383 | <para><emphasis role="bold">Preconditions:</emphasis></para> | ||
| 384 | |||
| 385 | <itemizedlist> | ||
| 386 | <listitem> | ||
| 387 | <para>The device has to be previously added to the uCPE Manager | ||
| 388 | instance.</para> | ||
| 389 | </listitem> | ||
| 390 | |||
| 391 | <listitem> | ||
| 392 | <para>The device JSON configuration file must exist: | ||
| 393 | <programlisting><AF-TH-install-dir>/lab_config/<Device-name>/<Device-name>.json</programlisting></para> | ||
| 394 | </listitem> | ||
| 395 | </itemizedlist> | ||
| 396 | |||
| 397 | <para><emphasis role="bold">Action:</emphasis> Run the | ||
| 398 | <filename>waitDeviceUp.yml</filename> Ansible Playbook with the | ||
| 399 | <literal><Device-name></literal> as extra-vars: <programlisting>ansible-playbook playbooks/waitDeviceUp.yml -e "device=<Device-name>"</programlisting></para> | ||
| 400 | |||
| 401 | <para><emphasis role="bold">Result:</emphasis> Output of the test case | ||
| 402 | run using the Test Harness:<programlisting># Wait Device task result | ||
| 403 | <Device-name> device is connected!</programlisting> <emphasis | ||
| 404 | role="bold">Note:</emphasis> The test will fail if the device does not | ||
| 405 | exist or it is not connected.</para> | ||
| 406 | </section> | ||
| 407 | |||
| 367 | <section id="remv_dev"> | 408 | <section id="remv_dev"> |
| 368 | <title>Device - Remove a Device</title> | 409 | <title>Device - Remove a Device</title> |
| 369 | 410 | ||
| @@ -426,8 +467,8 @@ image_name="<Image-name>" -e upgrade_type="<Upgrade-type>"</programl | |||
| 426 | 467 | ||
| 427 | <itemizedlist> | 468 | <itemizedlist> |
| 428 | <listitem> | 469 | <listitem> |
| 429 | <para>A device must have been previously added to the uCPE Manager | 470 | <para>A device must have been previously added and connected to the |
| 430 | instance.</para> | 471 | uCPE Manager instance.</para> |
| 431 | </listitem> | 472 | </listitem> |
| 432 | 473 | ||
| 433 | <listitem> | 474 | <listitem> |
| @@ -592,8 +633,8 @@ bridge=<Bridge-name>"</programlisting></para> | |||
| 592 | 633 | ||
| 593 | <para><emphasis role="bold">Precondition: </emphasis></para> | 634 | <para><emphasis role="bold">Precondition: </emphasis></para> |
| 594 | 635 | ||
| 595 | <para>A device must have been previously added to the uCPE Manager | 636 | <para>A device must have been previously added and connected to the uCPE |
| 596 | instance.</para> | 637 | Manager instance.</para> |
| 597 | 638 | ||
| 598 | <para><emphasis role="bold">Action:</emphasis> Run the | 639 | <para><emphasis role="bold">Action:</emphasis> Run the |
| 599 | <filename>configDPDK.yml</filename> Ansible Playbook with the | 640 | <filename>configDPDK.yml</filename> Ansible Playbook with the |
| @@ -619,7 +660,7 @@ DEBUG: Set DPDK state to <enable/disable></programlisting><emphasis | |||
| 619 | Access.</para> | 660 | Access.</para> |
| 620 | 661 | ||
| 621 | <section id="inst_vnfi"> | 662 | <section id="inst_vnfi"> |
| 622 | <title>Instantiate_VNFI</title> | 663 | <title>Instantiating a VNFI</title> |
| 623 | 664 | ||
| 624 | <para><emphasis role="bold">Description:</emphasis> Creating a VNF | 665 | <para><emphasis role="bold">Description:</emphasis> Creating a VNF |
| 625 | instance on a uCPE device. For details please refer to:</para> | 666 | instance on a uCPE device. For details please refer to:</para> |
| @@ -636,8 +677,9 @@ DEBUG: Set DPDK state to <enable/disable></programlisting><emphasis | |||
| 636 | 677 | ||
| 637 | <para><emphasis role="bold">Preconditions:</emphasis> <itemizedlist> | 678 | <para><emphasis role="bold">Preconditions:</emphasis> <itemizedlist> |
| 638 | <listitem> | 679 | <listitem> |
| 639 | <para>A VNF Image is onboarded and a device is added to the uCPE | 680 | <para>A VNF Image is onboarded and a device is added and connected |
| 640 | Manager. Depending on the VNF, other steps may be required.</para> | 681 | to the uCPE Manager. Depending on the VNF, other steps may be |
| 682 | required.</para> | ||
| 641 | </listitem> | 683 | </listitem> |
| 642 | 684 | ||
| 643 | <listitem> | 685 | <listitem> |
| @@ -663,7 +705,7 @@ vnfd=<VNF-Descriptor-name> vnfi=<VNFI-name>"</programlisting></para> | |||
| 663 | </section> | 705 | </section> |
| 664 | 706 | ||
| 665 | <section id="control_vnfi"> | 707 | <section id="control_vnfi"> |
| 666 | <title>Control_VNFI</title> | 708 | <title>Controlling a VNFI</title> |
| 667 | 709 | ||
| 668 | <para><emphasis role="bold">Description:</emphasis> Changing the status | 710 | <para><emphasis role="bold">Description:</emphasis> Changing the status |
| 669 | of a VNF instance (Pause, Resume, Stop, Start). For details please refer | 711 | of a VNF instance (Pause, Resume, Stop, Start). For details please refer |
| @@ -701,7 +743,7 @@ Invalid VNF Instance control command specified - <Command></programlisting | |||
| 701 | </section> | 743 | </section> |
| 702 | 744 | ||
| 703 | <section id="destroy_vnfi"> | 745 | <section id="destroy_vnfi"> |
| 704 | <title>Destroy_VNFI</title> | 746 | <title>Destroying a VNFI</title> |
| 705 | 747 | ||
| 706 | <para><emphasis role="bold">Description:</emphasis> Destroying a VNF | 748 | <para><emphasis role="bold">Description:</emphasis> Destroying a VNF |
| 707 | instance from a uCPE device. For details please refer to:</para> | 749 | instance from a uCPE device. For details please refer to:</para> |
| @@ -722,7 +764,8 @@ Invalid VNF Instance control command specified - <Command></programlisting | |||
| 722 | <para><emphasis role="bold">Action:</emphasis> Run the | 764 | <para><emphasis role="bold">Action:</emphasis> Run the |
| 723 | <filename>destroyVNFI.yml</filename> Ansible Playbook with the | 765 | <filename>destroyVNFI.yml</filename> Ansible Playbook with the |
| 724 | <literal><Device-name></literal> and the | 766 | <literal><Device-name></literal> and the |
| 725 | <filename><VNFI-name></filename> as extra-vars: <programlisting>ansible-playbook playbooks/destroyVNFI.yml -e "device=<Device-name> vnfi=<VNFI-name>"</programlisting><emphasis | 767 | <filename><VNFI-name></filename> as extra-vars: <programlisting>ansible-playbook playbooks/destroyVNFI.yml -e "device=<Device-name> \ |
| 768 | vnfi=<VNFI-name>"</programlisting><emphasis | ||
| 726 | role="bold">Result:</emphasis> Output of the test case run using the | 769 | role="bold">Result:</emphasis> Output of the test case run using the |
| 727 | Test Harness:<programlisting># Destroy VNFI task result | 770 | Test Harness:<programlisting># Destroy VNFI task result |
| 728 | <VNFI-name> was destroyed!</programlisting><emphasis | 771 | <VNFI-name> was destroyed!</programlisting><emphasis |
| @@ -751,11 +794,16 @@ Invalid VNF Instance control command specified - <Command></programlisting | |||
| 751 | 794 | ||
| 752 | <orderedlist> | 795 | <orderedlist> |
| 753 | <listitem> | 796 | <listitem> |
| 754 | <para>Onboard the FortiGate VNF Image.</para> | 797 | <para>Add a uCPE device.</para> |
| 755 | </listitem> | 798 | </listitem> |
| 756 | 799 | ||
| 757 | <listitem> | 800 | <listitem> |
| 758 | <para>Add a uCPE device.</para> | 801 | <para>Wait for the uCPE device to be connected in the Enea uCPE |
| 802 | Manager.</para> | ||
| 803 | </listitem> | ||
| 804 | |||
| 805 | <listitem> | ||
| 806 | <para>Onboard the FortiGate VNF Image.</para> | ||
| 759 | </listitem> | 807 | </listitem> |
| 760 | 808 | ||
| 761 | <listitem> | 809 | <listitem> |
| @@ -884,9 +932,13 @@ ansible_user=root ansible_pass=root</programlisting></para> | |||
| 884 | directory and rename it to | 932 | directory and rename it to |
| 885 | <filename>fortigateLicense.lic</filename>.</para> | 933 | <filename>fortigateLicense.lic</filename>.</para> |
| 886 | 934 | ||
| 887 | <para>Please refer to the "FortiGate VNF as a Firewall" chapter | 935 | <para>For more information please refer to section <olink |
| 888 | from the Enea NFV Access Example Use-cases | 936 | targetdoc="book_enea_nfv_access_example_usecases" |
| 889 | manual.<remark>olink</remark></para> | 937 | targetptr="fortigate_firewall_uc_1">FortiGate VNF as a Firewall in |
| 938 | the <xi:include href="../../s_docbuild/olinkdb/pardoc-names.xml" | ||
| 939 | xmlns:xi="http://www.w3.org/2001/XInclude" | ||
| 940 | xpointer="element(book_enea_nfv_access_example_usecases/1)" /></olink> | ||
| 941 | Manual.</para> | ||
| 890 | </listitem> | 942 | </listitem> |
| 891 | </itemizedlist> | 943 | </itemizedlist> |
| 892 | 944 | ||
| @@ -982,15 +1034,23 @@ FortigateFWInstance tested successfully!</programlisting></para> | |||
| 982 | 1034 | ||
| 983 | <itemizedlist> | 1035 | <itemizedlist> |
| 984 | <listitem> | 1036 | <listitem> |
| 985 | <para>The "FortiGate VNF as a Firewall" chapter from the Enea | 1037 | <para>Section <olink |
| 986 | NFV Access Example Use-cases manual.<remark>olink | 1038 | targetdoc="book_enea_nfv_access_example_usecases" |
| 987 | needed</remark></para> | 1039 | targetptr="fortigate_firewall_uc_1">FortiGate VNF as a |
| 1040 | Firewall in the <xi:include | ||
| 1041 | href="../../s_docbuild/olinkdb/pardoc-names.xml" | ||
| 1042 | xmlns:xi="http://www.w3.org/2001/XInclude" | ||
| 1043 | xpointer="element(book_enea_nfv_access_example_usecases/1)" /></olink> | ||
| 1044 | Manual.</para> | ||
| 988 | </listitem> | 1045 | </listitem> |
| 989 | 1046 | ||
| 990 | <listitem> | 1047 | <listitem> |
| 991 | <para>The "Python Unit-Test Suite" chapter from the Enea NFV | 1048 | <para>Section <olink |
| 992 | Access Automation Framework and Test Harness User | 1049 | targetdoc="book_enea_nfv_access_auto_fw_th_user_guide" |
| 993 | Guide.</para> | 1050 | targetptr="python_testsuite">Python Unit-Test Suite in |
| 1051 | <xi:include href="../../s_docbuild/olinkdb/pardoc-names.xml" | ||
| 1052 | xmlns:xi="http://www.w3.org/2001/XInclude" | ||
| 1053 | xpointer="element(book_enea_nfv_access_auto_fw_th_user_guide/1)" /></olink>.</para> | ||
| 994 | </listitem> | 1054 | </listitem> |
| 995 | </itemizedlist> | 1055 | </itemizedlist> |
| 996 | </listitem> | 1056 | </listitem> |
| @@ -1154,10 +1214,13 @@ ansible_pass=root</programlisting></para> | |||
| 1154 | from Enea and copy it into the <literal>junipervSRXImage</literal> | 1214 | from Enea and copy it into the <literal>junipervSRXImage</literal> |
| 1155 | directory.</para> | 1215 | directory.</para> |
| 1156 | 1216 | ||
| 1157 | <para>Please refer to the "VNF Chaining Example Use-case" chapter | 1217 | <para>Please refer to the Chapter concerning the <olink |
| 1158 | from the Enea NFV Access Example Use-cases manual for additional | 1218 | targetdoc="book_enea_nfv_access_example_usecases" |
| 1159 | information about preconditions.<remark>olink to this | 1219 | targetptr="vnf_chaining">VNF Chaining Example Use-case in the |
| 1160 | chapter</remark></para> | 1220 | <xi:include href="../../s_docbuild/olinkdb/pardoc-names.xml" |
| 1221 | xmlns:xi="http://www.w3.org/2001/XInclude" | ||
| 1222 | xpointer="element(book_enea_nfv_access_example_usecases/1)" /></olink> | ||
| 1223 | manual for additional information about preconditions.</para> | ||
| 1161 | </listitem> | 1224 | </listitem> |
| 1162 | </itemizedlist> | 1225 | </itemizedlist> |
| 1163 | 1226 | ||
