From 32e986d0aabdd8e517b6e3bf21af9d85d0c811fd Mon Sep 17 00:00:00 2001 From: yangalicace1 <royer.yangali@etsi.org> Date: Mon, 21 Oct 2024 13:26:34 +0000 Subject: [PATCH] Deployed 2ff5ac2 to develop in public with MkDocs 1.6.1 and mike 2.1.3 --- public/develop/architecture/index.html | 2 +- .../configure_your_machine/index.html | 403 ------------ .../openstack/index.html | 494 -------------- .../oracle_virtual_box/index.html | 542 --------------- .../physical_server/index.html | 492 -------------- .../vagrant_box/index.html | 615 ------------------ .../vm_ware_fusion/index.html | 447 ------------- .../deploy_TeraFlowSDN/index.html | 536 --------------- .../install_micro_k8s/index.html | 548 ---------------- .../show_deployment_and_logs/index.html | 422 ------------ .../webUI_and_grafana_dashboards/index.html | 410 ------------ .../configure_environment/index.html | 402 ------------ .../java_quarkus/index.html | 442 ------------- .../configure_environment/python/index.html | 499 -------------- .../architecture/CAPIF Core Function.png | Bin 58316 -> 0 bytes .../architecture/CAPIF_Core_Function.png | Bin 58316 -> 0 bytes .../images/architecture/New_Architecture.png | Bin 173563 -> 0 bytes .../develop/images/architecture/msg_flow.png | Bin 69966 -> 0 bytes .../develop/images/flows/01_Login_Admin.png | Bin 28999 -> 0 bytes .../images/flows/02_Creation_of_user.png | Bin 59335 -> 0 bytes .../flows/03_Register_of_AEF_GetAuth.png | Bin 44751 -> 0 bytes .../04_AEF_API_Provider_registration.png | Bin 51100 -> 0 bytes .../develop/images/flows/05_AEF_Publish.png | Bin 43247 -> 0 bytes .../flows/06_Invoker_Register_GetAuth.png | Bin 44751 -> 0 bytes .../images/flows/07_Invoker_Onboarding.png | Bin 64059 -> 0 bytes .../images/flows/08_Invoker_Discover_AEF.png | Bin 43087 -> 0 bytes .../09_Invoker_Create_Security_Context.png | Bin 43568 -> 0 bytes .../images/flows/10_Invoker_Get_Token.png | Bin 55546 -> 0 bytes ...nvoker_Send_Request_to_AEF_Service_API.png | Bin 26214 -> 0 bytes .../Open CAPIF Logo Screen_B_W Slogan NEG.png | Bin 22786 -> 0 bytes ...CAPIF Logo Screen_Colour Slogan NEG@3x.png | Bin 93037 -> 0 bytes public/develop/images/logos/OpenCAPIF.png | Bin 24999 -> 0 bytes public/develop/images/logos/OpenCAPIF.webp | Bin 7218 -> 0 bytes .../develop/images/logos/OpenCAPIF_Small.png | Bin 3747 -> 0 bytes .../develop/images/logos/OpenCAPIF_Square.png | Bin 7831 -> 0 bytes .../images/logos/OpenCAPIF_Square.webp | Bin 3068 -> 0 bytes public/develop/search/search_index.json | 2 +- public/develop/sitemap.xml | 52 -- public/develop/sitemap.xml.gz | Bin 559 -> 382 bytes 39 files changed, 2 insertions(+), 6306 deletions(-) delete mode 100644 public/develop/deployment_guide/configure_your_machine/configure_your_machine/index.html delete mode 100644 public/develop/deployment_guide/configure_your_machine/openstack/index.html delete mode 100644 public/develop/deployment_guide/configure_your_machine/oracle_virtual_box/index.html delete mode 100644 public/develop/deployment_guide/configure_your_machine/physical_server/index.html delete mode 100644 public/develop/deployment_guide/configure_your_machine/vagrant_box/index.html delete mode 100644 public/develop/deployment_guide/configure_your_machine/vm_ware_fusion/index.html delete mode 100644 public/develop/deployment_guide/deploy_TeraFlowSDN/deploy_TeraFlowSDN/index.html delete mode 100644 public/develop/deployment_guide/install_micro_k8s/install_micro_k8s/index.html delete mode 100644 public/develop/deployment_guide/show_deployment_and_logs/show_deployment_and_logs/index.html delete mode 100644 public/develop/deployment_guide/webUI_and_grafana_dashboards/webUI_and_grafana_dashboards/index.html delete mode 100644 public/develop/development_guide/configure_environment/configure_environment/index.html delete mode 100644 public/develop/development_guide/configure_environment/java_quarkus/index.html delete mode 100644 public/develop/development_guide/configure_environment/python/index.html delete mode 100644 public/develop/images/architecture/CAPIF Core Function.png delete mode 100644 public/develop/images/architecture/CAPIF_Core_Function.png delete mode 100644 public/develop/images/architecture/New_Architecture.png delete mode 100644 public/develop/images/architecture/msg_flow.png delete mode 100644 public/develop/images/flows/01_Login_Admin.png delete mode 100644 public/develop/images/flows/02_Creation_of_user.png delete mode 100644 public/develop/images/flows/03_Register_of_AEF_GetAuth.png delete mode 100644 public/develop/images/flows/04_AEF_API_Provider_registration.png delete mode 100644 public/develop/images/flows/05_AEF_Publish.png delete mode 100644 public/develop/images/flows/06_Invoker_Register_GetAuth.png delete mode 100644 public/develop/images/flows/07_Invoker_Onboarding.png delete mode 100644 public/develop/images/flows/08_Invoker_Discover_AEF.png delete mode 100644 public/develop/images/flows/09_Invoker_Create_Security_Context.png delete mode 100644 public/develop/images/flows/10_Invoker_Get_Token.png delete mode 100644 public/develop/images/flows/11_Invoker_Send_Request_to_AEF_Service_API.png delete mode 100644 public/develop/images/logos/Open CAPIF Logo Screen_B_W Slogan NEG.png delete mode 100644 public/develop/images/logos/Open CAPIF Logo Screen_Colour Slogan NEG@3x.png delete mode 100644 public/develop/images/logos/OpenCAPIF.png delete mode 100644 public/develop/images/logos/OpenCAPIF.webp delete mode 100644 public/develop/images/logos/OpenCAPIF_Small.png delete mode 100644 public/develop/images/logos/OpenCAPIF_Square.png delete mode 100644 public/develop/images/logos/OpenCAPIF_Square.webp diff --git a/public/develop/architecture/index.html b/public/develop/architecture/index.html index 61f4e7f..3a22561 100644 --- a/public/develop/architecture/index.html +++ b/public/develop/architecture/index.html @@ -282,7 +282,7 @@ <p><img src="../images/logos/TeraFlowSDN_tr.png" alt="drawing" width="200"/></p> <h1 id="architecture"><strong>Architecture</strong></h1> <p>The CAPIF architecture has three main components, Register Service, Vault and CCF, which are represented in the following image:</p> -<p><img alt="New Architecture" src="../images/architecture/New_Architecture.png" /></p> +<p><img alt="New Architecture" src="./images/architecture/New_Architecture.png" /></p> <p>Each component is separated into different namespaces and all communications between them use Rest APIs.</p> <p>Apart from the communication between components, there are 2 other entities that can use them:</p> <ul> diff --git a/public/develop/deployment_guide/configure_your_machine/configure_your_machine/index.html b/public/develop/deployment_guide/configure_your_machine/configure_your_machine/index.html deleted file mode 100644 index 903ae6c..0000000 --- a/public/develop/deployment_guide/configure_your_machine/configure_your_machine/index.html +++ /dev/null @@ -1,403 +0,0 @@ - -<!doctype html> -<html lang="en" class="no-js"> - <head> - - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - - <meta name="description" content="ETSI SDG TFS Documentation page"> - - - <meta name="author" content="TeraflowSDN by ETSI"> - - - <link rel="canonical" href="https://tfs.etsi.org/develop/deployment_guide/configure_your_machine/configure_your_machine/"> - - - - - <link rel="icon" href="../../../images/favicon.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42"> - - - - <title>Configure your machine - ETSI SDG TFS Documentation</title> - - - - <link rel="stylesheet" href="../../../assets/stylesheets/main.0253249f.min.css"> - - - <link rel="stylesheet" href="../../../assets/stylesheets/palette.06af60db.min.css"> - - - - - - - - - - - - - <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> - <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> - - - - <link rel="stylesheet" href="../../../stylesheets/extra.css"> - - <script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> - - - - - - - </head> - - - - - - - - <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="0D47A1" data-md-color-accent="1565C0"> - - - <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> - <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> - <label class="md-overlay" for="__drawer"></label> - <div data-md-component="skip"> - - </div> - <div data-md-component="announce"> - - </div> - - <div data-md-color-scheme="default" data-md-component="outdated" hidden> - - </div> - - - - - - -<header class="md-header md-header--shadow" data-md-component="header"> - <nav class="md-header__inner md-grid" aria-label="Header"> - <a href="../../.." title="ETSI SDG TFS Documentation" class="md-header__button md-logo" aria-label="ETSI SDG TFS Documentation" data-md-component="logo"> - - <img src="../../../images/logos/TeraFlow SDN Logo Screen_B_W NEG.png" alt="logo"> - - </a> - <label class="md-header__button md-icon" for="__drawer"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> - </label> - <div class="md-header__title" data-md-component="header-title"> - <div class="md-header__ellipsis"> - <div class="md-header__topic"> - <span class="md-ellipsis"> - ETSI SDG TFS Documentation - </span> - </div> - <div class="md-header__topic" data-md-component="header-topic"> - <span class="md-ellipsis"> - - Configure your machine - - </span> - </div> - </div> - </div> - - - - - - - <label class="md-header__button md-icon" for="__search"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> - </label> - <div class="md-search" data-md-component="search" role="dialog"> - <label class="md-search__overlay" for="__search"></label> - <div class="md-search__inner" role="search"> - <form class="md-search__form" name="search"> - <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> - <label class="md-search__icon md-icon" for="__search"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> - </label> - <nav class="md-search__options" aria-label="Search"> - - <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> - </button> - </nav> - - </form> - <div class="md-search__output"> - <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> - <div class="md-search-result" data-md-component="search-result"> - <div class="md-search-result__meta"> - Initializing search - </div> - <ol class="md-search-result__list" role="presentation"></ol> - </div> - </div> - </div> - </div> -</div> - - - <div class="md-header__source"> - <a href="https://labs.etsi.org/rep/tfs" title="Go to repository" class="md-source" data-md-component="source"> - <div class="md-source__icon md-icon"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </div> - <div class="md-source__repository"> - TFS GitLab - </div> -</a> - </div> - - </nav> - -</header> - - <div class="md-container" data-md-component="container"> - - - - - - - <main class="md-main" data-md-component="main"> - <div class="md-main__inner md-grid"> - - - - <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > - <div class="md-sidebar__scrollwrap"> - <div class="md-sidebar__inner"> - - - - - - -<nav class="md-nav md-nav--primary md-nav--integrated" aria-label="Navigation" data-md-level="0"> - <label class="md-nav__title" for="__drawer"> - <a href="../../.." title="ETSI SDG TFS Documentation" class="md-nav__button md-logo" aria-label="ETSI SDG TFS Documentation" data-md-component="logo"> - - <img src="../../../images/logos/TeraFlow SDN Logo Screen_B_W NEG.png" alt="logo"> - - </a> - ETSI SDG TFS Documentation - </label> - - <div class="md-nav__source"> - <a href="https://labs.etsi.org/rep/tfs" title="Go to repository" class="md-source" data-md-component="source"> - <div class="md-source__icon md-icon"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </div> - <div class="md-source__repository"> - TFS GitLab - </div> -</a> - </div> - - <ul class="md-nav__list" data-md-scrollfix> - - - - - - - - <li class="md-nav__item"> - <a href="../../deployment_guide/" class="md-nav__link"> - - - <span class="md-ellipsis"> - 1. Deployment Guide - </span> - - - </a> - </li> - - - - - - - - - - <li class="md-nav__item"> - <a href="../../../development_guide/development_guide/" class="md-nav__link"> - - - <span class="md-ellipsis"> - 2. Development Guide - </span> - - - </a> - </li> - - - - </ul> -</nav> - </div> - </div> - </div> - - - - - <div class="md-content" data-md-component="content"> - <article class="md-content__inner md-typeset"> - - - - - <h1>Configure your machine</h1> - -<p>In this section, we describe how to configure a machine (physical or virtual) to be used as the deployment, execution, and development environment for the ETSI TeraFlowSDN controller. Choose your preferred environment below and follow the instructions provided.</p> -<p><strong>NOTE</strong>: If you already have a remote physical server fitting the requirements specified in this section feel free to use it instead of deploying a local VM. Check <a href="./1.1.-Configure-your-Machine/1.1.1.-Physical-Server">1.1.1. Physical Server</a> for further details.</p> -<p>Virtualization platforms tested are: - - <a href="./1.1.-Configure-your-Machine/1.1.1.-Physical-Server">1.1.1. Physical Server</a> - - <a href="./1.1.-Configure-your-Machine/1.1.2.-Oracle-Virtual-Box">1.1.2. Oracle Virtual Box</a> - - <a href="./1.1.-Configure-your-Machine/1.1.3.-VMWare-Fusion">1.1.3. VMWare Fusion</a> - - <a href="./1.1.-Configure-your-Machine/1.1.4.-OpenStack">1.1.4. OpenStack</a> - - <a href="./1.1.-Configure-your-Machine/1.1.5.-Vagrant-Box">1.1.5. Vagrant Box</a></p> -<p>Other virtualization environments might be used; in that case, you will need to adapt these instructions to your particular case. If you want to contribute with details on how you used other hypervisors or platforms, <a href="https://labs.etsi.org/rep/tfs/controller/-/wikis/home#contact">contact</a> the TFS team through Slack.</p> - - - - - - - - - - - - - - </article> - </div> - - -<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> - </div> - - <button type="button" class="md-top md-icon" data-md-component="top" hidden> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> - Back to top -</button> - - </main> - - <footer class="md-footer"> - - - - <div class="md-footer-meta md-typeset"> - <div class="md-footer-meta__inner md-grid"> - <div class="md-copyright"> - - <div class="md-copyright__highlight"> - Copyright © 2019-2024 TeraflowSDN Project - </div> - - - Made with - <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> - Material for MkDocs - </a> - -</div> - - <div class="md-social"> - - - - - - - - - <a href="https://tfs.etsi.org/" target="_blank" rel="noopener" title="tfs.etsi.org" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M352 256c0 22.2-1.2 43.6-3.3 64H163.4c-2.2-20.4-3.3-41.8-3.3-64s1.2-43.6 3.3-64h185.3c2.2 20.4 3.3 41.8 3.3 64m28.8-64h123.1c5.3 20.5 8.1 41.9 8.1 64s-2.8 43.5-8.1 64H380.8c2.1-20.6 3.2-42 3.2-64s-1.1-43.4-3.2-64m112.6-32H376.7c-10-63.9-29.8-117.4-55.3-151.6 78.3 20.7 142 77.5 171.9 151.6zm-149.1 0H167.7c6.1-36.4 15.5-68.6 27-94.7 10.5-23.6 22.2-40.7 33.5-51.5C239.4 3.2 248.7 0 256 0s16.6 3.2 27.8 13.8c11.3 10.8 23 27.9 33.5 51.5 11.6 26 20.9 58.2 27 94.7m-209 0H18.6c30-74.1 93.6-130.9 172-151.6-25.5 34.2-45.3 87.7-55.3 151.6M8.1 192h123.1c-2.1 20.6-3.2 42-3.2 64s1.1 43.4 3.2 64H8.1C2.8 299.5 0 278.1 0 256s2.8-43.5 8.1-64m186.6 254.6c-11.6-26-20.9-58.2-27-94.6h176.6c-6.1 36.4-15.5 68.6-27 94.6-10.5 23.6-22.2 40.7-33.5 51.5-11.2 10.7-20.5 13.9-27.8 13.9s-16.6-3.2-27.8-13.8c-11.3-10.8-23-27.9-33.5-51.5zM135.3 352c10 63.9 29.8 117.4 55.3 151.6-78.4-20.7-142-77.5-172-151.6zm358.1 0c-30 74.1-93.6 130.9-171.9 151.6 25.5-34.2 45.2-87.7 55.3-151.6h116.7z"/></svg> - </a> - - - - - - - - - <a href="https://labs.etsi.org/rep/tfs" target="_blank" rel="noopener" title="labs.etsi.org" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </a> - - - - - - - - - <a href="https://www.linkedin.com/company/teraflowsdn/" target="_blank" rel="noopener" title="www.linkedin.com" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3M135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5m282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9z"/></svg> - </a> - - - - - - - - - <a href="https://twitter.com/TeraflowSDN" target="_blank" rel="noopener" title="twitter.com" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8l164.9-188.5L26.8 48h145.6l100.5 132.9zm-24.8 373.8h39.1L151.1 88h-42z"/></svg> - </a> - -</div> - - </div> - </div> -</footer> - - </div> - <div class="md-dialog" data-md-component="dialog"> - <div class="md-dialog__inner md-typeset"></div> - </div> - - <div class="md-progress" data-md-component="progress" role="progressbar"></div> - - - <script id="__config" type="application/json">{"base": "../../..", "features": ["navigation.instant", "navigation.instant.progress", "navigation.top", "navigation.footer", "navigation.path", "search", "search.highlight", "toc.integrate"], "search": "../../../assets/javascripts/workers/search.6ce7567c.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": {"provider": "mike"}}</script> - - - <script src="../../../assets/javascripts/bundle.83f73b43.min.js"></script> - - - </body> -</html> \ No newline at end of file diff --git a/public/develop/deployment_guide/configure_your_machine/openstack/index.html b/public/develop/deployment_guide/configure_your_machine/openstack/index.html deleted file mode 100644 index 7a04089..0000000 --- a/public/develop/deployment_guide/configure_your_machine/openstack/index.html +++ /dev/null @@ -1,494 +0,0 @@ - -<!doctype html> -<html lang="en" class="no-js"> - <head> - - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - - <meta name="description" content="ETSI SDG TFS Documentation page"> - - - <meta name="author" content="TeraflowSDN by ETSI"> - - - <link rel="canonical" href="https://tfs.etsi.org/develop/deployment_guide/configure_your_machine/openstack/"> - - - - - <link rel="icon" href="../../../images/favicon.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42"> - - - - <title>Openstack - ETSI SDG TFS Documentation</title> - - - - <link rel="stylesheet" href="../../../assets/stylesheets/main.0253249f.min.css"> - - - <link rel="stylesheet" href="../../../assets/stylesheets/palette.06af60db.min.css"> - - - - - - - - - - - - - <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> - <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> - - - - <link rel="stylesheet" href="../../../stylesheets/extra.css"> - - <script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> - - - - - - - </head> - - - - - - - - <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="0D47A1" data-md-color-accent="1565C0"> - - - <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> - <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> - <label class="md-overlay" for="__drawer"></label> - <div data-md-component="skip"> - - - <a href="#create-a-security-group-in-openstack" class="md-skip"> - Skip to content - </a> - - </div> - <div data-md-component="announce"> - - </div> - - <div data-md-color-scheme="default" data-md-component="outdated" hidden> - - </div> - - - - - - -<header class="md-header md-header--shadow" data-md-component="header"> - <nav class="md-header__inner md-grid" aria-label="Header"> - <a href="../../.." title="ETSI SDG TFS Documentation" class="md-header__button md-logo" aria-label="ETSI SDG TFS Documentation" data-md-component="logo"> - - <img src="../../../images/logos/TeraFlow SDN Logo Screen_B_W NEG.png" alt="logo"> - - </a> - <label class="md-header__button md-icon" for="__drawer"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> - </label> - <div class="md-header__title" data-md-component="header-title"> - <div class="md-header__ellipsis"> - <div class="md-header__topic"> - <span class="md-ellipsis"> - ETSI SDG TFS Documentation - </span> - </div> - <div class="md-header__topic" data-md-component="header-topic"> - <span class="md-ellipsis"> - - Openstack - - </span> - </div> - </div> - </div> - - - - - - - <label class="md-header__button md-icon" for="__search"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> - </label> - <div class="md-search" data-md-component="search" role="dialog"> - <label class="md-search__overlay" for="__search"></label> - <div class="md-search__inner" role="search"> - <form class="md-search__form" name="search"> - <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> - <label class="md-search__icon md-icon" for="__search"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> - </label> - <nav class="md-search__options" aria-label="Search"> - - <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> - </button> - </nav> - - </form> - <div class="md-search__output"> - <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> - <div class="md-search-result" data-md-component="search-result"> - <div class="md-search-result__meta"> - Initializing search - </div> - <ol class="md-search-result__list" role="presentation"></ol> - </div> - </div> - </div> - </div> -</div> - - - <div class="md-header__source"> - <a href="https://labs.etsi.org/rep/tfs" title="Go to repository" class="md-source" data-md-component="source"> - <div class="md-source__icon md-icon"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </div> - <div class="md-source__repository"> - TFS GitLab - </div> -</a> - </div> - - </nav> - -</header> - - <div class="md-container" data-md-component="container"> - - - - - - - <main class="md-main" data-md-component="main"> - <div class="md-main__inner md-grid"> - - - - <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > - <div class="md-sidebar__scrollwrap"> - <div class="md-sidebar__inner"> - - - - - - -<nav class="md-nav md-nav--primary md-nav--integrated" aria-label="Navigation" data-md-level="0"> - <label class="md-nav__title" for="__drawer"> - <a href="../../.." title="ETSI SDG TFS Documentation" class="md-nav__button md-logo" aria-label="ETSI SDG TFS Documentation" data-md-component="logo"> - - <img src="../../../images/logos/TeraFlow SDN Logo Screen_B_W NEG.png" alt="logo"> - - </a> - ETSI SDG TFS Documentation - </label> - - <div class="md-nav__source"> - <a href="https://labs.etsi.org/rep/tfs" title="Go to repository" class="md-source" data-md-component="source"> - <div class="md-source__icon md-icon"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </div> - <div class="md-source__repository"> - TFS GitLab - </div> -</a> - </div> - - <ul class="md-nav__list" data-md-scrollfix> - - - - - - - - <li class="md-nav__item"> - <a href="../../deployment_guide/" class="md-nav__link"> - - - <span class="md-ellipsis"> - 1. Deployment Guide - </span> - - - </a> - </li> - - - - - - - - - - <li class="md-nav__item"> - <a href="../../../development_guide/development_guide/" class="md-nav__link"> - - - <span class="md-ellipsis"> - 2. Development Guide - </span> - - - </a> - </li> - - - - </ul> -</nav> - </div> - </div> - </div> - - - - - <div class="md-content" data-md-component="content"> - <article class="md-content__inner md-typeset"> - - - - -<p>This page describes how to configure a VM for running ETSI TeraFlowSDN(TFS) controller using <a href="https://www.openstack.org/">OpenStack</a>. It has been tested with OpenStack Kolla up to Yoga version. </p> -<h1 id="create-a-security-group-in-openstack">Create a Security Group in OpenStack</h1> -<p>In OpenStack, go to Project - Network - Security Groups - Create Security Group with name TFS</p> -<p>Add the following rules:</p> -<table> -<thead> -<tr> -<th>Direction</th> -<th>Ether Type</th> -<th>IP Protocol</th> -<th>Port Range</th> -<th>Remote IP Prefix</th> -</tr> -</thead> -<tbody> -<tr> -<td>Ingress</td> -<td>IPv4</td> -<td>TCP</td> -<td>22 (SSH)</td> -<td>0.0.0.0/0</td> -</tr> -<tr> -<td>Ingress</td> -<td>IPv4</td> -<td>TCP</td> -<td>2200</td> -<td>0.0.0.0/0</td> -</tr> -<tr> -<td>Ingress</td> -<td>IPv4</td> -<td>TCP</td> -<td>8080</td> -<td>0.0.0.0/0</td> -</tr> -<tr> -<td>Ingress</td> -<td>IPv4</td> -<td>TCP</td> -<td>80</td> -<td>0.0.0.0/0</td> -</tr> -<tr> -<td>Egress</td> -<td>IPv4</td> -<td>Any</td> -<td>Any</td> -<td>0.0.0.0/0</td> -</tr> -<tr> -<td>Egress</td> -<td>IPv6</td> -<td>Any</td> -<td>Any</td> -<td>::/0</td> -</tr> -</tbody> -</table> -<p><strong>Note</strong>: The IP address will be assigned depending on the network you have configured inside OpenStack. This IP will have to be modified in TeraFlow configuration files which by default use IP 10.0.2.10</p> -<h1 id="create-a-flavour">Create a flavour</h1> -<h2 id="from-dashboard-horizon">From dashboard (Horizon)</h2> -<p>Go to Admin - Compute - Flavors and press Create Flavor</p> -<ul> -<li>Name: TFS</li> -<li>VCPUs: 4</li> -<li>RAM (MB): 8192</li> -<li>Root Disk (GB): 60</li> -</ul> -<h2 id="from-cli">From CLI</h2> -<pre><code> openstack flavor create TFS --id auto --ram 8192 --disk 60 --vcpus 8 -</code></pre> -<h1 id="create-an-instance-in-openstack">Create an instance in OpenStack:</h1> -<ul> -<li>Instance name: TFS-VM</li> -<li>Origin: [Ubuntu-22.04 cloud image] (https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img)</li> -<li>Create new volume: No</li> -<li>Flavor: TFS</li> -<li>Networks: extnet </li> -<li>Security Groups: TFS</li> -<li>Configuration: Include the following cloud-config</li> -</ul> -<pre><code>#cloud-config -# Modifies the password for the VM instance -username: ubuntu -password: <your-password> -chpasswd: { expire: False } -ssh_pwauth: True -</code></pre> -<h2 id="upgrade-the-ubuntu-distribution">Upgrade the Ubuntu distribution</h2> -<pre><code class="language-bash">sudo apt-get update -y -sudo apt-get dist-upgrade -y -</code></pre> -<ul> -<li>If asked to restart services, restart the default ones proposed.</li> -<li>Restart the VM when the installation is completed.</li> -</ul> - - - - - - - - - - - - - - </article> - </div> - - -<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> - </div> - - <button type="button" class="md-top md-icon" data-md-component="top" hidden> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> - Back to top -</button> - - </main> - - <footer class="md-footer"> - - - - <div class="md-footer-meta md-typeset"> - <div class="md-footer-meta__inner md-grid"> - <div class="md-copyright"> - - <div class="md-copyright__highlight"> - Copyright © 2019-2024 TeraflowSDN Project - </div> - - - Made with - <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> - Material for MkDocs - </a> - -</div> - - <div class="md-social"> - - - - - - - - - <a href="https://tfs.etsi.org/" target="_blank" rel="noopener" title="tfs.etsi.org" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M352 256c0 22.2-1.2 43.6-3.3 64H163.4c-2.2-20.4-3.3-41.8-3.3-64s1.2-43.6 3.3-64h185.3c2.2 20.4 3.3 41.8 3.3 64m28.8-64h123.1c5.3 20.5 8.1 41.9 8.1 64s-2.8 43.5-8.1 64H380.8c2.1-20.6 3.2-42 3.2-64s-1.1-43.4-3.2-64m112.6-32H376.7c-10-63.9-29.8-117.4-55.3-151.6 78.3 20.7 142 77.5 171.9 151.6zm-149.1 0H167.7c6.1-36.4 15.5-68.6 27-94.7 10.5-23.6 22.2-40.7 33.5-51.5C239.4 3.2 248.7 0 256 0s16.6 3.2 27.8 13.8c11.3 10.8 23 27.9 33.5 51.5 11.6 26 20.9 58.2 27 94.7m-209 0H18.6c30-74.1 93.6-130.9 172-151.6-25.5 34.2-45.3 87.7-55.3 151.6M8.1 192h123.1c-2.1 20.6-3.2 42-3.2 64s1.1 43.4 3.2 64H8.1C2.8 299.5 0 278.1 0 256s2.8-43.5 8.1-64m186.6 254.6c-11.6-26-20.9-58.2-27-94.6h176.6c-6.1 36.4-15.5 68.6-27 94.6-10.5 23.6-22.2 40.7-33.5 51.5-11.2 10.7-20.5 13.9-27.8 13.9s-16.6-3.2-27.8-13.8c-11.3-10.8-23-27.9-33.5-51.5zM135.3 352c10 63.9 29.8 117.4 55.3 151.6-78.4-20.7-142-77.5-172-151.6zm358.1 0c-30 74.1-93.6 130.9-171.9 151.6 25.5-34.2 45.2-87.7 55.3-151.6h116.7z"/></svg> - </a> - - - - - - - - - <a href="https://labs.etsi.org/rep/tfs" target="_blank" rel="noopener" title="labs.etsi.org" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </a> - - - - - - - - - <a href="https://www.linkedin.com/company/teraflowsdn/" target="_blank" rel="noopener" title="www.linkedin.com" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3M135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5m282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9z"/></svg> - </a> - - - - - - - - - <a href="https://twitter.com/TeraflowSDN" target="_blank" rel="noopener" title="twitter.com" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8l164.9-188.5L26.8 48h145.6l100.5 132.9zm-24.8 373.8h39.1L151.1 88h-42z"/></svg> - </a> - -</div> - - </div> - </div> -</footer> - - </div> - <div class="md-dialog" data-md-component="dialog"> - <div class="md-dialog__inner md-typeset"></div> - </div> - - <div class="md-progress" data-md-component="progress" role="progressbar"></div> - - - <script id="__config" type="application/json">{"base": "../../..", "features": ["navigation.instant", "navigation.instant.progress", "navigation.top", "navigation.footer", "navigation.path", "search", "search.highlight", "toc.integrate"], "search": "../../../assets/javascripts/workers/search.6ce7567c.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": {"provider": "mike"}}</script> - - - <script src="../../../assets/javascripts/bundle.83f73b43.min.js"></script> - - - </body> -</html> \ No newline at end of file diff --git a/public/develop/deployment_guide/configure_your_machine/oracle_virtual_box/index.html b/public/develop/deployment_guide/configure_your_machine/oracle_virtual_box/index.html deleted file mode 100644 index da54276..0000000 --- a/public/develop/deployment_guide/configure_your_machine/oracle_virtual_box/index.html +++ /dev/null @@ -1,542 +0,0 @@ - -<!doctype html> -<html lang="en" class="no-js"> - <head> - - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - - <meta name="description" content="ETSI SDG TFS Documentation page"> - - - <meta name="author" content="TeraflowSDN by ETSI"> - - - <link rel="canonical" href="https://tfs.etsi.org/develop/deployment_guide/configure_your_machine/oracle_virtual_box/"> - - - - - <link rel="icon" href="../../../images/favicon.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42"> - - - - <title>Oracle virtual box - ETSI SDG TFS Documentation</title> - - - - <link rel="stylesheet" href="../../../assets/stylesheets/main.0253249f.min.css"> - - - <link rel="stylesheet" href="../../../assets/stylesheets/palette.06af60db.min.css"> - - - - - - - - - - - - - <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> - <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> - - - - <link rel="stylesheet" href="../../../stylesheets/extra.css"> - - <script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> - - - - - - - </head> - - - - - - - - <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="0D47A1" data-md-color-accent="1565C0"> - - - <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> - <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> - <label class="md-overlay" for="__drawer"></label> - <div data-md-component="skip"> - - - <a href="#create-a-nat-network-in-virtualbox" class="md-skip"> - Skip to content - </a> - - </div> - <div data-md-component="announce"> - - </div> - - <div data-md-color-scheme="default" data-md-component="outdated" hidden> - - </div> - - - - - - -<header class="md-header md-header--shadow" data-md-component="header"> - <nav class="md-header__inner md-grid" aria-label="Header"> - <a href="../../.." title="ETSI SDG TFS Documentation" class="md-header__button md-logo" aria-label="ETSI SDG TFS Documentation" data-md-component="logo"> - - <img src="../../../images/logos/TeraFlow SDN Logo Screen_B_W NEG.png" alt="logo"> - - </a> - <label class="md-header__button md-icon" for="__drawer"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> - </label> - <div class="md-header__title" data-md-component="header-title"> - <div class="md-header__ellipsis"> - <div class="md-header__topic"> - <span class="md-ellipsis"> - ETSI SDG TFS Documentation - </span> - </div> - <div class="md-header__topic" data-md-component="header-topic"> - <span class="md-ellipsis"> - - Oracle virtual box - - </span> - </div> - </div> - </div> - - - - - - - <label class="md-header__button md-icon" for="__search"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> - </label> - <div class="md-search" data-md-component="search" role="dialog"> - <label class="md-search__overlay" for="__search"></label> - <div class="md-search__inner" role="search"> - <form class="md-search__form" name="search"> - <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> - <label class="md-search__icon md-icon" for="__search"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> - </label> - <nav class="md-search__options" aria-label="Search"> - - <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> - </button> - </nav> - - </form> - <div class="md-search__output"> - <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> - <div class="md-search-result" data-md-component="search-result"> - <div class="md-search-result__meta"> - Initializing search - </div> - <ol class="md-search-result__list" role="presentation"></ol> - </div> - </div> - </div> - </div> -</div> - - - <div class="md-header__source"> - <a href="https://labs.etsi.org/rep/tfs" title="Go to repository" class="md-source" data-md-component="source"> - <div class="md-source__icon md-icon"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </div> - <div class="md-source__repository"> - TFS GitLab - </div> -</a> - </div> - - </nav> - -</header> - - <div class="md-container" data-md-component="container"> - - - - - - - <main class="md-main" data-md-component="main"> - <div class="md-main__inner md-grid"> - - - - <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > - <div class="md-sidebar__scrollwrap"> - <div class="md-sidebar__inner"> - - - - - - -<nav class="md-nav md-nav--primary md-nav--integrated" aria-label="Navigation" data-md-level="0"> - <label class="md-nav__title" for="__drawer"> - <a href="../../.." title="ETSI SDG TFS Documentation" class="md-nav__button md-logo" aria-label="ETSI SDG TFS Documentation" data-md-component="logo"> - - <img src="../../../images/logos/TeraFlow SDN Logo Screen_B_W NEG.png" alt="logo"> - - </a> - ETSI SDG TFS Documentation - </label> - - <div class="md-nav__source"> - <a href="https://labs.etsi.org/rep/tfs" title="Go to repository" class="md-source" data-md-component="source"> - <div class="md-source__icon md-icon"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </div> - <div class="md-source__repository"> - TFS GitLab - </div> -</a> - </div> - - <ul class="md-nav__list" data-md-scrollfix> - - - - - - - - <li class="md-nav__item"> - <a href="../../deployment_guide/" class="md-nav__link"> - - - <span class="md-ellipsis"> - 1. Deployment Guide - </span> - - - </a> - </li> - - - - - - - - - - <li class="md-nav__item"> - <a href="../../../development_guide/development_guide/" class="md-nav__link"> - - - <span class="md-ellipsis"> - 2. Development Guide - </span> - - - </a> - </li> - - - - </ul> -</nav> - </div> - </div> - </div> - - - - - <div class="md-content" data-md-component="content"> - <article class="md-content__inner md-typeset"> - - - - -<p>This page describes how to configure a VM for running ETSI TeraFlowSDN(TFS) controller using <a href="https://www.virtualbox.org/">Oracle VirtualBox</a>. It has been tested with VirtualBox up to version 6.1.40 r154048.</p> -<h1 id="create-a-nat-network-in-virtualbox">Create a NAT Network in VirtualBox</h1> -<p>In "Oracle VM VirtualBox Manager", Menu "File > Preferences... > Network", create a NAT -network with the following specifications:</p> -<table> -<thead> -<tr> -<th>Name</th> -<th>CIDR</th> -<th>DHCP</th> -<th>IPv6</th> -</tr> -</thead> -<tbody> -<tr> -<td>TFS-NAT-Net</td> -<td>10.0.2.0/24</td> -<td>Disabled</td> -<td>Disabled</td> -</tr> -</tbody> -</table> -<p>Within the newly created "TFS-NAT-Net" NAT network, configure the following IPv4 -forwarding rules:</p> -<table> -<thead> -<tr> -<th>Name</th> -<th>Protocol</th> -<th>Host IP</th> -<th>Host Port</th> -<th>Guest IP</th> -<th>Guest Port</th> -</tr> -</thead> -<tbody> -<tr> -<td>SSH</td> -<td>TCP</td> -<td>127.0.0.1</td> -<td>2200</td> -<td>10.0.2.10</td> -<td>22</td> -</tr> -<tr> -<td>HTTP</td> -<td>TCP</td> -<td>127.0.0.1</td> -<td>8080</td> -<td>10.0.2.10</td> -<td>80</td> -</tr> -</tbody> -</table> -<p><strong>Note</strong>: IP address 10.0.2.10 is the one that will be assigned to the VM.</p> -<h1 id="create-vm-in-virtualbox">Create VM in VirtualBox:</h1> -<ul> -<li>Name: TFS-VM</li> -<li>Type/Version: Linux / Ubuntu (64-bit)</li> -<li>CPU (*): 4 vCPUs @ 100% execution capacity</li> -<li>RAM: 8 GB</li> -<li>Disk: 60 GB, Virtual Disk Image (VDI), Dynamically allocated</li> -<li>Optical Drive ISO Image: "ubuntu-22.04.X-live-server-amd64.iso"</li> -<li>Download the latest Long Term Support (LTS) version of the <em>Ubuntu Server</em> image from <a href="https://releases.ubuntu.com/22.04/">Ubuntu 22.04 LTS</a>, e.g., "ubuntu-22.04.X-live-server-amd64.iso".</li> -<li><strong>Note</strong>: use Ubuntu Server image instead of Ubuntu Desktop to create a lightweight VM.</li> -<li>Network Adapter 1 (*): enabled, attached to NAT Network "TFS-NAT-Net"</li> -<li>Minor adjustments (*):</li> -<li>Audio: disabled</li> -<li>Boot order: disable "Floppy"</li> -</ul> -<p><strong>Note</strong>: (*) settings to be editing after the VM is created.</p> -<h1 id="install-ubuntu-2204-lts-operating-system">Install Ubuntu 22.04 LTS Operating System</h1> -<p>In "Oracle VM VirtualBox Manager", start the VM in normal mode, and follow the -installation procedure. -Below we provide some installation guidelines: -- Installation Language: English -- Autodetect your keyboard -- If asked, select "Ubuntu Server" (do not select "Ubuntu Server (minimized)"). -- Configure static network specifications:</p> -<table> -<thead> -<tr> -<th>Interface</th> -<th>IPv4 Method</th> -<th>Subnet</th> -<th>Address</th> -<th>Gateway</th> -<th>Name servers</th> -<th>Search domains</th> -</tr> -</thead> -<tbody> -<tr> -<td>enp0s3</td> -<td>Manual</td> -<td>10.0.2.0/24</td> -<td>10.0.2.10</td> -<td>10.0.2.1</td> -<td>8.8.8.8,8.8.4.4</td> -<td><empty></td> -</tr> -</tbody> -</table> -<ul> -<li>Leave proxy and mirror addresses as they are</li> -<li>Let the installer self-upgrade (if asked).</li> -<li>Use an entire disk for the installation</li> -<li>Disable setup of the disk as LVM group</li> -<li>Double check that NO swap space is allocated in the partition table. Kubernetes does not work properly with SWAP.</li> -<li>Configure your user and system names:</li> -<li>User name: TeraFlowSDN</li> -<li>Server's name: tfs-vm</li> -<li>Username: tfs</li> -<li>Password: tfs123</li> -<li>Install Open SSH Server</li> -<li>Import SSH keys, if any.</li> -<li>Featured Server Snaps</li> -<li>Do not install featured server snaps. It will be done manually later to illustrate how to uninstall and reinstall them in case of trouble with.</li> -<li>Let the system install and upgrade the packages.</li> -<li>This operation might take some minutes depending on how old is the Optical Drive ISO image you use and your Internet connection speed.</li> -<li>Restart the VM when the installation is completed.</li> -</ul> -<h2 id="upgrade-the-ubuntu-distribution">Upgrade the Ubuntu distribution</h2> -<pre><code class="language-bash">sudo apt-get update -y -sudo apt-get dist-upgrade -y -</code></pre> -<ul> -<li>If asked to restart services, restart the default ones proposed.</li> -<li>Restart the VM when the installation is completed.</li> -</ul> -<h2 id="install-virtualbox-guest-additions">Install VirtualBox Guest Additions</h2> -<p>On VirtualBox Manager, open the VM main screen. If you are running the VM in headless -mode, right click over the VM in the VirtualBox Manager window and click "Show". -If a dialog informing about how to leave the interface of the VM is shown, confirm -pressing "Switch" button. The interface of the VM should appear.</p> -<p>Click menu "Device > Insert Guest Additions CD image..."</p> -<p>On the VM terminal, type:</p> -<pre><code class="language-bash">sudo apt-get install -y linux-headers-$(uname -r) build-essential dkms - # This command might take some minutes depending on your VM specs and your Internet access speed. -sudo mount /dev/cdrom /mnt/ -cd /mnt/ -sudo ./VBoxLinuxAdditions.run - # This command might take some minutes depending on your VM specs. -sudo reboot -</code></pre> - - - - - - - - - - - - - - </article> - </div> - - -<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> - </div> - - <button type="button" class="md-top md-icon" data-md-component="top" hidden> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> - Back to top -</button> - - </main> - - <footer class="md-footer"> - - - - <div class="md-footer-meta md-typeset"> - <div class="md-footer-meta__inner md-grid"> - <div class="md-copyright"> - - <div class="md-copyright__highlight"> - Copyright © 2019-2024 TeraflowSDN Project - </div> - - - Made with - <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> - Material for MkDocs - </a> - -</div> - - <div class="md-social"> - - - - - - - - - <a href="https://tfs.etsi.org/" target="_blank" rel="noopener" title="tfs.etsi.org" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M352 256c0 22.2-1.2 43.6-3.3 64H163.4c-2.2-20.4-3.3-41.8-3.3-64s1.2-43.6 3.3-64h185.3c2.2 20.4 3.3 41.8 3.3 64m28.8-64h123.1c5.3 20.5 8.1 41.9 8.1 64s-2.8 43.5-8.1 64H380.8c2.1-20.6 3.2-42 3.2-64s-1.1-43.4-3.2-64m112.6-32H376.7c-10-63.9-29.8-117.4-55.3-151.6 78.3 20.7 142 77.5 171.9 151.6zm-149.1 0H167.7c6.1-36.4 15.5-68.6 27-94.7 10.5-23.6 22.2-40.7 33.5-51.5C239.4 3.2 248.7 0 256 0s16.6 3.2 27.8 13.8c11.3 10.8 23 27.9 33.5 51.5 11.6 26 20.9 58.2 27 94.7m-209 0H18.6c30-74.1 93.6-130.9 172-151.6-25.5 34.2-45.3 87.7-55.3 151.6M8.1 192h123.1c-2.1 20.6-3.2 42-3.2 64s1.1 43.4 3.2 64H8.1C2.8 299.5 0 278.1 0 256s2.8-43.5 8.1-64m186.6 254.6c-11.6-26-20.9-58.2-27-94.6h176.6c-6.1 36.4-15.5 68.6-27 94.6-10.5 23.6-22.2 40.7-33.5 51.5-11.2 10.7-20.5 13.9-27.8 13.9s-16.6-3.2-27.8-13.8c-11.3-10.8-23-27.9-33.5-51.5zM135.3 352c10 63.9 29.8 117.4 55.3 151.6-78.4-20.7-142-77.5-172-151.6zm358.1 0c-30 74.1-93.6 130.9-171.9 151.6 25.5-34.2 45.2-87.7 55.3-151.6h116.7z"/></svg> - </a> - - - - - - - - - <a href="https://labs.etsi.org/rep/tfs" target="_blank" rel="noopener" title="labs.etsi.org" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </a> - - - - - - - - - <a href="https://www.linkedin.com/company/teraflowsdn/" target="_blank" rel="noopener" title="www.linkedin.com" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3M135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5m282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9z"/></svg> - </a> - - - - - - - - - <a href="https://twitter.com/TeraflowSDN" target="_blank" rel="noopener" title="twitter.com" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8l164.9-188.5L26.8 48h145.6l100.5 132.9zm-24.8 373.8h39.1L151.1 88h-42z"/></svg> - </a> - -</div> - - </div> - </div> -</footer> - - </div> - <div class="md-dialog" data-md-component="dialog"> - <div class="md-dialog__inner md-typeset"></div> - </div> - - <div class="md-progress" data-md-component="progress" role="progressbar"></div> - - - <script id="__config" type="application/json">{"base": "../../..", "features": ["navigation.instant", "navigation.instant.progress", "navigation.top", "navigation.footer", "navigation.path", "search", "search.highlight", "toc.integrate"], "search": "../../../assets/javascripts/workers/search.6ce7567c.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": {"provider": "mike"}}</script> - - - <script src="../../../assets/javascripts/bundle.83f73b43.min.js"></script> - - - </body> -</html> \ No newline at end of file diff --git a/public/develop/deployment_guide/configure_your_machine/physical_server/index.html b/public/develop/deployment_guide/configure_your_machine/physical_server/index.html deleted file mode 100644 index 09f63ab..0000000 --- a/public/develop/deployment_guide/configure_your_machine/physical_server/index.html +++ /dev/null @@ -1,492 +0,0 @@ - -<!doctype html> -<html lang="en" class="no-js"> - <head> - - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - - <meta name="description" content="ETSI SDG TFS Documentation page"> - - - <meta name="author" content="TeraflowSDN by ETSI"> - - - <link rel="canonical" href="https://tfs.etsi.org/develop/deployment_guide/configure_your_machine/physical_server/"> - - - - - <link rel="icon" href="../../../images/favicon.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42"> - - - - <title>Physical server - ETSI SDG TFS Documentation</title> - - - - <link rel="stylesheet" href="../../../assets/stylesheets/main.0253249f.min.css"> - - - <link rel="stylesheet" href="../../../assets/stylesheets/palette.06af60db.min.css"> - - - - - - - - - - - - - <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> - <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> - - - - <link rel="stylesheet" href="../../../stylesheets/extra.css"> - - <script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> - - - - - - - </head> - - - - - - - - <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="0D47A1" data-md-color-accent="1565C0"> - - - <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> - <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> - <label class="md-overlay" for="__drawer"></label> - <div data-md-component="skip"> - - - <a href="#server-specifications" class="md-skip"> - Skip to content - </a> - - </div> - <div data-md-component="announce"> - - </div> - - <div data-md-color-scheme="default" data-md-component="outdated" hidden> - - </div> - - - - - - -<header class="md-header md-header--shadow" data-md-component="header"> - <nav class="md-header__inner md-grid" aria-label="Header"> - <a href="../../.." title="ETSI SDG TFS Documentation" class="md-header__button md-logo" aria-label="ETSI SDG TFS Documentation" data-md-component="logo"> - - <img src="../../../images/logos/TeraFlow SDN Logo Screen_B_W NEG.png" alt="logo"> - - </a> - <label class="md-header__button md-icon" for="__drawer"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> - </label> - <div class="md-header__title" data-md-component="header-title"> - <div class="md-header__ellipsis"> - <div class="md-header__topic"> - <span class="md-ellipsis"> - ETSI SDG TFS Documentation - </span> - </div> - <div class="md-header__topic" data-md-component="header-topic"> - <span class="md-ellipsis"> - - Physical server - - </span> - </div> - </div> - </div> - - - - - - - <label class="md-header__button md-icon" for="__search"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> - </label> - <div class="md-search" data-md-component="search" role="dialog"> - <label class="md-search__overlay" for="__search"></label> - <div class="md-search__inner" role="search"> - <form class="md-search__form" name="search"> - <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> - <label class="md-search__icon md-icon" for="__search"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> - </label> - <nav class="md-search__options" aria-label="Search"> - - <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> - </button> - </nav> - - </form> - <div class="md-search__output"> - <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> - <div class="md-search-result" data-md-component="search-result"> - <div class="md-search-result__meta"> - Initializing search - </div> - <ol class="md-search-result__list" role="presentation"></ol> - </div> - </div> - </div> - </div> -</div> - - - <div class="md-header__source"> - <a href="https://labs.etsi.org/rep/tfs" title="Go to repository" class="md-source" data-md-component="source"> - <div class="md-source__icon md-icon"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </div> - <div class="md-source__repository"> - TFS GitLab - </div> -</a> - </div> - - </nav> - -</header> - - <div class="md-container" data-md-component="container"> - - - - - - - <main class="md-main" data-md-component="main"> - <div class="md-main__inner md-grid"> - - - - <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > - <div class="md-sidebar__scrollwrap"> - <div class="md-sidebar__inner"> - - - - - - -<nav class="md-nav md-nav--primary md-nav--integrated" aria-label="Navigation" data-md-level="0"> - <label class="md-nav__title" for="__drawer"> - <a href="../../.." title="ETSI SDG TFS Documentation" class="md-nav__button md-logo" aria-label="ETSI SDG TFS Documentation" data-md-component="logo"> - - <img src="../../../images/logos/TeraFlow SDN Logo Screen_B_W NEG.png" alt="logo"> - - </a> - ETSI SDG TFS Documentation - </label> - - <div class="md-nav__source"> - <a href="https://labs.etsi.org/rep/tfs" title="Go to repository" class="md-source" data-md-component="source"> - <div class="md-source__icon md-icon"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </div> - <div class="md-source__repository"> - TFS GitLab - </div> -</a> - </div> - - <ul class="md-nav__list" data-md-scrollfix> - - - - - - - - <li class="md-nav__item"> - <a href="../../deployment_guide/" class="md-nav__link"> - - - <span class="md-ellipsis"> - 1. Deployment Guide - </span> - - - </a> - </li> - - - - - - - - - - <li class="md-nav__item"> - <a href="../../../development_guide/development_guide/" class="md-nav__link"> - - - <span class="md-ellipsis"> - 2. Development Guide - </span> - - - </a> - </li> - - - - </ul> -</nav> - </div> - </div> - </div> - - - - - <div class="md-content" data-md-component="content"> - <article class="md-content__inner md-typeset"> - - - - -<p>This page describes how to configure a physical server for running ETSI TeraFlowSDN(TFS) controller.</p> -<h1 id="server-specifications">Server Specifications</h1> -<h4 id="minimum-server-specifications-for-development-and-basic-deployment">Minimum Server Specifications for development and basic deployment</h4> -<ul> -<li>CPU: 4 cores</li> -<li>RAM: 8 GB</li> -<li>Disk: 60 GB</li> -<li>1 GbE NIC</li> -</ul> -<h4 id="recommended-server-specifications-for-development-and-basic-deployment">Recommended Server Specifications for development and basic deployment</h4> -<ul> -<li>CPU: 6 cores</li> -<li>RAM: 12 GB</li> -<li>Disk: 80 GB</li> -<li>1 GbE NIC</li> -</ul> -<h4 id="server-specifications-for-best-development-and-deployment-experience">Server Specifications for best development and deployment experience</h4> -<ul> -<li>CPU: 8 cores</li> -<li>RAM: 32 GB</li> -<li>Disk: 120 GB</li> -<li>1 GbE NIC</li> -</ul> -<p><strong>NOTE</strong>: the specifications listed above are provided as a reference. They depend also on the CPU clock frequency, the RAM memory, the disk technology and speed, etc.</p> -<p>For development purposes, it is recommended to run the VSCode IDE (or the IDE of your choice) in a more powerful server, for instance, the recommended server specifications for development and basic deployment.</p> -<p>Given that TeraFlowSDN follows a micro-services architecture, for the deployment, it might be better to use many clusterized servers with many slower cores than a single server with few highly performant cores.</p> -<h1 id="clusterized-deployment">Clusterized Deployment</h1> -<p>You might consider creating a cluster of machines each featuring, at least, the minimum server specifications. That solution brings you scalability in the future.</p> -<h1 id="networking">Networking</h1> -<p>No explicit indications are given in terms of networking besides that servers need access to the Internet for downloading dependencies, binaries, and packages while building and deploying the TeraFlowSDN components.</p> -<p>Besides that, the network requirements are essentially the same than that required for running a classical Kubernetes environment. To facilitate the deployment, we extensively use <a href="https://microk8s.io/">MicroK8s</a>, thus the network requirements are, essentially, the same demanded by MicroK8s, especially, if you consider creating a Kubernetes cluster.</p> -<p>As a reference, the other deployment solutions based on VMs assume the VM is connected to a virtual network configured with the IP range <code>10.0.2.0/24</code> and have the gateway at IP <code>10.0.2.1</code>. The VMs have the IP address <code>10.0.2.10</code>.</p> -<p>The minimum required ports to be accessible are: -- 22/SSH : for management purposes -- 80/HTTP : for the TeraFlowSDN WebUI and Grafana dashboard -- 8081/HTTPS : for the CockroachDB WebUI</p> -<p>Other ports might be required if you consider to deploy addons such as Kubernetes observability, etc. The details on these ports are left appart given they might vary depending on the Kubernetes environment you use.</p> -<h1 id="operating-system">Operating System</h1> -<p>The recommended Operating System for deploying TeraFlowSDN is <a href="https://releases.ubuntu.com/jammy/">Ubuntu Server 22.04 LTS</a> or <a href="https://releases.ubuntu.com/focal/">Ubuntu Server 20.04 LTS</a>. Other version might work, but we have not tested them. We strongly recommend using Long Term Support (LTS) versions as they provide better stability.</p> -<p>Below we provide some installation guidelines: -- Installation Language: English -- Autodetect your keyboard -- If asked, select "Ubuntu Server" (do not select "Ubuntu Server (minimized)"). -- Configure static network specifications (adapt them based on your particular setup):</p> -<table> -<thead> -<tr> -<th>Interface</th> -<th>IPv4 Method</th> -<th>Subnet</th> -<th>Address</th> -<th>Gateway</th> -<th>Name servers</th> -<th>Search domains</th> -</tr> -</thead> -<tbody> -<tr> -<td>enp0s3</td> -<td>Manual</td> -<td>10.0.2.0/24</td> -<td>10.0.2.10</td> -<td>10.0.2.1</td> -<td>8.8.8.8,8.8.4.4</td> -<td><empty></td> -</tr> -</tbody> -</table> -<ul> -<li>Leave proxy and mirror addresses as they are</li> -<li>Let the installer self-upgrade (if asked).</li> -<li>Use an entire disk for the installation</li> -<li>Disable setup of the disk as LVM group</li> -<li>Double check that NO swap space is allocated in the partition table. Kubernetes does not work properly with SWAP.</li> -<li>Configure your user and system names:</li> -<li>User name: <code>TeraFlowSDN</code></li> -<li>Server's name: <code>tfs-vm</code></li> -<li>Username: <code>tfs</code></li> -<li>Password: <code>tfs123</code></li> -<li>Install Open SSH Server</li> -<li>Import SSH keys, if any.</li> -<li>Featured Server Snaps</li> -<li>Do not install featured server snaps. It will be done manually later to illustrate how to uninstall and reinstall them in case of trouble with.</li> -<li>Let the system install and upgrade the packages.</li> -<li>This operation might take some minutes depending on how old is the Optical Drive ISO image you use and your Internet connection speed.</li> -<li>Restart the VM when the installation is completed.</li> -</ul> -<h2 id="upgrade-the-ubuntu-distribution">Upgrade the Ubuntu distribution</h2> -<pre><code class="language-bash">sudo apt-get update -y -sudo apt-get dist-upgrade -y -</code></pre> -<ul> -<li>If asked to restart services, restart the default ones proposed.</li> -<li>Restart the VM when the installation is completed.</li> -</ul> - - - - - - - - - - - - - - </article> - </div> - - -<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> - </div> - - <button type="button" class="md-top md-icon" data-md-component="top" hidden> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> - Back to top -</button> - - </main> - - <footer class="md-footer"> - - - - <div class="md-footer-meta md-typeset"> - <div class="md-footer-meta__inner md-grid"> - <div class="md-copyright"> - - <div class="md-copyright__highlight"> - Copyright © 2019-2024 TeraflowSDN Project - </div> - - - Made with - <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> - Material for MkDocs - </a> - -</div> - - <div class="md-social"> - - - - - - - - - <a href="https://tfs.etsi.org/" target="_blank" rel="noopener" title="tfs.etsi.org" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M352 256c0 22.2-1.2 43.6-3.3 64H163.4c-2.2-20.4-3.3-41.8-3.3-64s1.2-43.6 3.3-64h185.3c2.2 20.4 3.3 41.8 3.3 64m28.8-64h123.1c5.3 20.5 8.1 41.9 8.1 64s-2.8 43.5-8.1 64H380.8c2.1-20.6 3.2-42 3.2-64s-1.1-43.4-3.2-64m112.6-32H376.7c-10-63.9-29.8-117.4-55.3-151.6 78.3 20.7 142 77.5 171.9 151.6zm-149.1 0H167.7c6.1-36.4 15.5-68.6 27-94.7 10.5-23.6 22.2-40.7 33.5-51.5C239.4 3.2 248.7 0 256 0s16.6 3.2 27.8 13.8c11.3 10.8 23 27.9 33.5 51.5 11.6 26 20.9 58.2 27 94.7m-209 0H18.6c30-74.1 93.6-130.9 172-151.6-25.5 34.2-45.3 87.7-55.3 151.6M8.1 192h123.1c-2.1 20.6-3.2 42-3.2 64s1.1 43.4 3.2 64H8.1C2.8 299.5 0 278.1 0 256s2.8-43.5 8.1-64m186.6 254.6c-11.6-26-20.9-58.2-27-94.6h176.6c-6.1 36.4-15.5 68.6-27 94.6-10.5 23.6-22.2 40.7-33.5 51.5-11.2 10.7-20.5 13.9-27.8 13.9s-16.6-3.2-27.8-13.8c-11.3-10.8-23-27.9-33.5-51.5zM135.3 352c10 63.9 29.8 117.4 55.3 151.6-78.4-20.7-142-77.5-172-151.6zm358.1 0c-30 74.1-93.6 130.9-171.9 151.6 25.5-34.2 45.2-87.7 55.3-151.6h116.7z"/></svg> - </a> - - - - - - - - - <a href="https://labs.etsi.org/rep/tfs" target="_blank" rel="noopener" title="labs.etsi.org" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </a> - - - - - - - - - <a href="https://www.linkedin.com/company/teraflowsdn/" target="_blank" rel="noopener" title="www.linkedin.com" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3M135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5m282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9z"/></svg> - </a> - - - - - - - - - <a href="https://twitter.com/TeraflowSDN" target="_blank" rel="noopener" title="twitter.com" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8l164.9-188.5L26.8 48h145.6l100.5 132.9zm-24.8 373.8h39.1L151.1 88h-42z"/></svg> - </a> - -</div> - - </div> - </div> -</footer> - - </div> - <div class="md-dialog" data-md-component="dialog"> - <div class="md-dialog__inner md-typeset"></div> - </div> - - <div class="md-progress" data-md-component="progress" role="progressbar"></div> - - - <script id="__config" type="application/json">{"base": "../../..", "features": ["navigation.instant", "navigation.instant.progress", "navigation.top", "navigation.footer", "navigation.path", "search", "search.highlight", "toc.integrate"], "search": "../../../assets/javascripts/workers/search.6ce7567c.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": {"provider": "mike"}}</script> - - - <script src="../../../assets/javascripts/bundle.83f73b43.min.js"></script> - - - </body> -</html> \ No newline at end of file diff --git a/public/develop/deployment_guide/configure_your_machine/vagrant_box/index.html b/public/develop/deployment_guide/configure_your_machine/vagrant_box/index.html deleted file mode 100644 index 91cb3de..0000000 --- a/public/develop/deployment_guide/configure_your_machine/vagrant_box/index.html +++ /dev/null @@ -1,615 +0,0 @@ - -<!doctype html> -<html lang="en" class="no-js"> - <head> - - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - - <meta name="description" content="ETSI SDG TFS Documentation page"> - - - <meta name="author" content="TeraflowSDN by ETSI"> - - - <link rel="canonical" href="https://tfs.etsi.org/develop/deployment_guide/configure_your_machine/vagrant_box/"> - - - - - <link rel="icon" href="../../../images/favicon.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42"> - - - - <title>Vagrant box - ETSI SDG TFS Documentation</title> - - - - <link rel="stylesheet" href="../../../assets/stylesheets/main.0253249f.min.css"> - - - <link rel="stylesheet" href="../../../assets/stylesheets/palette.06af60db.min.css"> - - - - - - - - - - - - - <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> - <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> - - - - <link rel="stylesheet" href="../../../stylesheets/extra.css"> - - <script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> - - - - - - - </head> - - - - - - - - <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="0D47A1" data-md-color-accent="1565C0"> - - - <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> - <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> - <label class="md-overlay" for="__drawer"></label> - <div data-md-component="skip"> - - - <a href="#virtual-machine-specifications" class="md-skip"> - Skip to content - </a> - - </div> - <div data-md-component="announce"> - - </div> - - <div data-md-color-scheme="default" data-md-component="outdated" hidden> - - </div> - - - - - - -<header class="md-header md-header--shadow" data-md-component="header"> - <nav class="md-header__inner md-grid" aria-label="Header"> - <a href="../../.." title="ETSI SDG TFS Documentation" class="md-header__button md-logo" aria-label="ETSI SDG TFS Documentation" data-md-component="logo"> - - <img src="../../../images/logos/TeraFlow SDN Logo Screen_B_W NEG.png" alt="logo"> - - </a> - <label class="md-header__button md-icon" for="__drawer"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> - </label> - <div class="md-header__title" data-md-component="header-title"> - <div class="md-header__ellipsis"> - <div class="md-header__topic"> - <span class="md-ellipsis"> - ETSI SDG TFS Documentation - </span> - </div> - <div class="md-header__topic" data-md-component="header-topic"> - <span class="md-ellipsis"> - - Vagrant box - - </span> - </div> - </div> - </div> - - - - - - - <label class="md-header__button md-icon" for="__search"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> - </label> - <div class="md-search" data-md-component="search" role="dialog"> - <label class="md-search__overlay" for="__search"></label> - <div class="md-search__inner" role="search"> - <form class="md-search__form" name="search"> - <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> - <label class="md-search__icon md-icon" for="__search"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> - </label> - <nav class="md-search__options" aria-label="Search"> - - <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> - </button> - </nav> - - </form> - <div class="md-search__output"> - <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> - <div class="md-search-result" data-md-component="search-result"> - <div class="md-search-result__meta"> - Initializing search - </div> - <ol class="md-search-result__list" role="presentation"></ol> - </div> - </div> - </div> - </div> -</div> - - - <div class="md-header__source"> - <a href="https://labs.etsi.org/rep/tfs" title="Go to repository" class="md-source" data-md-component="source"> - <div class="md-source__icon md-icon"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </div> - <div class="md-source__repository"> - TFS GitLab - </div> -</a> - </div> - - </nav> - -</header> - - <div class="md-container" data-md-component="container"> - - - - - - - <main class="md-main" data-md-component="main"> - <div class="md-main__inner md-grid"> - - - - <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > - <div class="md-sidebar__scrollwrap"> - <div class="md-sidebar__inner"> - - - - - - -<nav class="md-nav md-nav--primary md-nav--integrated" aria-label="Navigation" data-md-level="0"> - <label class="md-nav__title" for="__drawer"> - <a href="../../.." title="ETSI SDG TFS Documentation" class="md-nav__button md-logo" aria-label="ETSI SDG TFS Documentation" data-md-component="logo"> - - <img src="../../../images/logos/TeraFlow SDN Logo Screen_B_W NEG.png" alt="logo"> - - </a> - ETSI SDG TFS Documentation - </label> - - <div class="md-nav__source"> - <a href="https://labs.etsi.org/rep/tfs" title="Go to repository" class="md-source" data-md-component="source"> - <div class="md-source__icon md-icon"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </div> - <div class="md-source__repository"> - TFS GitLab - </div> -</a> - </div> - - <ul class="md-nav__list" data-md-scrollfix> - - - - - - - - <li class="md-nav__item"> - <a href="../../deployment_guide/" class="md-nav__link"> - - - <span class="md-ellipsis"> - 1. Deployment Guide - </span> - - - </a> - </li> - - - - - - - - - - <li class="md-nav__item"> - <a href="../../../development_guide/development_guide/" class="md-nav__link"> - - - <span class="md-ellipsis"> - 2. Development Guide - </span> - - - </a> - </li> - - - - </ul> -</nav> - </div> - </div> - </div> - - - - - <div class="md-content" data-md-component="content"> - <article class="md-content__inner md-typeset"> - - - - -<p>This page describes how to create a Vagrant Box, using the base virtual machine configured in <a href="./1.1.2.-Oracle-Virtual-Box">Oracle Virtual Box</a>.</p> -<h1 id="virtual-machine-specifications">Virtual Machine specifications</h1> -<p>Most of the specifications can be as specified in the <a href="./1.1.2.-Oracle-Virtual-Box">Oracle Virtual Box</a> page, however, there are a few particularities to Vagrant that must be accommodated, such as: -- Virtual Hard Disk - - Size: 60GB (at least) - - <strong>Type</strong>: VMDK</p> -<p><img alt="spaces_huDzAu5hmjUdNzCGBBbL_uploads_jrerlmLyZWi5f2Tzb7xY_Screenshot_from_2023-07-10_18-13-43" src="uploads/23ff9a3d6884646f7859a29d8f5ab934/spaces_huDzAu5hmjUdNzCGBBbL_uploads_jrerlmLyZWi5f2Tzb7xY_Screenshot_from_2023-07-10_18-13-43.webp" /></p> -<p>Also, before initiating the VM and installing the OS, we'll need to: -- Disable Floppy in the 'Boot Order' -- Disable audio -- Disable USB -- Ensure Network Adapter 1 is set to NAT</p> -<h1 id="network-configurations">Network configurations</h1> -<p>At Network Adapt 1, the following port-forwarding rule must be set.</p> -<table> -<thead> -<tr> -<th>Name</th> -<th>Protocol</th> -<th>Host IP</th> -<th>Host Port</th> -<th>Guest IP</th> -<th>Guest Port</th> -</tr> -</thead> -<tbody> -<tr> -<td>SSH</td> -<td>TCP</td> -<td></td> -<td><strong>2222</strong></td> -<td></td> -<td>22</td> -</tr> -</tbody> -</table> -<p><img alt="Screenshot_from_2023-07-10_18-25-18" src="uploads/ced8e7b1133d6831e0c203801b6ba448/Screenshot_from_2023-07-10_18-25-18.png" /></p> -<h1 id="installing-the-os">Installing the OS</h1> -<p>For a Vagrant Box, it is generally suggested that the ISO's server version is used, as it is intended to be used via SSH, and any web GUI is expected to be forwarded to the host.</p> -<p><img alt="Screenshot_from_2023-07-10_18-41-49" src="uploads/063d318dba47b72856ebb6d9a9b4390e/Screenshot_from_2023-07-10_18-41-49.png" /></p> -<p><img alt="Screenshot_from_2023-07-10_18-42-30" src="uploads/9e3879f84786c891af526cbea2de58e7/Screenshot_from_2023-07-10_18-42-30.png" /></p> -<p><img alt="Screenshot_from_2023-07-10_18-42-45" src="uploads/e615cc7a5e03623ffdf62a310ca86cd6/Screenshot_from_2023-07-10_18-42-45.png" /></p> -<p>Make sure the disk is not configured as an LVM group!</p> -<p><img alt="Screenshot_from_2023-07-10_18-43-16" src="uploads/7ab80c83d6c01c255969f4da1691eb85/Screenshot_from_2023-07-10_18-43-16.png" /></p> -<h2 id="vagrant-ser">Vagrant ser</h2> -<p>Vagrant expects by default, that in the box's OS exists the user <code>vagrant</code> with the password also being <code>vagrant</code>.</p> -<p><img alt="Screenshot_from_2023-07-10_18-54-12" src="uploads/39e1b5868733d40c12d86bdde165ede0/Screenshot_from_2023-07-10_18-54-12.png" /></p> -<h2 id="ssh">SSH</h2> -<p>Vagrant uses SSH to connect to the boxes, so installing it now will save the hassle of doing it later.</p> -<p><img alt="Screenshot_from_2023-07-10_18-54-48" src="uploads/5ecded27ab7966a4748ea5c25f98ab13/Screenshot_from_2023-07-10_18-54-48.png" /></p> -<h2 id="features-server-snaps">Features server snaps</h2> -<p>Do not install featured server snaps. It will be done manually <a href="./1.-Deployment-Guide/1.2.-Install-Microk8s">later</a> to illustrate how to uninstall and reinstall them in case of trouble with.</p> -<h2 id="updates">Updates</h2> -<p>Let the system install and upgrade the packages. This operation might take some minutes depending on how old is the Optical Drive ISO image you use and your Internet connection speed.</p> -<h2 id="upgrade-the-ubuntu-distribution">Upgrade the Ubuntu distribution</h2> -<pre><code class="language-bash">sudo apt-get update -y -sudo apt-get dist-upgrade -y -</code></pre> -<ul> -<li>If asked to restart services, restart the default ones proposed.</li> -<li>Restart the VM when the installation is completed.</li> -</ul> -<h3 id="install-virtualbox-guest-additions">Install VirtualBox Guest Additions</h3> -<p>On VirtualBox Manager, open the VM main screen. If you are running the VM in headless -mode, right-click over the VM in the VirtualBox Manager window, and click "Show". -If a dialog informing about how to leave the interface of the VM is shown, confirm -by pressing the "Switch" button. The interface of the VM should appear.</p> -<p>Click the menu "Device > Insert Guest Additions CD image..."</p> -<p>On the VM terminal, type:</p> -<pre><code class="language-bash">sudo apt-get install -y linux-headers-$(uname -r) build-essential dkms - # This command might take some minutes depending on your VM specs and your Internet access speed. -sudo mount /dev/cdrom /mnt/ -cd /mnt/ -sudo ./VBoxLinuxAdditions.run - # This command might take some minutes depending on your VM specs. -sudo reboot -</code></pre> -<h1 id="etsi-tfs-installation">ETSI TFS Installation</h1> -<p>After this, proceed to <a href="./1.-Deployment-Guide/1.2.-Install-Microk8s">1.2. Install Microk8s</a>, after which, return to this wiki to finish the Vagrant Box creation.</p> -<h1 id="box-configuration-and-creation">Box configuration and creation</h1> -<p>Make sure the ETSI TFS controller is correctly configured. <strong>You will not be able to change it after!</strong></p> -<p>It is advisable to do the next configurations from a host's terminal, via a SSH connection.</p> -<pre><code class="language-bash">ssh -p 2222 vagrant@127.0.0.1 -</code></pre> -<h2 id="set-root-password">Set root password</h2> -<p>Set the root password to <code>vagrant</code>.</p> -<pre><code class="language-bash">sudo passwd root -</code></pre> -<h2 id="set-the-superuser">Set the superuser</h2> -<p>Set up the Vagrant user so that it’s able to use sudo without being prompted for a password. -Anything in the <code>/etc/sudoers.d/*</code> directory is included in the sudoers privileges when created by the root user. -Create a new sudo file.</p> -<pre><code class="language-bash">sudo visudo -f /etc/sudoers.d/vagrant -</code></pre> -<p>and add the following lines</p> -<pre><code class="language-text"># add vagrant user -vagrant ALL=(ALL) NOPASSWD:ALL -</code></pre> -<p>You can now test that it works by running a simple command.</p> -<pre><code class="language-bash">sudo pwd -</code></pre> -<p>Issuing this command should result in an immediate response without a request for a password.</p> -<h2 id="install-the-vagrant-key">Install the Vagrant key</h2> -<p>Vagrant uses a default set of SSH keys for you to directly connect to boxes via the CLI command <code>vagrant ssh</code>, after which it creates a new set of SSH keys for your new box. Because of this, we need to load the default key to be able to access the box after created.</p> -<pre><code class="language-bash">chmod 0700 /home/vagrant/.ssh -wget --no-check-certificate https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub -O /home/vagrant/.ssh/authorized_keys -chmod 0600 /home/vagrant/.ssh/authorized_keys -chown -R vagrant /home/vagrant/.ssh -</code></pre> -<h2 id="configure-the-openssh-server">Configure the OpenSSH Server</h2> -<p>Edit the <code>/etc/ssh/sshd_config</code> file:</p> -<pre><code class="language-bash">sudo vim /etc/ssh/sshd_config -</code></pre> -<p>And uncomment the following line:</p> -<pre><code class="language-bash">AuthorizedKeysFile %h/.ssh/authorized_keys -</code></pre> -<p>Then restart SSH.</p> -<pre><code class="language-bash">sudo service ssh restart -</code></pre> -<h2 id="package-the-box">Package the box</h2> -<p>Before you package the box, if you intend to make your box public, it is best to clean your bash history with:</p> -<pre><code class="language-bash">history -c -</code></pre> -<p>Exit the SSH connection, and <strong>at you're host machine</strong>, package the VM:</p> -<pre><code class="language-bash">vagrant package --base teraflowsdncontroller --output teraflowsdncontroller.box -</code></pre> -<h2 id="test-run-the-box">Test run the box</h2> -<p>Add the base box to you local Vagrant box list:</p> -<pre><code class="language-bash">vagrant box add --name teraflowsdncontroller ./teraflowsdncontroller.box -</code></pre> -<p>Now you should try to run it, for that you'll need to create a <strong>Vagrantfile</strong>. For a simple run, this is the minimal required code for this box:</p> -<pre><code class="language-ruby"># -*- mode: ruby -*- -# vi: set ft=ruby : - -Vagrant.configure("2") do |config| - config.vm.box = "teraflowsdncontroller" - config.vm.box_version = "1.1.0" - config.vm.network :forwarded_port, host: 8080 ,guest: 80 -end -</code></pre> -<p>Now you'll be able to spin up the virtual machine by issuing the command:</p> -<pre><code class="language-bash">vagrant up -</code></pre> -<p>And connect to the machine using:</p> -<pre><code class="language-bash">vagrant ssh -</code></pre> -<h1 id="pre-configured-boxes">Pre-configured boxes</h1> -<p>If you do not wish to create your own Vagrant Box, you can use one of the existing ones created by TFS contributors. -- <a href="https://app.vagrantup.com/davidjosearaujo/boxes/teraflowsdncontroller">davidjosearaujo/teraflowsdncontroller</a> -- ... <!-- Should create and host one at ETSI!! --></p> -<p>To use them, you simply have to create a Vagrantfile and run <code>vagrant up controller</code> in the same directory. The following example Vagrantfile already allows you to do just that, with the bonus of exposing the multiple management GUIs to your <code>localhost</code>.</p> -<pre><code class="language-ruby">Vagrant.configure("2") do |config| - - config.vm.define "controller" do |controller| - controller.vm.box = "davidjosearaujo/teraflowsdncontroller" - controller.vm.network "forwarded_port", guest: 80, host: 8080 # WebUI - controller.vm.network "forwarded_port", guest: 8084, host: 50750 # Linkerd Viz Dashboard - controller.vm.network "forwarded_port", guest: 8081, host: 8081 # CockroachDB Dashboard - controller.vm.network "forwarded_port", guest: 8222, host: 8222 # NATS Dashboard - controller.vm.network "forwarded_port", guest: 9000, host: 9000 # QuestDB Dashboard - controller.vm.network "forwarded_port", guest: 9090, host: 9090 # Prometheus Dashboard - - # Setup Linkerd Viz reverse proxy - ## Copy config file - controller.vm.provision "file" do |f| - f.source = "./reverse-proxy-linkerdviz.sh" - f.destination = "./reverse-proxy-linkerdviz.sh" - end - ## Execute configuration file - controller.vm.provision "shell" do |s| - s.inline = "chmod +x ./reverse-proxy-linkerdviz.sh && ./reverse-proxy-linkerdviz.sh" - end - - # Update controller source code to the desired branch - if ENV['BRANCH'] != nil - controller.vm.provision "shell" do |s| - s.inline = "cd ./tfs-ctrl && git pull && git switch " + ENV['BRANCH'] - end - end - - end -end -</code></pre> -<p>This Vagrantfile also allows for <strong>optional repository updates</strong> on startup by running the command with a specified environment variable <code>BRANCH</code></p> -<pre><code class="language-bash">BRANCH=develop vagrant up controller -</code></pre> -<h2 id="linkerd-dns-rebinding-bypass">Linkerd DNS rebinding bypass</h2> -<p>Because of Linkerd's security measures against DNS rebinding, a reverse proxy, that modifies the request's header <code>Host</code> field, is needed to expose the GUI to the host. The previous Vagrantfile already deploys such configurations, for that, all you need to do is create the <code>reverse-proxy-linkerdviz.sh</code> file in the same directory. The content of this file is displayed below.</p> -<pre><code class="language-bash"># Install NGINX -sudo apt update && sudo apt install nginx -y - -# NGINX reverse proxy configuration -echo 'server { - listen 8084; - - location / { - proxy_pass http://127.0.0.1:50750; - proxy_set_header Host localhost; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - } -}' > /home/vagrant/expose-linkerd - -# Create symlink of the NGINX configuration file -sudo ln -s /home/vagrant/expose-linkerd /etc/nginx/sites-enabled/ - -# Commit the reverse proxy configurations -sudo systemctl restart nginx - -# Enable start on login -echo "linkerd viz dashboard &" >> .profile - -# Start dashboard -linkerd viz dashboard & - -echo "Linkerd Viz dashboard running!" -</code></pre> - - - - - - - - - - - - - - </article> - </div> - - -<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> - </div> - - <button type="button" class="md-top md-icon" data-md-component="top" hidden> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> - Back to top -</button> - - </main> - - <footer class="md-footer"> - - - - <div class="md-footer-meta md-typeset"> - <div class="md-footer-meta__inner md-grid"> - <div class="md-copyright"> - - <div class="md-copyright__highlight"> - Copyright © 2019-2024 TeraflowSDN Project - </div> - - - Made with - <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> - Material for MkDocs - </a> - -</div> - - <div class="md-social"> - - - - - - - - - <a href="https://tfs.etsi.org/" target="_blank" rel="noopener" title="tfs.etsi.org" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M352 256c0 22.2-1.2 43.6-3.3 64H163.4c-2.2-20.4-3.3-41.8-3.3-64s1.2-43.6 3.3-64h185.3c2.2 20.4 3.3 41.8 3.3 64m28.8-64h123.1c5.3 20.5 8.1 41.9 8.1 64s-2.8 43.5-8.1 64H380.8c2.1-20.6 3.2-42 3.2-64s-1.1-43.4-3.2-64m112.6-32H376.7c-10-63.9-29.8-117.4-55.3-151.6 78.3 20.7 142 77.5 171.9 151.6zm-149.1 0H167.7c6.1-36.4 15.5-68.6 27-94.7 10.5-23.6 22.2-40.7 33.5-51.5C239.4 3.2 248.7 0 256 0s16.6 3.2 27.8 13.8c11.3 10.8 23 27.9 33.5 51.5 11.6 26 20.9 58.2 27 94.7m-209 0H18.6c30-74.1 93.6-130.9 172-151.6-25.5 34.2-45.3 87.7-55.3 151.6M8.1 192h123.1c-2.1 20.6-3.2 42-3.2 64s1.1 43.4 3.2 64H8.1C2.8 299.5 0 278.1 0 256s2.8-43.5 8.1-64m186.6 254.6c-11.6-26-20.9-58.2-27-94.6h176.6c-6.1 36.4-15.5 68.6-27 94.6-10.5 23.6-22.2 40.7-33.5 51.5-11.2 10.7-20.5 13.9-27.8 13.9s-16.6-3.2-27.8-13.8c-11.3-10.8-23-27.9-33.5-51.5zM135.3 352c10 63.9 29.8 117.4 55.3 151.6-78.4-20.7-142-77.5-172-151.6zm358.1 0c-30 74.1-93.6 130.9-171.9 151.6 25.5-34.2 45.2-87.7 55.3-151.6h116.7z"/></svg> - </a> - - - - - - - - - <a href="https://labs.etsi.org/rep/tfs" target="_blank" rel="noopener" title="labs.etsi.org" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </a> - - - - - - - - - <a href="https://www.linkedin.com/company/teraflowsdn/" target="_blank" rel="noopener" title="www.linkedin.com" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3M135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5m282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9z"/></svg> - </a> - - - - - - - - - <a href="https://twitter.com/TeraflowSDN" target="_blank" rel="noopener" title="twitter.com" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8l164.9-188.5L26.8 48h145.6l100.5 132.9zm-24.8 373.8h39.1L151.1 88h-42z"/></svg> - </a> - -</div> - - </div> - </div> -</footer> - - </div> - <div class="md-dialog" data-md-component="dialog"> - <div class="md-dialog__inner md-typeset"></div> - </div> - - <div class="md-progress" data-md-component="progress" role="progressbar"></div> - - - <script id="__config" type="application/json">{"base": "../../..", "features": ["navigation.instant", "navigation.instant.progress", "navigation.top", "navigation.footer", "navigation.path", "search", "search.highlight", "toc.integrate"], "search": "../../../assets/javascripts/workers/search.6ce7567c.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": {"provider": "mike"}}</script> - - - <script src="../../../assets/javascripts/bundle.83f73b43.min.js"></script> - - - </body> -</html> \ No newline at end of file diff --git a/public/develop/deployment_guide/configure_your_machine/vm_ware_fusion/index.html b/public/develop/deployment_guide/configure_your_machine/vm_ware_fusion/index.html deleted file mode 100644 index 119a76c..0000000 --- a/public/develop/deployment_guide/configure_your_machine/vm_ware_fusion/index.html +++ /dev/null @@ -1,447 +0,0 @@ - -<!doctype html> -<html lang="en" class="no-js"> - <head> - - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - - <meta name="description" content="ETSI SDG TFS Documentation page"> - - - <meta name="author" content="TeraflowSDN by ETSI"> - - - <link rel="canonical" href="https://tfs.etsi.org/develop/deployment_guide/configure_your_machine/vm_ware_fusion/"> - - - - - <link rel="icon" href="../../../images/favicon.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42"> - - - - <title>Vm ware fusion - ETSI SDG TFS Documentation</title> - - - - <link rel="stylesheet" href="../../../assets/stylesheets/main.0253249f.min.css"> - - - <link rel="stylesheet" href="../../../assets/stylesheets/palette.06af60db.min.css"> - - - - - - - - - - - - - <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> - <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> - - - - <link rel="stylesheet" href="../../../stylesheets/extra.css"> - - <script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> - - - - - - - </head> - - - - - - - - <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="0D47A1" data-md-color-accent="1565C0"> - - - <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> - <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> - <label class="md-overlay" for="__drawer"></label> - <div data-md-component="skip"> - - - <a href="#create-vm-in-vmware-fusion" class="md-skip"> - Skip to content - </a> - - </div> - <div data-md-component="announce"> - - </div> - - <div data-md-color-scheme="default" data-md-component="outdated" hidden> - - </div> - - - - - - -<header class="md-header md-header--shadow" data-md-component="header"> - <nav class="md-header__inner md-grid" aria-label="Header"> - <a href="../../.." title="ETSI SDG TFS Documentation" class="md-header__button md-logo" aria-label="ETSI SDG TFS Documentation" data-md-component="logo"> - - <img src="../../../images/logos/TeraFlow SDN Logo Screen_B_W NEG.png" alt="logo"> - - </a> - <label class="md-header__button md-icon" for="__drawer"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> - </label> - <div class="md-header__title" data-md-component="header-title"> - <div class="md-header__ellipsis"> - <div class="md-header__topic"> - <span class="md-ellipsis"> - ETSI SDG TFS Documentation - </span> - </div> - <div class="md-header__topic" data-md-component="header-topic"> - <span class="md-ellipsis"> - - Vm ware fusion - - </span> - </div> - </div> - </div> - - - - - - - <label class="md-header__button md-icon" for="__search"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> - </label> - <div class="md-search" data-md-component="search" role="dialog"> - <label class="md-search__overlay" for="__search"></label> - <div class="md-search__inner" role="search"> - <form class="md-search__form" name="search"> - <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> - <label class="md-search__icon md-icon" for="__search"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> - </label> - <nav class="md-search__options" aria-label="Search"> - - <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> - </button> - </nav> - - </form> - <div class="md-search__output"> - <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> - <div class="md-search-result" data-md-component="search-result"> - <div class="md-search-result__meta"> - Initializing search - </div> - <ol class="md-search-result__list" role="presentation"></ol> - </div> - </div> - </div> - </div> -</div> - - - <div class="md-header__source"> - <a href="https://labs.etsi.org/rep/tfs" title="Go to repository" class="md-source" data-md-component="source"> - <div class="md-source__icon md-icon"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </div> - <div class="md-source__repository"> - TFS GitLab - </div> -</a> - </div> - - </nav> - -</header> - - <div class="md-container" data-md-component="container"> - - - - - - - <main class="md-main" data-md-component="main"> - <div class="md-main__inner md-grid"> - - - - <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > - <div class="md-sidebar__scrollwrap"> - <div class="md-sidebar__inner"> - - - - - - -<nav class="md-nav md-nav--primary md-nav--integrated" aria-label="Navigation" data-md-level="0"> - <label class="md-nav__title" for="__drawer"> - <a href="../../.." title="ETSI SDG TFS Documentation" class="md-nav__button md-logo" aria-label="ETSI SDG TFS Documentation" data-md-component="logo"> - - <img src="../../../images/logos/TeraFlow SDN Logo Screen_B_W NEG.png" alt="logo"> - - </a> - ETSI SDG TFS Documentation - </label> - - <div class="md-nav__source"> - <a href="https://labs.etsi.org/rep/tfs" title="Go to repository" class="md-source" data-md-component="source"> - <div class="md-source__icon md-icon"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </div> - <div class="md-source__repository"> - TFS GitLab - </div> -</a> - </div> - - <ul class="md-nav__list" data-md-scrollfix> - - - - - - - - <li class="md-nav__item"> - <a href="../../deployment_guide/" class="md-nav__link"> - - - <span class="md-ellipsis"> - 1. Deployment Guide - </span> - - - </a> - </li> - - - - - - - - - - <li class="md-nav__item"> - <a href="../../../development_guide/development_guide/" class="md-nav__link"> - - - <span class="md-ellipsis"> - 2. Development Guide - </span> - - - </a> - </li> - - - - </ul> -</nav> - </div> - </div> - </div> - - - - - <div class="md-content" data-md-component="content"> - <article class="md-content__inner md-typeset"> - - - - -<p>This page describes how to configure a VM for running ETSI TeraFlowSDN(TFS) controller using <a href="https://www.vmware.com/products/fusion.html">VMWare Fusion</a>. It has been tested with VMWare Fusion version 12 and 13.</p> -<h1 id="create-vm-in-vmware-fusion">Create VM in VMWare Fusion:</h1> -<p>In "VMWare Fusion" manager, create a new network from the "Settings/Network" menu.</p> -<ul> -<li>Unlock to make changes</li> -<li>Press the + icon and create a new network</li> -<li>Change the name to TFS-NAT-Net</li> -<li>Check "Allow virtual machines on this network to connect to external network (NAT)"</li> -<li>Do not check "Enable IPv6"</li> -<li>Add port forwarding for HTTP and SSH</li> -<li>Uncheck "Provide address on this network via DHCP"</li> -</ul> -<p>Create a new VM an Ubuntu 22.04.1 ISO:</p> -<ul> -<li>Display Name: TeraFlowSDN</li> -<li>Username: tfs</li> -<li>Password: tfs123</li> -</ul> -<p>On the next screen press "Customize Settings", save the VM and in "Settings" change: -- Change to use 4 CPUs -- Change to access 8 GB of RAM -- Change disk to size 60 GB -- Change the network interface to use the previously created TFS-NAT-Net</p> -<p>Run the VM to start the installation.</p> -<h1 id="install-ubuntu-22041-lts-operating-system">Install Ubuntu 22.04.1 LTS Operating System</h1> -<p>The installation will be automatic, without any configuration required.</p> -<ul> -<li>Configure the guest IP, gateway and DNS:</li> -</ul> -<p>Using the Network Settings for the wired connection, set the IP to 10.0.2.10, - the mask to 255.255.255.0, the gateway to 10.0.2.2 and the DNS to 10.0.2.2.</p> -<ul> -<li>Disable and remove swap file:</li> -</ul> -<p>$ sudo swapoff -a - $ sudo rm /swapfile</p> -<p>Then you can remove or comment the /swapfile entry in /etc/fstab</p> -<ul> -<li>Install Open SSH Server</li> -<li> -<p>Import SSH keys, if any.</p> -</li> -<li> -<p>Restart the VM when the installation is completed.</p> -</li> -</ul> -<h1 id="upgrade-the-ubuntu-distribution">Upgrade the Ubuntu distribution</h1> -<pre><code class="language-bash">sudo apt-get update -y -sudo apt-get dist-upgrade -y -</code></pre> - - - - - - - - - - - - - - </article> - </div> - - -<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> - </div> - - <button type="button" class="md-top md-icon" data-md-component="top" hidden> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> - Back to top -</button> - - </main> - - <footer class="md-footer"> - - - - <div class="md-footer-meta md-typeset"> - <div class="md-footer-meta__inner md-grid"> - <div class="md-copyright"> - - <div class="md-copyright__highlight"> - Copyright © 2019-2024 TeraflowSDN Project - </div> - - - Made with - <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> - Material for MkDocs - </a> - -</div> - - <div class="md-social"> - - - - - - - - - <a href="https://tfs.etsi.org/" target="_blank" rel="noopener" title="tfs.etsi.org" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M352 256c0 22.2-1.2 43.6-3.3 64H163.4c-2.2-20.4-3.3-41.8-3.3-64s1.2-43.6 3.3-64h185.3c2.2 20.4 3.3 41.8 3.3 64m28.8-64h123.1c5.3 20.5 8.1 41.9 8.1 64s-2.8 43.5-8.1 64H380.8c2.1-20.6 3.2-42 3.2-64s-1.1-43.4-3.2-64m112.6-32H376.7c-10-63.9-29.8-117.4-55.3-151.6 78.3 20.7 142 77.5 171.9 151.6zm-149.1 0H167.7c6.1-36.4 15.5-68.6 27-94.7 10.5-23.6 22.2-40.7 33.5-51.5C239.4 3.2 248.7 0 256 0s16.6 3.2 27.8 13.8c11.3 10.8 23 27.9 33.5 51.5 11.6 26 20.9 58.2 27 94.7m-209 0H18.6c30-74.1 93.6-130.9 172-151.6-25.5 34.2-45.3 87.7-55.3 151.6M8.1 192h123.1c-2.1 20.6-3.2 42-3.2 64s1.1 43.4 3.2 64H8.1C2.8 299.5 0 278.1 0 256s2.8-43.5 8.1-64m186.6 254.6c-11.6-26-20.9-58.2-27-94.6h176.6c-6.1 36.4-15.5 68.6-27 94.6-10.5 23.6-22.2 40.7-33.5 51.5-11.2 10.7-20.5 13.9-27.8 13.9s-16.6-3.2-27.8-13.8c-11.3-10.8-23-27.9-33.5-51.5zM135.3 352c10 63.9 29.8 117.4 55.3 151.6-78.4-20.7-142-77.5-172-151.6zm358.1 0c-30 74.1-93.6 130.9-171.9 151.6 25.5-34.2 45.2-87.7 55.3-151.6h116.7z"/></svg> - </a> - - - - - - - - - <a href="https://labs.etsi.org/rep/tfs" target="_blank" rel="noopener" title="labs.etsi.org" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </a> - - - - - - - - - <a href="https://www.linkedin.com/company/teraflowsdn/" target="_blank" rel="noopener" title="www.linkedin.com" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3M135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5m282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9z"/></svg> - </a> - - - - - - - - - <a href="https://twitter.com/TeraflowSDN" target="_blank" rel="noopener" title="twitter.com" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8l164.9-188.5L26.8 48h145.6l100.5 132.9zm-24.8 373.8h39.1L151.1 88h-42z"/></svg> - </a> - -</div> - - </div> - </div> -</footer> - - </div> - <div class="md-dialog" data-md-component="dialog"> - <div class="md-dialog__inner md-typeset"></div> - </div> - - <div class="md-progress" data-md-component="progress" role="progressbar"></div> - - - <script id="__config" type="application/json">{"base": "../../..", "features": ["navigation.instant", "navigation.instant.progress", "navigation.top", "navigation.footer", "navigation.path", "search", "search.highlight", "toc.integrate"], "search": "../../../assets/javascripts/workers/search.6ce7567c.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": {"provider": "mike"}}</script> - - - <script src="../../../assets/javascripts/bundle.83f73b43.min.js"></script> - - - </body> -</html> \ No newline at end of file diff --git a/public/develop/deployment_guide/deploy_TeraFlowSDN/deploy_TeraFlowSDN/index.html b/public/develop/deployment_guide/deploy_TeraFlowSDN/deploy_TeraFlowSDN/index.html deleted file mode 100644 index c66c0be..0000000 --- a/public/develop/deployment_guide/deploy_TeraFlowSDN/deploy_TeraFlowSDN/index.html +++ /dev/null @@ -1,536 +0,0 @@ - -<!doctype html> -<html lang="en" class="no-js"> - <head> - - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - - <meta name="description" content="ETSI SDG TFS Documentation page"> - - - <meta name="author" content="TeraflowSDN by ETSI"> - - - <link rel="canonical" href="https://tfs.etsi.org/develop/deployment_guide/deploy_TeraFlowSDN/deploy_TeraFlowSDN/"> - - - - - <link rel="icon" href="../../../images/favicon.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42"> - - - - <title>deploy TeraFlowSDN - ETSI SDG TFS Documentation</title> - - - - <link rel="stylesheet" href="../../../assets/stylesheets/main.0253249f.min.css"> - - - <link rel="stylesheet" href="../../../assets/stylesheets/palette.06af60db.min.css"> - - - - - - - - - - - - - <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> - <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> - - - - <link rel="stylesheet" href="../../../stylesheets/extra.css"> - - <script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> - - - - - - - </head> - - - - - - - - <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="0D47A1" data-md-color-accent="1565C0"> - - - <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> - <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> - <label class="md-overlay" for="__drawer"></label> - <div data-md-component="skip"> - - - <a href="#install-prerequisites" class="md-skip"> - Skip to content - </a> - - </div> - <div data-md-component="announce"> - - </div> - - <div data-md-color-scheme="default" data-md-component="outdated" hidden> - - </div> - - - - - - -<header class="md-header md-header--shadow" data-md-component="header"> - <nav class="md-header__inner md-grid" aria-label="Header"> - <a href="../../.." title="ETSI SDG TFS Documentation" class="md-header__button md-logo" aria-label="ETSI SDG TFS Documentation" data-md-component="logo"> - - <img src="../../../images/logos/TeraFlow SDN Logo Screen_B_W NEG.png" alt="logo"> - - </a> - <label class="md-header__button md-icon" for="__drawer"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> - </label> - <div class="md-header__title" data-md-component="header-title"> - <div class="md-header__ellipsis"> - <div class="md-header__topic"> - <span class="md-ellipsis"> - ETSI SDG TFS Documentation - </span> - </div> - <div class="md-header__topic" data-md-component="header-topic"> - <span class="md-ellipsis"> - - deploy TeraFlowSDN - - </span> - </div> - </div> - </div> - - - - - - - <label class="md-header__button md-icon" for="__search"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> - </label> - <div class="md-search" data-md-component="search" role="dialog"> - <label class="md-search__overlay" for="__search"></label> - <div class="md-search__inner" role="search"> - <form class="md-search__form" name="search"> - <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> - <label class="md-search__icon md-icon" for="__search"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> - </label> - <nav class="md-search__options" aria-label="Search"> - - <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> - </button> - </nav> - - </form> - <div class="md-search__output"> - <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> - <div class="md-search-result" data-md-component="search-result"> - <div class="md-search-result__meta"> - Initializing search - </div> - <ol class="md-search-result__list" role="presentation"></ol> - </div> - </div> - </div> - </div> -</div> - - - <div class="md-header__source"> - <a href="https://labs.etsi.org/rep/tfs" title="Go to repository" class="md-source" data-md-component="source"> - <div class="md-source__icon md-icon"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </div> - <div class="md-source__repository"> - TFS GitLab - </div> -</a> - </div> - - </nav> - -</header> - - <div class="md-container" data-md-component="container"> - - - - - - - <main class="md-main" data-md-component="main"> - <div class="md-main__inner md-grid"> - - - - <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > - <div class="md-sidebar__scrollwrap"> - <div class="md-sidebar__inner"> - - - - - - -<nav class="md-nav md-nav--primary md-nav--integrated" aria-label="Navigation" data-md-level="0"> - <label class="md-nav__title" for="__drawer"> - <a href="../../.." title="ETSI SDG TFS Documentation" class="md-nav__button md-logo" aria-label="ETSI SDG TFS Documentation" data-md-component="logo"> - - <img src="../../../images/logos/TeraFlow SDN Logo Screen_B_W NEG.png" alt="logo"> - - </a> - ETSI SDG TFS Documentation - </label> - - <div class="md-nav__source"> - <a href="https://labs.etsi.org/rep/tfs" title="Go to repository" class="md-source" data-md-component="source"> - <div class="md-source__icon md-icon"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </div> - <div class="md-source__repository"> - TFS GitLab - </div> -</a> - </div> - - <ul class="md-nav__list" data-md-scrollfix> - - - - - - - - <li class="md-nav__item"> - <a href="../../deployment_guide/" class="md-nav__link"> - - - <span class="md-ellipsis"> - 1. Deployment Guide - </span> - - - </a> - </li> - - - - - - - - - - <li class="md-nav__item"> - <a href="../../../development_guide/development_guide/" class="md-nav__link"> - - - <span class="md-ellipsis"> - 2. Development Guide - </span> - - - </a> - </li> - - - - </ul> -</nav> - </div> - </div> - </div> - - - - - <div class="md-content" data-md-component="content"> - <article class="md-content__inner md-typeset"> - - - - - <h1>deploy TeraFlowSDN</h1> - -<p>This section describes how to deploy TeraFlowSDN controller on top of MicroK8s using the -environment configured in the previous sections.</p> -<h2 id="install-prerequisites">Install prerequisites</h2> -<pre><code class="language-bash">sudo apt-get install -y git curl jq -</code></pre> -<h2 id="clone-the-git-repository-of-the-teraflowsdn-controller">Clone the Git repository of the TeraFlowSDN controller</h2> -<p>Clone from ETSI-hosted GitLab code repository:</p> -<pre><code class="language-bash">mkdir ~/tfs-ctrl -git clone https://labs.etsi.org/rep/tfs/controller.git ~/tfs-ctrl -</code></pre> -<p><strong>Important</strong>: The original H2020-TeraFlow project hosted on GitLab.com has been -archieved and will not receive further contributions/updates. -Please, clone from <a href="https://labs.etsi.org/rep/tfs/controller">ETSI-hosted GitLab code repository</a>.</p> -<h2 id="checkout-the-appropriate-git-branch">Checkout the appropriate Git branch</h2> -<p>TeraFlowSDN controller versions can be found in the appropriate release tags and/or branches as described in <a href="/Home#versions">Home > Versions</a>.</p> -<p>By default the branch <em>master</em> is checked out and points to the latest stable version of the TeraFlowSDN controller, while branch <em>develop</em> contains the latest developments and contributions under test and validation.</p> -<p>To switch to the appropriate branch run the following command, changing <code>develop</code> by the name of the branch you want to deploy:</p> -<pre><code class="language-bash">cd ~/tfs-ctrl -git checkout develop -</code></pre> -<h2 id="prepare-a-deployment-script-with-the-deployment-settings">Prepare a deployment script with the deployment settings</h2> -<p>Create a new deployment script, e.g., <code>my_deploy.sh</code>, adding the appropriate settings as -follows. -This section provides just an overview of the available settings. An example <a href="https://labs.etsi.org/rep/tfs/controller/-/blob/master/my_deploy.sh"><code>my_deploy.sh</code></a> script is provided in the root folder of the project for your convenience with full description of all the settings.</p> -<p><strong>Note</strong>: The example <code>my_deploy.sh</code> script provides reasonable settings for deploying a functional and complete enough TeraFlowSDN controller, and a brief description of their meaning. To see extended descriptions, check scripts in the <code>deploy</code> folder.</p> -<pre><code class="language-bash">cd ~/tfs-ctrl -tee my_deploy.sh >/dev/null << EOF -# ----- TeraFlowSDN ------------------------------------------------------------ -export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/" -export TFS_COMPONENTS="context device ztp monitoring pathcomp service slice nbi webui load_generator" -export TFS_IMAGE_TAG="dev" -export TFS_K8S_NAMESPACE="tfs" -export TFS_EXTRA_MANIFESTS="manifests/nginx_ingress_http.yaml" -export TFS_GRAFANA_PASSWORD="admin123+" -export TFS_SKIP_BUILD="" - -# ----- CockroachDB ------------------------------------------------------------ -export CRDB_NAMESPACE="crdb" -export CRDB_EXT_PORT_SQL="26257" -export CRDB_EXT_PORT_HTTP="8081" -export CRDB_USERNAME="tfs" -export CRDB_PASSWORD="tfs123" -export CRDB_DATABASE="tfs" -export CRDB_DEPLOY_MODE="single" -export CRDB_DROP_DATABASE_IF_EXISTS="YES" -export CRDB_REDEPLOY="" - -# ----- NATS ------------------------------------------------------------------- -export NATS_NAMESPACE="nats" -export NATS_EXT_PORT_CLIENT="4222" -export NATS_EXT_PORT_HTTP="8222" -export NATS_REDEPLOY="" - -# ----- QuestDB ---------------------------------------------------------------- -export QDB_NAMESPACE="qdb" -export QDB_EXT_PORT_SQL="8812" -export QDB_EXT_PORT_ILP="9009" -export QDB_EXT_PORT_HTTP="9000" -export QDB_USERNAME="admin" -export QDB_PASSWORD="quest" -export QDB_TABLE_MONITORING_KPIS="tfs_monitoring_kpis" -export QDB_TABLE_SLICE_GROUPS="tfs_slice_groups" -export QDB_DROP_TABLES_IF_EXIST="YES" -export QDB_REDEPLOY="" - -EOF -</code></pre> -<p>The settings are organized in 4 sections: -- Section <code>TeraFlowSDN</code>: - - <code>TFS_REGISTRY_IMAGE</code> enables to specify the private Docker registry to be used, by default, we assume to use the Docker respository enabled in MicroK8s. - - <code>TFS_COMPONENTS</code> specifies the components their Docker image will be rebuilt, uploaded to the private Docker registry, and deployed in Kubernetes. - - <code>TFS_IMAGE_TAG</code> defines the tag to be used for Docker images being rebuilt and uploaded to the private Docker registry. - - <code>TFS_K8S_NAMESPACE</code> specifies the name of the Kubernetes namespace to be used for deploying the TFS components. - - <code>TFS_EXTRA_MANIFESTS</code> enables to provide additional manifests to be applied into the Kubernetes environment during the deployment. Typical use case is to deploy ingress controllers, service monitors for Prometheus, etc. - - <code>TFS_GRAFANA_PASSWORD</code> lets you specify the password you want to use for the <code>admin</code> user of the Grafana instance being deployed and linked to the Monitoring component. - - <code>TFS_SKIP_BUILD</code>, if set to <code>YES</code>, prevents rebuilding the Docker images. That means, the deploy script will redeploy existing Docker images without rebuilding/updating them.</p> -<ul> -<li>Section <code>CockroachDB</code>: enables to configure the deployment of the backend <a href="https://www.cockroachlabs.com/">CockroachDB</a> database.</li> -<li> -<p>Check example script <a href="https://labs.etsi.org/rep/tfs/controller/-/blob/master/my_deploy.sh"><code>my_deploy.sh</code></a> for further details.</p> -</li> -<li> -<p>Section <code>NATS</code>: enables to configure the deployment of the backend <a href="https://nats.io/">NATS</a> message broker.</p> -</li> -<li> -<p>Check example script <a href="https://labs.etsi.org/rep/tfs/controller/-/blob/master/my_deploy.sh"><code>my_deploy.sh</code></a> for further details.</p> -</li> -<li> -<p>Section <code>QuestDB</code>: enables to configure the deployment of the backend <a href="https://questdb.io/">QuestDB</a> timeseries database.</p> -</li> -<li>Check example script <a href="https://labs.etsi.org/rep/tfs/controller/-/blob/master/my_deploy.sh"><code>my_deploy.sh</code></a> for further details.</li> -</ul> -<h2 id="confirm-that-microk8s-is-running">Confirm that MicroK8s is running</h2> -<p>Run the following command:</p> -<pre><code class="language-bash">microk8s status -</code></pre> -<p>If it is reported <code>microk8s is not running, try microk8s start</code>, run the following command to start MicroK8s:</p> -<pre><code class="language-bash">microk8s start -</code></pre> -<p>Confirm everything is up and running:</p> -<ol> -<li>Periodically <a href="/1.-Deployment-Guide/1.2.-Install-MicroK8s#check-status-of-kubernetes-and-addons">Check the status of Kubernetes</a> until you see the addons [dns, ha-cluster, helm3, hostpath-storage, ingress, registry, storage] in the enabled block.</li> -<li>Periodically <a href="/1.-Deployment-Guide/1.2.-Install-MicroK8s#check-all-resources-in-kubernetes">Check Kubernetes resources</a> until all pods are <strong>Ready</strong> and <strong>Running</strong>.</li> -</ol> -<h2 id="deploy-tfs-controller">Deploy TFS controller</h2> -<p>First, source the deployment settings defined in the previous section. -This way, you do not need to specify the environment variables in each and every command you execute to operate the TFS controller. -Be aware to re-source the file if you open new terminal sessions. -Then, run the following command to deploy TeraFlowSDN controller on top of the MicroK8s Kubernetes platform.</p> -<pre><code class="language-bash">cd ~/tfs-ctrl -source my_deploy.sh -./deploy/all.sh -</code></pre> -<p>The script performs the following steps: -- Executes script <code>./deploy/crdb.sh</code> to automate deployment of CockroachDB database used by Context component. - - The script automatically checks if CockroachDB is already deployed. - - If there are settings instructing to drop the database and/or redeploy CockroachDB, it does the appropriate actions to honor them as defined in previous section. -- Executes script <code>./deploy/nats.sh</code> to automate deployment of NATS message broker used by Context component. - - The script automatically checks if NATS is already deployed. - - If there are settings instructing to redeploy the message broker, it does the appropriate actions to honor them as defined in previous section. -- Executes script <code>./deploy/qdb.sh</code> to automate deployment of QuestDB timeseries database used by Monitoring component. - - The script automatically checks if QuestDB is already deployed. - - If there are settings instructing to redeploy the timeseries database, it does the appropriate actions to honor them as defined in previous section. -- Executes script <code>./deploy/tfs.sh</code> to automate deployment of TeraFlowSDN. - - Creates the namespace defined in <code>TFS_K8S_NAMESPACE</code> - - Creates secrets for CockroachDB, NATS, and QuestDB to be used by Context and Monitoring components. - - Builds the Docker images for the components defined in <code>TFS_COMPONENTS</code> - - Tags the Docker images with the value of <code>TFS_IMAGE_TAG</code> - - Pushes the Docker images to the repository defined in <code>TFS_REGISTRY_IMAGE</code> - - Deploys the components defined in <code>TFS_COMPONENTS</code> - - Creates the file <code>tfs_runtime_env_vars.sh</code> with the environment variables for the components defined in <code>TFS_COMPONENTS</code> defining their local host addresses and their port numbers. - - Applies extra manifests defined in <code>TFS_EXTRA_MANIFESTS</code> such as: - - Creating an ingress controller listening at port 80 for HTTP connections to enable external access to the TeraFlowSDN WebUI, Grafana Dashboards, and Compute NBI interfaces. - - Deploying service monitors to enable monitoring the performance of the components, device drivers and service handlers. - - Initialize and configure the Grafana dashboards (if Monitoring component is deployed) -- Report a summary of the deployment - - See <a href="./1.5.-Show-Deployment-and-Logs">Show Deployment and Logs</a></p> - - - - - - - - - - - - - - </article> - </div> - - -<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> - </div> - - <button type="button" class="md-top md-icon" data-md-component="top" hidden> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> - Back to top -</button> - - </main> - - <footer class="md-footer"> - - - - <div class="md-footer-meta md-typeset"> - <div class="md-footer-meta__inner md-grid"> - <div class="md-copyright"> - - <div class="md-copyright__highlight"> - Copyright © 2019-2024 TeraflowSDN Project - </div> - - - Made with - <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> - Material for MkDocs - </a> - -</div> - - <div class="md-social"> - - - - - - - - - <a href="https://tfs.etsi.org/" target="_blank" rel="noopener" title="tfs.etsi.org" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M352 256c0 22.2-1.2 43.6-3.3 64H163.4c-2.2-20.4-3.3-41.8-3.3-64s1.2-43.6 3.3-64h185.3c2.2 20.4 3.3 41.8 3.3 64m28.8-64h123.1c5.3 20.5 8.1 41.9 8.1 64s-2.8 43.5-8.1 64H380.8c2.1-20.6 3.2-42 3.2-64s-1.1-43.4-3.2-64m112.6-32H376.7c-10-63.9-29.8-117.4-55.3-151.6 78.3 20.7 142 77.5 171.9 151.6zm-149.1 0H167.7c6.1-36.4 15.5-68.6 27-94.7 10.5-23.6 22.2-40.7 33.5-51.5C239.4 3.2 248.7 0 256 0s16.6 3.2 27.8 13.8c11.3 10.8 23 27.9 33.5 51.5 11.6 26 20.9 58.2 27 94.7m-209 0H18.6c30-74.1 93.6-130.9 172-151.6-25.5 34.2-45.3 87.7-55.3 151.6M8.1 192h123.1c-2.1 20.6-3.2 42-3.2 64s1.1 43.4 3.2 64H8.1C2.8 299.5 0 278.1 0 256s2.8-43.5 8.1-64m186.6 254.6c-11.6-26-20.9-58.2-27-94.6h176.6c-6.1 36.4-15.5 68.6-27 94.6-10.5 23.6-22.2 40.7-33.5 51.5-11.2 10.7-20.5 13.9-27.8 13.9s-16.6-3.2-27.8-13.8c-11.3-10.8-23-27.9-33.5-51.5zM135.3 352c10 63.9 29.8 117.4 55.3 151.6-78.4-20.7-142-77.5-172-151.6zm358.1 0c-30 74.1-93.6 130.9-171.9 151.6 25.5-34.2 45.2-87.7 55.3-151.6h116.7z"/></svg> - </a> - - - - - - - - - <a href="https://labs.etsi.org/rep/tfs" target="_blank" rel="noopener" title="labs.etsi.org" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </a> - - - - - - - - - <a href="https://www.linkedin.com/company/teraflowsdn/" target="_blank" rel="noopener" title="www.linkedin.com" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3M135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5m282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9z"/></svg> - </a> - - - - - - - - - <a href="https://twitter.com/TeraflowSDN" target="_blank" rel="noopener" title="twitter.com" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8l164.9-188.5L26.8 48h145.6l100.5 132.9zm-24.8 373.8h39.1L151.1 88h-42z"/></svg> - </a> - -</div> - - </div> - </div> -</footer> - - </div> - <div class="md-dialog" data-md-component="dialog"> - <div class="md-dialog__inner md-typeset"></div> - </div> - - <div class="md-progress" data-md-component="progress" role="progressbar"></div> - - - <script id="__config" type="application/json">{"base": "../../..", "features": ["navigation.instant", "navigation.instant.progress", "navigation.top", "navigation.footer", "navigation.path", "search", "search.highlight", "toc.integrate"], "search": "../../../assets/javascripts/workers/search.6ce7567c.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": {"provider": "mike"}}</script> - - - <script src="../../../assets/javascripts/bundle.83f73b43.min.js"></script> - - - </body> -</html> \ No newline at end of file diff --git a/public/develop/deployment_guide/install_micro_k8s/install_micro_k8s/index.html b/public/develop/deployment_guide/install_micro_k8s/install_micro_k8s/index.html deleted file mode 100644 index 0a985a4..0000000 --- a/public/develop/deployment_guide/install_micro_k8s/install_micro_k8s/index.html +++ /dev/null @@ -1,548 +0,0 @@ - -<!doctype html> -<html lang="en" class="no-js"> - <head> - - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - - <meta name="description" content="ETSI SDG TFS Documentation page"> - - - <meta name="author" content="TeraflowSDN by ETSI"> - - - <link rel="canonical" href="https://tfs.etsi.org/develop/deployment_guide/install_micro_k8s/install_micro_k8s/"> - - - - - <link rel="icon" href="../../../images/favicon.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42"> - - - - <title>Install micro k8s - ETSI SDG TFS Documentation</title> - - - - <link rel="stylesheet" href="../../../assets/stylesheets/main.0253249f.min.css"> - - - <link rel="stylesheet" href="../../../assets/stylesheets/palette.06af60db.min.css"> - - - - - - - - - - - - - <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> - <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> - - - - <link rel="stylesheet" href="../../../stylesheets/extra.css"> - - <script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> - - - - - - - </head> - - - - - - - - <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="0D47A1" data-md-color-accent="1565C0"> - - - <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> - <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> - <label class="md-overlay" for="__drawer"></label> - <div data-md-component="skip"> - - - <a href="#upgrade-the-ubuntu-distribution" class="md-skip"> - Skip to content - </a> - - </div> - <div data-md-component="announce"> - - </div> - - <div data-md-color-scheme="default" data-md-component="outdated" hidden> - - </div> - - - - - - -<header class="md-header md-header--shadow" data-md-component="header"> - <nav class="md-header__inner md-grid" aria-label="Header"> - <a href="../../.." title="ETSI SDG TFS Documentation" class="md-header__button md-logo" aria-label="ETSI SDG TFS Documentation" data-md-component="logo"> - - <img src="../../../images/logos/TeraFlow SDN Logo Screen_B_W NEG.png" alt="logo"> - - </a> - <label class="md-header__button md-icon" for="__drawer"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> - </label> - <div class="md-header__title" data-md-component="header-title"> - <div class="md-header__ellipsis"> - <div class="md-header__topic"> - <span class="md-ellipsis"> - ETSI SDG TFS Documentation - </span> - </div> - <div class="md-header__topic" data-md-component="header-topic"> - <span class="md-ellipsis"> - - Install micro k8s - - </span> - </div> - </div> - </div> - - - - - - - <label class="md-header__button md-icon" for="__search"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> - </label> - <div class="md-search" data-md-component="search" role="dialog"> - <label class="md-search__overlay" for="__search"></label> - <div class="md-search__inner" role="search"> - <form class="md-search__form" name="search"> - <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> - <label class="md-search__icon md-icon" for="__search"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> - </label> - <nav class="md-search__options" aria-label="Search"> - - <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> - </button> - </nav> - - </form> - <div class="md-search__output"> - <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> - <div class="md-search-result" data-md-component="search-result"> - <div class="md-search-result__meta"> - Initializing search - </div> - <ol class="md-search-result__list" role="presentation"></ol> - </div> - </div> - </div> - </div> -</div> - - - <div class="md-header__source"> - <a href="https://labs.etsi.org/rep/tfs" title="Go to repository" class="md-source" data-md-component="source"> - <div class="md-source__icon md-icon"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </div> - <div class="md-source__repository"> - TFS GitLab - </div> -</a> - </div> - - </nav> - -</header> - - <div class="md-container" data-md-component="container"> - - - - - - - <main class="md-main" data-md-component="main"> - <div class="md-main__inner md-grid"> - - - - <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > - <div class="md-sidebar__scrollwrap"> - <div class="md-sidebar__inner"> - - - - - - -<nav class="md-nav md-nav--primary md-nav--integrated" aria-label="Navigation" data-md-level="0"> - <label class="md-nav__title" for="__drawer"> - <a href="../../.." title="ETSI SDG TFS Documentation" class="md-nav__button md-logo" aria-label="ETSI SDG TFS Documentation" data-md-component="logo"> - - <img src="../../../images/logos/TeraFlow SDN Logo Screen_B_W NEG.png" alt="logo"> - - </a> - ETSI SDG TFS Documentation - </label> - - <div class="md-nav__source"> - <a href="https://labs.etsi.org/rep/tfs" title="Go to repository" class="md-source" data-md-component="source"> - <div class="md-source__icon md-icon"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </div> - <div class="md-source__repository"> - TFS GitLab - </div> -</a> - </div> - - <ul class="md-nav__list" data-md-scrollfix> - - - - - - - - <li class="md-nav__item"> - <a href="../../deployment_guide/" class="md-nav__link"> - - - <span class="md-ellipsis"> - 1. Deployment Guide - </span> - - - </a> - </li> - - - - - - - - - - <li class="md-nav__item"> - <a href="../../../development_guide/development_guide/" class="md-nav__link"> - - - <span class="md-ellipsis"> - 2. Development Guide - </span> - - - </a> - </li> - - - - </ul> -</nav> - </div> - </div> - </div> - - - - - <div class="md-content" data-md-component="content"> - <article class="md-content__inner md-typeset"> - - - - - <h1>Install micro k8s</h1> - -<p>This section describes how to deploy the MicroK8s Kubernetes platform and configure it -to be used with ETSI TeraFlowSDN controller. -Besides, Docker is installed to build docker images for the ETSI TeraFlowSDN controller.</p> -<p>The steps described in this section might take some minutes depending on your internet -connection speed and the resources assigned to your VM, or the specifications of your -physical server.</p> -<p>To facilitate work, these steps are easier to be executed through an SSH connection, for instance using tools like <a href="https://www.putty.org/">PuTTY</a> or <a href="https://mobaxterm.mobatek.net/">MobaXterm</a>.</p> -<h2 id="upgrade-the-ubuntu-distribution">Upgrade the Ubuntu distribution</h2> -<p>Skip this step if you already did it during the creation of the VM.</p> -<pre><code class="language-bash">sudo apt-get update -y -sudo apt-get dist-upgrade -y -</code></pre> -<h2 id="install-prerequisites">Install prerequisites</h2> -<pre><code class="language-bash">sudo apt-get install -y ca-certificates curl gnupg lsb-release snapd jq -</code></pre> -<h2 id="install-docker-ce">Install Docker CE</h2> -<p>Install Docker CE and Docker BuildX plugin</p> -<pre><code class="language-bash">sudo apt-get install -y docker.io docker-buildx -</code></pre> -<p><strong>NOTE</strong>: Starting from Docker v23, <a href="https://docs.docker.com/build/architecture/">Build architecture</a> has been updated and <code>docker build</code> command entered into deprecation process in favor of the new <code>docker buildx build</code> command. Package <code>docker-buildx</code> provides the new <code>docker buildx build</code> command.</p> -<p>Add key "insecure-registries" with the private repository to the daemon configuration. It is done in two commands since -sometimes read from and write to same file might cause trouble.</p> -<pre><code class="language-bash">if [ -s /etc/docker/daemon.json ]; then cat /etc/docker/daemon.json; else echo '{}'; fi \ - | jq 'if has("insecure-registries") then . else .+ {"insecure-registries": []} end' -- \ - | jq '."insecure-registries" |= (.+ ["localhost:32000"] | unique)' -- \ - | tee tmp.daemon.json -sudo mv tmp.daemon.json /etc/docker/daemon.json -sudo chown root:root /etc/docker/daemon.json -sudo chmod 600 /etc/docker/daemon.json -</code></pre> -<p>Restart the Docker daemon</p> -<pre><code class="language-bash">sudo systemctl restart docker -</code></pre> -<h2 id="install-microk8s">Install MicroK8s</h2> -<p><strong>Important</strong>: Some TeraFlowSDN dependencies need to be executed on top of MicroK8s/Kubernetes v1.24. It is not guaranteed (by now) to run on newer versions.</p> -<pre><code class="language-bash"># Install MicroK8s -sudo snap install microk8s --classic --channel=1.24/stable - -# Create alias for command "microk8s.kubectl" to be usable as "kubectl" -sudo snap alias microk8s.kubectl kubectl -</code></pre> -<p>It is important to make sure that <code>ufw</code> will not interfere with the internal pod-to-pod -and pod-to-Internet traffic. -To do so, first check the status. -If <code>ufw</code> is active, use the following command to enable the communication.</p> -<pre><code class="language-bash"> -# Verify status of ufw firewall -sudo ufw status - -# If ufw is active, install following rules to enable access pod-to-pod and pod-to-internet -sudo ufw allow in on cni0 && sudo ufw allow out on cni0 -sudo ufw default allow routed -</code></pre> -<p><strong>NOTE</strong>: MicroK8s can be used to compose a Highly Available Kubernetes cluster enabling you to construct an environment combining the CPU, RAM and storage resources of multiple machines. If you are interested in this procedure, review the official instructions in <a href="https://ubuntu.com/tutorials/getting-started-with-kubernetes-ha">How to build a highly available Kubernetes cluster with MicroK8s</a>, in particular, the step <a href="https://ubuntu.com/tutorials/getting-started-with-kubernetes-ha#4-create-a-microk8s-multinode-cluster">Create a MicroK8s multi-node cluster</a>.</p> -<h4 id="references">References:</h4> -<ul> -<li><a href="https://microk8s.io/#install-microk8s">The lightweight Kubernetes > Install MicroK8s</a></li> -<li><a href="https://ubuntu.com/tutorials/install-a-local-kubernetes-with-microk8s">Install a local Kubernetes with MicroK8s</a></li> -<li><a href="https://ubuntu.com/tutorials/getting-started-with-kubernetes-ha">How to build a highly available Kubernetes cluster with MicroK8s</a></li> -</ul> -<h2 id="add-user-to-the-docker-and-microk8s-groups">Add user to the docker and microk8s groups</h2> -<p>It is important that your user has the permission to run <code>docker</code> and <code>microk8s</code> in the -terminal. -To allow this, you need to add your user to the <code>docker</code> and <code>microk8s</code> groups with the -following commands:</p> -<pre><code class="language-bash">sudo usermod -a -G docker $USER -sudo usermod -a -G microk8s $USER -sudo chown -f -R $USER $HOME/.kube -sudo reboot -</code></pre> -<p>In case that you get trouble executing the following commands, might due to the .kube folder is not automatically provisioned into your home folder, you may follow the steps below:</p> -<pre><code class="language-bash">mkdir -p $HOME/.kube -sudo chown -f -R $USER $HOME/.kube -microk8s config > $HOME/.kube/config -sudo reboot -</code></pre> -<h2 id="check-status-of-kubernetes-and-addons">Check status of Kubernetes and addons</h2> -<p>To retrieve the status of Kubernetes <strong>once</strong>, run the following command:</p> -<pre><code class="language-bash">microk8s.status --wait-ready -</code></pre> -<p>To retrieve the status of Kubernetes <strong>periodically</strong> (e.g., every 1 second), run the -following command:</p> -<pre><code class="language-bash">watch -n 1 microk8s.status --wait-ready -</code></pre> -<h2 id="check-all-resources-in-kubernetes">Check all resources in Kubernetes</h2> -<p>To retrieve the status of the Kubernetes resources <strong>once</strong>, run the following command:</p> -<pre><code class="language-bash">kubectl get all --all-namespaces -</code></pre> -<p>To retrieve the status of the Kubernetes resources <strong>periodically</strong> (e.g., every 1 -second), run the following command:</p> -<pre><code class="language-bash">watch -n 1 kubectl get all --all-namespaces -</code></pre> -<h2 id="enable-addons">Enable addons</h2> -<p>First, we need to enable the community plugins (maintained by third parties):</p> -<pre><code class="language-bash">microk8s.enable community -</code></pre> -<p>The Addons to be enabled are: -- <code>dns</code>: enables resolving the pods and services by name -- <code>helm3</code>: required to install NATS -- <code>hostpath-storage</code>: enables providing storage for the pods (required by <code>registry</code>) -- <code>ingress</code>: deploys an ingress controller to expose the microservices outside Kubernetes -- <code>registry</code>: deploys a private registry for the TFS controller images -- <code>linkerd</code>: deploys the <a href="https://linkerd.io">linkerd service mesh</a> used for load balancing among replicas -- <code>prometheus</code>: set of tools that enable TFS observability through per-component instrumentation -- <code>metrics-server</code>: deploys the <a href="https://github.com/kubernetes-sigs/metrics-server">Kubernetes metrics server</a> for API access to service metrics</p> -<pre><code class="language-bash">microk8s.enable dns helm3 hostpath-storage ingress registry prometheus metrics-server linkerd -</code></pre> -<p><strong>Important</strong>: Enabling some of the addons might take few minutes. -Do not proceed with next steps until the addons are ready. -Otherwise, the deployment might fail. -To confirm everything is up and running: -1. Periodically - <a href="./1.2.-Install-MicroK8s#check-status-of-kubernetes-and-addons">Check the status of Kubernetes</a> - until you see the addons [dns, ha-cluster, helm3, hostpath-storage, ingress, linkerd, metrics-server, prometheus, registry, storage] in the enabled block. -2. Periodically - <a href="./1.2.-Install-MicroK8s#check-all-resources-in-kubernetes">Check Kubernetes resources</a> - until all pods are <strong>Ready</strong> and <strong>Running</strong>. -3. If it takes too long for the Pods to be ready, <strong>we observed that rebooting the machine may help</strong>.</p> -<p>Then, create aliases to make the commands easier to access:</p> -<pre><code class="language-bash">sudo snap alias microk8s.helm3 helm3 -sudo snap alias microk8s.linkerd linkerd -</code></pre> -<p>To validate that <code>linkerd</code> is working correctly, run:</p> -<pre><code class="language-bash">linkerd check -</code></pre> -<p>To validate that the <code>metrics-server</code> is working correctly, run:</p> -<pre><code class="language-bash">kubectl top pods --all-namespaces -</code></pre> -<p>and you should see a screen similar to the <code>top</code> command in Linux, showing the columns <em>namespace</em>, <em>pod name</em>, <em>CPU (cores)</em>, and <em>MEMORY (bytes)</em>.</p> -<p>In case pods are not starting, check information from pods logs. For example, linkerd is sensitive for proper /etc/resolv.conf syntax.</p> -<pre><code class="language-bash">kubectl logs <podname> --namespace <namespace> -</code></pre> -<p>If the command shows an error message, also restarting the machine might help.</p> -<h2 id="stop-restart-and-redeploy">Stop, Restart, and Redeploy</h2> -<p>Find below some additional commands you might need while you work with MicroK8s:</p> -<pre><code class="language-bash">microk8s.stop # stop MicroK8s cluster (for instance, before power off your computer) -microk8s.start # start MicroK8s cluster -microk8s.reset # reset infrastructure to a clean state -</code></pre> -<p>If the following commands does not work to recover the MicroK8s cluster, you can redeploy it.</p> -<p>If you want to keep MicroK8s configuration, use:</p> -<pre><code class="language-bash">sudo snap remove microk8s -</code></pre> -<p>If you need to completely drop MicroK8s and its complete configuration, use:</p> -<pre><code class="language-bash">sudo snap remove microk8s --purge -sudo apt-get remove --purge docker.io docker-buildx -</code></pre> -<p><strong>IMPORTANT</strong>: After uninstalling MicroK8s, it is convenient to reboot the computer (the VM if you work on a VM, or the physical computer if you use a physical computer). Otherwise, there are system configurations that are not correctly cleaned. Especially in what port forwarding and firewall rules matters.</p> -<p>After the reboot, redeploy as it is described in this section.</p> - - - - - - - - - - - - - - </article> - </div> - - -<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> - </div> - - <button type="button" class="md-top md-icon" data-md-component="top" hidden> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> - Back to top -</button> - - </main> - - <footer class="md-footer"> - - - - <div class="md-footer-meta md-typeset"> - <div class="md-footer-meta__inner md-grid"> - <div class="md-copyright"> - - <div class="md-copyright__highlight"> - Copyright © 2019-2024 TeraflowSDN Project - </div> - - - Made with - <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> - Material for MkDocs - </a> - -</div> - - <div class="md-social"> - - - - - - - - - <a href="https://tfs.etsi.org/" target="_blank" rel="noopener" title="tfs.etsi.org" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M352 256c0 22.2-1.2 43.6-3.3 64H163.4c-2.2-20.4-3.3-41.8-3.3-64s1.2-43.6 3.3-64h185.3c2.2 20.4 3.3 41.8 3.3 64m28.8-64h123.1c5.3 20.5 8.1 41.9 8.1 64s-2.8 43.5-8.1 64H380.8c2.1-20.6 3.2-42 3.2-64s-1.1-43.4-3.2-64m112.6-32H376.7c-10-63.9-29.8-117.4-55.3-151.6 78.3 20.7 142 77.5 171.9 151.6zm-149.1 0H167.7c6.1-36.4 15.5-68.6 27-94.7 10.5-23.6 22.2-40.7 33.5-51.5C239.4 3.2 248.7 0 256 0s16.6 3.2 27.8 13.8c11.3 10.8 23 27.9 33.5 51.5 11.6 26 20.9 58.2 27 94.7m-209 0H18.6c30-74.1 93.6-130.9 172-151.6-25.5 34.2-45.3 87.7-55.3 151.6M8.1 192h123.1c-2.1 20.6-3.2 42-3.2 64s1.1 43.4 3.2 64H8.1C2.8 299.5 0 278.1 0 256s2.8-43.5 8.1-64m186.6 254.6c-11.6-26-20.9-58.2-27-94.6h176.6c-6.1 36.4-15.5 68.6-27 94.6-10.5 23.6-22.2 40.7-33.5 51.5-11.2 10.7-20.5 13.9-27.8 13.9s-16.6-3.2-27.8-13.8c-11.3-10.8-23-27.9-33.5-51.5zM135.3 352c10 63.9 29.8 117.4 55.3 151.6-78.4-20.7-142-77.5-172-151.6zm358.1 0c-30 74.1-93.6 130.9-171.9 151.6 25.5-34.2 45.2-87.7 55.3-151.6h116.7z"/></svg> - </a> - - - - - - - - - <a href="https://labs.etsi.org/rep/tfs" target="_blank" rel="noopener" title="labs.etsi.org" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </a> - - - - - - - - - <a href="https://www.linkedin.com/company/teraflowsdn/" target="_blank" rel="noopener" title="www.linkedin.com" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3M135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5m282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9z"/></svg> - </a> - - - - - - - - - <a href="https://twitter.com/TeraflowSDN" target="_blank" rel="noopener" title="twitter.com" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8l164.9-188.5L26.8 48h145.6l100.5 132.9zm-24.8 373.8h39.1L151.1 88h-42z"/></svg> - </a> - -</div> - - </div> - </div> -</footer> - - </div> - <div class="md-dialog" data-md-component="dialog"> - <div class="md-dialog__inner md-typeset"></div> - </div> - - <div class="md-progress" data-md-component="progress" role="progressbar"></div> - - - <script id="__config" type="application/json">{"base": "../../..", "features": ["navigation.instant", "navigation.instant.progress", "navigation.top", "navigation.footer", "navigation.path", "search", "search.highlight", "toc.integrate"], "search": "../../../assets/javascripts/workers/search.6ce7567c.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": {"provider": "mike"}}</script> - - - <script src="../../../assets/javascripts/bundle.83f73b43.min.js"></script> - - - </body> -</html> \ No newline at end of file diff --git a/public/develop/deployment_guide/show_deployment_and_logs/show_deployment_and_logs/index.html b/public/develop/deployment_guide/show_deployment_and_logs/show_deployment_and_logs/index.html deleted file mode 100644 index 72386e6..0000000 --- a/public/develop/deployment_guide/show_deployment_and_logs/show_deployment_and_logs/index.html +++ /dev/null @@ -1,422 +0,0 @@ - -<!doctype html> -<html lang="en" class="no-js"> - <head> - - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - - <meta name="description" content="ETSI SDG TFS Documentation page"> - - - <meta name="author" content="TeraflowSDN by ETSI"> - - - <link rel="canonical" href="https://tfs.etsi.org/develop/deployment_guide/show_deployment_and_logs/show_deployment_and_logs/"> - - - - - <link rel="icon" href="../../../images/favicon.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42"> - - - - <title>Show deployment and logs - ETSI SDG TFS Documentation</title> - - - - <link rel="stylesheet" href="../../../assets/stylesheets/main.0253249f.min.css"> - - - <link rel="stylesheet" href="../../../assets/stylesheets/palette.06af60db.min.css"> - - - - - - - - - - - - - <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> - <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> - - - - <link rel="stylesheet" href="../../../stylesheets/extra.css"> - - <script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> - - - - - - - </head> - - - - - - - - <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="0D47A1" data-md-color-accent="1565C0"> - - - <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> - <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> - <label class="md-overlay" for="__drawer"></label> - <div data-md-component="skip"> - - - <a href="#report-the-deployment-of-the-tfs-controller" class="md-skip"> - Skip to content - </a> - - </div> - <div data-md-component="announce"> - - </div> - - <div data-md-color-scheme="default" data-md-component="outdated" hidden> - - </div> - - - - - - -<header class="md-header md-header--shadow" data-md-component="header"> - <nav class="md-header__inner md-grid" aria-label="Header"> - <a href="../../.." title="ETSI SDG TFS Documentation" class="md-header__button md-logo" aria-label="ETSI SDG TFS Documentation" data-md-component="logo"> - - <img src="../../../images/logos/TeraFlow SDN Logo Screen_B_W NEG.png" alt="logo"> - - </a> - <label class="md-header__button md-icon" for="__drawer"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> - </label> - <div class="md-header__title" data-md-component="header-title"> - <div class="md-header__ellipsis"> - <div class="md-header__topic"> - <span class="md-ellipsis"> - ETSI SDG TFS Documentation - </span> - </div> - <div class="md-header__topic" data-md-component="header-topic"> - <span class="md-ellipsis"> - - Show deployment and logs - - </span> - </div> - </div> - </div> - - - - - - - <label class="md-header__button md-icon" for="__search"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> - </label> - <div class="md-search" data-md-component="search" role="dialog"> - <label class="md-search__overlay" for="__search"></label> - <div class="md-search__inner" role="search"> - <form class="md-search__form" name="search"> - <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> - <label class="md-search__icon md-icon" for="__search"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> - </label> - <nav class="md-search__options" aria-label="Search"> - - <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> - </button> - </nav> - - </form> - <div class="md-search__output"> - <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> - <div class="md-search-result" data-md-component="search-result"> - <div class="md-search-result__meta"> - Initializing search - </div> - <ol class="md-search-result__list" role="presentation"></ol> - </div> - </div> - </div> - </div> -</div> - - - <div class="md-header__source"> - <a href="https://labs.etsi.org/rep/tfs" title="Go to repository" class="md-source" data-md-component="source"> - <div class="md-source__icon md-icon"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </div> - <div class="md-source__repository"> - TFS GitLab - </div> -</a> - </div> - - </nav> - -</header> - - <div class="md-container" data-md-component="container"> - - - - - - - <main class="md-main" data-md-component="main"> - <div class="md-main__inner md-grid"> - - - - <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > - <div class="md-sidebar__scrollwrap"> - <div class="md-sidebar__inner"> - - - - - - -<nav class="md-nav md-nav--primary md-nav--integrated" aria-label="Navigation" data-md-level="0"> - <label class="md-nav__title" for="__drawer"> - <a href="../../.." title="ETSI SDG TFS Documentation" class="md-nav__button md-logo" aria-label="ETSI SDG TFS Documentation" data-md-component="logo"> - - <img src="../../../images/logos/TeraFlow SDN Logo Screen_B_W NEG.png" alt="logo"> - - </a> - ETSI SDG TFS Documentation - </label> - - <div class="md-nav__source"> - <a href="https://labs.etsi.org/rep/tfs" title="Go to repository" class="md-source" data-md-component="source"> - <div class="md-source__icon md-icon"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </div> - <div class="md-source__repository"> - TFS GitLab - </div> -</a> - </div> - - <ul class="md-nav__list" data-md-scrollfix> - - - - - - - - <li class="md-nav__item"> - <a href="../../deployment_guide/" class="md-nav__link"> - - - <span class="md-ellipsis"> - 1. Deployment Guide - </span> - - - </a> - </li> - - - - - - - - - - <li class="md-nav__item"> - <a href="../../../development_guide/development_guide/" class="md-nav__link"> - - - <span class="md-ellipsis"> - 2. Development Guide - </span> - - - </a> - </li> - - - - </ul> -</nav> - </div> - </div> - </div> - - - - - <div class="md-content" data-md-component="content"> - <article class="md-content__inner md-typeset"> - - - - - <h1>Show deployment and logs</h1> - -<p>This section presents some helper scripts to inspect the status of the deployment and -the logs of the components. -These scripts are particularly helpful for troubleshooting during execution of -experiments, development, and debugging.</p> -<h2 id="report-the-deployment-of-the-tfs-controller">Report the deployment of the TFS controller</h2> -<p>The summary report given at the end of the <a href="./1.3.-Deploy-TeraFlowSDN#deploy-tfs-controller">Deploy TFS controller</a> -procedure can be generated manually at any time by running the following command. -You can avoid sourcing <code>my_deploy.sh</code> if it has been already done.</p> -<pre><code class="language-bash">cd ~/tfs-ctrl -source my_deploy.sh -./deploy/show.sh -</code></pre> -<p>Use this script to validate that all the pods, deployments, replica sets, ingress -controller, etc. are ready and have the appropriate state, e.g., <em>running</em> for Pods, and -the services are deployed and have appropriate IP addresses and port numbers.</p> -<h2 id="report-the-log-of-a-specific-tfs-controller-component">Report the log of a specific TFS controller component</h2> -<p>A number of scripts are pre-created in the <code>scripts</code> folder to facilitate the inspection -of the component logs. -For instance, to dump the log of the Context component, run the following command. -You can avoid sourcing <code>my_deploy.sh</code> if it has been already done.</p> -<pre><code class="language-bash">source my_deploy.sh -./scripts/show_logs_context.sh -</code></pre> - - - - - - - - - - - - - - </article> - </div> - - -<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> - </div> - - <button type="button" class="md-top md-icon" data-md-component="top" hidden> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> - Back to top -</button> - - </main> - - <footer class="md-footer"> - - - - <div class="md-footer-meta md-typeset"> - <div class="md-footer-meta__inner md-grid"> - <div class="md-copyright"> - - <div class="md-copyright__highlight"> - Copyright © 2019-2024 TeraflowSDN Project - </div> - - - Made with - <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> - Material for MkDocs - </a> - -</div> - - <div class="md-social"> - - - - - - - - - <a href="https://tfs.etsi.org/" target="_blank" rel="noopener" title="tfs.etsi.org" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M352 256c0 22.2-1.2 43.6-3.3 64H163.4c-2.2-20.4-3.3-41.8-3.3-64s1.2-43.6 3.3-64h185.3c2.2 20.4 3.3 41.8 3.3 64m28.8-64h123.1c5.3 20.5 8.1 41.9 8.1 64s-2.8 43.5-8.1 64H380.8c2.1-20.6 3.2-42 3.2-64s-1.1-43.4-3.2-64m112.6-32H376.7c-10-63.9-29.8-117.4-55.3-151.6 78.3 20.7 142 77.5 171.9 151.6zm-149.1 0H167.7c6.1-36.4 15.5-68.6 27-94.7 10.5-23.6 22.2-40.7 33.5-51.5C239.4 3.2 248.7 0 256 0s16.6 3.2 27.8 13.8c11.3 10.8 23 27.9 33.5 51.5 11.6 26 20.9 58.2 27 94.7m-209 0H18.6c30-74.1 93.6-130.9 172-151.6-25.5 34.2-45.3 87.7-55.3 151.6M8.1 192h123.1c-2.1 20.6-3.2 42-3.2 64s1.1 43.4 3.2 64H8.1C2.8 299.5 0 278.1 0 256s2.8-43.5 8.1-64m186.6 254.6c-11.6-26-20.9-58.2-27-94.6h176.6c-6.1 36.4-15.5 68.6-27 94.6-10.5 23.6-22.2 40.7-33.5 51.5-11.2 10.7-20.5 13.9-27.8 13.9s-16.6-3.2-27.8-13.8c-11.3-10.8-23-27.9-33.5-51.5zM135.3 352c10 63.9 29.8 117.4 55.3 151.6-78.4-20.7-142-77.5-172-151.6zm358.1 0c-30 74.1-93.6 130.9-171.9 151.6 25.5-34.2 45.2-87.7 55.3-151.6h116.7z"/></svg> - </a> - - - - - - - - - <a href="https://labs.etsi.org/rep/tfs" target="_blank" rel="noopener" title="labs.etsi.org" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </a> - - - - - - - - - <a href="https://www.linkedin.com/company/teraflowsdn/" target="_blank" rel="noopener" title="www.linkedin.com" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3M135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5m282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9z"/></svg> - </a> - - - - - - - - - <a href="https://twitter.com/TeraflowSDN" target="_blank" rel="noopener" title="twitter.com" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8l164.9-188.5L26.8 48h145.6l100.5 132.9zm-24.8 373.8h39.1L151.1 88h-42z"/></svg> - </a> - -</div> - - </div> - </div> -</footer> - - </div> - <div class="md-dialog" data-md-component="dialog"> - <div class="md-dialog__inner md-typeset"></div> - </div> - - <div class="md-progress" data-md-component="progress" role="progressbar"></div> - - - <script id="__config" type="application/json">{"base": "../../..", "features": ["navigation.instant", "navigation.instant.progress", "navigation.top", "navigation.footer", "navigation.path", "search", "search.highlight", "toc.integrate"], "search": "../../../assets/javascripts/workers/search.6ce7567c.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": {"provider": "mike"}}</script> - - - <script src="../../../assets/javascripts/bundle.83f73b43.min.js"></script> - - - </body> -</html> \ No newline at end of file diff --git a/public/develop/deployment_guide/webUI_and_grafana_dashboards/webUI_and_grafana_dashboards/index.html b/public/develop/deployment_guide/webUI_and_grafana_dashboards/webUI_and_grafana_dashboards/index.html deleted file mode 100644 index 3024c65..0000000 --- a/public/develop/deployment_guide/webUI_and_grafana_dashboards/webUI_and_grafana_dashboards/index.html +++ /dev/null @@ -1,410 +0,0 @@ - -<!doctype html> -<html lang="en" class="no-js"> - <head> - - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - - <meta name="description" content="ETSI SDG TFS Documentation page"> - - - <meta name="author" content="TeraflowSDN by ETSI"> - - - <link rel="canonical" href="https://tfs.etsi.org/develop/deployment_guide/webUI_and_grafana_dashboards/webUI_and_grafana_dashboards/"> - - - - - <link rel="icon" href="../../../images/favicon.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42"> - - - - <title>webUI and grafana dashboards - ETSI SDG TFS Documentation</title> - - - - <link rel="stylesheet" href="../../../assets/stylesheets/main.0253249f.min.css"> - - - <link rel="stylesheet" href="../../../assets/stylesheets/palette.06af60db.min.css"> - - - - - - - - - - - - - <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> - <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> - - - - <link rel="stylesheet" href="../../../stylesheets/extra.css"> - - <script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> - - - - - - - </head> - - - - - - - - <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="0D47A1" data-md-color-accent="1565C0"> - - - <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> - <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> - <label class="md-overlay" for="__drawer"></label> - <div data-md-component="skip"> - - - <a href="#access-the-teraflowsdn-webui" class="md-skip"> - Skip to content - </a> - - </div> - <div data-md-component="announce"> - - </div> - - <div data-md-color-scheme="default" data-md-component="outdated" hidden> - - </div> - - - - - - -<header class="md-header md-header--shadow" data-md-component="header"> - <nav class="md-header__inner md-grid" aria-label="Header"> - <a href="../../.." title="ETSI SDG TFS Documentation" class="md-header__button md-logo" aria-label="ETSI SDG TFS Documentation" data-md-component="logo"> - - <img src="../../../images/logos/TeraFlow SDN Logo Screen_B_W NEG.png" alt="logo"> - - </a> - <label class="md-header__button md-icon" for="__drawer"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> - </label> - <div class="md-header__title" data-md-component="header-title"> - <div class="md-header__ellipsis"> - <div class="md-header__topic"> - <span class="md-ellipsis"> - ETSI SDG TFS Documentation - </span> - </div> - <div class="md-header__topic" data-md-component="header-topic"> - <span class="md-ellipsis"> - - webUI and grafana dashboards - - </span> - </div> - </div> - </div> - - - - - - - <label class="md-header__button md-icon" for="__search"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> - </label> - <div class="md-search" data-md-component="search" role="dialog"> - <label class="md-search__overlay" for="__search"></label> - <div class="md-search__inner" role="search"> - <form class="md-search__form" name="search"> - <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> - <label class="md-search__icon md-icon" for="__search"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> - </label> - <nav class="md-search__options" aria-label="Search"> - - <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> - </button> - </nav> - - </form> - <div class="md-search__output"> - <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> - <div class="md-search-result" data-md-component="search-result"> - <div class="md-search-result__meta"> - Initializing search - </div> - <ol class="md-search-result__list" role="presentation"></ol> - </div> - </div> - </div> - </div> -</div> - - - <div class="md-header__source"> - <a href="https://labs.etsi.org/rep/tfs" title="Go to repository" class="md-source" data-md-component="source"> - <div class="md-source__icon md-icon"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </div> - <div class="md-source__repository"> - TFS GitLab - </div> -</a> - </div> - - </nav> - -</header> - - <div class="md-container" data-md-component="container"> - - - - - - - <main class="md-main" data-md-component="main"> - <div class="md-main__inner md-grid"> - - - - <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > - <div class="md-sidebar__scrollwrap"> - <div class="md-sidebar__inner"> - - - - - - -<nav class="md-nav md-nav--primary md-nav--integrated" aria-label="Navigation" data-md-level="0"> - <label class="md-nav__title" for="__drawer"> - <a href="../../.." title="ETSI SDG TFS Documentation" class="md-nav__button md-logo" aria-label="ETSI SDG TFS Documentation" data-md-component="logo"> - - <img src="../../../images/logos/TeraFlow SDN Logo Screen_B_W NEG.png" alt="logo"> - - </a> - ETSI SDG TFS Documentation - </label> - - <div class="md-nav__source"> - <a href="https://labs.etsi.org/rep/tfs" title="Go to repository" class="md-source" data-md-component="source"> - <div class="md-source__icon md-icon"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </div> - <div class="md-source__repository"> - TFS GitLab - </div> -</a> - </div> - - <ul class="md-nav__list" data-md-scrollfix> - - - - - - - - <li class="md-nav__item"> - <a href="../../deployment_guide/" class="md-nav__link"> - - - <span class="md-ellipsis"> - 1. Deployment Guide - </span> - - - </a> - </li> - - - - - - - - - - <li class="md-nav__item"> - <a href="../../../development_guide/development_guide/" class="md-nav__link"> - - - <span class="md-ellipsis"> - 2. Development Guide - </span> - - - </a> - </li> - - - - </ul> -</nav> - </div> - </div> - </div> - - - - - <div class="md-content" data-md-component="content"> - <article class="md-content__inner md-typeset"> - - - - - <h1>webUI and grafana dashboards</h1> - -<p>This section describes how to get access to the TeraFlowSDN controller WebUI and the monitoring Grafana dashboards.</p> -<h2 id="access-the-teraflowsdn-webui">Access the TeraFlowSDN WebUI</h2> -<p>If you followed the installation steps based on MicroK8s, you got an ingress controller installed that exposes on TCP port 80.</p> -<p>Besides, the ingress controller defines the following reverse proxy paths (on your local machine): -- <code>http://127.0.0.1/webui</code>: points to the WebUI of TeraFlowSDN. -- <code>http://127.0.0.1/grafana</code>: points to the Grafana dashboards. - This endpoint brings access to the monitoring dashboards of TeraFlowSDN. - The credentials for the <code>admin</code>user are those defined in the <code>my_deploy.sh</code> script, in the <code>TFS_GRAFANA_PASSWORD</code> variable. -- <code>http://127.0.0.1/restconf</code>: points to the Compute component NBI based on RestCONF. - This endpoint enables connecting external software, such as ETSI OpenSourceMANO NFV Orchestrator, to TeraFlowSDN.</p> -<p><strong>Note</strong>: In the creation of the VM, a forward from host TCP port 8080 to VM's TCP port 80 is configured, so the WebUIs and REST APIs of TeraFlowSDN should be exposed on the endpoint <code>127.0.0.1:8080</code> of your local machine instead of <code>127.0.0.1:80</code>.</p> - - - - - - - - - - - - - - </article> - </div> - - -<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> - </div> - - <button type="button" class="md-top md-icon" data-md-component="top" hidden> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> - Back to top -</button> - - </main> - - <footer class="md-footer"> - - - - <div class="md-footer-meta md-typeset"> - <div class="md-footer-meta__inner md-grid"> - <div class="md-copyright"> - - <div class="md-copyright__highlight"> - Copyright © 2019-2024 TeraflowSDN Project - </div> - - - Made with - <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> - Material for MkDocs - </a> - -</div> - - <div class="md-social"> - - - - - - - - - <a href="https://tfs.etsi.org/" target="_blank" rel="noopener" title="tfs.etsi.org" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M352 256c0 22.2-1.2 43.6-3.3 64H163.4c-2.2-20.4-3.3-41.8-3.3-64s1.2-43.6 3.3-64h185.3c2.2 20.4 3.3 41.8 3.3 64m28.8-64h123.1c5.3 20.5 8.1 41.9 8.1 64s-2.8 43.5-8.1 64H380.8c2.1-20.6 3.2-42 3.2-64s-1.1-43.4-3.2-64m112.6-32H376.7c-10-63.9-29.8-117.4-55.3-151.6 78.3 20.7 142 77.5 171.9 151.6zm-149.1 0H167.7c6.1-36.4 15.5-68.6 27-94.7 10.5-23.6 22.2-40.7 33.5-51.5C239.4 3.2 248.7 0 256 0s16.6 3.2 27.8 13.8c11.3 10.8 23 27.9 33.5 51.5 11.6 26 20.9 58.2 27 94.7m-209 0H18.6c30-74.1 93.6-130.9 172-151.6-25.5 34.2-45.3 87.7-55.3 151.6M8.1 192h123.1c-2.1 20.6-3.2 42-3.2 64s1.1 43.4 3.2 64H8.1C2.8 299.5 0 278.1 0 256s2.8-43.5 8.1-64m186.6 254.6c-11.6-26-20.9-58.2-27-94.6h176.6c-6.1 36.4-15.5 68.6-27 94.6-10.5 23.6-22.2 40.7-33.5 51.5-11.2 10.7-20.5 13.9-27.8 13.9s-16.6-3.2-27.8-13.8c-11.3-10.8-23-27.9-33.5-51.5zM135.3 352c10 63.9 29.8 117.4 55.3 151.6-78.4-20.7-142-77.5-172-151.6zm358.1 0c-30 74.1-93.6 130.9-171.9 151.6 25.5-34.2 45.2-87.7 55.3-151.6h116.7z"/></svg> - </a> - - - - - - - - - <a href="https://labs.etsi.org/rep/tfs" target="_blank" rel="noopener" title="labs.etsi.org" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </a> - - - - - - - - - <a href="https://www.linkedin.com/company/teraflowsdn/" target="_blank" rel="noopener" title="www.linkedin.com" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3M135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5m282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9z"/></svg> - </a> - - - - - - - - - <a href="https://twitter.com/TeraflowSDN" target="_blank" rel="noopener" title="twitter.com" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8l164.9-188.5L26.8 48h145.6l100.5 132.9zm-24.8 373.8h39.1L151.1 88h-42z"/></svg> - </a> - -</div> - - </div> - </div> -</footer> - - </div> - <div class="md-dialog" data-md-component="dialog"> - <div class="md-dialog__inner md-typeset"></div> - </div> - - <div class="md-progress" data-md-component="progress" role="progressbar"></div> - - - <script id="__config" type="application/json">{"base": "../../..", "features": ["navigation.instant", "navigation.instant.progress", "navigation.top", "navigation.footer", "navigation.path", "search", "search.highlight", "toc.integrate"], "search": "../../../assets/javascripts/workers/search.6ce7567c.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": {"provider": "mike"}}</script> - - - <script src="../../../assets/javascripts/bundle.83f73b43.min.js"></script> - - - </body> -</html> \ No newline at end of file diff --git a/public/develop/development_guide/configure_environment/configure_environment/index.html b/public/develop/development_guide/configure_environment/configure_environment/index.html deleted file mode 100644 index bd70182..0000000 --- a/public/develop/development_guide/configure_environment/configure_environment/index.html +++ /dev/null @@ -1,402 +0,0 @@ - -<!doctype html> -<html lang="en" class="no-js"> - <head> - - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - - <meta name="description" content="ETSI SDG TFS Documentation page"> - - - <meta name="author" content="TeraflowSDN by ETSI"> - - - <link rel="canonical" href="https://tfs.etsi.org/develop/development_guide/configure_environment/configure_environment/"> - - - - - <link rel="icon" href="../../../images/favicon.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42"> - - - - <title>Configure environment - ETSI SDG TFS Documentation</title> - - - - <link rel="stylesheet" href="../../../assets/stylesheets/main.0253249f.min.css"> - - - <link rel="stylesheet" href="../../../assets/stylesheets/palette.06af60db.min.css"> - - - - - - - - - - - - - <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> - <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> - - - - <link rel="stylesheet" href="../../../stylesheets/extra.css"> - - <script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> - - - - - - - </head> - - - - - - - - <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="0D47A1" data-md-color-accent="1565C0"> - - - <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> - <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> - <label class="md-overlay" for="__drawer"></label> - <div data-md-component="skip"> - - </div> - <div data-md-component="announce"> - - </div> - - <div data-md-color-scheme="default" data-md-component="outdated" hidden> - - </div> - - - - - - -<header class="md-header md-header--shadow" data-md-component="header"> - <nav class="md-header__inner md-grid" aria-label="Header"> - <a href="../../.." title="ETSI SDG TFS Documentation" class="md-header__button md-logo" aria-label="ETSI SDG TFS Documentation" data-md-component="logo"> - - <img src="../../../images/logos/TeraFlow SDN Logo Screen_B_W NEG.png" alt="logo"> - - </a> - <label class="md-header__button md-icon" for="__drawer"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> - </label> - <div class="md-header__title" data-md-component="header-title"> - <div class="md-header__ellipsis"> - <div class="md-header__topic"> - <span class="md-ellipsis"> - ETSI SDG TFS Documentation - </span> - </div> - <div class="md-header__topic" data-md-component="header-topic"> - <span class="md-ellipsis"> - - Configure environment - - </span> - </div> - </div> - </div> - - - - - - - <label class="md-header__button md-icon" for="__search"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> - </label> - <div class="md-search" data-md-component="search" role="dialog"> - <label class="md-search__overlay" for="__search"></label> - <div class="md-search__inner" role="search"> - <form class="md-search__form" name="search"> - <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> - <label class="md-search__icon md-icon" for="__search"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> - </label> - <nav class="md-search__options" aria-label="Search"> - - <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> - </button> - </nav> - - </form> - <div class="md-search__output"> - <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> - <div class="md-search-result" data-md-component="search-result"> - <div class="md-search-result__meta"> - Initializing search - </div> - <ol class="md-search-result__list" role="presentation"></ol> - </div> - </div> - </div> - </div> -</div> - - - <div class="md-header__source"> - <a href="https://labs.etsi.org/rep/tfs" title="Go to repository" class="md-source" data-md-component="source"> - <div class="md-source__icon md-icon"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </div> - <div class="md-source__repository"> - TFS GitLab - </div> -</a> - </div> - - </nav> - -</header> - - <div class="md-container" data-md-component="container"> - - - - - - - <main class="md-main" data-md-component="main"> - <div class="md-main__inner md-grid"> - - - - <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > - <div class="md-sidebar__scrollwrap"> - <div class="md-sidebar__inner"> - - - - - - -<nav class="md-nav md-nav--primary md-nav--integrated" aria-label="Navigation" data-md-level="0"> - <label class="md-nav__title" for="__drawer"> - <a href="../../.." title="ETSI SDG TFS Documentation" class="md-nav__button md-logo" aria-label="ETSI SDG TFS Documentation" data-md-component="logo"> - - <img src="../../../images/logos/TeraFlow SDN Logo Screen_B_W NEG.png" alt="logo"> - - </a> - ETSI SDG TFS Documentation - </label> - - <div class="md-nav__source"> - <a href="https://labs.etsi.org/rep/tfs" title="Go to repository" class="md-source" data-md-component="source"> - <div class="md-source__icon md-icon"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </div> - <div class="md-source__repository"> - TFS GitLab - </div> -</a> - </div> - - <ul class="md-nav__list" data-md-scrollfix> - - - - - - - - <li class="md-nav__item"> - <a href="../../../deployment_guide/deployment_guide/" class="md-nav__link"> - - - <span class="md-ellipsis"> - 1. Deployment Guide - </span> - - - </a> - </li> - - - - - - - - - - <li class="md-nav__item"> - <a href="../../development_guide/" class="md-nav__link"> - - - <span class="md-ellipsis"> - 2. Development Guide - </span> - - - </a> - </li> - - - - </ul> -</nav> - </div> - </div> - </div> - - - - - <div class="md-content" data-md-component="content"> - <article class="md-content__inner md-typeset"> - - - - - <h1>Configure environment</h1> - -<ul> -<li><a href="./2.1.-Configure-Environment/2.1.1.-Python">2.1.1. Python</a></li> -<li><a href="./2.1.-Configure-Environment/2.1.2.-Java-(Quarkus)">2.1.2. Java (Quarkus)</a></li> -<li><a href="./2.1.-Configure-Environment/2.1.3.-Java-(Maven)">2.1.3. Java (Maven)</a></li> -<li><a href="./2.1.-Configure-Environment/2.1.4.-Rust">2.1.4. Rust</a></li> -<li><a href="./2.1.-Configure-Environment/2.1.5.-Erlang">2.1.5. Erlang</a></li> -<li><a href="./2.1.-Configure-Environment/2.1.6.-Kotlin">2.1.6. Kotlin</a></li> -</ul> - - - - - - - - - - - - - - </article> - </div> - - -<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> - </div> - - <button type="button" class="md-top md-icon" data-md-component="top" hidden> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> - Back to top -</button> - - </main> - - <footer class="md-footer"> - - - - <div class="md-footer-meta md-typeset"> - <div class="md-footer-meta__inner md-grid"> - <div class="md-copyright"> - - <div class="md-copyright__highlight"> - Copyright © 2019-2024 TeraflowSDN Project - </div> - - - Made with - <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> - Material for MkDocs - </a> - -</div> - - <div class="md-social"> - - - - - - - - - <a href="https://tfs.etsi.org/" target="_blank" rel="noopener" title="tfs.etsi.org" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M352 256c0 22.2-1.2 43.6-3.3 64H163.4c-2.2-20.4-3.3-41.8-3.3-64s1.2-43.6 3.3-64h185.3c2.2 20.4 3.3 41.8 3.3 64m28.8-64h123.1c5.3 20.5 8.1 41.9 8.1 64s-2.8 43.5-8.1 64H380.8c2.1-20.6 3.2-42 3.2-64s-1.1-43.4-3.2-64m112.6-32H376.7c-10-63.9-29.8-117.4-55.3-151.6 78.3 20.7 142 77.5 171.9 151.6zm-149.1 0H167.7c6.1-36.4 15.5-68.6 27-94.7 10.5-23.6 22.2-40.7 33.5-51.5C239.4 3.2 248.7 0 256 0s16.6 3.2 27.8 13.8c11.3 10.8 23 27.9 33.5 51.5 11.6 26 20.9 58.2 27 94.7m-209 0H18.6c30-74.1 93.6-130.9 172-151.6-25.5 34.2-45.3 87.7-55.3 151.6M8.1 192h123.1c-2.1 20.6-3.2 42-3.2 64s1.1 43.4 3.2 64H8.1C2.8 299.5 0 278.1 0 256s2.8-43.5 8.1-64m186.6 254.6c-11.6-26-20.9-58.2-27-94.6h176.6c-6.1 36.4-15.5 68.6-27 94.6-10.5 23.6-22.2 40.7-33.5 51.5-11.2 10.7-20.5 13.9-27.8 13.9s-16.6-3.2-27.8-13.8c-11.3-10.8-23-27.9-33.5-51.5zM135.3 352c10 63.9 29.8 117.4 55.3 151.6-78.4-20.7-142-77.5-172-151.6zm358.1 0c-30 74.1-93.6 130.9-171.9 151.6 25.5-34.2 45.2-87.7 55.3-151.6h116.7z"/></svg> - </a> - - - - - - - - - <a href="https://labs.etsi.org/rep/tfs" target="_blank" rel="noopener" title="labs.etsi.org" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </a> - - - - - - - - - <a href="https://www.linkedin.com/company/teraflowsdn/" target="_blank" rel="noopener" title="www.linkedin.com" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3M135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5m282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9z"/></svg> - </a> - - - - - - - - - <a href="https://twitter.com/TeraflowSDN" target="_blank" rel="noopener" title="twitter.com" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8l164.9-188.5L26.8 48h145.6l100.5 132.9zm-24.8 373.8h39.1L151.1 88h-42z"/></svg> - </a> - -</div> - - </div> - </div> -</footer> - - </div> - <div class="md-dialog" data-md-component="dialog"> - <div class="md-dialog__inner md-typeset"></div> - </div> - - <div class="md-progress" data-md-component="progress" role="progressbar"></div> - - - <script id="__config" type="application/json">{"base": "../../..", "features": ["navigation.instant", "navigation.instant.progress", "navigation.top", "navigation.footer", "navigation.path", "search", "search.highlight", "toc.integrate"], "search": "../../../assets/javascripts/workers/search.6ce7567c.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": {"provider": "mike"}}</script> - - - <script src="../../../assets/javascripts/bundle.83f73b43.min.js"></script> - - - </body> -</html> \ No newline at end of file diff --git a/public/develop/development_guide/configure_environment/java_quarkus/index.html b/public/develop/development_guide/configure_environment/java_quarkus/index.html deleted file mode 100644 index ad556e9..0000000 --- a/public/develop/development_guide/configure_environment/java_quarkus/index.html +++ /dev/null @@ -1,442 +0,0 @@ - -<!doctype html> -<html lang="en" class="no-js"> - <head> - - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - - <meta name="description" content="ETSI SDG TFS Documentation page"> - - - <meta name="author" content="TeraflowSDN by ETSI"> - - - <link rel="canonical" href="https://tfs.etsi.org/develop/development_guide/configure_environment/java_quarkus/"> - - - - - <link rel="icon" href="../../../images/favicon.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42"> - - - - <title>Java quarkus - ETSI SDG TFS Documentation</title> - - - - <link rel="stylesheet" href="../../../assets/stylesheets/main.0253249f.min.css"> - - - <link rel="stylesheet" href="../../../assets/stylesheets/palette.06af60db.min.css"> - - - - - - - - - - - - - <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> - <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> - - - - <link rel="stylesheet" href="../../../stylesheets/extra.css"> - - <script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> - - - - - - - </head> - - - - - - - - <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="0D47A1" data-md-color-accent="1565C0"> - - - <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> - <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> - <label class="md-overlay" for="__drawer"></label> - <div data-md-component="skip"> - - - <a href="#install-jdk" class="md-skip"> - Skip to content - </a> - - </div> - <div data-md-component="announce"> - - </div> - - <div data-md-color-scheme="default" data-md-component="outdated" hidden> - - </div> - - - - - - -<header class="md-header md-header--shadow" data-md-component="header"> - <nav class="md-header__inner md-grid" aria-label="Header"> - <a href="../../.." title="ETSI SDG TFS Documentation" class="md-header__button md-logo" aria-label="ETSI SDG TFS Documentation" data-md-component="logo"> - - <img src="../../../images/logos/TeraFlow SDN Logo Screen_B_W NEG.png" alt="logo"> - - </a> - <label class="md-header__button md-icon" for="__drawer"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> - </label> - <div class="md-header__title" data-md-component="header-title"> - <div class="md-header__ellipsis"> - <div class="md-header__topic"> - <span class="md-ellipsis"> - ETSI SDG TFS Documentation - </span> - </div> - <div class="md-header__topic" data-md-component="header-topic"> - <span class="md-ellipsis"> - - Java quarkus - - </span> - </div> - </div> - </div> - - - - - - - <label class="md-header__button md-icon" for="__search"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> - </label> - <div class="md-search" data-md-component="search" role="dialog"> - <label class="md-search__overlay" for="__search"></label> - <div class="md-search__inner" role="search"> - <form class="md-search__form" name="search"> - <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> - <label class="md-search__icon md-icon" for="__search"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> - </label> - <nav class="md-search__options" aria-label="Search"> - - <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> - </button> - </nav> - - </form> - <div class="md-search__output"> - <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> - <div class="md-search-result" data-md-component="search-result"> - <div class="md-search-result__meta"> - Initializing search - </div> - <ol class="md-search-result__list" role="presentation"></ol> - </div> - </div> - </div> - </div> -</div> - - - <div class="md-header__source"> - <a href="https://labs.etsi.org/rep/tfs" title="Go to repository" class="md-source" data-md-component="source"> - <div class="md-source__icon md-icon"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </div> - <div class="md-source__repository"> - TFS GitLab - </div> -</a> - </div> - - </nav> - -</header> - - <div class="md-container" data-md-component="container"> - - - - - - - <main class="md-main" data-md-component="main"> - <div class="md-main__inner md-grid"> - - - - <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > - <div class="md-sidebar__scrollwrap"> - <div class="md-sidebar__inner"> - - - - - - -<nav class="md-nav md-nav--primary md-nav--integrated" aria-label="Navigation" data-md-level="0"> - <label class="md-nav__title" for="__drawer"> - <a href="../../.." title="ETSI SDG TFS Documentation" class="md-nav__button md-logo" aria-label="ETSI SDG TFS Documentation" data-md-component="logo"> - - <img src="../../../images/logos/TeraFlow SDN Logo Screen_B_W NEG.png" alt="logo"> - - </a> - ETSI SDG TFS Documentation - </label> - - <div class="md-nav__source"> - <a href="https://labs.etsi.org/rep/tfs" title="Go to repository" class="md-source" data-md-component="source"> - <div class="md-source__icon md-icon"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </div> - <div class="md-source__repository"> - TFS GitLab - </div> -</a> - </div> - - <ul class="md-nav__list" data-md-scrollfix> - - - - - - - - <li class="md-nav__item"> - <a href="../../../deployment_guide/deployment_guide/" class="md-nav__link"> - - - <span class="md-ellipsis"> - 1. Deployment Guide - </span> - - - </a> - </li> - - - - - - - - - - <li class="md-nav__item"> - <a href="../../development_guide/" class="md-nav__link"> - - - <span class="md-ellipsis"> - 2. Development Guide - </span> - - - </a> - </li> - - - - </ul> -</nav> - </div> - </div> - </div> - - - - - <div class="md-content" data-md-component="content"> - <article class="md-content__inner md-typeset"> - - - - - <h1>Java quarkus</h1> - -<p>This section describe the steps needed to create a development environment for TFS components implemented in Java. Currently, ZTP and Policy components have been developed in Java (version 11) and use the <a href="https://quarkus.io/">Quarkus</a> framework, which enables kubernetes-native development.</p> -<h2 id="install-jdk">Install JDK</h2> -<p>To begin, make sure that you have java installed and in the correct version</p> -<pre><code>java --version -</code></pre> -<p>If you don't have java installed you will get an error like the following:</p> -<pre><code>Command 'java' not found, but can be installed with: - -sudo apt install default-jre # version 2:1.11-72build1, or -sudo apt install openjdk-11-jre-headless # version 11.0.14+9-0ubuntu2 -sudo apt install openjdk-17-jre-headless # version 17.0.2+8-1 -sudo apt install openjdk-18-jre-headless # version 18~36ea-1 -sudo apt install openjdk-8-jre-headless # version 8u312-b07-0ubuntu1 -</code></pre> -<p>In which case you should use the following command to install the correct version:</p> -<pre><code>sudo apt install openjdk-11-jre-headless -</code></pre> -<p>Else you should get something like the following:</p> -<pre><code>openjdk 11.0.18 2023-01-17 -OpenJDK Runtime Environment (build 11.0.18+10-post-Ubuntu-0ubuntu120.04.1) -OpenJDK 64-Bit Server VM (build 11.0.18+10-post-Ubuntu-0ubuntu120.04.1, mixed mode, sharing) -</code></pre> -<h2 id="compiling-and-testing-existing-components">Compiling and testing existing components</h2> -<p>In the root directory of the existing Java components you will find an executable maven wrapper named <code>mvnw</code>. You could use this executable, which is already configured in pair with the components, instead of your local maven installation. So for example if you want to compile the project you would run the following:</p> -<pre><code>./mvnw compile -</code></pre> -<h2 id="vs-code-quarkus-plugin">VS Code Quarkus plugin</h2> -<p>In case you are using <a href="https://code.visualstudio.com/">VS Code</a> for development, we suggest to install the <a href="https://marketplace.visualstudio.com/items?itemName=redhat.vscode-quarkus">official Quarkus extension</a>. -The extension should be able to automatically find the current open project and integrate with the above <code>mvnw</code> maven wrapper, making it easier to control the <a href="https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html">maven lifecycle</a>. -Make sure that you open the specific component directory (i.e., <code>src/ztp</code> or <code>src/policy</code>) and not the general controller one (i.e., <code>src</code>.</p> -<h2 id="new-java-tfs-component">New Java TFS component</h2> -<h3 id="sample-project">Sample Project</h3> -<p>If you want to create a new TFS component written in Java you could generate a new Quarkus project based on the following project:</p> -<p><a href="https://code.quarkus.io/?e=grpc&e=kubernetes&e=container-image-jib&e=kubernetes-service-binding&e=smallrye-health&e=resteasy-reactive">TFS Sample Quarkus Project</a></p> -<p>In that way, you should have most of the libraries you would need to integrate with the rest of the TFS Components. Feel free however to add or remove libraries depending on your needs.</p> -<h3 id="initial-setup">Initial setup</h3> -<p>If you used the sample project above, you should have a project with a basic structure. However there are some steps that you should take before starting development.</p> -<p>First make sure that you copy the protobuff files, that are found in the root directory of the TFS SDN controller, to the <code>new-component/src/main/proto</code> directory.</p> -<p>Next you should create the following files: -* <code>new-component/.gitlab-ci.yml</code> -* <code>new-component/Dockerfile</code> -* <code>new-component/src/resources/application.yaml</code></p> -<p>We suggest to copy the respective files from existing components (Automation and Policy) and change them according to your needs.</p> - - - - - - - - - - - - - - </article> - </div> - - -<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> - </div> - - <button type="button" class="md-top md-icon" data-md-component="top" hidden> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> - Back to top -</button> - - </main> - - <footer class="md-footer"> - - - - <div class="md-footer-meta md-typeset"> - <div class="md-footer-meta__inner md-grid"> - <div class="md-copyright"> - - <div class="md-copyright__highlight"> - Copyright © 2019-2024 TeraflowSDN Project - </div> - - - Made with - <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> - Material for MkDocs - </a> - -</div> - - <div class="md-social"> - - - - - - - - - <a href="https://tfs.etsi.org/" target="_blank" rel="noopener" title="tfs.etsi.org" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M352 256c0 22.2-1.2 43.6-3.3 64H163.4c-2.2-20.4-3.3-41.8-3.3-64s1.2-43.6 3.3-64h185.3c2.2 20.4 3.3 41.8 3.3 64m28.8-64h123.1c5.3 20.5 8.1 41.9 8.1 64s-2.8 43.5-8.1 64H380.8c2.1-20.6 3.2-42 3.2-64s-1.1-43.4-3.2-64m112.6-32H376.7c-10-63.9-29.8-117.4-55.3-151.6 78.3 20.7 142 77.5 171.9 151.6zm-149.1 0H167.7c6.1-36.4 15.5-68.6 27-94.7 10.5-23.6 22.2-40.7 33.5-51.5C239.4 3.2 248.7 0 256 0s16.6 3.2 27.8 13.8c11.3 10.8 23 27.9 33.5 51.5 11.6 26 20.9 58.2 27 94.7m-209 0H18.6c30-74.1 93.6-130.9 172-151.6-25.5 34.2-45.3 87.7-55.3 151.6M8.1 192h123.1c-2.1 20.6-3.2 42-3.2 64s1.1 43.4 3.2 64H8.1C2.8 299.5 0 278.1 0 256s2.8-43.5 8.1-64m186.6 254.6c-11.6-26-20.9-58.2-27-94.6h176.6c-6.1 36.4-15.5 68.6-27 94.6-10.5 23.6-22.2 40.7-33.5 51.5-11.2 10.7-20.5 13.9-27.8 13.9s-16.6-3.2-27.8-13.8c-11.3-10.8-23-27.9-33.5-51.5zM135.3 352c10 63.9 29.8 117.4 55.3 151.6-78.4-20.7-142-77.5-172-151.6zm358.1 0c-30 74.1-93.6 130.9-171.9 151.6 25.5-34.2 45.2-87.7 55.3-151.6h116.7z"/></svg> - </a> - - - - - - - - - <a href="https://labs.etsi.org/rep/tfs" target="_blank" rel="noopener" title="labs.etsi.org" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </a> - - - - - - - - - <a href="https://www.linkedin.com/company/teraflowsdn/" target="_blank" rel="noopener" title="www.linkedin.com" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3M135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5m282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9z"/></svg> - </a> - - - - - - - - - <a href="https://twitter.com/TeraflowSDN" target="_blank" rel="noopener" title="twitter.com" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8l164.9-188.5L26.8 48h145.6l100.5 132.9zm-24.8 373.8h39.1L151.1 88h-42z"/></svg> - </a> - -</div> - - </div> - </div> -</footer> - - </div> - <div class="md-dialog" data-md-component="dialog"> - <div class="md-dialog__inner md-typeset"></div> - </div> - - <div class="md-progress" data-md-component="progress" role="progressbar"></div> - - - <script id="__config" type="application/json">{"base": "../../..", "features": ["navigation.instant", "navigation.instant.progress", "navigation.top", "navigation.footer", "navigation.path", "search", "search.highlight", "toc.integrate"], "search": "../../../assets/javascripts/workers/search.6ce7567c.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": {"provider": "mike"}}</script> - - - <script src="../../../assets/javascripts/bundle.83f73b43.min.js"></script> - - - </body> -</html> \ No newline at end of file diff --git a/public/develop/development_guide/configure_environment/python/index.html b/public/develop/development_guide/configure_environment/python/index.html deleted file mode 100644 index e19e711..0000000 --- a/public/develop/development_guide/configure_environment/python/index.html +++ /dev/null @@ -1,499 +0,0 @@ - -<!doctype html> -<html lang="en" class="no-js"> - <head> - - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - - <meta name="description" content="ETSI SDG TFS Documentation page"> - - - <meta name="author" content="TeraflowSDN by ETSI"> - - - <link rel="canonical" href="https://tfs.etsi.org/develop/development_guide/configure_environment/python/"> - - - - - <link rel="icon" href="../../../images/favicon.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42"> - - - - <title>Python - ETSI SDG TFS Documentation</title> - - - - <link rel="stylesheet" href="../../../assets/stylesheets/main.0253249f.min.css"> - - - <link rel="stylesheet" href="../../../assets/stylesheets/palette.06af60db.min.css"> - - - - - - - - - - - - - <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> - <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> - - - - <link rel="stylesheet" href="../../../stylesheets/extra.css"> - - <script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> - - - - - - - </head> - - - - - - - - <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="0D47A1" data-md-color-accent="1565C0"> - - - <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> - <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> - <label class="md-overlay" for="__drawer"></label> - <div data-md-component="skip"> - - - <a href="#upgrade-the-ubuntu-distribution" class="md-skip"> - Skip to content - </a> - - </div> - <div data-md-component="announce"> - - </div> - - <div data-md-color-scheme="default" data-md-component="outdated" hidden> - - </div> - - - - - - -<header class="md-header md-header--shadow" data-md-component="header"> - <nav class="md-header__inner md-grid" aria-label="Header"> - <a href="../../.." title="ETSI SDG TFS Documentation" class="md-header__button md-logo" aria-label="ETSI SDG TFS Documentation" data-md-component="logo"> - - <img src="../../../images/logos/TeraFlow SDN Logo Screen_B_W NEG.png" alt="logo"> - - </a> - <label class="md-header__button md-icon" for="__drawer"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> - </label> - <div class="md-header__title" data-md-component="header-title"> - <div class="md-header__ellipsis"> - <div class="md-header__topic"> - <span class="md-ellipsis"> - ETSI SDG TFS Documentation - </span> - </div> - <div class="md-header__topic" data-md-component="header-topic"> - <span class="md-ellipsis"> - - Python - - </span> - </div> - </div> - </div> - - - - - - - <label class="md-header__button md-icon" for="__search"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> - </label> - <div class="md-search" data-md-component="search" role="dialog"> - <label class="md-search__overlay" for="__search"></label> - <div class="md-search__inner" role="search"> - <form class="md-search__form" name="search"> - <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> - <label class="md-search__icon md-icon" for="__search"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> - </label> - <nav class="md-search__options" aria-label="Search"> - - <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> - </button> - </nav> - - </form> - <div class="md-search__output"> - <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> - <div class="md-search-result" data-md-component="search-result"> - <div class="md-search-result__meta"> - Initializing search - </div> - <ol class="md-search-result__list" role="presentation"></ol> - </div> - </div> - </div> - </div> -</div> - - - <div class="md-header__source"> - <a href="https://labs.etsi.org/rep/tfs" title="Go to repository" class="md-source" data-md-component="source"> - <div class="md-source__icon md-icon"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </div> - <div class="md-source__repository"> - TFS GitLab - </div> -</a> - </div> - - </nav> - -</header> - - <div class="md-container" data-md-component="container"> - - - - - - - <main class="md-main" data-md-component="main"> - <div class="md-main__inner md-grid"> - - - - <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > - <div class="md-sidebar__scrollwrap"> - <div class="md-sidebar__inner"> - - - - - - -<nav class="md-nav md-nav--primary md-nav--integrated" aria-label="Navigation" data-md-level="0"> - <label class="md-nav__title" for="__drawer"> - <a href="../../.." title="ETSI SDG TFS Documentation" class="md-nav__button md-logo" aria-label="ETSI SDG TFS Documentation" data-md-component="logo"> - - <img src="../../../images/logos/TeraFlow SDN Logo Screen_B_W NEG.png" alt="logo"> - - </a> - ETSI SDG TFS Documentation - </label> - - <div class="md-nav__source"> - <a href="https://labs.etsi.org/rep/tfs" title="Go to repository" class="md-source" data-md-component="source"> - <div class="md-source__icon md-icon"> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </div> - <div class="md-source__repository"> - TFS GitLab - </div> -</a> - </div> - - <ul class="md-nav__list" data-md-scrollfix> - - - - - - - - <li class="md-nav__item"> - <a href="../../../deployment_guide/deployment_guide/" class="md-nav__link"> - - - <span class="md-ellipsis"> - 1. Deployment Guide - </span> - - - </a> - </li> - - - - - - - - - - <li class="md-nav__item"> - <a href="../../development_guide/" class="md-nav__link"> - - - <span class="md-ellipsis"> - 2. Development Guide - </span> - - - </a> - </li> - - - - </ul> -</nav> - </div> - </div> - </div> - - - - - <div class="md-content" data-md-component="content"> - <article class="md-content__inner md-typeset"> - - - - - <h1>Python</h1> - -<p>This section describes how to configure the Python environment to run experiments and -develop code for the ETSI TeraFlowSDN controller. -In particular, we use <a href="https://github.com/pyenv/pyenv">PyEnv</a> to install the appropriate -version of Python and manage the virtual environments.</p> -<h2 id="upgrade-the-ubuntu-distribution">Upgrade the Ubuntu distribution</h2> -<p>Skip this step if you already did it during the installation of your machine.</p> -<pre><code class="language-bash">sudo apt-get update -y -sudo apt-get dist-upgrade -y -</code></pre> -<h2 id="install-pyenv-dependencies">Install PyEnv dependencies</h2> -<pre><code class="language-bash">sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget \ - curl llvm git libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev -</code></pre> -<h2 id="install-pyenv">Install PyEnv</h2> -<p>We recommend installing PyEnv through<br /> -<a href="https://github.com/pyenv/pyenv-installer">PyEnv Installer</a>. -Below you can find the instructions, but we refer you to the link for updated -instructions.</p> -<pre><code class="language-bash">curl https://pyenv.run | bash -# When finished, edit ~/.bash_profile // ~/.profile // ~/.bashrc as the installer proposes. -# In general, it means to append the following lines to ~/.bashrc: -export PYENV_ROOT="$HOME/.pyenv" -command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH" -eval "$(pyenv init -)" -eval "$(pyenv virtualenv-init -)" -</code></pre> -<p>In case .bashrc is not linked properly to your profile, you may need to append the -following line into your local .profile file:</p> -<pre><code class="language-bash"># Open ~/.profile and append this line: -+source "$HOME"/.bashrc -</code></pre> -<h2 id="restart-the-machine">Restart the machine</h2> -<p>Restart the machine for all the changes to take effect.</p> -<pre><code class="language-bash">sudo reboot -</code></pre> -<h2 id="install-python-39-over-pyenv">Install Python 3.9 over PyEnv</h2> -<p>ETSI TeraFlowSDN uses Python 3.9 by default. -You should install the latest stable update of Python 3.9, i.e., avoid "-dev" versions. -To find the latest version available in PyEnv, you can run the following command:</p> -<pre><code class="language-bash">pyenv install --list | grep " 3.9" -</code></pre> -<p>At the time of writing, this command will output the following list:</p> -<pre><code> 3.9.0 - 3.9-dev - 3.9.1 - 3.9.2 - 3.9.4 - 3.9.5 - 3.9.6 - 3.9.7 - 3.9.8 - 3.9.9 - 3.9.10 - 3.9.11 - 3.9.12 - 3.9.13 - 3.9.14 - 3.9.15 - 3.9.16 ** always select the latest version ** -</code></pre> -<p>Therefore, the latest stable version is Python 3.9.16. -To install this version, you should run:</p> -<pre><code class="language-bash">pyenv install 3.9.16 - # This command might take some minutes depending on your Internet connection speed - # and the performance of your machine. -</code></pre> -<h2 id="create-the-virtual-environment-for-teraflowsdn">Create the Virtual Environment for TeraFlowSDN</h2> -<p>The following commands create a virtual environment named as <code>tfs</code> using Python 3.9 and -associate that environment with the current folder, i.e., <code>~/tfs-ctrl</code>. -That way, when you are in that folder, the associated virtual environment will be used, -thus inheriting the Python interpreter, i.e., Python 3.9, and the Python packages -installed on it.</p> -<pre><code class="language-bash">cd ~/tfs-ctrl -pyenv virtualenv 3.9.16 tfs -pyenv local 3.9.16/envs/tfs -</code></pre> -<p>After completing these commands, you should see in your prompt that now you're within -the virtual environment <code>3.9.16/envs/tfs</code> on folder <code>~/tfs-ctrl</code>:</p> -<pre><code>(3.9.16/envs/tfs) tfs@tfs-vm:~/tfs-ctrl$ -</code></pre> -<p>In case that the correct pyenv does not get automatically activated when you change to -the tfs-ctrl/ folder, then execute the following command:</p> -<pre><code class="language-bash">cd ~/tfs-ctrl -pyenv activate 3.9.16/envs/tfs -</code></pre> -<h2 id="install-the-basic-python-packages-within-the-virtual-environment">Install the basic Python packages within the virtual environment</h2> -<p>From within the <code>3.9.16/envs/tfs</code> environment on folder <code>~/tfs-ctrl</code>, run the following -commands to install the basic Python packages required to work with TeraFlowSDN.</p> -<pre><code class="language-bash">cd ~/tfs-ctrl -./install_requirements.sh -</code></pre> -<p>Some dependencies require to re-load the session, so log-out and log-in again.</p> -<h2 id="generate-the-python-code-from-the-grpc-proto-messages-and-services">Generate the Python code from the gRPC Proto messages and services</h2> -<p>The components, e.g., microservices, of the TeraFlowSDN controller, in general, use a gRPC-based open API to interoperate. -All the protocol definitions can be found in sub-folder <code>proto</code> within the root project folder. -For additional details on gRPC, visit the official web-page <a href="https://grpc.io/">gRPC</a>.</p> -<p>In order to interact with the components, (re-)generate the Python code from gRPC definitions running the following command:</p> -<pre><code class="language-bash">cd ~/tfs-ctrl -proto/generate_code_python.sh -</code></pre> - - - - - - - - - - - - - - </article> - </div> - - -<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> - </div> - - <button type="button" class="md-top md-icon" data-md-component="top" hidden> - - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> - Back to top -</button> - - </main> - - <footer class="md-footer"> - - - - <div class="md-footer-meta md-typeset"> - <div class="md-footer-meta__inner md-grid"> - <div class="md-copyright"> - - <div class="md-copyright__highlight"> - Copyright © 2019-2024 TeraflowSDN Project - </div> - - - Made with - <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> - Material for MkDocs - </a> - -</div> - - <div class="md-social"> - - - - - - - - - <a href="https://tfs.etsi.org/" target="_blank" rel="noopener" title="tfs.etsi.org" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M352 256c0 22.2-1.2 43.6-3.3 64H163.4c-2.2-20.4-3.3-41.8-3.3-64s1.2-43.6 3.3-64h185.3c2.2 20.4 3.3 41.8 3.3 64m28.8-64h123.1c5.3 20.5 8.1 41.9 8.1 64s-2.8 43.5-8.1 64H380.8c2.1-20.6 3.2-42 3.2-64s-1.1-43.4-3.2-64m112.6-32H376.7c-10-63.9-29.8-117.4-55.3-151.6 78.3 20.7 142 77.5 171.9 151.6zm-149.1 0H167.7c6.1-36.4 15.5-68.6 27-94.7 10.5-23.6 22.2-40.7 33.5-51.5C239.4 3.2 248.7 0 256 0s16.6 3.2 27.8 13.8c11.3 10.8 23 27.9 33.5 51.5 11.6 26 20.9 58.2 27 94.7m-209 0H18.6c30-74.1 93.6-130.9 172-151.6-25.5 34.2-45.3 87.7-55.3 151.6M8.1 192h123.1c-2.1 20.6-3.2 42-3.2 64s1.1 43.4 3.2 64H8.1C2.8 299.5 0 278.1 0 256s2.8-43.5 8.1-64m186.6 254.6c-11.6-26-20.9-58.2-27-94.6h176.6c-6.1 36.4-15.5 68.6-27 94.6-10.5 23.6-22.2 40.7-33.5 51.5-11.2 10.7-20.5 13.9-27.8 13.9s-16.6-3.2-27.8-13.8c-11.3-10.8-23-27.9-33.5-51.5zM135.3 352c10 63.9 29.8 117.4 55.3 151.6-78.4-20.7-142-77.5-172-151.6zm358.1 0c-30 74.1-93.6 130.9-171.9 151.6 25.5-34.2 45.2-87.7 55.3-151.6h116.7z"/></svg> - </a> - - - - - - - - - <a href="https://labs.etsi.org/rep/tfs" target="_blank" rel="noopener" title="labs.etsi.org" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> - </a> - - - - - - - - - <a href="https://www.linkedin.com/company/teraflowsdn/" target="_blank" rel="noopener" title="www.linkedin.com" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3M135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5m282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9z"/></svg> - </a> - - - - - - - - - <a href="https://twitter.com/TeraflowSDN" target="_blank" rel="noopener" title="twitter.com" class="md-social__link"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8l164.9-188.5L26.8 48h145.6l100.5 132.9zm-24.8 373.8h39.1L151.1 88h-42z"/></svg> - </a> - -</div> - - </div> - </div> -</footer> - - </div> - <div class="md-dialog" data-md-component="dialog"> - <div class="md-dialog__inner md-typeset"></div> - </div> - - <div class="md-progress" data-md-component="progress" role="progressbar"></div> - - - <script id="__config" type="application/json">{"base": "../../..", "features": ["navigation.instant", "navigation.instant.progress", "navigation.top", "navigation.footer", "navigation.path", "search", "search.highlight", "toc.integrate"], "search": "../../../assets/javascripts/workers/search.6ce7567c.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": {"provider": "mike"}}</script> - - - <script src="../../../assets/javascripts/bundle.83f73b43.min.js"></script> - - - </body> -</html> \ No newline at end of file diff --git a/public/develop/images/architecture/CAPIF Core Function.png b/public/develop/images/architecture/CAPIF Core Function.png deleted file mode 100644 index cc790ca60cb40a631a0fcc83d3530f62e51b28e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58316 zcmeFZby$>Z8!tMPfPko|2ufIhv^aE)ASJ1kv<S%1(m61S$U>z=L3%(yx*G;mloS|Z z=uqjFZrIN|xW483_CD9y=eo{0f9-W$%XoR?dG5Y{_wO-CLrsC^IOA~`3`V1*c>5j< zMv8>NNMIDlz!i@dcZ0xhM9%jVWMH{%7iYj<NG)%v-h#mjLaFvl$-v(!A1mrP!(ivG zLH`pe-Mjh=1{*U~x_wK_!+3t5D(=jB{L-PY)a%5iEAituVii`Ti`eCz9yOU#R&k$J zJJ)m3RPto-g?hukE?qW$cuwUZ`sDI!){6A2Pu_ma^oYHdTy?oQIr)N%+-*9IXo~4q zB8_&(&M!upqMtBKZ`MjlYTp!;6zr|hGBH+X86{V9b#>Qv?=7ocUtHQWI7I~32ZOO{ zk-`aofL*$RIl4r_Ktw~hglMDy+lBs<kw=ga{%}%&n33=Ybl52z;SaE9uh5V<z^lyv zzkXHNGsUYiNgADo;A?0ZL<_wlF?%S&%kdRhI7S1vLiYM&)0Hsei)P^G9A}Dso?Lyr zLXkq>a31{qI2n%#D`lJn@yyp7V7+LWTmR?r|93@aCJe{VAr_dK(jA=Wul_Y^oHgJf zn!c0v&f7moRG39;;fWX7=wQYE$476Y9D1GzZ7LVl@mYD*{)nk@O00s-eEyeSj6`#0 zzxH0Atyb%Be5pOmD=V5yv&tJ(8^Uu<Ov}ttBBOcdX4}F#XQHG``0IX7S{3Bb;FT-z zs_GG=NTL#D!Atj&DV1%8$Q0>AZUFV4Ij&!WI4$BiFJl{fE|kl$E~<bt%lfgyuW};g zWztq(r;JEm)SZ`0vB{@8(szui?i*aFI*x2hubHh~`$%$_n(2XwxI_wPsQcF<<HZfM z(>lU0#kh^y2EROK)BV)FdwQgYn*%L6%UxtFn5wT)k@pfU|3a|ax+_gzupI0BkjA^% zbJtW*^bp^xm07*VqutY8LLGj`ur`_|bs#l!Yk%k(&2EXOY=!folU-kR?ZVCiaZHi5 zNWR?LLH#8bdhw)z<}zaDI=x!AtWp-MR}Si_&b#$7UY1;8f0<E(tp+@e<O?HJV-|Nd zd`nf6tGJw_@9CoKtRC}Ywd6;!^mB^i$QZ3Em*mxff&5fSBU1QCC0$8zkIv)6MRB>! zx5Md4cO9m?9~c#--=h(GFUysd!QqtjsM;%k`;v-nRHQm%dSd{UmgnTFSuW<Tl%%hV zsGKu4(<u#FKh`^~=x|@UHP+wd&giE2_DZJC7PV%5nH9F~NTC|5tBPS6lL&sd@+R}= zb=BZVHIBQZv6FKLHphfVrA#xdW0#Jzc-w&u{KvK9MX<)J&*?KfcJAOyzR5WUJ&Iy+ z)#WE5Qnd}$QDMkd>@epUbx(083SO<btuT`Lb*>b-*@KVqlat<DjyWS<ETj42%A%X# z%LRj6B{?}pDF>_?UMlMXw{69vCpx;?S*4}=XWQGl8<FA9TYWXz=TGnusg}f8n{+Q+ z*%g~RtP%Veghy`E$ev;FdKsy+s41%%pQ$^VbEBiC(x>B5yemnJ;?>!qB`Iw2A`Moj zMmC7#<41yleEuC>n1W_*Z(pQ&`3lEm6AI@G3S_-YQ*EZ|+;}RApS)Ew6gl$d24~P3 z{vFu`{K>w$`n>n(M{&)W)t1X%tsZogEV$+w*%<GQZaw!X`2}Myf9I;!aLuV>N+!Ke zo5z;D8$2a#t9Q$ZTDNx3&9;4cTz@LdINPyfRjYD(zsFR$U_swU&P47Gy_LZ?8szhX zJ9*4)--kp+|I1FCZrd#7f49htwC`UqmZ>td(0#)p@QXJ`^2gV6_OP+)kk-^hd6jax z)x^P+oh?o*4YIm6R`6}Rj*>FMS;sZ+z;OSHEF3jKRH9-oQK_PBiT&6}<sdQQRvCJM z7Flgqqp~VgjD4!Ly6RcR{${JDoQS3_rqVo*0q9zT0=Z4B^nJX5#5GIsy<f2%f5*L{ z2Ul~mU~Ei8!DC+-hi~vRvP`<bM+Q@GkDYVS{N`O_PX@nMx#GS#8<`~cBBVn1f{!FJ zCNb~+l{D$}RON+PEn`o8KHI)2+iOIs?){cfcH$sC$_D4hvuAZiGJiG(#MEq+Y@L0j z-^@h?PvS`ad7aB8-9Xa3^9-(d?N@a6?qW0sxhBSwE49GwprPG=f9fDeHZHSdZQ$Sq zwNvTXo1z~)&Ny4$;mQievy$ppEOR@3%gi)v2QR+`-d<@Nv1(0v2{Xg{ui!)dU3F#f z5l2K;E9u8`m}h5kUtGNEd}u;9r-RawolXnR!t1u{4^baDGJWYL=Te)k@jbSkSr*dW zVT#hh23mNZ=wFfO`rMydd6{x_cs_yK5s~)Jr5}H&o*r8A;<=Ai5)}H<;u%-c!qVZ- zm1V$A$%dIZ{jcnIOr%&QVo>$i{PLt9LrN3ZhL~UAS)7QPL-*5;DbcwT-6<1Q`s}Ot z>-gM+EUumH=SVre?k{A1T6PgtI<e^b4y~LC&F9zexnR%fCOVz_(yg`oV$$g5kbAV< zhc||q20HUD_SgQWZJ)Hkg-h<bq+IfNtUfqsW}PXWK0vbGDycp&GwbGEer2F&>MzFX zA99p_4T4Y#xrO&8QjXj0TZj~XDLCIdNh1W$x;IEGEMl`uI&Ze;NypNnxAbeHdGd$R zTXC0ii+vCt3)Q_tu1fF@{5TIP6+{wdg6is%2nANGNIhg_97k4mN|Enh3L))$`LB@q zWbNnwdHnwe(an#C%Os_g0nNYy(2;!Tr>5+?EZdC=Ys;a2hE(*tE>XnbM~E#@f1aVH zLPqkL<Ywj7h#ef#8@Yt{<e4muKs7n+$0ZDr20!;3y%KBfy+fXN1?c)n)dUGWg^-Iu zeB|H;H2+B)jN|+Py53AS-nNmhE&+P%SrGad;uA=NuhtU^jNv2sA26=ab=G+3d#^%> z8AJX0B3d=;^4X!w(J}}U%mbIRIFG%$gvqw}IbNu=N3Rh+UU>m`{xJW;E&pRT<|)Bt zgg&T?InGN`A|(dP94!0jpj(SUX|2KUMThf<<S|HFZI@0oRR`B$oll{KD6(O0^msp- z{1#2^4Q)Hj3DnWY<qL^|8>Htmii_a~!qClE{RuZ~BgU3#y$cfrp=&q;!mXJkjAJz3 zg<<ud8J|l+Mf@}kDAUQVfC$>~T(ti&`@gQngR9KHSK##mdTHZr#F**PQWIFAr3x@W zyJD}J{Vg$<XN22az_*`E_OBYWGsfPBifY&%L1Otw5;ID^09}(Htf`MExM1X_t_e!; zNa)44ASs&5BE||9&cl%>kFI_pNUQ%0&I1Ux<w)Mp;|fB@;B1b4T|4V@!v@ex&m1T0 z$bbaWP1kr+1j7a?bonIV@*ub@Jm1v(Ie=<76}o)|^f2hB;ar48^t^mdkT=4VusNse znC1KYW*`Yc)_~pvy$$BU_(QO;B()<Atk4slZXpVWMBVhv+0z7iX|WvPPOl>kv^d`+ zXuJ_c*l!IfoEZ|?3PIyTN4FXv%(6GXeT%+%wAyhI!fIJa7~3}%27h1UCtOPe*9t9K zTn@IUe!unx;kBUVte2i|`dhL6p^zdt-k|HpST?lu^%)N#kt5tLLs~n|gIV4Rl+<e{ zv}pZ-gj>6T?f-Zc06*GUAuY7CyVF1}rfNb%K}T|NBbYJ;Qon!hBS8nO-UPoPg)eLe zO7<HPZ0$2afhTdKt3W1MQb*?AC;_eBAD!krlF#lPpKaM1ennx3ps|z-M5+|Cb8{t@ z?aZ5ekQa4HI#0D(5bP|>l#B`2*A!Fha@7%w=?urX`riq|tUo>aMd4`=4d<<=Jyd`E z!bGVroK8xq&v*2T%T?qs=JZu0_K#nVUXzS*6+3zkdZgf=8-H42EpuyjW<P?@{MQ%$ z>rTRZ{}+o=<^JDZ#sA~YeEDB|?@uB8?<|q<QNq@?*$y|-$v=C^`t5Wj&c5KveSAn9 zcHQk;mw%e&{5m5Xsj*jLM$kl|5ihwgXlx$U#mc`re~K?w*r6v$HW26#Qs9zjT|zdu zVL8qS3b^L<#4#7o)?e5Rl-^6ahS^@v^UD#m=_xORDGC$Ej04;2$0rcNGZe?n$&c=~ ztc$HiPuiI5>PzH{I#0gx=0dw%#wgK%u-O#Beq`->{%AG@i=E(AT8EVvG-uOubKQDj zVQQrC42yMof}e(|QXrkQ(nduNf3fAM#0mwQsv(}A#HAz<V)({@0KpkeuV8MKZ3PN@ zrWO~!`F%$y+0ApfKAUd@%YGJsK4x^Bab*1L1;%{mDK&Rh*o+J!!uP;b-E9I2_pA{V zNL(uBhpI8~5S!jy*Iv>vUQ&4U50(w{2+GwMP+hQU{&5SJPByN;$a1)ZD20Sb^%3MR z6BPv4M!SH;d=R?;ed}Dl_on?OGpzFon(bmsBv04&RAM_}K^QvV3Fe%7bG9B4y0-7S zE;v;G7$HH3oy0wB@M`}SCwlXMnV+yXWGI@Agz&oOqC_(a2)deu!LlRqQ6LZzw+im7 z@YQT3gJj7}YcW6ir4TrtyB#b;9uXl4GFP@Ggz9KaQy>MV`wGmKf2bX<n;f2{MJD(i zcuH;#IWN~@3mwPge?MXb9^uaZfd%OVap?-C2@}DtZoM>uU4BT^I*ZR5leDh3&^f^* zHl9nvil;ypMu3z_vsqjV?njR_u6g=$p29u*LLB2hiqiGl8)F&12I~w)vsLwbAEi~0 z&e#+{^bZI?vkBi9F}rjWj&Yi#a8ZzyIJimS6?KH<<=uWBiuLHl%b2FSq;Q1kB}|hf z6mFKlmZBy=d5^FJwsD4tM&myCJqj%3C=*f0ApDs@>J<QjD}xlHop|)7+obU68^nyP zs}#r;e{7)tF`5^(iG%=&W+9^S0)Q5XYcYEQ?u&+m%!vW%bnQG5O_(Psd>d%R5Vek9 z-i#y!PgcyWP_T_?1w=$G5E+|#!jYkkUnGtR15p(E!C|$jy3RRX!)Ze0P-t?C9B%4{ z0x=t`ERFx_32*&cU#vG3P)`_^0x1LP4RdB9Rnvma0b)k)(IaEB1qwfXwC3XxG_DVi zoR^76RgnUT{&od(-LS{I-m9a}5=~gvHrKb+J#(M}kh!5CeV-qy5In630thqtM_%8d z6vrhE)W#}(5;x94%!tW9iTl_tJ#U4>-0~5EvA)zZQU#!!?uruc67BEr6`3VOJia<m zgAxbM$=Wh8NO?6(b!B0zd1C((hLREzmD@Ku9OlX&w%#ZMl(%ydXHNSc$@u5qUy6>t zX<0AL1;me@4|iY>LkKmMjd4Y72FCDS1rJP~!eOdT1Lcjv(7%8@XJmmnr_cNr5{*|g z$c|n;Fc_4cQo!;yFlkhT?*ko!5W`Movqen=z2(23d~I46cSl)yEb+>26cAaMD73oA zJ{GhiLBI9pua(~p)hVn+B2P#=1IM_$&#Z}`nj{ZD5^2iofScz!A>Zr_rBh@@iPRL5 z|3@9SGXF8SnNL7EQWs77fyw{g5~~p~i4BIL1VNz!ei*Ck-yZ;8|65@xvA^v&j4=*D zJQLy2p!<*bL11C)<NrXYi9Mk>o+4ipk09>9IvSE^IKuK<zLpIVL^J|lrEDMr_gjQi z-_%qFmKr-gxcs(dSN69>&A(&E+)8VW7bnQ!Dljq>aOgkwazA_X6{xy?7h}W!($eoO z_1{oO`16B3gZeufh!dx}?M6	^oTi<K*f0+o%(mR!QNF$AIs0{VwvwfUW<R)*9K4 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 WziK~uUEOQDnR?nrS|yin-TxoGM%c^% diff --git a/public/develop/images/architecture/CAPIF_Core_Function.png b/public/develop/images/architecture/CAPIF_Core_Function.png deleted file mode 100644 index cc790ca60cb40a631a0fcc83d3530f62e51b28e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58316 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	^oTi<K*f0+o%(mR!QNF$AIs0{VwvwfUW<R)*9K4 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 WziK~uUEOQDnR?nrS|yin-TxoGM%c^% diff --git a/public/develop/images/architecture/New_Architecture.png b/public/develop/images/architecture/New_Architecture.png deleted file mode 100644 index 6ef7755c59136332a25d9c4ac735fa0784d24442..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173563 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 diff --git a/public/develop/images/architecture/msg_flow.png b/public/develop/images/architecture/msg_flow.png deleted file mode 100644 index 7163f87ea381ab5e63169d8722fea4c259c10a42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69966 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 diff --git a/public/develop/images/flows/01_Login_Admin.png b/public/develop/images/flows/01_Login_Admin.png deleted file mode 100644 index 5913c96c3bcb4a1c18b22ff13547604a1c8e9df9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28999 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 Z1*Wu|6G_BpOF*jvQCHKxRD`<~@;}Nsa;E?Q diff --git a/public/develop/images/flows/02_Creation_of_user.png b/public/develop/images/flows/02_Creation_of_user.png deleted file mode 100644 index 2024dfff4eca11ecdf5930060ec635d6d06482c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59335 zcmcG$bySsYv@O0>)QupaNK1osw}c>#2m&IFgp`B=N`vC25u~L<I;2}bN$Cb@knZmK zExzxbd+zUyGwxsK?r(fUbicguJnLC&uKCRQ`YJt@zI}`M76O5|Eh{6Tj6hsnhW`za zSK(jC=HE!bA2$r-r6mv-m;WVJr-vdC6bM-fF;$1y)p5s{PlnDBo3=y4CY+(J!NO>d zC09LEEt0ZW%(JuRgj<~}l~(cwBh>gT_0V<o@FaT}bIs)?EyR2&lEiU*C1i}^&N_u_ zMZZ5yZ}FkI6D3=dP;0y%D{v6YW!vepFlM_!%ie^9TR{AL_vN$B<qwDtBOf=fU;e;) zqmJP6&vHVf-sPWD1{5w=;Li{K|8oa;S*^lAm}g~Vm^KIAH#0NC_owCOcli0?%6R3w z?B-MJv2uORD9vJ1%Fq@R%QxvDDP;9l6NygM``qUH11U7VzP`i5!?!&DPF|ebXRGBh z(mKqAzX*_;NtW~<DK?|FU|?a16MV-gZrTyeL;QJOHUb~9Ig3j;)5LlWG1XIQIl8}` zofi=iF=D+sn5!ixC+E6G#mTwd8qRcbutCmk`X%3!0*UJGjC&{@K=@40*)au!fYoko zWWbdBmZJT}#Mzi_*K;}Q$hLQaI?Bq*78W`Ab8v7?O${<BHa7OdhYt_bG!c)!eHbP{ zX#dQsJr}eZ;}3Wn$*QC4ICn2t#_n%}FN;=btdL`&*ug{lb#0WAk&)4-_0*6c(epp1 z+#);eTz4NlWoBg^G%r!K*+3v75z`omPAtRIk=J?p0p6HIg(h8Oe#toEp>zt-!p{3) z3@Y&R1I585JKKfMv$;q;R-MXSI9O6zni}Qj?|=91T{hhxi}Uk?nJVeezDf0Pf5s7X zJ9V(J+0NA}vlEP~t-WYts~t;Ih$)+JVq#;%rre!y-mn}i4^Ga2C#X!h{75k4kKPK6 ziK%)!)0F)pFKb}gB*C@Rda|bOeG+EgkL_09yANz^Y+w?0V1!%ew#}F4*t733sgd%( zK~Nf%Xu2OSrEmW8spJ`1AFm1`6;OWm440T#&}R0xj}LM>)tjfSJ{lJ>6~K=8SrI4V zs=1i!e!AsdkH#2&i;^Z-24yr_YFSU1o|@|D=s0Y@f92W@b!Pm4xA3oPWp~knzkXFW zqn3O|XlQM1jZ%`6^UMGC*c<D)pNw()SAD%3&TFG(1n(ER>kF5Mi_*`U%FFq^tqIf? zXlQANOJ^4rFsxfzTBaS{{^aY2FVh$6@^t*oC%S^@MDG;3`g1t$p*<Gm?EJjiyX)D) zfiqs%<RT`Wu@Nj<Hl%z84L;5X>m4zC8)cJjqcyJ1N=n@@aK{~dlN2bAPoFNfg4}87 z=+?(7Y*+sj5YBjF5Lk^@^3c;GDR)~QB*5sBin{$!K6k2i+g<Frckf=k*X@)2QR_%H zz0Sf_0zH?lvxCXe-s0Co>&@iuLQcCGFlBI(nzMZ^Z^>M`?7fvCjF0`>b8RZh$|4u1 zJA%c3eto)musZxrEqf?W?_#ZNvNKj7^p%Exqq1v}s%4YlDluZy=;tqLM6Ax+w;bX! zJ}g-U@C=lXy^ui%8<Xy9BRp(ud8enR3NgHtsIjrJ!lELWF;1(oa&q_69t++C5!d6U z&m`hGUm_z3@bT$LY5W2L>>R}VYFtm&C#qK#7RqcFo_gu)I!t>eCnpbNzj#1LHxe;u zHBy`jvw}<#`*g$gXfASTY3ZBP=d9;y&ikvl#;@w?>sMTKpTB?4D=zb`CxBF-x1(dt zlR)>YsC!LJ%;?8!H?zzlvO186H<~y#h^bXnJ&|!y#j(-(`FUw`9jarz%D(n^ndyZ4 z)vH&?q|YRLozXli=VvGTY#PiF%R61ae?LOLTkiMOC)AfeSRa3pr|Y`Zo0{e8d5uGS zYVWJYfEYX&y<cl<>-P4xAAJ1%o%aS_G#b3!>!8ZFmO^~!^MG_|@*qd2`u&=wqhp15 zQbvmwswnU#7HPTDp83g|T<UgzrV6aiIzpHM+uvU(*VotU=9I}~eG*n9x76;wKsV7I zl2^kjV9xGa;twpcED*-`Z@hBlis<QP{prz8SAwYf@$OPzx?-MQ?fKtE{{e3K+Xonk zH+S;);nD<m?^1`$vEa9*C%Bo{#w{H2ydLCt@qaTNDtdlMEhHqgtynjmq~~^Y-Eged z{lc(0up>eAqLDzaxH|jzD>XYi4rN$Wl-a1wT<g8j8uPiWqV1iX$L^hfk*Fw=0`(lV zY>uX_tu08-W!94uHLg|Z=_b#f^?cW<f}tN#yMpL0hr;l4m?6B?{cJ@Knbhb{z@}N8 z0iWXH-Jc(?xt{FDaTt2lmo+pu_i@L?#R*%E6#xBe5U{m1(|oeKv@>jyfWE_Lzdpu5 zPyf5EO{>^6cuhw{L<E@>5P%u5b+og<G$&x%O%X!V*V|ijx-FkQ;B>S-*Cld-Ny+W7 zIW;o4xK#u*^BC!RIPJ~Az(5zuAS~=U@xyVkt6plO_ToHWzaFyk!omWd-C}olw-O3R z3<pNhG8=&~HTvu@co&iA^@OhP!<B1U`+C#6#`;Mu6}AhjliTZ68zUjZ5nq{ge;gj~ ztte*}o2xZ8HZr~VUi@lhv%zed@%=tgsl{+%PEL+Fk#R?~=jzk!?^)3~C=xtX_X!&} zw;J{<hKh{gX=!N&0hafITa3id-Q3)ubmXRKkPQYP5DREUY>0A1#H#~HNN@%i*j6LX z=rm7^j$v~5Oru{O*P$@14rE8NkKZ98IvUinu0Gvvqokxf*<V}vQ$XETI6Xa`;Ii#2 zLvv?hyNSg5bVcuCdw17JqZBH@^BtFs>I0FJ)gmZxchRPomINHPXQ7l1z7cqOW;{1D zL(TkmYiH-1*~s{~>*3~f`qMawb8%$#Zm+!Ue7o6Xjc}7XV|XAT$KT(<)ba80FmU&? zVBjR)bWvXdgL1;JuK&}(;Qt}^NO~PkY#6{%Ix_7Tzu-8X>cyacjS6{{QX+&#HYDu6 z2L&n;;qaAikiZ<v>9%Qnv}L5VQV>^sKa~rvh=6~i0XrevBy+|4DsgLe4DzJS3K2D0 z;%j0!m<orlGjPZYR2hTiQt$XeedNNV=GHSLz~RqK8~XQTUeUJy>tw7h1?tQd*I((m zB!sG%W@-kEM2-=?MDg1%ol)M;xiZ06qM56lnWD@fhJz=`^M3e4sClw$(tP63hxycD z`=cAro3~J!g+{Ws4}QLleVTr;850vIA~a;2uf(_hwOZ01-6PQ~TAwgFO*RBo8}c)W zZtUMX5J_y~D;5lRQ1aEaKr=VeI)ZxuJFlIp%3)1V+~<`>fqHvk&KtDv1#Q=3pY^R{ z@Z7Av!F{)TF5$yS;DZwWo!{mqx>Y*QuwU7!m90l(+`0vbY1c`(`RyD2yFyPwH~#&F zoA3((nx7w(VCc2Jn{Q@~-(eimf|!CVih1K&^V_=UoF-PhH&O~UZ2hFW#NDKiBHcO7 zc`k<-=A=k-<s0g0s}XNxWaP@8Q_(Qy1+^GYw2NMbz#>ngzz5a~qkeOtOr1lj*qI5{ zx1=VVQ5Ly3u5rMeP5%3kScz?-L?y(E=Jo^QX~Mi)LS1iT&l-JTR@27+J%SF7xN>;} zZVk70t=gd?vL<J0I{NXy*J$~~dePADBJ|Oj?CiRfKEfQs={6#<2Cn*_$TzaK0Q(Gq z;JH$L1EHj6E)xIf@DkD^2(AG<gOBzTmUTx}zID0x;x6psi)BUjU3yH8>V+nTr*&s@ z-d*Dg9WJKC-V>w)cPMx3w|-<-ypc4SO3@|8Sxm*JMzJ^1VYpXye{osYm2I4v5KX1i zb7L#<NouK64sF3S;kmX+^XIr~pmjxI@Q3)!aQokfl2YDg>`iK9k!tG7T=J~CY`Ko} z>|eQG9(r(C(^rjhNsJZgaEt#|4{=@Glnj5t-yz4CI@|8W&Q@dc@L+b*t@2FzdsVF( z%@9rlwXqk!f70suUi?}mHOlQ&Kvqvq4o?>iz0CjG(}hfS$Bf!mx3+vTGV32z)Orha z&m0D)<zJT&wqaO{9Byx1bf~l9GL7LLkLGG{%qvv>J?e8tJ2o?Bg%Tse^lpc?<;F$x z)kj<e1HCMNq>XD|{hdnG5v9qSaM7N}WsNWks7x-sBF6G~e63H2WTxzVMX&TCg2^7+ zK%!S}T;nBgnEACRpQ+mFx9au>OBh3Q&ol7I!~$gIH$M;j{K^+GdG|)>M$M>BtTesw zV+JX0hNuApZT9a97~}&17bn)oEdIS*C|oA8Bd+m8;y27Qx%i>q50_Z0QRy5y#inal zI&;zqgOyC$wFLZw7ut;tqXzzZ;}m|i!&mVP=h6tc_jLh!CPSzoAvBFtSM`~icho#m z=%rBXbTW)@n<*#EE8eAJQu3H^Y^q`Hxa*8WC2NG>KjT&zRmA(?<cTXzQno4><JLFY z=319=h<`4!b203`{Z}|gLbgb`T`M<s*qmcqNE(Mm(w|;RLOGyYJ_r9>IG17jU7ts2 zV#?fNU+N+!%{eA2RiwUf25?yOXt795v{DA3`_UomQmVSNSdf(CXR&@%UMZ$hIVq<2 zJA*eF&^=NJ{cv$<8nsw{G@>|ya6aPD$;i>)*u9Tfrg+=8KiQ?Xw`0vgQ7Ru9XelK^ z!W3EHFLENeMq*Y%$T9!#J-dp?v%bIzSR))tUrFgXE8Wm)j2bhOTHVyUJ?}XE**B*4 zNO&!)*8L}{XX}dFgufn%$b88=s;Fp#1{zrn0sjGm*<5@ShinfGb+Re0*q5(mngXHl zU`!8;WWM0Zau6nUOeSzI`4{c@%eInGHfXV^bvD=<x9_0IhTzpl?Fn^Jq8R-O+t!Iq zrI?>>7t6@uq`-u*&`lFWrD*sWb2JH=;NKuev5TY07U5B6P1Y*jCaQU3?D@M_jKqqY z*w%W%+uPHw$0>cB(S%mcgDNLh1J!oZerr=L+jb{kN(@$=wWN?WZ`j#MV<~3Knxf#{ z0p11$%C>SR=Zl_zDg5|rClY={e`k+kOgNbuZ0u15%B-QXM1gGuHuF*S9%g_#Bg3#P zJ*tJrtY*i?L&KiRR@2H^M~8D;#Ui8mt^&@|33Cdiux+(ncPX+Oc#WHMg-X23)|g3_ zD<gSBC5wW*thaYtv~W8_<>E`mY2z(yR6!VX(8}su?z4sY@o#2~8J=Bv&3U@zW=(`l zbIO_OR?}97ceDat-G4khC}xiP*=mwO&~DlMm+MY(&$tke9IAV^=bB&JXBui((XB9< zH2mPSa?=eZ_XL|bO0JW0-++h3>H@Z55p>MHlccK?1<y?rhrTEDSw;G#TDjqM@V;NU zGUddo(;?eJ|NNd4nT-5;&;Ds^h2h^Br`0psxw>4T=y2pkd)^qmOm(O4tc26xuW}I` zGe2cH<TaBf<co{+X=UTimbO>hRh1rv38Gq@Nv|C8eY&**?m=X5Eits6x!tc8KjoRb z=Ot=|A1_nOqITGwBSBfX`&rGol0%>j!!!ibe0opCrpc4!h9-^5?*=kPMT}<ZkbE0D z|AJz}uc{<z!9E#3s#04_tT0!Ge$^{@;T$itb>W9E%1CXmSJG4nK4N`!EbV;rD5I_Q zox3(0|NH6hGV8t^PL^R2Nr#^wV%u*J;^NPqxb_bGuwh_&J}`s*_OT}$;SPT2`cnES z(u3cDe{MTGr%X4dw@fQW#XUBhzM8#>rGM<Ndy`Yfz5R{91>p+<MFlyE={OZngc4so z)ITY@CRoeQ|A2=60}VQ=d-K=0np@3GdZ>VqN#NSxh|afD<H?PKRwk!+m|^mgXNDsq zoTP+(#-}-G5;&ZE?u4FVGs&iE%=YPozCD^W7926{0Rz3_uN>{2ay0jbEOvUriuqo+ zP#+-uG2iO#&A;?KwQknxO4DTz8>cpVW>LnwPCUma8pkrQG7;a)lV+ID(h-2p@76wM zrFgx~=nhIL$f^fP$<)QBUBaS#e><U(&1|)D!j~&@-sR9RFT<hY$rzL16J~r$6c%l| zc3U<MlTgwOLg^+=qmL1Bl;8*BR1@ooleNRf^7yrQ^8T~gn^m;86e({@5gL;13`Xb! z|Iu6MS4AroPX1WPyfrk1P%SHhzWRx~uEwMhr>`TEN&gZ3XYzI@shRy3H$~5#n@$IA z7U$Max_?U$-!J<n{y;IFu_}he9(#2_U~F9Be1K0ha*+v%I=8k-7tzrg4N)Kua*R)> zzeU+!<ZOcaGSJ%Py3mH>KHwe^FjU@R$q*D*$-YvpgT}Btex%{~q_@geUSCLH|732p z?v|8tLURl;qsw$|tcKpU-9bDu>6&!!ccXE)6`ua|W|fVz19p?%P`sn#udHO|jh?%r zrLG75;z>@g+Hpk56{oqNY6L)87eAg0&*qavU1y0AWnoTf^i|1x&AV>a$7u9xCGXUB z?8AN0YWZGfDIxLS<{VnN*n!+Sm9Z7eI|_76J1yJplBJmI6P+ikdk+nwZeUS<Y<e{p zaNNu3mwe;4j}%g;(q`O4-J^{8>z@_{hBG1kzMjy9A41jh)f|~G4zPqr&Yief41ZN& z+_PyJE)Ixuc2mhz%?lt~U72ao2#6h)(chhFv*s<uc-CNt$;!f{cYf|}N7r91-@mvp zBSEzlJ9lw*I{xC?>5oa>{hqm)gGL+0kVi}=wTbUT-D|9Nd?&g38IL^p9vm$8r%8_* zil=|0Uv570wwh$=sI@khWW0kPdPT_ujgt8tP8-hyw)y5giv!gvH9A)g>IjS%JdTbH zKd%(fLeJEvlH1zKbZ*@!=<%#OfDkw6F!OINzM&*#z2C|0buXOO!x>_437STA%trqO zEVb;}guGFk(_P8WniW%@TZA8$t@Y5oYHF~$6?JH#*|cx%uJ(HDL7;2X&}e-t5sPtL zI2U?teC+VgD7$AY<0p2OI+~j2>&+x~H)>u#SX*2;Ih#DutL8n@aM$bdl%J6AY7fnD zp|RO>w!Zx$+X$}Zayon69=qdo=s}a6<)li?Zd;E$atBH2m*#f7XX=*3dQlUV{5%M= z%{=v29YH5^Qb5ldRe)4quu9|;(n^~><7}U)MVX)-0a~5W6YuLzYKyxwX*C^{p7P^9 zWaI0{M-CzVldW7AaqsNy3bj%XA}CQf(Pcuv9v$JS;xRw^tusTH+%8r0>EYK}-itHm z8{xf7tFuQWU3>OH$ZdgOw-$2_g8~nSe*3E*yguTJvsHInclXVSvABHFJk;c0pSf5M zWvqT!Y=gb|mWjD?Bk5THA@2v8rNTm+*@gS#ti>tCKRgqpH5?mf`9!`rl~S6GmGoKa zk$1`I83yD>N_pTgva+5{FVq)PEm}kz#prSE{iterS@?#KGR#@gzDk?2X`3u=6z#gh zBop)Ywh}fuu{VdFvL^o22FU=O5@9Xf(->RcqCdikajJ7n@A|&5?_K?ANG)5LQuhI8 zyE`Knzc0aGTq$M{*Yf<yV~Tz;l6a>x&aQ`tI@z<~1&<Sm)bUBjsOWz-*S+0v-7nGZ z^DvMYc_i4~HKVH^oL*&qSo9XMNpB&-J;7a(czI*xnVRlauPA{J53Y@UrF4*U%>)@u zi)t&8;e-l{6!KnV7#V+vl#ENKQQWX2ySz!UW)6}vEbfKN4%u{*>2ZU^jbrC~_~Qrt z^xoJj(l|zD8jc@o6`S8DIlBw6&hqYkw(pu`XApi&dkb4FndbMgc3qFsG=|CGfm3TF z4Z45hc1wsm4qB3`46eAMeUQ*z^Ag3z8&vmju{^%`{PaD>XAaK-kd&x%k=zEqdz>RN z6teNnG_o>y#1hWb`(jaMcXoulv$Ugw^j|3l=e2iqnNs44%cTY^v<q2F64uXRm`Ye` zN+Yoy;uCf^=7#*ATZu%oyWbQ4U9ZD6-?*@Lm+85crKTqZO1Y2o%Ws{fdtNwqJbdLY zULqy5e>ep#98D#D*i|{<WHpI<T2*;6bv-bW!`*8YkJccSQIp1!Xw?g6d-n}F&neN# z6Fj-p&BTnclwHi{j%7xvb^RE-L<lkhDfI?rWYV_ZEe{IIn@S>zhs%e<uMIMjE#)tw zRHUA|nW^u`ZQqS*1kkE9aMoL9IWFh$bLUh(bn=usVfWVOL{nboM<4&WjIcq5tCPE) zHH?q#5<boLE@tp+&F*3(rNkH2xh)h0n|Af<xyxJbyLoQE)Y{RvP~`Tcb5^z|;S+kB zoMevrFy|i<%Gv4fM8Y;-U9lKb{gTN}*BE$|88?s>X_AkbMJ+Qn8x692)`&fEl<8*+ zsw@ALHt#RyQ%xg23ZRr6Jp+v!@L1?Fy-5ct89Y*uAq_~3zBl_b3{5}k=M(^3qDh{H zhy487{MCKdfF41N`4Q*XWv$7Ui0{0}JYJQNNHBlMWK#PPk^|EhN6_x@Px8G4CSeZ^ z-xzkOu;+{M8<V({s!3c*0bi3P5A`ovkbj?|^Ie1{JP<xm&1S#ATGM=II%GcEJ;C<G z@kLjg=VNi~`DDlVR0foivQ2AiSD7rHZk@{mF^(IdC5l1xC>&W%ZtBbfTQr1er$gr* zvP5yDPDiDrzY!kG9k+mOjJ-0sdz`(ZD-zEn7MB+O8djEK3&g$;v@e43bi{Q|_<ppl zeZ0p*Ud<BjlRzRkRlQeB3H>Cq0u_|<1oZ+Ze~G!reL4BAV>=ww2}{qD`c#U2k|psP zg;o#oWVs{-dvfec6-e&hCBofR9o<YH@d_gCHSBL^J9ndWZ|6ki=gpB@e5pL*pb`+n z@kt3V*3H_+y&>#pV5VvCaJ<}&ryoh1#-fv~sgZly;LbuvC?NL5*zoAYU)OSagJgW< zVO}DVa&{@Hz=p0fd4ak2=3`q0s~Cf!#q#Ab|7+!G0@u2~Y;TaTj{S{vD?B^%ysPK( zUC;RabkffC1HXP`QUtF4(Se<DrUd04wV79bwB)VF`k6$OvrzS-?2HYG>eTsTwfC~0 zgs3hLgcxGfKFgmk)nC5OC0&*Myjt+a`uW<Oc@A-(1%d2F(^SdplE4f5_<Rw+|4sRj zy*Qvu6UW3rV@2=GkK$$T^$*P`jxJle&K&8lk%`;-Z-sHiMbDj{ByT2aWPb6YV9=y7 zY?Na%Dcwd=Hn8J$*%I#59W`OM3GvnP@0lM}C2Y9acYfudj<0ZG+4woE#mRS3bzp{4 zYTN8~o|B>N^N}!b-}#f(#l}g6I(4bejcqaLjru%?-5J+Z-r7YkR%9`<7lLlf$Dl4B zqqO&TIIsM5f3@HthG-w*jv9tZ$=7xK2#k}~T5C1=FwRVJu`g)W__FNOyxfoc)drOo z?i`pdJbtFCc^uy6XcW&tF?lCUW%}*vE;%x(Jl?WPuQHG$aJ`$ZTV7N1jY1%X<{^FX zo4?!$1w2XrxoG?cd4y%_PsNcPF&tDfmi+JM{RUcZ9-gr3v41YcTave_7uxbJIu;py zIP22%Jm76}`pB;7hGm6&YDo|SXFmb@PT>AUEIU~bpT$<#_m5<=<H;d+7Yc2yCnb^k z7LsVsRJ8+fZlS+nWBW0kUPvk&-l>s$#Z6>K@4k36#$Ku;CD~YW(M`;iyEm?gAoc)0 zJ;z(vp5v?Z)DVpu(#s9et8#n2VNLML$}K>h)lR=N1x}R7^rKfGAaG+8oziY!9KS=( zSNeV#ErV3@u3Uw|SiuIK_~P1dsK+=<Wyp_Ev!PtI*B@%TJlus9;fl0nkA-s++KKuF z8&n9N#IF;ZvD6N?juPUoe#9x<u45z}tzqwqO4zttZsC-`?*8hn=bVH2VD8vMBxU=K zXX6|)X%k0Or^S-ILPTILHb0NHNH@9s<TzxMGXB)N=x_YeJ=0#%<LzHTc}d24231lN zsKASJZ|y$u`S}Oht@8)FqlWR)u7-j&k(+HvVe)SQ-W_(NU%xJS?xu^aMt#SJg25vZ zRZ1i4M<MG$K`xYPD)FWCoj*;>7aIH;G&IR!%XD-Ps`DqZUueXX-}Df4FUo`%OE5F3 zS^bIYp-Yy$X?d7+eMUFF#O-W<_C>R>@cUUVLurxvx1<Vv$fT6nyF-N=q=IfDtZDTl z*bAczh9#Ql9{IQ5pvfA<`!C_)_bt7v{`H#^Q$gjrJq9+}$>aIKzq^fEaSw}KPI5Cb zCT4Lz3hrJUEL@DAHTC0CC#*f(9<CuZNj1AgX}3Fjbkj41(8Ig)>d%?uskjRAJE%49 zB{i$_fa@2*jwpFm5&Xv$`ETd`Mls=vi5&VqCgA*j?!YZS-M6149eCazlt}Mq(8#Iq zw<hPeQo?@jClP0pro|<4d_0YsL-UJv*{%Sm?-v;h$D>W5Y){jI@rZ_s&b+!JhZmZo zI?#@@zo5w)wrh1XP3TZL+xzyD1Ta7D<JNhzaX!t(C+y-OD0;8JbUnbcNKX>Y{9w2L zg64d4By2$nJBVCZXreT4*09#rxcUpFY>&jJ+!50+o04>C56iH{ka5+@^dV+Qpk6}o zTY8H&H2I%qe%V_bIj_%q8u5bgWZyKmC*x^sO`_`WkrH$Q*#U#7z;Jq0q6AG}_l-=J zZ5-JFeCE`sn~Kotb2Vb*6&ldii|~J^QFCC&uj7m^_zx|BfNW14-v`{5M$X%^ML54c zG*K}JervReZVZrM_{D;Mu`twd@I!cfV55s<XFlt!Y$HN+GEc!MqgJNDX#BT;9rs?O z;S1IHByt)uHm0G2l|8)2eVJxNA|hl-zdokU-SETZq8k3hRx9!D&>~*dE~{vet$VWV zB{$ha$Me36HR|X3HU~e+Ro0y{RE`fUn8N+?w5w>JIjzaHb~2qVH&W`1NTB&kJQ?g5 zn+@B&_8?D@P?7>gV-s|%=!csk4kD3=N;YKS=vLgh)cc8F)F$?4E`e%jSwbE}!I(R0 z`j$kpAxPNaj}3j1e^EABb`i^}d`yjca_@l21c)#okBYiiB$fHp#QSpad{Z{g`Dpcn ztJ1yazcs4p>J^v_CB>9s)Q}O8j|)=C&=?e2&5}K>aM)Dc$9}N=?nYbRxF#2OxRXfz z&?q$xe|}01z)S9vDSI{MzWi7khP_hNuznUsX8NC_FS+lFy1rj4{U$?PzM+~FDLvAs zQ=f9DXRbXaM}4c~W48VJ1|diOV<QI)eLdOct}`bgmHBxllthk%WVGa-bIq=vg2(G0 z^eGt`^jpnL3@=`*25u)?7)l1Kr{OXQdD1oubwx3*ue9BA=wuGb)bMR>jS9FYY3z#L zq@KaZ5+aL7hR4E7(#o7>6CDnJLE<*~QTb=a;xb&aP5A}MzYVeyiO^+>@I$c-b!na# z8F)6TTG6x7Flc6NzoM1%FQ`*eds(6>q0Hx77ivs9pxC@rh>iNa^U!WFalri3r%xb) zP-phC%@uoIvW$VG?6jb7t)`F2Otq@1W4ZdI(m+QxzEQnXCQLb%K(@g6ac0twFI-DF z;*eq^%uIv18J|QX*s|=cM)__3EoITNINLbk%ru(%dR@(tDY(BwN%wcuo`I*g#JYaT zSIjwkh2uL+CTXU@>feLue-IYLmTAJ%dKFgThXxwc-bp23Qd4htGCUG4s=+giH=r?y ziVmiSBACNQDWjRSi{HY-qg{ysI}kTZ*0v9<O&0xZIhtrB0j`A8OLBge$x72er$Tn7 z3`I`#M9yoqJ55)fb2HtO9p_$;-uk4a6;S7?e(t6v;lclIdT^MDwr=l)Av!$EMS}CT zn6kK4lb^FsBF!!AlS#D+b4oKcn&<v0R&k>a__LFOJ0~sMAyt;tnid)dflnBhgpF=J zxc%a&xLETE-MFhCu6+0ejbzL&?dAN)O5>nWtI34vQe~2e_2L^=B%Q{~+LP-uhnQVX z+ZS0qi=1-n5<+B%0j*rHs=}ABVWlRmj+}ml<jt%jGilg|AYPsdR-L1caQ=cvJ(h4C z_M*aMzUw#K3dp5tM1K0Fo;K}yT>_P_<V(TeMIoz}JnNYKCj0tTTyCamN2a5xb<D5E zsdd?CR49^1I5Y|&cq}2lM(b!|U%2H%@F<`6<lq_V(%;CDLi_A#AVFNqizbO~Pew_v z%xrJcaI4+chk{;{#?Cpj^+h=ank)yJ>|45VE?3QcA7USzJKyhrz!^C+RL;~`rnEIl zWt7Ts>5ifI!fzq;4FRw;j|-eMlgomvUvOoCLB-AaTsT`at&CrI20XmQ96SEHWy2k` zmL0XsUadb5W8b6woKbS}Y8^Pg>;USpiDY|AM+tkVGPUngJa@#1bf83fP?&`njD_{* zr&E(hn8?0uY1t9D)rC_*_h@lXoIG7pxxzWIzeBowIO<Jrq568K7E9?veEoR$G<%1k z_pUg^)+A5fuN{^A`R#Oc?2}@JCMz2jk0ut({TPRaB|=_x;*YtcJ6Xn^TZ*my0qUKv zui{8yW4*;eV|o{wd5ztg7U_Y*Yrs6VBT=5NeC__RX@-~_|HGAyQDjJp?7p>gicISk zhe${oBW=-~^4vfzZBbRL+Q9ggZhEALQNwnvC1s{uneGGnkQ73c1qnx2&jRa$b7rI4 zgn2|#k?k$F!@b$kGa|-3q*O9q6Wa+Xee^qrkM1|`e|*HvAm+Z|geOahMv!?ek*qrh z?X3FKC^dvl!}E=0?VOn=meU@k5Nqx*it~*kHX8kTb>ChsnrA)kWc=q$WsI%~R17Bx zFDJ}pt8BVd8V{Ya2)!z!RPqlNzQw#x=s$d&%1G{qi(&6q(iKW$raCut^y~Jki}RWF zH?x`N4I55ZYS$6`4?GMSMB^Ao-c5zb+E2Dd(Q7uyjgOs<`Wl&+W8)$eaKx7Que0gP z4(9b%VtG)|V6QJ|N5aM@P02=owKcXbZ`foJQaVFY`5>{=pyDBQNY!GU5(voNC<Akd z%G7*~(<CJJg+{WT$_^3D`d8mJBPfPVtT#tBZ9kH}8if%C@vB@c&zAiGWEBgNU-}<o z=U+uU`i!2v9{-ag?!k@orpvwNpN)?WxA__ph^r_N<(P{+h!4lgJ6mY~saQKVAm9C^ zCyOw@`X76DnUaU%IB3Jg-VXxwnQ!p)?4F2sh~-`BK-e8UNa3B4T{G6BNv0FlswXjv zPNVmuk-f8ibTw<B;eQ==4Gv3!!&pSHLuk(W6^?ekv3ODi!=`C;nmz+nhSYzv`zh|y zu&%sg7}-q}C2!rDY2ztQ87^mOIrPW#>eDQ<1JCGBy4Rx77q=B3SvH4iqS){xWm7|7 z|5r}x;Ln^L>wIsF(L~V1!~_UN<WiNXg1fmDLTCaS|C{aH@?}=ZXUdt}Kec#@b@n~8 zH3SZr=WcXbObZ0gIFeDSE|J|1YO&yr=`fCXrBNzowE;sh&w?6|(O7TEwAsL)`1tW7 zC@#!PG#SI|E@YHGKNuq*HDAQ~iv#<!LIRH?^TMTw$jw(cnnOoC*<gD+R}IdE`chVy zn30k4<Hwj0=UY;54t$Z?<72!XIS|WibA!ym%55(s>9eIQmlzJWg1>~hCsp_O_;_=3 z^U%->Q+_Y~m-ne0zW#Hm@_#QC`_H8w2#NHoRl_bdhF*g~fn2IM60|YOnXrGn>r_2# zQL34{cYY+BsvN&iUth0PYN5eKH1da!RPq^f8;nz`a;94LfO&~>CZ2yIp5(6!nN4=Z zayI_{H}@MTFSn3wy;${_6dhbLa-E1Sw}5fbez6CrGSbQ_A5z@D@oCrs-?+<yT+7wf z4c|XCC548DMk0G)P~MBT6d$q^jcjz9Mnt#_jdG?cW4K?V!Qox>tOL}E$K%^WVx%50 zqg*D7+a=qmX77=#$gPz3)BZTO(F;PJ(9Q5a{mS>+=ac)<(UFyv6^!?<U%&Rg=6>#W zscWS;R>Z7Fn#9&8{9i{OqGYiv=nJ#~$*7>*X}S))Tb>eB&*<@pKc~6bmKG$`-XX^D zda3kSv5<{_7fsOTarf&-JN=6~HEP7K;fb5!i3w`{>`OnxGoR{u!oL=Cx$8gn#<}3* z7D4~7&?O8k;pu<pVvO4$GVh)VA-Q>W>5QySU8LYfPHEKW<Ou>{vOim!+ARhekf#$H z(e;N2`L)YU@BbNzXeM7pMFpA|i0ec?y0WO}zXb6Uw)4mn?k>%12*jffN|$N=r{!-r zC7<c)>Rzg%GBR*<HOs7YKo8SsP!Jh8lp-4n0f<@yMV_y}zY1eG9H=OIwhMARdH!CI zJxZ^Sn{wYl3yz3TTiP-NC1QdXCee0&dP#VE{8OBUme2>;HM@teMBXi{cEt<7;?yuT zU0g_TXSMiYGbi`tNq{;t7B==|k%=M?!*x)WJ$v>nocNUEwax%FlQT%=JSff&XRt>j zP$)E$nj|I!g8O;UyDn;ikS||w?%#J^8z}*G(L|NK^+IRd&O+D4;<q4tX7$b8KE;K( zx$2$Hhr&*~G71U+*3M22$b}p>K@4hIq6tE#lf0T^Mp|0Q-zG39nz?F+eQc3!B&n<* z&FXA#UmY#Wt51K|4eD1=A9{Ox52;+a09h(0h@^&#Og1KKFAgT%$p!69)z#HqTuwKq z>#tqA=6<qPmf(Kw*q`w%Dk@4Ywa~m3)PmF~kkJ-(iD;>*rKx3G3W&PpLgFoFU(E># z35j6V2nh?@{dxp~OH?<g@KEWXx}-)@2@A(1XS`b(91aPOh^VZp>WbmB-kI-E&g?fY z8PR2AU?>n??@R9j<>UQz`UekgQtpB%5`>ITlax+(5-y50bM^K0v0_{Yb2N}iaGnzL z0Xb&;+QYy8PSs?FKTLb5^z`&9v?oBR8Wx5ZP{5A;c5nIlXy9O;o+vzImZIlXmxFP8 zn2>8Xu^I^VDr{(3S)VfFd!taWjFC%RTwGP}R_N~dQc+W%ot=TAGCm=}dQ>v?>YvDq zP(_i<X#Ih>5rRWdIw6y)>^E*ztq&J1faXp`MFm%!&w2unS4u)6N3*0=UoL>7`E8f* z!C0|bpUC0Vr^Q86@6TVt!w2A23e-sn3Hc%XqKhG&1p4}JZEk*%p}8+;$8WcY({vad zUhTBUD82|1%~FFLohn{>dKm}py`pSc+W`&NcQ}YgeSM@&-f8Ze8F!-7h`f&WhV*Ff zv^4nMwHytXn?s@B-CrMHnV!~XCtMAp$WYCSUZ{ODT?cyIl|Dt$@gI&m_LHvmtA99v zV^r>~c0K@|roOX~<p?*b8}y?b))PNUUJspbx3PhGa|;w_Fy2L$qop7<{;^qyp`oFH zqzs{9@GGo+y$B13=7~JNiy(->rt7_HkLF{HiyXTX#R>`vK*xN18MW<Ewx@@0i-s=+ zhM=zlK_`nwA&TZ=|9XZd;$&Mfnmg0nEBw7?=1-Woh_*Qld}ek+Ou@Ky7yvj8h(3uw z(_M~%HK@;6wacg2X~j*K`!g}?UA7tt!bgVHRv_xggq_MOD((x|%=)v{l)D_+D2!a8 z?1x#p|L{GCW<erp0x?WDL##HKl%;Txf2L;63R&r0&!4Tn#{(y;7+pJ=nVImIu5eP5 zj_A|@bEZ^n(2}b&&pW!!{to6=Xl`u0Tz_yw`(|VUCn4eCv_kh`0mcg0f^<oI5dxRc z@T6J%@9L@r<rc(6iRN12t2T%x$N0Q7LAp>`*2u~7x8IgkD7)k%S<%@*>X@ljW>w1f z^eekQtXZg5TYGyvF&%Z6g5#6n$gJ!6Y(@2$Ol!qilWr%Ulj*UsgWj)=<f<23HT(er z($RqHO@{+7^gag#*?+ZZ384i!B~R27xQk(e6U_%SG!9Nq#F#gxY2z1O_hOZ%Lv0aP z4UUUD``xO>b)sCdv^=QIGeml>a|N-SCJ=z#@oN9o)X$H2lAs6o_VmovsoK|XLGe^P ze80*M>29*d6`M@x52$vZXR8gkNHe$H!UhegoV<LtqD9Q9>153rOd(`To1J-uT(yVJ z`xg3iiCNUrfoL~wj70dWIr#w#k5~68ARwT)m^(oflHJNgwKEYBQBO|~W<7uVkK?QS z?fJb=nR=G&E>+PWtE@d)ulo7(C$`ApBYqnr(UtnQWA(}~+n|2_1_hlNA0)7%JUj!< z&FRXyeSLl3zI}s4|0TvUI_voTl%v~pohQg;lai9|(mi>ET-rM(Rx9;Vc;P({k}Rdi z9j}(wE8ndc7#O&?x_VNJfpQWSa<Mw|zUV9neoGp!K>UCZd&c8BhFY#>iD^$V--N@A zzUUFQp?mp4Ff+ctHtWWp0z)UK;~_nF*TwFnAdzEJNNa4>yUM9yP<Dz$$J2UMoJpG- zo0{lA*Ieq;_?K2b;?LEbtStPO4L-O7CZ-QRw<TRhe|We;G&eeBKd9#a{Q2{$E#fx0 z$PYkJ5otL&Prmi=KZ*MKHKT6{Wd!C1IQ3|?vwf<jVF1(ptJ$&-E&k-g?dz`$=3cvj z*}Y`<d<NZn<Idk_p)E$ErtE~M{hSfIcc!eUZV*0K|M-!m2o*E2qP+&~=1plSsS&jT zOd`&Pm+UT}v@S)XrKKg|vm%9ZU~HVmPELWu#$EtT<Wc2XWSSZ1ATig-U)aDZ<h2~x z6e7pRFNKk*_r|V;3<2(lyy(JXPquw1ysle+B}+6dV-QM=;eaC{DLAQ{W#j*>X~*Kq zsX2xMxvxNgiwjPUk&@Rh)Ya)prGPpUb}j`U2bKz)m1<iNbfpFb{8UuQ%DJ#aqN1bC zd1E}&31^~<A8TrAT3D=tkQn&LwS(aBy{#>M!udK+jM8?93vxoj#r&n^Zf#@|gph0~ z9eP_lEPA0Qw&;3{=vY|sAfBzgINOl)$ESVp01OJ%(m`Z$sWza#hjqEupV>Fx5u=zO zQVm*JsLCL76{oo~U@6V5aP#_gSiKB9JbMtLrOi+q|51>~3pv_=o8<M-ch{NEd=cQT zFlYp=dq9y%m$9+&`^D}nl*Ps!#310EECN-qhlj`4uY{C4a*9kuT*jEPA=FX<GEbiZ zwCIO2t@d3T(wWTk>Xx4S*<Nnh#GTHAg3QaDDJ?Diq9cFVZ4HBzoLo;yDc^3Xx2~=Z z@*G$X0`EWE&rFZ+H80^ZZs&jdw*f-;(n4SkTbc~_2eXxP;UO(Kqv)Q-I?T66K>=t2 z%$;(-Skn@09`Rrk*_gC;Zlh*my5kF~eZJR&IhRZEaBHS5l5G+a8dKhnzxhj~>j%Ml zgrO}^;plSJNXW_E;bhWjHxVC<vkC|%g;cM_@mpHMU_efNr7>7vZ+LpR1yH1k(8SpI ze1`mD^WY%;A6+s09)v+@nUKwr)zhben|5_5bd~g{jfCzOX9pnG2Ms5zCy?y34Nv|0 zbnliYpg8b01aOErY`z2t2LB?L8ZF{lnQt_3E;I`@$qw>$sj!-pW+sAg22yQfb90*! zXVepX0s{Nl-?#x=Fh=6y;$!3E=})41Q{^KepAAQ>3o?IjJ<2v#f0rKKxjRwo?rvvS ztjhS=$44FNK>ilgBS<?hHF&wXcSo&jbLmn)TP|5$u0KdSuo{_)XQ5J>_hLzXdkZN8 zv<<L;FHR;ex)U&Lvh$dm)boaF_Xf4Z#KbV`QC?o>8}1i(-%sZ+nfGdk{}H4U!{Llt zg_#?vvd^m@80*kCBSR!w0fK%s#TdHw^e-SXaGkgw@8Uj9v^21>wY?O>hlbw8!BN_= zzYX3QxM-bnUzXwu1t+J?aN#SqnnQy)TZe73+QH78<q(DnZD<y2AXW+tn@8AwnvdK^ zLu~TH1-hSLlT}bv>$>kQJ{t`Vlv8}Y9%nxx0H6t+1q96MZ@~TlKyJ`pmP9G;^;#t( zBO`b`0KzPRbpyNs((#=)5QvVCMO`(;5Ngq>Y2UMRa#jH|Il?k9FN`g6vm7pz<VQ`f ztULs<{<Nym6b-Bn&5ms5HiH0QAiJ|)utle(Dx3A4+h0dy#LTmw{9S$U6r)Xmqzdo$ z9GuClq1wd6Bu}gCJ1z#oT%P~eGQd>`kV#NOpP506(VfHZeE4^5t=eJhZxicvgrZEY zv0l7-CJ+L{{3po8xw$z_4EZY#q}UjGVRE!>h1NAk^MDIH+X&D@>lI7wphsbj6?VCj z80GvYN*YcWD|UGG0~ZxioH5+X+nY_V<}}JAK65~r9`a_(r%Mh({25+7JAf2e85>~a zFeJE%K*Zvr*bw}<!7|)XIKX-1<>|@uUIXsJ@$z(cE8eZ(kG&-ZhadX)N{kP8KmGwn zo%z-OWGDXr&C=V5)G9*5%a&DBAn-0(*ro3IxUjGgd@@a}_YqG&QUE7L@0U#9YEZB# z6vWX)SpQrf=Hhb^icKy19aM8~to!Dx9*C*_27|3jOVG=o9|{XOi-wueIA~<W(XJs( z)ne&g1TL{>c>%`N4=O8=_W&h=+e<E$lMqwt8(4UXm@#lM5s4aaBTCpvn|a>jBHmnq zHWk*EPKC`J__-h?paqBDfesmqhUfhfj3)Zqh|Nax65h+BZ)@hhhqZb+W#I3DZo~cJ z+|}ph<(=NWFJ!(-g_z=mD(nU(4KNm=p`k%c{3^X4NOc7fjc$UjH>F37D7ka@ZV_bZ zq{rSjZrp&ZHCp=k^8T?dJtoi5ZP~%~!7PrXB1AkY`pXPj>qIO#C7|Jd?!Dqtpgm;l z{}Sop6BP8|yrGa8Ch9}lEf{+3cvmzoqu)5uX$*d_9idNnd1nfD;QR8gb8V5AQMbGg z_4cyM0;pmD0)6}<W~MRSsg_6_1cI3O^2iV<Blqy|gjNS;XJ?_ZWB>&qM;k7u5#bv0 z>Kfw1gBx{`X%u{XWpJE;fB>M9&pP<s`A!GxI<6itpD-)cx*$h?L-~;34R-jQV&}4| zut3DF<xL+fBWS<=1IDb0Rh62Z_%oVVN@^<4d$A7~^lWSdtaWW~NwtF@WK{*;9a4cS ztsaav*rfbZu-@EG51UxA5KlXdIEU9IZeI>drp?Dq@KUO04>UD2w14IJ27a96<Vy`| z)G%}?z7ltci5Zy<0R}-U0&bBoxm4(yWMyTMNn>N$9u)64CdMI$fGtbF#c+U|7i&iX zsZ;A#4fl7)mxi9+6bdL-nd&&MxGCUZ;CgO(CWB)PWP5hysf@X5{y3ocr$QR+Ef1tC zCajN?WXsUp!oV0Ud?laS09{8xdinxHNp|KcxG+b`tn*YE0sFV^xKz75`6>H`)TBhy z^Urmdw?`^-oUirl1joT#7Y}V}g|-!M%+1@x+-AKgw@G+Y($j0fsiK(++GSQKbh>~Z zq`t{Mc|yu#9%kt|(;mf@t`IX=VQb=Tjd|-<p`wae?eiUG7M8W1Z_;_X)q&tUgzD;c zb_^YcoEGUiy{M==l(ee%YrUr2q8F#OYHDh*3{qJxEvcFZ;Ga4=KBl9kH7n5!cpJlO z*%Uxjq+jn978VAyL7DkLD{xyf6=3iI07xq2zz&!ux)rQ>qhO1g=eL5xFPnM}1Bq*H zHd8Hyk}Nn?2t+jJDk+RkHhz;q0R@WC3)fcyO^hDT4}3ZX0eqGt{kd9vT7~F<Zxcku z_qjzyFQ8T<lU7$(V`E8C-B8|8k)$;R%EaEQJ5OX}Hg|Wq2{G&Bg}Pph|9vCf7Qx~V zaQuv=i4gw&<=4wc$V>mC;SXpurlwwI4>11Vh7bZPC;Ib0P?^A42Mqw3#&Av!v;GVe zWN7eI&L%!$h#|rM$3jUt4QLoh8mH>>;7L|!Rzt(Wij7)A0Gu?j%3QPgI2;MR`#Xpr zfSSNAoE`5yw4Hw<B_*Y)866Z9^d&Jl*<f?(mrz$NjEkP@-T({<wBxwqPSv`sk<=(4 zwZ8ODlXy0la_^JQN5#jpYHL20d5j}5z=CDZ4gMuClA4x`93CDn#5=Rn(HVoQF1%Ez zkmtL0MK2gGLtNhUvoSK715U1+0hgIQICj;(nKQnAm;fl{8~D<KA6}ZAWBo8tY%H3^ zJ^=v|NJ&XaOK5+9llk8`z87#j#28Qq7BKr@OBRgl)aU=Z`MJ)3*qe0Tm!nh?+an8t z=66R2i?Hz7N?xr9BsFPr*J8(=`AA)-%;kt>t!o!&Lh2{!&_8Qb+AV<%3%t%+^{sUb zC2$Mc!5GZrCDV=*rreyEebA>sm}Cu@Cy0WduDG}uS_G)dchI)-=Q6M+)jP=U&qLL3 z>+e^E>@L)JIiGK&g}R`VgU46|_`n7YJQy6at=_6*MyH{BOz~q;;t>%=MMM}gJux>o zmykeh9)c^_4QLWr7|@P9_inwku6(b%UKa^;jqVSJt;_QOu#l8&EQg>7AbK1!>w`-j z5*n%)CwSQ(g)_YXJ_k}DAj#Fq+R5|5s(lE*Xq|`cw$QZEg_?n{8L-1Ja9l1fE|;@b z444FF4cyJK!p^*0Tt$~&+%kUV8wz~@mS7#pDJZN#dkxowQM_#FP$(2MX6>;8eG%Kh z5(NYXl5rUaG#X@DzPj83i0t`_VZEwaWcPw1wB-gS;hX(cjcHg2{}l;BOZ9$LJyUfA zh7I}vcVrS&atx;Dwl+2vj%u#|=C%gH^z?Kv;Jrvva&UBn<=-|Pk@ZmUzktscqpZp~ z{k0uHBqt{)ZAOK_vL%3Z8;~rZJrv4ftQ^<SLeCS(0Vn~$#$?ll$Fb|z0c=<~FSzpH z)5|4RM4}_}IBmXdtd54N>MS_-Xgsg{l*C2jfL;UZz92+3tjNz&)cF4To_7%)9YDE+ zhLW|_xcr9}AQUW<cS%S_|GYAzXU(@OJNn(#73AlaRe1)~&wXeCLfNokc&1`0T;5WF z5gmM$W~=bx0R*D6^LoVkKQ5&|m&gV_|LO4`Lh6Z}?W%~1)<PzPqI3Ce_o4R7rFEz> z7aJGn8vvuAeYILGy!<M0tK#Qs8(;zm=&J?)IG)g0acUq5^8dJ?x;!HK0Rd7EHOkHV zp5gMZQ_R{FE)~FM$jHbTM*edXopr;J>tq5pG~n125U2oLa(ST1bbk>Wu$<=F+G9|S zf#4^pV!r(14gS;nHQ>W^fNV0;9Msj`Zt?HE{M6uocldW^h70;2@W37eY5Ds9_=XDF z+FI9>_y7B<P*i*+3^=2RtML9kFWh*s_2fA`V42nUC60p6PlobGhrM99Wl%}81JDhS z1S<LEH{2rdU^wDns?^ojp9Y+Axd#OwQ<v|!HJ3ji{``j*tS_Z566ysm+FM9O0Gc~u z!6e|Xg2BU9u`*at8m*`Rf!wbadP|R+__nwV=#jXIOEky-G-i56NB*c;HsvNp_mBbV z#TM&!$2(C4IQQ+`Oiwn<dV0KD5F@9D6@Jl?WA9efwK~$%;9K)-__l5%c9Q~#SPGwz zkUP@@xYSbZ@xmmO#SU8rqN1Xn;yq9$;ROLyC{8Y}lf9J(!7}2H9}nefdE>NpbkHIV zpb>y|M+z@L*tEO!(vOzCU<`*4pL3irDA-*dXzS|(N?l4)68MARiOXDa<L1rR+|iKo z;av-I*#ngo74S}jC-kxd<Ifod#1};`j<CgWhQ8}$*90PyR)+GxQLaZ7jCTEcN8H0Q zuM&8*0Wt|B6CM<5;J*fv3<ya-iRAqJd^k;iKGpL9!<ZMjmtjPaNK%E^^L?c;z5E_9 z1cz)0fYYpKV>maou)`&<Bc;9_9W5jj6&9k%+kgzP1il3Fa%!Y5^vaNDkV#QoCQoB{ zbD`U>a|Xg~4Z_=&l+Um!0Fov)32zP*ZYY<1rrbckfD@gOo*qZ}yKeRIw;&Ng2r$S^ zWblpxNPGWU{H-C~!7k2o`ytp3I0>Of$%LfP`%(BTuc!m_3guh3+6frTl*GiB5Vu%b zY38{>_aDx$ti*(cr3{#JG{Le5UZCCUHVF{*bc*p~S<jjD^d^^?dLdsCyRp7|y(7ny zJAD~h+!%iZ@bK{mo%LCDfB0OAw(;Y!$VFU$y#2Sr&pJ*-SoEbSK&>hgzDzt2(vaqG z#9@@~@ZM6q9G3J?H?iZnz=XmAOkr~nxis>Xi3tV+M0y|xD-+XW<b4qrb(yptQ|O#X zysNTp@87+1M@U#0HpVu?7LJGqM_#g1pukP-&7oWM-tx_x`~mZOy2PSxr%)=$G;qD= zGMjmCzWaa^&1<PCE?x&1657~3r)t-tYlvuHfCzw#;2jH)V~CZCPE;Nm{r&<~2g(WT zP>?@-k4YI891I&X^E>H44*`v(D3hZ^zdG4gn6vrwpV|#~0WH@JG&Jb1fmOXinKHEE zi3Xcz)&z9VP@e&-!7Biw#|OlmoSdM$2N)l(7MJU&p1THpOe)Z)r9^=MhQY%vR7l0c zHak-+0E4UaJXFwO7N_aYxfzsa==OmRS%Dhmy4xcS_czba%FD~k!O;^T#f<+#RaG@K z9f$V6vT<1M_G>ff(*^b810^;{!`027t<<lD4H}Rq4f}IBySw`LGHX-^Hmb2KvEYh- zxaWom!sR@13R$S{(P28oV`E@IyWayDUk~1r0FVgM(J^q$FgCnIiK>jRL)`xlE^NxN z#w#^zXPwj>0D-xAmL)5ip?1AyAGZPyS~CddfB*gs1gzFQWfc`_Dyn6*crPnkxGI8Y zZL@K5a&l<s0A2%e4qIOkbf@*$q7<nAhRf22&Vfc2NHHn_fg>nm{`f4K6*jLFwuj71 zfT)0FFbo_Dl=$27&+Er?HHy5_mVoqHwj~jEDsC}~25t%#9JFUZ9_d})+<iPeV3X4N z`}-k;U>twIC=;-1LsbAsDILdlcPP=)ZF{x_f&}m0y@6Z{xZ~)6G}4+cG!+0vV1pun zh^q;hCSYNaNkA-L!2Sb7Nszz)%6Qem>%3~Za5?v*IfCo~L5QsK@^bi<U3k9;-H~Dx z=OyzE3EA~*ZwOc+<$C3TH}*nZ7_ZH;yE@w1R)B7XYPmF8wjp}Hg`KOWRj)~nf}C_V zZa=xVK7Io15O6^9va(CiK4(48=C%0K4f`m>YUv?2EO+21tH~PJ-#)t-t~z*>(R=ZB zs*C6oQF{ZS-0xgXZUw8VB|1s;qyF`gd&<rQ2|43(T3RusN+JWLT3VJI&kiLjyIti+ z2J;!}OQVxDQ!tV{G<9Zq+mFt+Tm<!Mqs+unTW)7Oww<<)qS!pv3qrQ>>y5z4JbHzb zclyDFYk7IOT-!<%{l=~$5RtHt21#LM<<T*l2L%ve&?-0xk-5FZ{`AXXPLme#!LOyW zv$LfoO7LA)cJ^z%=3XsT_a)ZF+dMox`}_Ob&9Hqmy|6GuA{-GJDeAO~bgzdp|C8e8 z62>AHHT5@dZ1S2GGEecOygW7`x63yLDX*2VJqib=`N4w+2k$Ox>+yA&e_kEL{`1lC zWpV#-MJly7@}Kq+xP;iaxT>?+5Wc4IabZEh${h~uoSqiK?q5JzFIuZIy8c=b+}qvd zCk>2`*VXgxV~7iKqzDY;O#B1{O!s7l=5g}(@0~yzlXgBj@{?OIB=h<94Rdh{O6o3O zRz%HIkkn~%Ru<%9*l2nE`ZZlBFj+(W{qW|Pv?oypFJC66roOVaX2ZMncHGCu2UcB? zdJc40J`z+%)UY?-uM-3q{&M*r?g718bNCknr6eZy3mPvNqTHMu$k#aH{2u^|{C~u~ zc|ecr-u9h2iGEoqG?FPpNl2k&Y%rx{XrvONq*7@@nL<QTkx*$sNSRVXQYmAmh$Jbq ziYE1bF4kK2UVHE7dG7z-{@B~1`d!0$euv{YzQ?JfrFA=UbQfh)s8-u+?fIm4?>w8n zuWC3Ttxq3`yTD;HjZ0WwY*b2k5d;fieqzB97p1tkIKVo5C+^>O1vimsxA$>s>L6WX zo>WYUY4t_5K7IP&{vv(^c=ev+x$5c_fp=NSFmQbX=PX$8gvJ^Cxa#%mvwlClyKUKf z;J~}e${$b^@)Nu@p&_UNu9qFuS$7J0At}l5?X5R?duJci+8_!wjDzB%=J<TuV!;Ag z1%;LmPe<XB<L}=}OT~8!WI158hK7c|I7}Y>&l`fp>J=*p<x%6kzJVFHHoi}x4am>k zAv$``k;dZNY{Rf2Jh7P#y=Tmx9p1U`puw0@7!VuQtoe$KiP!k(h=_%`SN9n&pIsQ8 znwolBomUm`sejX!tk#yxxtkJCoR}j1BFkSf3pn=GSI>t}BO@cJ=gZnsGMrCO-)|WA zaA8A#`cBD?ll$#?Q&BOK9SsZ&g*koc(qoa4&!}vcEL~bySon3sR274c9XfRA*zvX4 z>e7sDQa5vQ1fnG^t!I||+O;L8Z6}|fPW%ZJC8ea~It!Q;AW*>;@C`pO$m);q3zH{L zwr@KxVc9aNjNal$;O;l*?T(6CY-U#c<cYX$2eFRIN9M@(?meW3M3eSztJp^WPV@ZV z*EBS5-!748dI=5yt0f~NqvrOFH*ZdJcK%Go@YOSeCJ1RmzrZ&kuaaTmrV1K>TH)*V zty`kt98%8cQKN<q8B$i$U~0`yq{^xv9h`Gb4Ln6oUcR`vc)j!KZ?>?ElZW+^T2Fa% zB|UxqK=lFME4~YROd+<hs>{@Vd)~c!hv7<>_8ZA~6Z~76tBaHC_ifrVdCi(LhY!Ex z)v*hJJo@=hnLHWLxeBP2nz~ky?tII?b!+gjVYpIh=x<fY+jV}uUFi~Dv75Kl%ai?E zTW5}_xW0Pj%C+w9J+oYhh(y`dZncrAkK0Wa+6pV#DOE-|pPW1iv+CjQUiamTk^r#2 zo`((~KYs<~39em20X=Qn=4NSTl=JpN%p-JA#~sVu{4wv_`htt?{a6EWWp?hF1;(Qh zENH=QM2OwKeH$`+(v<<$&g(w{BPs<Z#9ii-Bs%ft=b4&<2TivOuuXmX;@zjZWkM(P zZb;JMOe&6TQ;r@uaNsxR#(Th?iz?W`&JF_gwFcN1Tv!GvhPra@qD3o~EgR(DUOCYG zGXos$l;O-slRniChaAj==!6~!3<?4cvs4nvjdPvSQsyLdTAxcT>4$)UChO}bq<p-! zb=$Th52^sA^K<Q;oSf|J&H=c<6ZxSy0Ti3BCGz+8$Ciw0aPQu|hYx4bBLJ|}<$cJ* zy^S)+-QE3=6d_)${&1$H_vET8ahH*@4C_^J_pS@2xr)J<v12>6Z|}H#`A&ri+RDmp zl-=Gx8tx+<l(VF3Zw(bq&2w>aQ(MFhLhI`4H2Vx6KD_JsENqzg!?r0KUv8h$k5J8L zbm<a|%t<vMKi^O_mZG6cmoCrWA~xtb;>Ax21d%@6O^TciEMZVkhp0j;%BYZ#J7mM2 zn|;~vvuDp<_3MkKmy&ws#M5Kd*J}uh7Qw5=bw`YmXxNJmVv@V!F1K&+KCkX=XlW@Q zUhwg$O;S>l@ywY+hYp=-Z0vpd>7=9Qm$3$i4I74|j{TK;^)XXLQ)bNAdgzdRNbaby zV=G;>*!q6Gdx`0#QMFdSd1HJ?n+=hcvb1WrYTa|0yMJddp?WKQe=Z}V8JMsBvJuZv z&wNs&#uJF>2|o36T0G6ndiw2fb{0tl@#?<R3+{I>j^$ScZ`)>|dvWv_QC;<i4xNOr zA13Aen`v~lf6XtiJk^f(e;MORs;h=&vX#5HXYrJM_%N*XNtoZMn(QCn)jQQ{lJ8_C zg)C+?>F+F7Ih6PHM|<U7!Ryrz{7MH%w+0ogo9G!4$^)EIsWon#av&Ji>$h)jI;3{( z+7*PxgARkZW@1mixin!XmvS}gh>6j<adNvZUD6KDdF`U*+j6qkym=46WA^l)?s3+q za+CQ2SK^B2JOg94-HTpCGOzJgj*f%%XH1`d{L&?FFdY_>fNri|-$WbV0)-WS{CG&; zu>vb}(c@#}&Yd$YEiGFkrU_3jI?2*ETk-tE;QRMY)~#CyzO#J!MSSN1=kOFKi8@Is zys2q$8ngc1(Wxeh`*O>b13!HH*m<KMBPduQuj}_bJKL5nrGAx##lf_+(R=f1Yid@m zSP?qp!NZ3=dh`hVp|XAJR@sR@TERJy>b7k&75cvn^7-;Bb-o4!NRb<;f9vMWn-@26 zsjp@DAbg7IM~CDV5KUICnmKEh$C@<}(A02#fK;P3HNSj%;5242H(-leO-!%#h>5wi zrluxUhe)4|bL^fYAtTkHu<^~_*+2)u!NHYx4&N#NN^}wFL+z4*99OPvdL68WS=^qe zsFikhDm^4fVVgH^#=+{^BBTAoI(P1TWQ6O7(ko3-&Y6?MgMxy{(_M7~XU0qF51ue# z!ap;xT;*5|OJjsEOTUOKBi4(LAJ}@!G{W}v$v>dP7BB8QLhsl;moDEZ;pWZTOWbsE zxjOyJqY%SqpFasKzSz6rEH|Y<?n0#RrY*1R#xnqYpoKjzuFMWb@iTVxXm{{-@gs=J z7B5=VFYx|@2LgXaXVpK@&D|a7+|~7L=ps59@gqq|s)2Xm{xCM&Ai6~C;+MHJ>W3YP z?y!y^G9vu_>(~0C8<geJ`VyB9Xf8L&eI>1r$f7<z<eM$CKi98s(nf={=F{_WK|Lpo zA5UFFKdB3`O@U8mzmDD^zl35<tg)|IONn3)x8#iHlP-vB($doEd$f2?6JK-jxxg5l z?Ui|5|HvuhFAY9E7xgnG^>3AwG*R4-S8&eR-jj@<fB9WHReozr+tS*(${UqH?L!YA z)&(rUkMT=GGeALx!(%?`YTx*Lf2;FpX%{bD;suyYhumWI=W2XA@1Q-;X!DeQa64X4 z7k28j<@M{=h{Wvd?N`B^j~lnpR_2i0!-5?O6Z-g{Nf;&f>kI$6^TeXnFSMVGmFBl! zJ(_QBO(-W9ld%)t%dyIA4YUu<61BI|x!<s8Uvsn1;>9K5hr$fw;0=I%3W|#SNOhD_ zm+noSjUQ#){##0c({{-X2{ZiqaS)em6EmkGSq&1LFhVFAI{$=?x-8)7JwV<I1tSm5 z8arxKNtVCv&S`7i++y!J9!d<`x9`oTPgay}efzE_JcI{H_v{&$m^hA~di(b6{rmSj zbm=u%(g_?>qvz5kOOWdkJeJto*X3sm{CGwnSlN`IWLDZd3c@o!4c`Rm7zhY>B$v>B z()jh?C6#MytLBk3Pn{Yu&q$>^FLX6bPh(?a%8vHJdR&#{Q#aMfXee0jl`AhwN=mTi zBPWa)F+y!<21N&r*2N1KdhmH?=UZ8oLc|<9dUVX{=diSOXZKrLSQJH1(4kx&J9ey$ zOgPA`hlV;ZZE0y~p6?&w!xxW<+eF<Il+(6dyO&;-haij4kyX{)(f#r5n~+7hT>f4@ z@GiguFvu|Lp<~8;zk6izZuk_jcZ0V2ogK9HccK}Tonc~T7M7T}+}=Kp_->v1ZQy~3 z2zG3C_lTAdrLEL<IyyQEA<I^;E-G`8mE7Fi7TRzH@9y6^q=xD)@1#lSAqo>rJewqi z5Bg(wW`Oy>W|5y;RMlR56t;i6iiwZkcj+d4eR>b0EEdq(&iw!05rq$1c>i&kn{xEn z-d_Gu1NfPkWFd<b82z0^Le9T@{@hp;xL_FN<QpThaZX|3&O(R2efofG&CFZ+^-WJ1 z8PZJmZC0aHh2P+Bl2$v_(((|tg<1z&zRZj$%I!bz?C&%ncuRtq;a_>XvPMuccw}1t zol7zuO!;}e*4PzQU0TM+TY=9nBX!WSfW8(dnTa1k-U7cuEMK&6AzJAena8RMx_&$Q zX5aail9bd>{59;6&&0!p4p;)tP!0R$IX-arl`9h_iCE@J;;(6@csK-Nyh0_Uq>lGH zla{t~+qOL+%YgLSPkNr|yV&auy$aD9xPhewx>W*D;OeT;ZODibMbDl^=GiqiG|-V5 zsDy&m%F4=84LvO>=@O(LIEVF(_a+@$&t3Wxg-2myGdEFf)=Ec55FDjI8Yq}=u6I1h z9zWcS$tE%!bD(F|SH_hqa8l*v<u%{FfsH?4iv;J{WuC~U(MJS&E-g*a5rW-8{*2bp z=q?d7Ug0wj1CZPjYql9PZlNHtG&NNbiL>f|;dKCPO<%4{*}tA7e$P>pi*7g`lfQ4g ze~ZuGF~0-ax{c=t2(8T6mp+?B0%yu~;z-MmLFRg=%ms@4XLB<Jj#|aBFLiZc+a$O% z*##_<N#e^L9hCy#xoPVQTo3~R<Hq&=Z2u0$1ld|%{t#d;(B{O${<vHM^1gD?`@iIh zwQEO>uvxlvljv+(+E3a&G<Sy%y`aQE5O~4jl<|1+BZxiuGN1N|!10@hMqSM+Tm?G} zrkb5I>+nPY01Ld!{XlP^jEZb+uGAGj0)8L}0Z`s0oH%h~<`t(N1RjmKw1i^qf>m3; za<?Dey_@mzy0K`AfkEfPcaD!3_oSpGeBZvo%Qxh=yI}E&>itcZ(+h?*U%PR`E`Q&U z>AU16iN_s3-l=29%vo>RPogkafy)I?24H$s(}1ol`*^~u1|PqvQ-e%ZEmIv>Y1`uB z2Kb%IYIfL}A}91N>ZcQ28}&nDZx>33s_2wnsH&geFwadVwF+BY0exGuW{tgl1#-|! zJ-@Z)W@jspA8#?Z2QH?|>1w)fi!EPB#5{KF4@E^akvOHx4?16zeyYx*^iO2*m_DZC ze0xvub_1SSxpJtVQD`i=aKSKo+xi*M2?=wL3GZKYbpI!liV75x8<n0td)6cR=c`Rp zwEi**3KKC29zOi!<82wRgG<#AUc%g)K3VV|{g%K7h{YuFc@dC$Mn(k)LwqXo1tj0g z+Z%Dkzcn%Nw*#oLAZe+81YQp=#hZs0K6=LS2Zgt9BN?-%3tO~Eb?tm>Yk$Ik(89P@ z4jwpg^Q_~T^$iUfk47^uPatz*Vw8ptUqyuArP9SSU>pnX(u0P$Z{N#KPc;-m!uRf7 z3(kkb=j_>cP8r{6h4TL0@w`YD(9sOrq=T8VefkJ=WZCsC==@thq}~C-3eG`^Y;0u} zy?5^eBmq=!R2{RA-J_QsVV(Km^XEGiuD(7#`_5hbpB&Vq$F0N221jaYx~*I1ztH_x znrX@ZsDS+azvULGiDBX4V<Bw8iIK;7dwJ0ctoQUpvqInJzJ6&AZ6uv~)%*ABQnb0+ zFPo)*+Eu=xARiH4GJ9iHdO(2Ki15p>45f}>FZmB2o;!Q?{*4>4%NE0Z(q9QvD|g0p zDINbm;9T^@i{rLjN78-zZRddOfh43sgO(w`Jay`nue_1-hLoc32gttME&#<3cO}bt zR#q+V?)7gzDWnM-y*U+8)14Pk;GH@1mADEfaZ37Mnwxgwv1$_>c*)-`x2aX)O@ykf zZ!Vha;^IQ=y_4RV-%+dj|G?{n?9|tCyidKzx%Z2P%u+qmlqo?k23^TAPMKD$7%xw* zP@9`r+aX1__`!p67cCI@2~S*c6rLpNw<n>mZ=IFtgb~~ourUjee|_}mk+iflGS1Im zt=<eu9V;2LTtN5C!0!^0lT(?q*zzFNI&S3X(G>Y`g?3{btFI(@KN56d0*OrkrvIb6 zrF;kD5Fl#Opm%!zhP)45+u1)OoVaaDic_oKwB4JozWURrB0CM*->;iiCMP9{Z+vpz zS<x@yarA`snBG#}pE~skv8S|t_iaK%;TqZUU@-beM9M(cv?^0R2FIRGfteVR(er*p z0&ut{utdfS6JQl;dZvP8^M;n^cA&UCaq?t@as1)Kq|<r1o^RH}wAk6fe^_MtG;pzJ zXtXsnBFC+b=R*l7l$vWIP<;VGqK)s{7YB~LU^vl{#=QZhBStRmxHnI8)TqU2D|+fD zKqn!!WM@%i4jD4!P(-H&;lagd-)bqt@b=Rl8!mhXQ=}>%KYrwXd-dwocZ|~o)+6!x ziIWE;iM{;*{jIs>1WbP%jU_u?fAnY!%8tvQGy97l<ud8hi1R~-8V&2EW_ju1)vJ1{ zVUHd@R0>1`mLQ|yyGP|Ba|NSEr<I&{Ue`a#zoj7;R00*JiovA|7a(d6s2Bw8$<Xk# z2)I*;*)w0=z$CP_BPABweuh*~)D_H(kzzkAE-uW=W1aJ)O9AHAu1%#><Ea@L1p^uC z>0PBbBzf4aSaHer`eucL#)iJWKdJP5eSPsDCB=LsNmHz{;}8ZCzB;#W+qLUXY7=vh z;jQiZNQ(4PO}E`32(y43&YYR68us0Nj#$9hnS*-}@Faq+Wp;~|NnF%;{~lE(4PN4T z`U=UeU2_!I^YE1ozR@TNavLX$fa_&)6MYV-@>bVY-5(Hm7oH}}|8=IHsfs~-Y%Fh# zej(@K!&;gy`DC{pZ^FKow}tS`?F0)$`0AN{t@JPo2&X6Np(+%_6C2+A;j@Bt%==L? z5M;?-US7OXE{me4{zOz%->}Tu4|Wpmse?DsH4e(Myz`e9pn1M(7%@9CDr(-48FS{$ zv9YnKysTiVgdgwjP5pi6R?KV%SO(s(rEA~KFA4aF8_FI-6o~V8Q;*SMJp3}r((=Wl zNAp1}0jFA9eq>=79&+Z)Nc{w!)8xs=&L5MIlr%Opg!if7DY(12iS#A<XCL2pBgFcF zW9#MNw<>D{1h(Qz`AYISD0M^b>)w6(JbL^XjPm-ud(uCK9$Pjj^}>ZG_wMb<wt02F z-b8|QKF!YA`EX=pWB#cyH@2xw%)E-)xRWOfi;G8(9JxpPnvJ?$ucIE%3%h0Q3JH-B zZ_nt)sAWYyEzOwldbgWfCL`n(<rQ;hEbF%?#G1w~yLU)vX_cEcigO#AFTmh==f1Eg zmM$$XdgC%dBSOW%BtpVHc4>izv-P9Vgu9;cz$o@aa+oHX(yr?_6gp&`-Tx2FGV@FV zE6;Snf(xuX5aP%1W~M4or|IeG`RgCwyEl@?&Ks=gX(}+jAH<T7j&%Lx%z?Az&=RAY z0e^m4TzYwAAW#(E=qBN_XM~<hPsiljv<^u(9{ld3yK_BBQ^Fp|{8vQq%Gq9k9eH_J zH`{@k;=o;b8KCMnxcFjgHQ_{%7D?e4j#7pi*r%p&Y|0;<^#>0bVxZDJ=f;g2H*b!B zllS^8euPF!ZQ<D)MMWd}^;<$dpa?>z2!`Y4;So)k*_6#RlN40el@-NFAPH2&kI`u@ zUUuzWv&e!r;?N;!efIgv<;xrD%R^EuE;1xAge;E!9(V-W9{d*EnbO4V^GLUTdj@N0 zoF$3%b>}tL4kfKqq1!t+q@O>(e*OB(7cW|7`aI3asR&EM8y_5@ZQHgy75=RA@{p-& zPJz*7>Ei7@hthTPFYnwM0eMLJNOhlooFUR@x3DaBY~TLu!kYeRuPg1Z^baicZ}kO6 zCe-cfJqo_|u(rDZI`geuOuv3@m5C&*p2+?Cdx=C}>c1}KI((9iE*420Vb7gB*;U!j z(UC}!Ly<~!`H7;W{Hy1%UhnB)`6aVv%_4no3kmsLnqG=B81?P_$B#cx6ClK&5?}K} zO2!^Lb!t~Z#rM579nXQY&`%LGSAUr4i>wKSN+Qqb<jI+f7dKIp)qedtcftK<&%DtG z2qp2#+@`m`n^X6UUUA;y8^t?!K9ict1=Mc?{%qH)T^sc$cK?okCS|zExP@I7zM2Y( zrcIwt`H=eb1LP;?1KhfPy?o})?~(Zh1&Z*pOp0Z8qlMR#3aIVi_6P;U*U4o7cEXDW zQLlBMVyV<ag5X;Al~y{YkCN})(M0bnZc-!Y^~Xl~j^gE9zT^iQs+Sd)Z?sM*+G9e6 zr~^bIcFd&8X!Yt5lSFV=G|(^BYtB%s^0E2pA^x-dZ2^#vT~gJ>>OkW0<GE!npeT*n z2U{OBT(vXATs}%^E1=|FRV9)5?ZQIqK?f*A0fjnlvUPN<=WGO1bMvfOE9K+j<F&Q5 zQTun>QeIIJ78Vv10zpJvtFEeIz5B$TJh@X4O%vY;;^03N1(4828M{M6LAbPZbbgd5 zj-($SYY?~pldF~-AUNBx%%!n-ow2s!0%s{(a5NgZu2NEm(J}DPZf><8;#6+dSt+1R zC(w1^K~L^;c5)iekrg1{>l?n=2i`@SKxaq(R<pQp_v_QkZ8uyc2I}7C0>3lFQhsyi z`pQG=khnO|S`~bFez68>?Pki?bG3K=yrkk&ke8bOmAo{yurL<2PaA$TCFL`F!X=Mr z^P7D%vYq-L^rTA{iYq2|mYrFEauiBIu+jSmfZK3Y^qZj+VAlLCF+LfGsxBRasPY9i z1b=0)<sbwxy$^6PJdsd$omDOvyVXcxyyxyal`Juo&IWP!2_J&elg>}j*>MO7wFAF$ z`YK5;04lJ_#}6LVz^}`fpTU;U)isj5FU%-1jQ|z#!_6-B=|c*TF=L9<Ao$~rYG{`9 z?Dza^SNgTSt^~MQ*?<A~bLY>S&!68fu-?ZH)%TJmuXig?rrQeMzFnkG5qP1w>2p>V zgMk*5+Eg0aqejiM&7n<kz4)9}ZhhHfrjp3f(UCe1X*Jj*q&Tt4`RQ3mHrUvlYuA>5 zhmi5dxmWjyDl9524C}l@B@g5=IWh4CU_^t6jV#hfm~pg7NW2jddsLn_oEidOx_8&E zS&&t^o6xg{5k#&j4|NiSQ}#bYA)&9|c5j|B^~|<yj6uzuIrH1~Ju_6O=9wxYvGIrQ z+uAEm5&y|Z<^^L^vYR(gTe<Q*f;*8u&}>}3or8m+)zx`}M(vI1A2<h2L{ACW;bc<M z3MVHTKwtSDVy|ZYArV9irGMmfO1rA5s_r;g#vVDcL3H#%tFr}9L1E;Q_WJLDRS8%O zsTUPgN9+14yi83<N(xO$NJ&XKb}SX4T%VmcD{CnE&H>;Fm`6bc^_-~vNK}-8a~L0@ z@DkEN;O?NH9IC~r$Vlzw_f;aUq9Wr<XI%RrXsqJAQ;Di5$zW}ck8rX<Nwt03wz*p7 zOh4^*c42dQo<f5ytxw(+*k4oCw9}`7J-@A?7NZOVK?WTW$ahrq6sr#x;<mkHjh)>a zASnB`*R>~>tb=UOTJzy{GZAHuEq6OZxz9)cr4SLs9Ye#{Ix=d>Xt1tT)+BEFO{0P= zazzAEuqPhgRPh)8;84>mrw7fE@|gK?TmMmZ1G>JJYpZ;t!WDhzMiFX3iN1&+5)d!b z<3$yEtX*p~dp4c4r)L7VtF|`q7qfq=Co<VPFRhUre!lI(g(YN6svUIV7wDXwl6Pu+ zcrSAmgR|w2*43Z<Ma6za+)K@$zWPPv!Gq5qJ$hSRZ8*G1Pkczmz<UPu8>bi<b#aeP zOzeET+lzP4u3dZ0%M(Bb_gxGUG^A*hvBpjV$uBh+KM3F#nvPmuqhyXz+<hWH8;X|X z^?8yqL$WuQas0?A3W)yw`wwW60_T2~muK))j-V~;W7=BXWq_{k%SVrT`I}G`End7> zXW_kP&lU~qWfW)PL%wohwD!Nyx6nj$=kAG)R&c+!vCv_i&Rfc)#N=e_EWbnAu8hL_ z_#f|UNqU8v0DB72{zhjC7SOON?(1$H-CnTbbZ)Jb5%N;#Osr}4p-(9%w;<aJ&H?!s zsDee(`nNc9h8$`0@eqkCMt9E7WHn|LkWT>Ol7bm`8%^-g&{%{fjfR0rOPJ{c*e)_X zs9~Q^bnZ(JBqzt;R8W{$WO$BLRW+oB=O7&P0&IR}k{MS+Nqf!OkwYGS1Mn7rM8@SK zM~;N=p(rPInRL&Hk9V-Kc?HzHTr=|GMK4+~jzKUn>8_v9*D@+9DrHgH3Tg-XQWh?& zm<Y2h^(m)Q30qb1Y;tn4&nAhntDpi~-$pq@i_KfS_<eaf<zr}cv>$vb+ys)qCr_Ww z9YC#x6m8I~gM(krARd59iuAcL+$ZEy+=qbhqM|yFu#<kMXrIskN;G;@sK*`8^m-`W zvTFxt@dW2+Xlg!BU)6Ua@{8rRw%HD;=7>hh%P0HRByc-kQ}@h(IE+1YYPGHHo_+hK zguWqzah4R$8$eM^iEPj6vG%{Qyy;Xjos~`J&;Oo3S98o5q4q_0L=NUWEx56I&-0g= zeCJMfY~I{4yr8Rug!h+M8$!t*gGZUuURj)Tl=hRCkr_*1f$BuZ!2IRgH*X*{KEJqp zeksQewO*kS$$U4}w?;fTB;>f?aA<P-%tN&rye!Z6C(m1r+qtRzMrVaKVjXkGhKQeC z=P~G0(r*wZHQUt8j5$)?PUL|D84=stJ-#Y`mUa^13>m6Xd$-?){{;T04N6(sM$B}Y zhlj_kSw)};P>4<1`%5*pKFSm;{u6Ks`jIMZZS@(}SH%YYPobp#B;nhAOS<+?FLqXY z<ZM_O&~2QS@O2^O7~lUTKD+o&-gx&fov=;7+_c)Df{O0#Cy8z_gxWMFlzQ{^gg8!Z z+A0I=huEg`Mi3|$4-c!ecH6F9@-$zTQFmYO-p2zvqm(U&kGtD7dJpC}KhQ#L6j9vu zH~0n>S>+S<_N~K4r5j7=;VxV_pd`L$#>07EZy(k@?DN&8XQ0SxS<+v%mv>V5hUA(* z?(a-&B6UK=p)lF`atxsti2{#~tDxE?28$md-Jwi}tB3tvxiTs=^!}M3lFGA^l6ie) zAg-n5U;P{=t<QE|w`R>ffSuyvsp9Up7mj?c@8{QoB?o}HfV`yoCv1Yj1-_6`v-(gv zqm7u&oVnSx6{C4s0|yP_RH?J!&tUplNQ8jvWmnA|=9mwhVvt9P@#;{29hhSEks~kq zG-$Y^8yQ6Lhj0V!jO@rIH%Jb|YZGhhR?u&h6qXlUvN_d;svFMcg3sEuHCZinDO|OO zlLuSWOAXOJMvRKO6LCbKVW%<gwM-W}BLBUTy87-y2V|{J3JO+&SFw>f1&LiOXn)br zIxrde_AS3<Dxku`R0lIt)2nKLXoHWxt}^;pnb?;~iOgJS8JT6PRxzFha8Kg_4xoRl zv@}|2D;J4MschyRtNB0wNtGD>2cI!Od9LD&`k-r`E_sYFtosmG^HnL3$$TV-08Mdm z6~I_ly>?uyu5bJ!ZFrATO|kIj0=^~t?BDRM#Et^XL5xSK_W3hx(h2qM&mTfv$jiwA z&<_};EPe!ttE_2t{_#`giHw5u8$Ntyybq+w+O=zQyGo!|_GoGLLQW2I2QfGi^)LPX zlPC4Kq_n_r44N6q1dKzX>GlWV-@kj%)b{Ngbw{@~V`(ZCfQw)DjT=*#xC{y!prUf( zR|A<yY!moki=-VpcNX$4vN+_3i8*kkL0Vd}&Y2%yy#nFb9UZ;e(eVO93P^Q0lWq-Z z31-M}n!tf5hm~mRSz9Z<9N+I3Vq-C49d8*X=@0StXz6&+^#i*dzBAic_>$AGo8ji> zHghJ*`@ua}ujE!4A)Lj>Uc$u#90=j_0b>V%G|D<pPtW=Dfd;HDxg|2=PG7ppq@?Yu z?cKKpsu(l}_-~tXzqIs}x`K}jf;9Q{RX*eYE9!RYT9wIyD+vkW%BI%VAq5%C8a~XF z7_Xp)NIf|vle`12K=6F&`$K+`h^q9$RS0+nQ{X*flantqh#j=&RVdvUG&Z%P#vl5j zZy*MWA3mgEAFg=X*dQM)k^Z>nt~KbV0F`#@`jy}88hDpkmBjwUSt>-TF>i1bgHR%P zRVPKCyQQTq%(UoeYrodmwQHA~wk4J7ol4qfY_RssAUCvdMi=tA=P)e-seGp@WXBFU z9gh>Hs#Lng_wF%hznTW!(eagwmi`eJfPYFZ(=q}EYh*xwvu@e(ZNvhy&nyp6J+4N+ zrdWB{+JYdTXIY<G!^5t(nKGq)NbYr+@u=+$Lsh~&1}D;U?2-a}KWT9>wE9YX{9ER@ zFZd3qGMX+?KKF@HW%<)A|E$#1QN=mG)p|W=g<q>SydTbB=5Cd3&hd1~<!$A<RT2y? z=uMs4Vd7TZ)SlBe8hPCAYh^w5zD%==Z}srfttFs!puSoyz+2^VN0&B+?%A^jM2<}+ z5Tbydf-Vd#%K_uJIPrKwqOg3?wek42tw_(z^ke)C_9^=pc}Sob5iS@?KpcdscrjK7 zMoODTO@?YfkVZsLxLi^rR@Fr;Ku)eISoP(2d~s0wX+CSc>FDfiZDO*~dS0hrG}Tn| zWVp&#G8Q9#5b8`4-FW!CdlGDYo9~|ODvRdHh8U|I3aR|3w!+XmJn>X)EQwHmYtEA2 zOry^nb8{Kz?5(1s>5qHscsRj<h0a(oZ2q8uZ+o&0WF^6Uw9r$qfp=M>Da$zf8tFc2 z8g@ZK|Ie9CpTLzfUCQ*?@!SVfYA`c<3LQqt?f_5%*6P-G49BrChJi*0S^gv?k)+~8 zIqRM*L1?1`$BvaV7N<#^t*v!SdWuvApNsm&#(sf96GCl<PJlTZrd51sJ*n!zsx8kf z$zgfw9TzH~1q&DEIiy<qJJ1-WC4QT?&LH%|g@uQ1FE;+Ab#%L|J+b>Q)(ycs#ajc! z+v5hC`La@<h?C@=KLsJVy(OnD^A2C0wRb?zPvTD~k*WREL#dIA+CS(`<=JUh4aZ-i zmdROoZK!Sww<!P*xMT<cTRVZVRm!C|Z}vq-dXvLI*2s9}^8nHK&~cojnLAB<qb&D~ zBK6FfHNL(R+<h<rsZZ~rpTJ6Cwg3vzb2}F)9GS>(RtiLj`MSFL5;2V@=ftsfyk#&% zrVYS-`a&?jzk|{sVT{=<Yd8f28@R}Q?HT+VI?UUbcjpdzm$(O2^+$$Tp4_!9XNkGF zxs;R?iGEzkDy`_%Qk_!IoMHHz*clCgJn?>9!Y`7M>mS*YKf>KU&Irxfl9ely)k77G ztx<vuZ`PkaeHk;xgvFE-p;1v7w0vgfwQO{{1|<RMB>u<|+Z8Je<u%pSY1;@WD^{*N z_Mr90?D)h)VZ>1Yl2<u7!L3`EnldH7An-2rf1)}7S0@lztX{;jSZ&L56>q?KCgi?> z$mQ_Y?%P;f-7ugj_5z*Bo)+e;fQ0won94x!wlsF3GgN3Px9!|%neNp4FOiHtyz27h zRYQ{t5D-(gP|;8tFb?}+T7t$`H+L<K=AS<)+f!1UscWc97`Ozoc-UY=*4epZ$D>o0 z!c2ppe`a>(P)gM9-5h8+NF>fU^iN!P+|@#H^FZ(8yZ&McuscZa^U~5;SA;Q1j3F{P zYmy8pjE)C?CZ8~F@aokoT5Tc`b|Pu#&Y`a!>~#9V1y6`Qj)+7zLIfl?!IKgr*15Vi z!g9hz!OscG97_AZIRNxr5Zcj2)qaOre^`ak;?{x1bP2i!i{x{ds%+@kvF1u5emy14 z;M>+y`^{z4lAl~zL{XB^k+rj6*dt~!Q1>1@c#tCt*(_8yo<6E-YR=em{1(6>|J4^~ z3ic;i2ekzmGv&mH{#sg3u3zu3q@*-#*opNz;`zA`;>vE_y?;L+6^OI*4-)*^wU>Pw z&ISh?Rc<<R&ymgyXRYr)epI?%RBIY${*Lx5ieo8x*q}A|(p-|+Mg|?aPv>QdKKTeD zkUgy1+7J>QT}m|J(KWGs`H3f4r(ug}h%Q~a#N@vd?}l3^@eu_j`qFhMXuAn6TDUpY zfi6MN_#FRCSqO>~HE!)&0bzP|wGDh};9bCRb)R|{@=?;IlP5nCPidr90Yfv-N^a!! zC<h`TrZ~)Gk`1VT-kr01r4d-YyQ@rl_4wc);0#@Fy!W3`yY*L#(bSmja`8F!PH%s| z!898T;eY}(oDE5^+So*g_VC4)%$=Pihy5PLP`j)#U0J-X|FP}4<z<6vq4<J=IqO+< z*uV3<b1Tx+0tgQe)<me<6E5V{qykzJ{}i$st)k4?Z5Xfi%jrlkmoh3*sEfu6%_k&A z>bJJ_wDVH27yr_i=+S0$&~2I3nbu^iPnHujDX9Ku-LC;{sH`rmUztQiHA|#-;dhHA zsQkqN(^XunaP7QNNqh-tzi;0>ki@U)d9=Ydx}a92H*Y_QiV!e0>qGW%)sD_1XHGcU z^?mbr$!op$cH-W|<YCk{imojl<FWk3YSbi?L`%-dD*wVT181mICwjiUb9i><6FF(+ zKp7jL+cjEp%?nDh6KiVj`a7H`|GX_jp|!9oq16~MZEYvj1DP2E|CT0wH))dVHvKPA zQ+BguXwjYPdJ$)=eirr~EPS~0=IzJTSio#6rar*o3=Iq>sjarVk(0A<@#0Yt#>~1B z4HZH--R=DOLE=l07EzE8c;}n^uS#*<hrtvYh#WUD=oArwbCjV$7HatGclwnu4Cv=K zF(mgvaWN|Kp9MGL)YXF~!?X(`r;TJIq$hJ_vqD0o+-sH)@fCe*rTwnhWN)O_ZmVqi zFHAL{&1AD?{NH%wRQVvW(4)=cKRiq8@^baOiA(d_c^*pD_?a&iTmCr@#1)p2!-$!S z8EAY!srxpXjf9s6cX_|59IDIvRZjp?ZMjzS{`|3&ln`fyJt__VjW=!U^T(EdlD3!P z<2x!Nfu$5?cLs}8hYp=*@&fs7Ys*jSRpWu95T*P#%J}sdM7l2O7miNpr)+RGE-pyL z;8(3|Wo@nN_HGWNj?lEIJDLcLRpI|<K6*;og&rN_UBscduH(+PCV|ljH*I0`p-fU} z-kv^<P{|__L6Rb5#WgHcC3i>fwM1Z89^|o%@zWhv($YJP(Lr(egQ@T*C`72StE#IJ z@EABK%m{scW&L^PNJv!`Iv*F9c!{N~ogY8FVS`)q1cO<#-nw4oa~Mv*BFTsYrEkxc zd!KkXrP*yrAV(Q=mKJZ%rZ6)zBb9gthy_fV`VV&5wXu8OzAIO+p7qmO5d>ORcB}57 zPcO4Vq!5#R@dQ;G7<iZ9XAl}YF>s%$nwnZ}Cqg9?J_dDGzsct3nW43D{Ws`A^WJ^< zFz_XJIpAmM#kE^h@(5e~0x|4a)27>&we??YgUU^04_p)4neOd3EVIFd4fInjs*K^Q zj+>PC%peU=c4$Cca7r+R%3P-JNm%%L<u<fQhauvW+~-S$npw7Y?{Pe;@U&LLUu#W% z{amfxyRrrWYe8vzIv_XL*xI|gvLr8WLv05!y>7c|r;@disKVQ<$g)OX&KPoYq&771 zP*v4Si!3KkZkP4S_2TU4@tl-Oy$HI77UITi515n>cDr+Oa_B)Iy0UWoS7e>AhI<KQ zF6Q@;QGE<J6@|*RHA6ZZJBX77=EWQ1pe6oGajmZY#lDSTDItD@&XEEVp%Y)sc;Mr} zs$iG?6Y|~Pr;i`F_LJ~JuVsU!Ubz=}e3+W2r~YrVI+??sMgMFd23<A%n0Q$p#D7hy zcEtGuP|i^u(f|B=-MO|`aB-Yc;_S1hz7K7U+?ZP&aW$bDeXqbLiHjq5J1BtfZ66_* zAm7t?G5pe@?Ic(M##Ir6kiVq$+3s+r6gZ|{9XH)WWOpVgJ$($D?C%$$F)82oaTlAv zv;b1EOWXXXs`=@Q7nT#BSv7L`SCx(<UZ#RX$4B;chRd41v(JEe1ApPZ`)3_5-*VP1 zO?zOkU_dW;Sn-W9`RneJRr$t5-4x1gpDe>yYutyNrh0qDVnOrAGd7F1GL9ZUZq%q6 zTti{Em<qZ=Df=5l3>2Y88ltL-5dGMx#iyS-MO1@6BJ%uLy;ZyS)s@k4gXL!AzWgK6 zbcMZr8oU9F%#YIbYW@39woSNFThoDEG%M^u_<vH%b6#p27#iY4EG!?~nf4Dq_MnPX z%L-OwfMob^Uwil7G}eO#Rq{N^j1<3?60XEr8gpiRzA^zd>yUOuRn^l5zlyva$wnJc zbKN;GvYf)t@ROV^^}$4Bp|DXReaVhX(W>E3bFFtkRu)R^nz}k9D^%XrP(krCqg+l> zc4cIY-=KFI0s#90!_23@3PoDjmV8^)&aXz_p@h*US2`)l`_D$pF?RKHPac=B{mz|x zSX6XsX`rdjgr=I09OFE7+BD!Z_hZ;sO1eRqpI&f+CBwuUB`q#n1118v)PJovwfd*5 zI!N@4E|s>;!oosALc(gH<uvBAw``fNr>92`W`6$BC{0Zu_Sa-`0*27kGYD1mW9V!L z3(Kyz@nvS$m(AS0>&uo2VNz@!4cQ$Ow#tD>4KWKq;(Z0B_w(n1&hGW=jlt|RXTUPS zd)LiPGkR@rESJ?BeeDk#w)HGbWd+y2&M)Yw|1(-$R<OsTE6fIK&&jbD)TjMppH)3Q z>^z;9_b&vx?7OW+K8rHiu<L1h>o%3SUW5=H)pFfj7+Cm4q#IJlJpPbu<dOyWGV60# z-LwfBr~cO4DM(7zc88{hvcQ_nef*67nIO6zvRhEsd3XFT>bkiVahGF^s^7mS|3@D> zwDTohKXTIo8PvvGn3wCjQ}WgjH8tGRq+7=H=C$Zkju;Em=fXJih*j$!u18`|Dr?l< zZf-Pd7Gy;HYCB>l!$zl_C%0AW|2I$^Fv+NRwL%;91KEZB@s*Mr8)E8(F9=_z-DA~+ z|ChBf9q!AW0}Qu6!$@W3&NoOPJzL*U=e;Hjr2oqZZG~ce*{4rvdtVG{vo7r02Dg+q zui6Xjsbw6ZZGCa)r%&SCFZ0;jPXY@Fob#6$@A&HoUH^#<OA4mZC$9dRjQ38G3ECG@ zF?#xoh7Gs&A>$u2NhCmUW_n7Z15r`yGFSHIy=v(|#E;d~B#_MlB|g7+Uc%wqDqOj7 zhX>)01$D*2g90gTwc_ygvcH9VB`@WwnipIeSzRRcrciRBl4$FcqsW5sA6vKX2l%0a zQ^udaCFeo-zX{8g0ugTE>J=QEnx5{U5rN?p@p8O^lrl1+*`gclL4JaE^F(YTaj3y( zB6DhZ=i$#aLxmhMQeB;fg+fmTCqezA6OSgykol>iZ8RcCH-c$l&c8vaU$XyoEcjK{ z=g-eCj#_$C68xL4VMVd3T<PDCDfnAp?)|>U_AB0k+5htMta-PEof}5x&knk+zGf=j z+4SkT{y*Pa1MrugTRxA?2z(@V$bd(dqW4{jA)R$0?f?HS$x5F*aU=y-R)&X#xqo>z ziQPuk#NOv}u{tP&Ya#?LNqtI{10!!SVyuo%6Tlf_7&^YhloXt$p^=?Izd_Q_;JT>& z4OE&+UKzO}VgpnBe~ShSS}nBq4-+gW(B=edqnKFf;4m#Twpq64EFRl{?w$4DA@MxY z2Nfe(oLXBhX4KPF|2~O3ILy%c_$0BbdQ_)Sn?d@v)}8JLBYOrK7!CV8QHq5@y!~34 zi&XC`FI8MY=m-Ku=(bc1LLYVt3$2D8sE@&O5}AEsDbozNdIpx5hi1AlzB1OQ{tE)R z=0}BvtAuHZAD`EGc*N%qv$&v+o*2~*Ac?&0&h~BT<auU)_zev+T%(4*A@((pOo`F4 zPpSi|g8#g$iU%^GDxeb0s8^G|8|QEOkD5s!vC%oG4H=T1lE~~t7Ntybu`tutWkh(> zn>=#mzswfP{eYL5)lu*gdiO5j)Tz?1ufQF#0X!{3&ZSx>V#B88mVcdpVgZ9}RPG~2 zc(}RQsmosIRp+LG!~N-$XnFTRot_N%w$xOs=Y=l?n+=r3m)tF4KPQao`CKzVKh!R_ za%X-<j!O4!h#bx*m-mMXK~BlI8OQ<ZUH^*Q71M<o@F=bHzmYaZuQpSyG5!6oB)4&> zN?p~H0TVQ;S6{!l=r4ZT|0pV!TRY~KnKIut`14UlFJQ!wrSW1^$J5TKJ0^ZBmf?QD zRzSZ>{$Jo1llI>ZA)4?2`>q}?oG%0car7t#<rAvUwuvf4a8Ka+$9&eb5Cu!fLGZ0J ztC!W@O1O-9j4dn__5Sf)*hH@a#uHa=7^!-2ySc|1DjyaFZsf($>|)t-rVZ6bu)-i6 z|4uYZABG-wUAK<11ds_y;NZW|Dhi2XEoaS5EIWqe25;S}<@GHV-G{lNcIEr`m+{<0 z_A1OzPz(+3!B9ov%a^)XFg|{~j-fcoj)Juv?HvF-|BF_AIijoK!!1wSWaI3JBQ=#p zIVsT0+&uTjjSnv_n;Te9&{^U24>H@tc;38G>gq1A;+lO5pFc<MJCwLMWJqUaM3DnV zO$(ZL#N~L!w{NavqNoaenK>jL;A>Bt)ka%rv#pNIp8x#T`<-!@Ig{X@1I6ERx-X)Q z=@o1bW3#GcjKwz;R4iAXFx2h@?=x?{+ZXeJYfe%uj#zXq0Rg;{lAe*#N+d%xmEuRJ znB85gMi_(=Zh(j<Z<g%bwd)~FMIfMNgmRnAtR5#H@`Y!ebJkA}s6K3eSR@wR{mtXR z*_dGP90rmf-g&k|_VPQs7WpXw?#;_p9(oVDioQAu1x|7@<B|haR9=-!<PO&Dsqyty z++|@(^JbX~^Pg+Vu60OC*`T%e#b&|4%f@Bc3$rx&<5;c2Xi=~>pKVLihtvWtl7N@; z)I9u^A5dnqVfffbO;L(z)m4?FI_u18Cnox!)s<%^c2_FVrV*=%z?ReY{W~~6#XsTM z;|;>UsOlH*|MYsarXi#18D&lOAT?~SmZ%SNOZi1f8zb6_1+?gONcqJe>!nTl(^n(j z`nVdo#o^2XoGYlEeC2<6ay16~9m=e4XefU4=)U7Q9APqd2}3SoKc{BRvKGqP>n~p_ zI+qJ`Y@DFt4_I@*xcDU6vR~6`Vt1`218Re29iO+pN|5%6@n1-!jv{1(pYxUfH4WVu z)Mj@k*nC5M{Ru2INeu#n4x;q3FBFIVJ0x#NCWrM(CJ_DkFN%F-s|o}%0E2HrGxW%x zm*wju_Q4By$Ord0ise<SKK}I&&SDn6UZ@9-98rGrt5mw$QLpj-!-ve}H);#ipIEKT z&k4Q|(=acxhwprTuP6NFUF+KSwH5HHPGg$jm`GGr?-%^_4{?|2$@ub>|Mg57!~J~g ze*H;L;jc36FG*uN$Qr&n%Kn9o;b#(H2-10@%daP0yT2tg^QwQESgknN@bL$UD)A}T zA-t^G@Pn#TVOp8*nsxko))27(iT7$DClR+#-hD&t%d^_Lx`o4fZORUi>?js<t#NLn z2^|AFjhQ$87a*Uia^b?|c6OR%q0C*~0{j@?=F6L%C{*$H9AWGD{Y>QWHy~mdPB8TN zQos5=%z8{^U3hI!;~g1g6p<6i;Q%DtrU+d>0+}D~Zeq1M(3@24t?fA3WY%#q-&tYi zf=VO>3FU+E%x-^(iFr@;H?T%Z32Y^;PpskNsVC{***DbLAnm^L@?t-CP3Z^QHL|4> zXUk-YUAIvuQt%_n$U+m+{q|+D$Z^z!W^za^dG-wCBPBT*LvwXl`QJAdAHTV=lfLh~ z$XUmevtj_8*6l(Ros<=;R_|}c$TWkfVTJ~wHwvV_=KOvZTXL3+j4-ZN6fZLUVlOM{ zD)Z~{vh21hiNnM36{;ewPYmZFO`g0d+osmtk$VPjmuTIf_oyu+`aE*|BQ3iEw`^(q zMdOQ9dok+r{E5QbmQ?>sry&3ve6^GO->eJ1F`&)g76HPqxEeFh%nT<3g2bIMi!CgK zF~d=^lHiZgtGr^+ib-|t`tkkXj)Gf`YzEM;yu5sb@xU$Dzv9G^pI_}U@6Yo6bx{xc zyFV*(_bE!ES63>+4&o)PmNr|TB*PTB-$_!gqa$Ze$OV0s`Ev~P(gaN}`A$udAJ;7} z-6t8LJyq0xZ=N969HpUQbzCjTYTOfW$7{&FRJxzEx^k)H%HYSF_P*@PfbRQ`A74D4 zD=EQ!sLv2u&%uL{&V2+zMvlS!N+b8uq&?Ukw+Gny01-n3ed=<r&@F76LMLpmE{jGB z#!Dj&qX*PG(4<d|=GJ*MecLBFZsNqugao0+Lqt!%TK)Bu^|&WY%WVz}ME%59o#*El zTPwS+rx=CRp)qHuDSN|*lt6u3Mrp7GW1GJVv8qv=!FcbbOO1lg^y@1idA1LS^?H0b zK-Af?rISG@Newj?0q@#1eI?Oum8Z|1X`_W35sqp2#}6OS;GxOKa=FF40SD!ZmF^&C zn?(>7z1&sCjCpkXwsFIdP!;DFmx4r>*8d<Qq1RNdg(#defJ*PSordCg&%0+*A|v|* z&RMvyx5A<oE2`m877lxqh3O>QE>s1Jy=7cAL@2JU;o-+!ZfQKYzveWO5|dKD<;xSX z#36^EcVm8w{HDEm&?sjH4L)bo?1G)dtccOB+ZjW8pS_((@u3_D3-|qO=6*HnT_SCo zOyhI;{x120)}o0pZ6f4;Te>G=S~I-W6;KiCXRYA^l_&^ij~>;oiJCTZqCu$I`&li6 z^ucHJTSKnsNNr7erYPoD^x|z%kz`Z9<i4A?A02Q?_Co0LZ4FZjHC`rv2oGBs7oSj7 z5Iy|S+B}oP2bM2d9`7(D=IF)Pqr*mQ?GiKi)@$|K6ESqZpv{SrO6tR2-m$(NvHng& zbisrlewC-hITc1i5wYF`hC?r%?5^KcFn=YIt$In@l+Hxmu!2mE7Z7Y#*U61pW^J<g zq-`e&f@tCWrQLR8;SRfb#mYL);>ic5ez7L91Am@&Y$SffC_OmM;U}}qJtd~%hn8pO z4UxPTozngLrBIsqR_rPdlwXYac<x-mQR72p(sRRhacT~!3*$_X7@T!oZ1(*EgF=Xy z7vXfgU>JgQ@ca@G52A3<VO^xf-=K<gKDdVEm|RRnSdtv?ckG_5NF-83$p7vhdfjy3 z0K-O;i%BdrltIk!)_^+$b8=<@KvdYEQ}G31S-26>dwPDlSeewkcIf#5!zu+cr)}wt z{uXszQqP^+r;=yw*AR#JD>n8<rkYu=V_!z%iXu4E9iP2yVLC&c;IG2LLFzX#_w#-e z>9DvSCmGv9v(9H-*U81Jxi20N*k{_#K6Nx2&u-4;n;1F5G`eG)$wj-o?pt1*aW2XX zOu6#tbi1J14gn5TBRk!qpww}%wzD4L<RMrEhVUS84GRBQLP<3fr<Lz#Vq#ta2#Oy; za`mpxn=`%f>>DTZ(x!^DRd`lEvs#<7@(1u30jl&Hc(KdwL|=hmV`jruZdp{R?H99N zMioW#ty?MY*_$&5?wunmFK;=(H_@V)&te{P)pT)=Ezkns%KyXsfqmJ~$oQ%Kq;D=5 z5w1ASHL&$^{;F|1zVB(hP_0u?Gu|Ln|8ln`6Z?@8ig-Ea*JMmP#td+5thjYzaWxtP zv(=BwA{~N{N51{A>D-zFnGaWmy%MZ;^X)WjD|%#JSyR6GOEK<Vv=ee3xtW~!qV3pK zXU>K19RlWa@R06@p%*PiH1C0M#F4P>Dz^bYt+gu(Q!NJjTwK1OYZK{fA3F8zL$}Hm zcQZ{lk398u@n+jVUG%ELz%KkD9U@>9)GNFD=!#9}hwqPkd^jSax3u)62W~U_Ww}+E z@OH#sw>StVQt-#5ydCKym@x$H{YcD%mqIq4ck5Qds&i?Lxn>bpHv1-?l?@8&A6@`E zXJ9he4Nxb-IK<)srwojqq-|PhCLAO{X>-l~ZQI4;F(t|?EOdV&-}Lr_QNZMV7%_@z zO@c)5@W5BB$F?cO#uSc(1y+d7P}_wb^y7k^CNfD%CqVlT>#Dm|CXL^4I#;95&h+kA ztkga@BsEm;IWd1FO%x7aGY9taXh0=@=hm%y5(1k}=r-{qQ}@J0Z?E>p_m8XGMoTIv z->C7ac%Ga;eM^$tMWk<xpidEpZCynp#wY~_h{;~(LYi~Ubl2OvzcZ@n9GIneF}^tI z;+76q`N<G>s{t^;HK*6_y6uo^JaDaWOYmGa*56L=I`81ZI({^G%$W3}M_=QGd(z^- z-o5ke&w`yJISDhgZ>mb1Gni<=oeKJgk#9MVE%fN%9cOZucs;QQORoF&?dbAGQd@c` z0k)y3$-K3=KY`)Cod%>tvClXcIhpR=zh!q)WIS>_V{!zC^>$y(v=>kC_isIM;>3!9 z2^MC;9=(6xDY%y11nrWX*|NnwqFifJ_MD1@JN>VpGI+T%p_}iSAGbz-92td?s`wGK z+-1k|?DX9&2Z;1Zn(`BUE?nQt9=Mk{Z_w|JdSm`<ro;Q|6nkI2CnL7#7<jnAZ8I$h z4Tho)yLbxUTlx9V(pN36$U_bkj;96K1*6jY?cosnci+YuCrh7R`FO-;TO2|985_(s zMJf$)2ClZ1is@*+1^1n1CL9U^3<}h>Q3>FLw>bue4IsEWi;){Ta&hII)0T2Ri{b;e zxkS)w^d5po0nrjP2sPr$Ou6peyQ6xCsO#GCI$XN7&)2D2EPHjUD>41#RM*LY>2UyU zlxlCMOrMSj?laBHuI<~s7nqUMI4g`+?mI&y?6>dmBW(N|nX~wLk4l<x?55O4j1Ug5 z;_xNp<cg2>uR3fQaXr(#CAauFe^FT&_2X8i>E}HwBUhC@J~@si9YzPz8-TkNaUx=P z=G>;en7<7r1h7&qbf0S(&kU;+t|^sqK4B1x!)m_&ijp_xAAxq|yfgy&(3gJ2-s8Sr zimFcAJTycsA=SIL5;@Eax24{j=O&t>gb|XlOP(zg>Z>AI6t>qlb5voXX&+90gP7Zt zO|DSeGXu+eh+*&ASB51BC>a1TjALkJO4G$8&65xrg^@i)BE1K0gczQwVnZ>dh*RHF zd`H<5vp~@#(TX&0&fr2qa{BYqu;iJmETb^QM?&Zg<B727R)uSv2~#Yl$L_s5UGP0P z=h0K7YZoFLy`qK3y=mh{Ci(Ed{DuJ%aDIkiU|4twa3*##L?ui!cpS;b3ulI}vQ`d^ zHK`&H2y%%mO{Y~%Ki#%HSKL~jWPQLV&S;%i^!d+5VHcBpPK<ZP$CIg?{*N_FuB8~P zO;;LPlI8D@YE%D+Fv-O%B<=Lv^JcGcaZyAVesWP+32jV4g)66C&7Rm0Sn2g^z1xbl z4HOxK4l7{xvKGqrd#iO6i7Kc0<?N=>@+c5s4Em_s=!Gc`6%%XUF4l`$tDNI>tUSv) zEbG*^`YB}&8pu^!?2yuwoLjy(JiM~9(mdqklMyeoWsOuqS*>{J)^pa!nXD7XM>{FL zdWJUJQ4g8_IG0yf5r=?K{A9;452vNmZ_XXgAHev6vh0!L@NeU-=g!6U=pt&Hn3x#B zR6I;7E3Law>+7}Crn_2uXM)The+X9SD1{}$gE#J<g22U1o4dT}yePT2^un5@SVqvR z!&@ci9V#2%@!<HjF$=qQoWXcf-Pm+7u|+#zlvZTg%Wkf0`10iojN05D1NO{V^u1e; zPkd`{yai^}E!Gs%8>;-g-WN3yB>}3r;_A+A3#I8(G?zknA(MCU=phzxb58OxwVl1f zQqMIjw7t8Lsg<j%hKZf)E@fohL!!fVb&3kao=Gli!dzT0t~s{S>38Q-$f1?cc{3R| z3JFOmOHNxP`KtjAc>8A09pB|$f49exokCTXN3wetWq7Wkv^yxjYt(OCLbF}JJ>sQa zcE8)_yONltX;+ka&irG%yP$-3?5MOZQS!H$n&znA9~l$zXR}rKXS3z#@cUErM*Z1@ zNA~{Rgx|gWr>UsJpUu|qU!hl%${aKJ?df5dQ;p=T0FtV5;ILj@Zq|cET+<{z@13Cn zu{vvKkARLsgD$2y3Wugrr1K5UHFr3-q?P5Vi$fB%Gc>>I?6oL9dHWnp=K?ZOwEd5O z&Fxa0Kw{p$5jH1eB4)4%%l$hKfX%`VTKFqw+k^0=2t^gmzQW(L#A{F6y8*A>2_HBJ zb#w57VSb#$wQ7Jw&=RD&&|Ils&}#1LGdhV&Mq8S=cS-x0>|c+vFt6_YV~V5Yk*6%4 zP%6_TN%*rNe=>JW?z}Fm(_c@lPdlMMz1#gsXc*J_98N<MSb4LZ-lmN!t;HOB;v@sB zdr-bZLML=C1k$llg<(=x1!-ExjuQTNFuivglY8^#ch1p+T`bzxJ)mR9>HK6FB{S}a zSZjR#pr`k9>&~6U@9U^*cb<$ral#1>lLT}+OtSBo5BTI#&zn;`9+d7c*0tNNOtHI5 zgp!<v$e~y13x+wQK7Cpi&?qhY>v%+=IwpCbWk#rjw=gHinHBXK&d#KF!aSQ(vi7kA z=bsbP6lpcK)$4-lQk%nVsEZN7nWa3Q{OSHRA8ceWb8e<@qbF@<rsn&*d*zg=E7C4~ z(^N4KPC7v22??}j{y{NKIpG%-WUqNn{{(uC?P5yt3a{vO9#dkDWMHbpL0H~l`rD7H zwmzUh#rGY_K%2WWScNeI_}nL;jzk*GK07&j$3u(feOmaZ-b3-rB*Y2g*MnNwH5r^0 z;MYhI$a^c9*x1wrT+%!Lh+O{S1zs*L>MOq1$E%JT=LK8|ja<~NeL(ySStah`M6r!7 z2ZB|E62ryQCXL%S*~>`PnUYkv>QQg2s>V^7MJoD!{qe*4w9TZ7kU8Bd=9HQgEFLpx zZQPT;v;eoq76&)cvk*R2o=+(Iut3bwHA!-Jq(#$xyG}Y{F@9;A<p)34>Z)g?1bf0O z!}FD}j-hsbg{$Ywu3|AAASMF#Z&D&;PqVYP|HwcNGhLYbDcS63C$>oG$+<Rn+t%T4 z!!#iAn9i+daE@8&ETF_fd6wb11pwVokU?>19>-M@{!#@%%v;#R!?An5#l}G?c}M^e zANFNOJN9H^^q@Q{i(mgqc=$hTaE6@zS205GfpC-%t<JLP;E^!~n`+|*+<jk{lJU)u zcxI}~`7gO>LIS^GG0TmF+dm~Ka86CZn4eU#ly-|}?iVOz_@XllPRviHLP2L|TKNQN z%1teV7)64IfS4ILWcTMlFvuvOwfVW4A3qd1hJg;#Gg^^xYyBfyoU$b-M0d##&8Tz8 z-q->5k}$M>!7701!&+;WFkCEDJZvAY_3Jq^HAQ+oHM-dNwy|o%H$Y4Ak7JOj0AVt1 zf0k2OAi9t-j2g9;NlIk23o|^=WM#E-10sEZ^NyR2Ff`gN`4ZeQ%N3WLbUIg32&SNK z2y;&{*+8ClvmT3|YP6QTLuq{!n~ZBo2j>vKu+W$)9#Qy~AGvt>GWil^2B+us4<sXs z^l1;S%ldzRy6pQ}<v=1W$BPW<6^!sqIDJK{3kbJfO@}HYBU~0m`YY13;V(|kM^Y|c z!J5#*rltR~R${`C?Se&o#WfbGxW6&ICh3wyG&aJR)wFZ_cA&3D;xQehFH^#SbLjLL z6>WmnSjtH(45wCjO&mSCr}Dmo2L+8WXin3`T5n&(>{PYLQ_zIwtg-kxg2S7{hD%j^ z5Yw9=7&_v!!k8+D-j2l%aVWD&7rD#+%d$9|V$K{<!P#zEKN-kom{nSzBta6rW)Me~ z=b)L@Bx@da10|%iK8&$nS&+;`+5mJPWm9vJ%Yra<tK_m@dric`B7S+`U0f)B)^}n3 z=@oRWG7A1y9-<3FfRW9V`WYgBc}pB_MxU7StI=FMk)xS}HnXB)fDa`w=x(LfYQ&nt z3<BUD_KMPfb()5=XNPRvDgy6hWe;35tI>p06`Sumr{RmJLCOP%@Ob~It8(o8<br~N zRWDZv=Suv%Wk@v-$^`2)LnX;UBRHpf&z@;O0*gBroF$7aM$5rk=_sXOff~5s$?VZ< z8PAzxTCh-xJJ8&?-{m99h9Xc5e9;ccZym)L{=^^8*8&Fkyp32E7z#oB^2++LYHG9V z1>S}K)IA$b{-b9W1kA3sXs*NZc(lwknyH38ZYL4MV9{_6>S2IFc4^6gVLhhW?g(0{ z+pSVUT>RGU+vkdJ*Z5e5^XUPPj(W9L|0FSUR^9G{2c6C=pao35z9tgOPPTC-D+B)Z z+8^`x8QKHPfb(&N=T7p`5Aa3WUs}y!`nS-kOLpX>HFa5D(;HVtVA7L#D16ro#DTqf z_S`8u@|vUOrzdAP8`0>($~*_)G<FmSrl8_pD4cJGhXhazyO{a-C9*fa&*{DWD9#kf z$ft;=FvK!RWcD_aVw}|c();~M!A6T?g$VPwO*-8O5~eg8mY<q#4ba<3QWlqlI&w~R zUE`yJmz4s^?epi(9Z6@mS}KE+Xl2W3PQY<F=u2??<w7lOY?SmJNgS$S)k62<SAWDX zj-fQCuxE62XXzX$U440=B<9O>lLG#z`e24iDD3y*laF{Ec+{|a>X@&@;|NX-Ckx>W zXu5$VQT2FTG?7VRxexEzW2+mE_JuV8j5vWI?@$#2PhZdFyb#ClE_)};KO7qBiauI- z`k9`ta_8BqbaZbjD_5pHQ_UXxG*fKOXSr_dKfRMno9;TzQea3<m~UWmyU)&PIP~kt zv4F+2X3m>!O?4vdbm}WI=$G-%8WBkmp4{cmo-$&y;vc_<PfI<<H&;4VR}}~&XRw=n zW*ywU`)*9O*j+blx#-cy>A(fK?23=h^z`;FiX5H1dAc<{?_I|YZC+V;Unza6%u0Ho zStpp6E`{?<aCn?~HLw3&Z}ITAfBvk)+Hwwr6sj0({{)#l$E1Z9jJ#RY?HA27>#oy% znKqL|lsrPW&G|-jaj_=LD;_rrw-Phj@l;a_jWD|O!2<@^b4me{XRCT%y4X2|!qL9c z1i7UwBIe!!025kzZW4aXab)DW#(o%mEX?xrUA_8LYCE2=nBG#y&Q-xzIRZzxZhra5 za|eGj5hvUKW+MKxIF5+_c3&*I^5lHsIKc(Ot|`*4LrERGhmb)>M_Vki{f?10ab^lt zVRR>V&G<Vt<E3WDbQC)`X669jGmB2L9FWzydMJr$E>|&N>gTdrR`Xd9)(B($?vq9B z?bO8r=Err86Q-}n-_g+#iAA2{q+a2eW&$9B)Rf14C2^{{p)UFRTN5psI7&}Q?1cf$ z2XG<?uo8WJeDR9WeP%L+lxNp{mdZFTP0Uf{_cauCYZLHRnLWln78KSv)lgy#8L|P6 z?CvwoBYUR{-{EkK+Kg6y*Up`FH8owNq|S$3U#LPqbkFp@OntGq-bwoUbv$Zb6@%T1 zW1J40l+)ncz?H)2RbiNm<XiM_Q^hBB<aj}|NJE&^giXA;7IMz+Y#Oj%RY|E+Z^@gU z0H^hBHrooF$T?FQmAkj`fVu#^Wmu*IK7VhzV#V9Hs0qW44h~i6yfJ2ZAK`<7+Y29* z7tp31*s(t(a#IS7=Na%WhODCP7w)(3y;<5y?QZ=fhIl6n1=m|U;(f7C@JOyB9n3&A z42hfVfoWYRtNP5F=jHTbDaT~x$X336`@On&B`su#wXL!7?a%>6E37_Vk8kGM(cR#T zp`aUkQ^n1nkl}h!m_JHC@9?O}wPW3>3l|mu3AkY#-B#*sJ8oyVitpUyVsU1Q;^rrt zshSloV`Ap2tS}rhGTB|ro&t^<f|(pokOeAKn;ncqIY!wtq(s0SEtNKKMTueE3yyAa znmbo|k_allhhcTb!AZx^%gHEQL$RTRLku4@$oI(dMI*vlnYJ>ECo{ajDSb{Q=^vNQ zfA5k{M4Hg>W-n$2qeG7GF?;D7NG>LX>EOEX<xEjQZ_Pf`6YKvN&B_nhpHva6cCFO3 zezI1=ocZ$y`t<z`b!`dqzT!s+(H9N^Ljr+i#FQyFP<nnyo+|E3vn9K<tYk%7kp!Cb zH?CeYUsFSGz|+BE1oMnNb_H2v`ivVm5XYcSojL))_EO$=_;AQb;gA#zl7*Aqo{c!F z?PmQ7@9xWYa%{&=+RNIeHr#z#=tUh97u|}xEP4Hxy}#h=wNVLPX~p7ARw*I7c75Vl z5#|>K5gEa{X@#_Y`$@Z1miv!N`ngYBc~iFDgWCR4rHD7_C8_m}%ug2lcsSlqc~S&N zE`a}NXlMX-iV#AGM8D40dB$-kj}TTq^EmC@?Xp_TU|?;t2Q%-+J~`X#7Ha?D3%VFU z^Ix0UtA|;x!m84Yh{^^KB;~St+8p`$VEqDY@JKxX5d$U8^f63IcYw5@&Rn{Kowq|| zXl#r_&%v?I3jbeYZvj>1*0u|?6%{0;OC%R1t)kMhq(!==J4Hac+_30wq*GEtLK+1L z7v0hVQX-)UNdNcR@B97l|DEqYXB@^J+cCuTtS9C(=RL3c3M4x_`+CD#CImS4dhN6X z6CFd9M6+Z!*3rm|tqeL40|OpfInTZod>WdISC|Rx)m3cq>>aSlfKsLC^T#+E0LFmu z{0k$&mQkesUy$*C;-~;PZKi{*pA2|P@Hr9;N{?#_%-z7nr3P&`2mxXBrpdL&%!GBi zzZ|TB#UIfhltQb-QzUm6t_X9#U|OmxH3{tdV0CZ$&G6=adu#;2@X&X|v^(LKVErMh zpa7vj7`@YdyUM41@8J3Qm^F>pFcm#Jgd%(flBl3E<fHn^Zv|hKUT#k31AcKhj5FpX z?FBap@$6x-2R5udJ^kL76HGG5@%K_#v<zCkb=aX}`)>%@8mgbQot<c+rH4EapAm3F zOjb_L<NRn1#JrR=G^v@H<*LPY*Nn)nOFf-_`zEn_<NOJ4%NV@)Ks-ibV%oAftX^+~ zLnr?IdyI=HSeKljIV&)J<Hmvap&)_T(F;5f0PWa^fdJ*XaG3`PZ^@)qzI{`te+AnH zXitg&ng!$kItx>*6>RFE1Be0W0i|gK8Zh*-Fxi<nIRG`m3j=+^OxSjUoC=uTm~A}{ z6A#ZeYz|;ci?IZQIzTf%N^4X;qX}vQ3<C<}3g8vq-`WWx8;sr2fu1nt=@8fS{SIUZ z0U{b5%nDFJL17HDu)B6n<o_%uZcX$#rjOgaU95Ty`xmGVMh_g}G9X)h1n^b>I59gX zm@}VZ$hKo`;0fV%2<CWTaRsh=7m!i{LO`fi-s`>v>;;en*jQ~YwD}R7oL6dopFM-@ zCQo;F*#gzzerRobLYWJ+dI5Zl50$%jeduhCG8oOSu1-k$7xO}1$!FlIfm77xk4JR9 z@C2bGu@}bEl!6@vhF&xvymQY<{R3mfPk8ev=;$!IRVu0?%~GADz+}bCL(|Y0z~rgJ z{shL?KvY3aO<x}GQ%Pv*C}xUqh_Dy<LVB#b;5%qd9ozSqRGotJ3AAS%|JXxm3<y88 zlfJ)K!Q4Yn?xO+bLTLOz#)&*U`=*y0aj^Z2763C9C?}ifIA5-V`;OO2qLwElA0E*a zp+T&>ytMQcW7>s9LyZ9xS6;=-06@wX4SxeUN(}#noYlnqW`V7fX*#f`07`<ErJ!(n zaEV8He}POS2jppjE!;p<``-|24k*bxF6b?2pE$sJ%iUZsdl1|q|5cn2lB6b)Bb1BZ zRsOwlBvyBL6s30Sn4|x*N*MiXl^~$qVFo#(Q3SLVo?j$>H2OeQ2-&v2>XAE<59Zea zyak9XaMEVtsk2Tn&{jCC7~SZK$8A#ItT;93zI~2<&^{(IU@@ErMK*$!b$Wht%qBzB z%M~`<FjS+}<f{KfU&eYwI_wnHiu25SF&b>xBYpz9#60U=1uqDclu#go8#x!aP^YZG z2nQA%L<c>5=ngF!<RZMq(8Yok0s8YVlyl@mr|h;TE3&{$O_B-JtZ7?|$G}Dar6N}^ zwBn)jjJx*mM_LgH8*&|^6?R8{^hMiz3ASITsZ_v(d%)wm0cOX)ejFGI>ODO08Qa{4 zQy`nqQ)dBxJU)~%s0R4DvV0D7o-R3lS^xhmR;Z3q9*t>oLYygsEe!V*`Zxcmf*|k~ zK@ooW(j|bbmMin0mr8;o0d)CcDDZc|CbPC<q7)#nZgBB%IQaszI`qoNzhj=#TRl9% z<95D?-Iw(kgq<PeA3Rj-<VQ6m(SU~k2h8K(!3~wW1@y&XNS#FcoiYO_5NcPLiVT3< zFD=~#7!K_Hfux}cIycj9LfB5it_9p$pxW2s2n`8Y2iO#Fu`!!{0LcOA@LC(VRXrtQ zHIxlgN||;Q6W}A@b%Vng|JiIo612~^yF-bXaQqQ+C(oXh{$7XX?~Tn9C=5%mIS|+y zsf0K<k1%PoTeXu0n^V<=KB9FMw9@mKlsz#`(#O!?fBzojvQA)v-@yliV7z;|av1Kr z49p8q_rb`3J=AMJ<d{$9Yi+eo%7L5*8D33*VgZuV3X_+Xp^v%Y65p%TG7=~*VTywN zoaguALTDKP(~jvMUwJs=YUt0Rlwrbgbv?l2ZB||pH;DIy7j%Cq4P&b`Vaf-O0VfAu zqhBHw7{mh()(-Kgo=|)JyMb<h{I3SO3v7H~ANuX#faY^U6R;+KfdMv#V4j2q+mEd+ z`#Y~u6`+vC7^75%3LUZw3*TgX32XAR&zRo$rAxF|H!7`-UjraFrDd?f8C)&=!&E}z zFC_fK8L_J^2GK;AjUd6Y<HLTqx|QW+wSr-E?9BVL%*-gF+uYpbVo^}6L-P$lL`OHb z$<2KvW4Gf0OLVn-48jAPD}rmEKa;N$2Xz=<S9?1s1bpr6%Fe_Ko)aM}S`MaD1#Ds0 zy0^FIB9zflONlk~4wfC5`1u3{r>6eCmz{LV91XBXj2;hV)C-(I*b%VCbAY;uo4fy@ z><lg)NTpztWzgm;3gtZvW$-@3VLTy;T3#K<*j!tqq^0E&;W8{7H3ufRq$E!N)I+;m z#zt#;Gl8eQE5CxrO;6B^KL}5>pW-KuBj|!hA?-(Nbe(yo7TV*`!!**-{1d`o$6LI2 zTjd&nY|wf?fo>Nu62l4<_w}Cp4rPgEX<)iYiNT86-S!2LoZr4(@~e7RC&|Up5f1X- z+Sd<(p?RAH1jqla8;)wJP%Jd1dLy4lm{#OWiPEo!aIQq4L*!t_pBC<j@hGHG2iXgz zV~l4Gd}^wq8F_fhkFS@0T7HoV+}W^_=j62xTJ^q37bnYU9+?$RLS3!-1Er{4<j(Cx zEz)WuSTdndfu_q~Z|_Zzw=oyO22xq)iP*7f<bT@PwQrT#A4cKf;vT``3}`Q;V;=zt zV=5WU?Vv3TU>~+AtgXsv(7l8{{nOMU=MTUxy!RA#BlDVIH7n@n=ZA{%iHV-7>6p58 zFx(|}H7u8}3pn9H;q8m}fPM{#RGsyY(Mu<;5Oa>~as62aeQKOqNK1w8cKZTS^ne9= z^0(pLa|woF<qS6*Wa)lj%0d$Q%{U%*u`h}=Xnm?c>{Jg|zSu?dU)^X0R_MaeKr-e> zqj~@*!+Bd%Vq%mF04RnYwGq@d_#I#9a_&RF5FiEkGBzQhV>q-p)R5}x2_393V4ktW z!7PWFBcQGZ-p)8S*Z-z-EseQK!nE=uubf*0=Kumu9}eFS_rWKVx`K^uH(e9T0D}ko zB1@vzjQL^9cmidGC(Pp*;}uY{Kn;a<o_fCtKU-UvEG=mK0q$aq@wbD5s$2ZL3KWxo zGaX^VbD&niWCPkys~3C&f6ua++bV)|!Ec52dZ6+MxJoeH;^mfz4Y>EC$cNBKM$;^f z%wZtJye+hR<{Cst0dDP)IfzEnz?K!0FJAyv4a`|$FTOs4dGni7gK9Cxlo3W9FFzGN zQ1QVM4xT#@f@E&+6rTP6w0CEXNe^-`X4(HlhRe9hgQI(@04D>(t2Y~9Pyjs&yp;n9 zA-hKOoni||Q7)$wvFUOt7pe{@fxrh80%~AO`Oi`XbSUT@qig_J(q9?T58eVEr#L&i zY>qO7%zD8_6K=>?4>4xuW!N+&^{zmTbc3@PZh`rgYKOV=5q)DcJTquOru47MoNw9^ zek^DLaL;jrr`fUb+~vm?N0=ia!`i?4vh}04Ine~%Vq)_kynqhezBXI4BMsIo-R_%( z&o(~idA<kBdMN2Q$ie^*f=UeRr9Vv(kGD+>bxW)1>K+3J1gJm{0i(dON@DOSrU&xj z(La<aK(K|~ce7vMTH=k;9DlKbI}Vqb<@uchy2sGL03Fu8Dd5cmggGB;gT(HqLWT6v zwg4)V0o{$rQA{yq)%t(cm((TmXV|?wfT3N}$g9a28mZwuYRP5~%VmE?vit)q0<$Gx z>-Z>~DN!CW+jhGgEW6<Z2nvct>Y@;G*mC$-(cp-z!INCgg-4AKeHmNi1_p!$gcl}h zfaNuSE)9zv3?K;bqo=30l)3gO-Wh}DzJCs!Z1^F<mQYDhzYVN#u)v3{K0pd@tQX1R zs+mDuc{~Yd$xIg|BO*~A)W)zEnzDNiD;M-JGJw?k6iB^`4;85xs7%8^!5yo|qg6T% z!x*p$S;O>OtN;s#yorNwPDryMMl!|r00?Kq2knpw2wj97BNtcS)bL+J-{5Hj%f<MW zQAFTnKCWJQ1WB<vhSryD4%ZVdi-1DFTnD5(RoXC7EP{FZ$_hCZ)%uThXk0<jVR!kH zYvDa9mEV^Ua_z5~u^v4chtoFheL{r&bd<LHrwFf}FFP&1o9j!gdxB04dR!DUS3_co zae|GpF=;Tmm2i#>D84QX?)7<31R3(iIxLqe$XI7$DhJMv4}bZ^D-0djiXc__*u?bY z7VeE3SH2n>y@Jo)t$&BvEMWcb8`7_*^&5eUHn=w-|1fI#q2iwsUuH<z_%GOP(xLx; zyFhfi{u?uv7lH`){4QENLV<QHM;vJatBiE9Z?>H}Gr`lI>07wvM^2RI&Ok`4c%WBr z;JWfgv+x1#1#<D?xc=;qaHO;vY_gMkf!}yGVHd#vhT}&mYe2Jhs3cdcEV#Y(zT55L zRc?`{`_JJ6Q`=)I$Sv*ZZ8jb2*lJ}BA4c7!i9B+<cQN-m*=<sfKK225If<HG{rI3- zF?9FjVFEU$l6J?vk9DBCt6d~WC6K-Uig97+d!;BNSoUdmOmkB_kqX=vpDBOe?3X#O zV9;d$i;R4lu8BwF5|yv~rQrYdW5u1dyqcx^?U4C%JUE(Cu%T7XghF+vT=$?qO~59s z{ZXat%xCk6^RLIP#AB{rs^P-XWty9bY15t|RmEuTdjQNAmX#?Kj_PnFvAPS9-XrGr z<r<@npc$h15aU2wJDoYk<HJ$GC+h0{RI6bCq_1VeR=+)4I!%bnKRdZ9XLH#6G|gEx z8hbT?7395KG=7jzv4Pj^NKslV#$=Zp!K&ur(V$oeh7h~LB<gvc(SfM}DwlOHQ~ip} z)0~N)F5qn!-R4dNra5rm3a;KX+2#8mC$L@I#O*cn$uS+$=}-BXu;|{H|NAhwaF}d3 zjBY;f+r>ii3oQRcauGdSDm;N}c~@)P`M%wJ+W($ycOb9rgC^ChX@8Z=SVg>WP5<FG zB)1i(AOD4Ab4eQ7vaMs@UYFp#fuH~IAjXz5WL%a@j93ZqBynzu=(}&rPj#?*)m11x zGt@y(wckyq7m9p5+Fd7uvnA%qDNLWaj-OhD8*nD7&V>wF^T>PM<e}xaZm074z;Pi< zH9m3SF-tDT(za;cFt(e(<smA&<vE*`m(rVWn}SA@pEyw7q*d(LYffC=vF^9zNiHyK z(b_{Bn~uB!7O1mD%NtuZsjPu=9LDhT=ifv1LPx^$Q*Nv2a=&q%H`^H~XH(3)-SC>% zZNE@bHG<yJETlTs<?#9825l%nO1so~1MMN?(dl@vx+v#0iN7&d=-nxa?rzFDPtrmU zx#(I8mg*Q9y!2ZUe>rXU=pN_eB6O*aM|IB9+0Tq=cMi)lOC?QQ-nbHYb%%x;Yu#{v z$7%9-c({KUyf)xlwO=E<DpjRgEiogQZ9juGi5?Z1nY3Jv_Vae*Gvsn(<LG++kQo)z znZHAVAhgaa*Lw)x9bqoMnlxh4AS@S7JD^RFxz-otWc;Az@KD{pST1)LA=`*HOCJ|; zL#AXEdUwePk2-90URMe;ww=*Dv+4OASpB`$?d0VagZGbdfgate!P}ZKWZb`BuL%y= ztd?0+SGAjrFr#W%Jf`DBG~aY#f8L{gr{5gF&ng?iH|Q+V%@`pUwg~@DqRDqgV!);` z&Uw_vwN^E^tv`^6Rn9*j*Z<|V>eaWjgU&cPk)aD&3cUxv!cU|-|BDOo(#zwt=YFff zDBHp5WUe9ky(c4FgU;#W?K)3Ix{Vcx5K=MsSY=V}QPobGcO7bfiLf;b8&KV9M>_~? zRy#k}^)L)u^B8E?=@+q-!eLY}iXb5G)C|XEe7U3O>cJn$|3*^PKO2?9rVxr7#=xNv z(>z4vci~3fg)K3HE%))uU)hBB?WR4K6q2H&7h=}um84LSv}5`T&bYRO9J2v^SKp4C zNaEPfHlO{;qD0)8+D++6De4Jj&N@9<Bel>~kkx26s%W?2chV$9T0LH>BQ30kt-2xI zh22fVimCXMrztI=`I1~KLHtV(IW773(!s_DSM^JZk%GvVft29@<0!tal$sQRQ1LV4 zu|)7J8*cabm7ds*Z7JZKe&uI#<wb4k@APqha5Sk`)-`&BQ|0s^j)XD7qcpHumuQK& z3tNs9yOa66!k(BUHybCed?8DTAf;8Cn^n;C`!ol16u&JrkKaesTe2Nid+3HG5@UDj z^qY+E6(u(nhBde}$#NGGArGsmA9vPNWl+ama0}$wUIPYux=ZcudsD4bAN^~G*GYyy zg+`<m@{$ji(HfV<JTWJstY*nt=2DZnqJlD4Qq^4}Y^5s?+k6o2C+K~J|8}gTMsPaW zt78|&!mpoLxCidf*4O?_8=SYlx!#fORN9G>lSdI;ZfwGKZ?s0cB$t!Z$@QA&mq%!S z-fK?h7nvKKQ|p{>)R&J#wN=dQbXR2d4l|<2oQl;E51u_|BGKt@45^D#{7arV@cBH4 z@XO=lEt1iMwZ{5VbDW&yZplPzZUpm@`zW<;nUUOHHqIaeeW0dgbNaIbnN@xNq*lQ< zq))X;{EnB4ce5XfPtxDe>)~Y7eqDOD!-w^O*<7#L^-mwS2hUk=)ve2o7e9YqyP%~V zUtU{K%3qu7!sa;bYmLe9J6#fu#m;JL=48DchmaFAop?<kGAKAdDqhdbw%lIJY<(qe zvp)M<@c4yqo_>h9eT(IN8|u)wwKB4b$c<IHb>>MMf@J3>Q5Iw)CIWKdWL%VI3Df#= z3(fjSk}nJ0`;&RegDY0JadEw$p36_$Nu@9dmUh~4?F=g(OU7_=GU0{YlNtCXezz#E zG#s=Z==zTZhxiC){kp|^?QNcTJ|(w9oZoRaHOIXVw%=rOW^1z`*ZcW%@H-vmU49jp z|1IIW-9%{E&s)F|n@@K)B}m@TJ+nIX_gRytX~Yc#eSh-{kAdHl*ABkFSW->ZUhQK1 zwuAQLD~K-bU5KjunVz^-#v1U(@csQe95-)G8L&s+3RyC_erejB7+V@Al7{U3=k%Oc z^g><A%gfBd4JBj?JHlFeWt*hi%<&<)UbWR4RHK~kzq}UEqSK)(+m+;32RbXA8q!j7 zb?)9Km;c>(UDfzN<7c?xR;g-;y&9cpqTrf%TZo3e(AA<OMK4_*bIwU;R_@1!1|j^6 zWv4TTS)<=0otK&p2pvq*R>vLBvND>#6%SOYhEg$-9hp5u_Mjd2H0^HK)BoP^8Z6Z} zs|$_J>i6B*yX@0$YDS{6^Zc)}5D6TXTSC4Kvwb0nd@rzyF2_;Gjr;P<-;#?HOjO%F zS*#8?cDqSU>UcV8sJ(GkEuI2-qU4+!!B<Y0P}|mMcp~zK5%l|}X}LPZXr&E0JI0;l zb(fWhPBZ=uAN{i4`7jmEi|P00j;p_#FX*<%#EhoW&df<vRy-9mkJZ#(>gWF6UZ{RM zEme0E9Izr3AZK{za3#c7bb6ZgWKuhG**y+Hglx$QdxWDS_<UgG;);8ic-GCrlCg;@ zao)ZoGv4ST-?`wPe7me|iS~nUJ;i0V?+Fkc_k&@UPlYwLFcU1?Q%~1AIUAhc<ej$& z`Tg!E4xf7D^y!(YSAC=Gpryh5JD+HU+ZiIp`O)v$NXkv`+;soMj2f`i({42JnTdJD zvUkqQ{^8`y=jzhdBgUG?L$ezd3Us3vCoNe<{zOhHr8*9^%1E&^7ygrlthWzRexl9q z3ZZH|O7fNlZQoN@T_Oy)ytV{Es`+bz&Oh!h;^dTtYdxii@YwU>b#;lYzR-WaKU5X} zyu5rz$*(|ZkS+6jiub*<U+Gsyzo{O))LpHkKjcgZ)9Mo6+*&annY+8uE2oPnJEe%{ z;Tmdlb5HZ4*;-mDMb`%P6gGB8)A_&cqQ=v@aGSa~I&vS-|D&R*$jIru+}GGS8dQ=n z!rOLyf8RZITI&2f!f*fkM7dVCIBNMbLgMrtFUN)AMr4{BzovNZ6RcOkA5s`Ni2G%& ztI`>Ymp9&D-QSrID9ey|rZ7_WBD5piG>9;=JVy4@TnF;r%JgA!nRLG7LuNIf6<UYd zR04{4SJ?#|l=5nzU3}uFlu9b}>X~z;Jmb+$Be%@?!%|I-`K<H7p6xAW;Y@FP6O;mz zkn?uCoA3d<zMcWK_{dD}ToLD8t0$<-EdWtgwc8mry1dw#%-a%udK7$dB(G-tW4zk- zbp7LAlD+q4R-Sju+(O!g@p0$Pvi5kyP~7|ACU(Sy{^8uBX`%i&&yG^oNRy0}SvT{E z8ZS;^j$GWAy_rRS<WmC)4&-;4H|Dh?${To=0^xE#hn00#1NisHSn{suqg&^5^o=BC z-a8*1W?tVTc)ncnb|~7*oRGrnozvlb>=m*3%oK*90K6+i$ZAS&-|C1yj^;XusU9jj z%CZ(ro?YT}E@alKjr%B+@fRbED_GS<S62I9hhM)J(KmkaWutfSMmWAro>*$Ey#O`4 z^wO>!6IP^Y`}(>uzo(z!4fwCR^ViQ*dYy)6ldk2hndqj@f^wdvddq9X*agE@u{W;o ztZV7M`MIZQi>{5Im(3>s3!y(!YFYk1`5JHuELQ{-wT}b`zUPoIqU3wgt~;WyIt|!( zZCdA?6)nlABU!7b!idmKZyQvQ;r+QiAyMb8bZ$FI?)43yB5C{fPNBJT>fO@lx=SHF z6n^2oX4b_`SwVQm<z{jCO^J^=lvs3^yQoMJ+^t$Uk8v7GG$`UTt5Z<C!Y+0*pYJmw zp-rOD<XFXeQk>i^Dr}-HrTog_CcRsA=eyt4Pe}?W<-&!o$xXXA&2#fOs&Pt3(}D{` z;qad$&!-uDpSqvu8yFCan^Q0z#MQg+Z)<$rT8ScB@+h^>;?%=hdy`FsEGRfUV9Q#f znvADJx6Y&)7*{IRzQD+#!kwQ#OK3KG)W&w|GrL2P+*o4f$b8LMVRkg(<jB*7V1KT5 zr?S$;bLC<+t3my?8(v(ocjxsf=FxY$)<wTNO-2qke@GF1v8(cK{YDUh8>kmX6y{lS z_W4QSWsv}4WZ~$Yry={lx7k(PRU_be^XoK_#Htr$>+wsxpj9H$E_v}dpSN>1`t{fT zbg735dk^qAlkd)7k0#1XMB;FmsfMd`J6e3&d$D`vA#OC$^(`VM@2?NHR~}H9QC8V3 z#1M&JLH6`(>__u6a}F{j%L!q7F`^U;&6#4;N)0U|aKkK!kq2q7oGI}DZ~T4O`>^4` z=18sDTKW0!6Aw|DaOz9M2xN$bxoV;U!f}J>M--8hvs&A(x7`YjnQG{+Ola4)rK$Px zio2Z7EY?X3ve;PeB2=bH1;oe|UG9?KvQvqr6ZAr{93}<&NC@QfY3C%(?B~5h+fr7b zBgk4R{CR}q_qhNGZTC}mb5H5=;k)Y`aVGvgAVhhfwf|*!P(5?Ld*&A7@3pCyq%vL} zwaLXZLrl1!0^V}MiWudYt#Q&bdbP0etzReESt+CKz!@!dxjlt}7)i#Q#4e>unH9xo zA5*y%c2lL{QiFm;Z!nr50ey(uV2i~a7h6;0q1R~3uYvFWjuR=%6HmBKYRnlO_T$%% z%Qa#LX`Dn`PAW~FxcZ?oy@%VX=1mI9_<;y2QjsO%c5IehDqOj_te~~Gg!G&WG54h8 ztfj-~?K}hr+Qq+*&tToF8N4{@fBn0+R9uHWHYDrT{TC~Bdx%axvcHLhQsRWfjRV!U zo>V(U@OA6dk{|OkAA=baxlpY3=a5AB0@j#0YUPMff7RZym8NrQ%HgWFev@p|E<U;X zdUiYfYT~7Q;dBa*uP2|~C6mUiy^Zdj(wZf#IB{!&{`mwHPLHy-aTvoaq!Q#28p4gF zH?fo{)5k{!3<HVK1D{!}Ck}qcqy?sKx=~jl6EnP9d}d4s#YxAjtNomGQ?-AFgbRqD zIL&Q1Cr|jcYBLc>ds^&vx?GbBlEN89!1op8^BfOOmW@T`QyI$~jeKD=l@WdWc1R@x z6<g0|vJ!A+I=*R#6UQ?`;^4E}f0MThRd?h22uJ;s!mq;}S*d(yHy3~5N8tJ+aN{hj zE-@y&TwnJuFbpH7BV(2jiN<X=VwJp8Te+Vtbw@Mb;*<Q$t?vDzoDs^Td!p3y12!wH z=eGBi!uVLZyTZtySk(O7+n66-p4b9s2e$_TgV1ztcT75&vKsfsW=370tx=t)3_f1# zPl)-tw0lq}Y7Z1qv^(9;O8%>g{=oMPtFe4nyC<&O#<UnoDc$*PmP<*<P*eMdKatG> zPyW~Pfk5(JZC(Xs?7GU^y>niysF>*FYnB4f-m+#kT_|InjA!O=I15gL4}5~k@xYd- zc*@VX(&+*Rt%|HTp6lWP?(=9Jh4gW!!gV@i5mW*uw^%5f)M`-Gy0V$3ouAHz|K{&P z1X&Vb?WVYYa;6wCsiAT)Q5F8RF^`io*G5Mnr$NR|Aq_Je3y%TJm%5zG{Gmj-vUdD8 zIp>^yX!}b1EH29p<h;+Dbus8@n%VGjdHZ9v8_e^@@b7FE%I#GIIV|<5r9bY`*3sa} z<Kr;WJ18yY;A)2d{HWyFisrzN;O{^W=yOK+*(U0lZI8@zF3xG`kC)8riwYW>`nxZ3 z+z9Lh`SVHL$M;XT<zw~w+>PQ8F&eqqlE?Dn#w4VYkL{FbzEf+)X0*u0DLiRQiM2&@ zy7gD=*6T6}dW*pO`_gQ^q0d%iPzL38eK$!fVeVzlz4Li_^^KC`<7+$dmj|S)?-W>` znCh&gxt#_PrS5;P{@Z4>s#>c|vpllmaOBEpKG)yw<<4F^yka3Y?;=FbRCxyX=9*l; zlWzA~?{%CicN00FVs;ThZQoap_=mSh4R&UDK5S(Y-V%4ayQ9g7>@m5o-5=D%0@tB@ z)2(H-E{o=t;A`tD-81hNG4~UCRoL-f$8)?e@ts}&sGt5$0a!m}n(?j8A$;>2qksRg zlTHXndal@PE1f9GB^V^EpT8AKA2%yvul*kG6<i!FdWJx*4>~8yh7~*A3KWeqF)u&& z(;KrtJHkO)&Cihf&-MlV$`v0lsMUSz+iHMksSp!}8}X--=<tGv_U6RA(w7vGTT{3< zw_pCMs=M)03I{jZsTj3ZHc`J`_hf-?zSt*w;!}QRgC}zZ7NeN}bzr1i6N6#EL3u^^ zeov@E>G=1x&6aO1erRnH)ALZGXx`OGU!GOmnNCrHlANek$$fljoPx|gRnHm?NYRwl zMW|&d4ARpFUp>Gztg|p28ID+Q&2aNO`MH&=YRLQkgp%{8NEde3p&!oD37t1W_V-r@ z6w%)t5rT{b9iI%-oE2hlVyQ?EZ%p8jw|7YYT}_PWm)AgSwRp}Hvk76p+?+L@>RV&$ zpQ?0yGBOs*zr1A9-Px(jr5VOVjN}N8Hf(U+`x<+f|BSiy^iVi)vr3!0{X_jlz*W<z zyN4TeV}&Q`E%UOYWKyy3@pjHroq`f;1!G;eKJOClSwPs`Ekfoom))AdwqxI}&E=&` zYNEqFtY^+LQCXxU-u~Hqv~RG#R&g8N+gm<aCSyc7?co_@H0YHP#<91Qv9|2unQb&b zAZq^<FgJbF*V`0#hg?kmmR=l_yYekoD2n6j|9H1-BCVb+lxO&B^<{~iZ}H+i*-gIb z+9qH=mSTA=%ER@m;pNlldwtHsXYG@|LTyey7S+Y7Z*ffh*SIL+TMY*@&phj@?UlC4 zDCi%$s%&k~RNFQkRU7*Gu?7=erx)1@cW`Yzs~9%Tx+!wd@UgCrkY3pS&aB@a7HdzC z@YXQHMtDMj=Sy59P6nEbsCUjfHi3a7Q_WJZ4T9;(oUF~F*~E1HiWKs0ja7tCOZooz z<`Jkj(x4`+izv{c?hFasy3>J{3+Qph#p^&T$V!eJk`hbj8V#LUo+wA4@^Os=jXqsR zqfPujA)s4ton&E-EjPZy{S0gDs&u<9dY36QY}tRc{Ezisq1v2YVy}hR#l%RK!z>rg z-I`}sO<1uZ0}V-TySrI!w13occl8<%K8QZ;{Q4L1y{8$1$r~#h6twGxn&r&0K_;Kt zrGqKt;uU9!)F#-3PmWGJz7qs7`{lpYuFjx5xjpOedh4^Zv*10mNA;3St?n$z#^eiI zz38Ue+vg2`DZRv@2whLNJ^I`|u=PaFkDrHzQ8Ju7Uk86f3@bX60Vis?hP=`C!Sl0B zZ|~l6b=B3)rSZ(fMjGYN7v6ykIH;ImD|C~`TJl1aZ_^2)^g0tq?3A{#+Xdi1A9ecM zS4eAQrNjA{;~Z-qF1B53J0F^xd%FMAYq`+p&*+39?`#h*?Spp?g$ELc*ZvGwpAcG} zyYD(R3=qu~-hHZKIbiPL)p+Gf9S8Sl4C1jWliiG0YJS^=qm*Q-r<()iP}dU&zI;0I z_fE^cQTxY7>)dXW@%%nQ@}F|?k{yf`yqng%&u{gAvGjDYp=Y;iii=7=TKP&XT}I^E zoggc(yMA^0Xen6#kqLBN+&g%a&wI*MXbY}Ta-yHhlVz$VX6@c)D(%c~(#qx@sMUQ+ z63E8v$bYk@@!h5P);@~M%$l+qzBRHYLrGMe^3<WKCBHgxG!n?ET+Eq5RhO0mh)UR7 ztVe9EViWRpstq~--3ly}eRE$UK{H{FNmh58?vwnuwEpWl#GuVcI5~VDZ$G+Zfn96% zkEpCB(SK)2dA<F+MK|&aDrPF1yGM*k)BW~r0JY}xTKKXnsY{y_rdK$flk44$Q7);- z#~!hjQ@N6=RkQjCjr||%o}4@A4Yh7g^pmW0s`~x33)zA=2~!K5m0MI*?{e=g<WItN zkOUTfRyI&cbtq$pOGR{6-f=5N2Pc;7L^s8GhgbPyid6c3v_j*ZjMXT)ibcUF6K&1! zx8q74mcl79vg>Yt=T-5X+_iRrri88X45J_0+MkwoPLV-Ugp?|ibeWO)bCLqMfsC@# zWgz-#HSj$Q`m7wq&x#Xf_K7Jpys2=9bMUZIxBoEf<HdtN>RtV6l-s)fo<2wVaU`GT zF0sffMc|rBS$q5>Xn7NpFGW)DpdZ~I<kYenrJ~iP!;R<+$-iAS%Y0|HZQb?!b9^`Y z$#d~xMx)+IdO4P**2iqGS?u*iW?o0?&b7>tF(($E@kx9aaC@1G46lO3vJi5Tg7=b( za>@}ZS|!|{?^=cPx0?h8YcGD(;XeL_%&Yrka-RrWE}Yz?;ikkL)-%!4DRxcwo-yBh zoE3|_xw`hSM1PAN>wJcA%%S4%ob{9ClTZclyHnPEKz@Wvs=7>_JE=j3>*`Dc%%JSj zNC30rp6E5p#j#TJOQ$eUhlW3pyF<n-jT4KouT91EZ^!0nZv8vI6Va($lM-8RqyTmD zpRCw~kTotuzbgJ|Hn!s95vIxe`W&eRQmP6uut4Z}TVaL-Zdi^KV9S!KwVmUJ?oz~Z z{AB%3>HAZK!csvuWUNwme_&y3-Rao{hPDlCq|5THs>W>qF$#+vDpNqH==NP5uwj%9 zGeNW~W6JPw?FL~>eqw|aziJ#s)tv{S;nCw|YaW>l)?pN+WF5{FRU>%J3e|V;51(A# zrAnZ)2NWOWzBp%$U}2)>mkUQx?hcnJY}53hXCIbQ{}f@B^*3Qpb<ql!5xaF<DfHyY zHl3*cZB5V66*_FW(K3bl3}u7{F&VSQ5fh4CSK&^X_BN}Er%s<|W;F@6)CiY^>L4M$ zPl+==l6UGp>x|pEZdqq$<~9r=*`;>$ERH`6eT5j<$Tj|%U7#K2>Xc<qC7-|FQ|S~w z^<j@zDx4!0n-P)J^sLWwz^02To{TeHyh=Ah#FCLCmit<f8$n|0P+2;~XB6834ht12 z88a(K?5;#lp=_%8ZT<3aVv1HK>x1*OTvSbv39YZ>`bU9=c7Z!&kHhnE7#D>s!;IwQ ze;Y~n=)W2zLU3!k8!62Ctue8(2eEKS*RL9~Q%=mEu;4I9^k3cD=<{}?jEyb~%PHP$ zc<*-R`OtBaqhOLWLR*gCB+SC&<%JW!<Op^rU-OILTj#bJ-60fm9J+c9>G@P)#CSUo zI#Y;(ZVc|#$OaMl|Gf0UltfM=LXzXu{-#M?lLJni2|`|%>;0S>lY&~w-R`y%H4n$~ zs$A6axvL5{t1PLET3N7c85yC)m*;DYvZ=(JR+>R{b_zphKBXk0Us7IZ_D($s+?Jo7 z(U%+jwm&-~eE7z@djD0po6MrB3GB%@Wo{f~BBa!qieKFA4-neXI+=7`l@OE*r7}?Q zu<hCtVTn_pw|#&D0GE%IHe;(@!*_f!*pB_@!j4qM_HqYXlOLV{ZP(SOSQ6^gw(U>G zIQ_cT9c($3RQtB`9<-et)weeH*zl7exZ{e{#q<&K6(=&J7p<-{$s%QMuO)YqYJ?e8 zVkz_TNtmejGb&uWOvLz!v}S@`fM1MOQ_Dw_npG0>P!eP<E-ulY%&3)&DaDNO%HY+V zJIQOg_L{NFh$w|3Y%Xw$!=q)FoZ660Eo+Yt2BPPG%_`~8xO<Jfa!9|5C2|$^rJQbs zRK<PVuiopzOI?#fBDZ<An27c24VI}tiJYADX(gMFk$;&tS)rx?4B%}VhNPwom!Q;G z<%s&DRstfBYNxU<a{q;3F>x>0qP3d4Z-8~`=XFRoI(BsN*J(ms;aWOU4zJp(k|8Pl z>y-w43T%87-|Fm(c9T2RJ*TGepU?RrTiWbUHrGz)9sUw6E6Ezq9hp`Cft!DI8Ffif z*$NN+_4rYM5O%?#*n)WG7kcsh+FMLDK5gd=g-U}S18X8|S%p~#>8iW9dxs8U{-0Di z*fJdhrwbQwa=ic2?$h%{;bDCxpPWqgA$ikzv34$w-b>rV<J*Z5z}hWx7t6}_#t3WZ z1AeVsDDWQdYLa{)?V-VPS8q;LYGyZF_X%*mZXe5x?ac4qe&PJlxrYV^OZKSyQ`*s| zCM84n*M@$&%X|<pTcu44QSg3Ymp+h-4_+B$v}NF9SfRh>uu951AOq$JcM8O_#6$Pr zD6pF9Xfnlq)s%eEvGcFvVZ-q{O5u3F%%!j?S+!Sb7fs9>?h<ij;)8=c_D4Ziyjx^k zs^=ManU5zPy?TTezdAp_W{|)ON&})lPd~c`{+>@?*3;v1yXr5kSTg<{_@seI5FAS~ z;a<Pqu7_X!YguoX_TAM>*HnF5&w`IWh5J2YqX@qu5uzUa+~Dq)IX4%pJ|XKGoif6- z{?!)`se%}J&If-kfw^Z$$L)7%pC+n|e&%~N=;jTBnho4lC5U##NM?7d|8-Qg4{uJJ zQ<uG$^pD#2npKN|N{`=BME>CU98Few`n|ON`)QFx$iamr@$i9XslaIg*2w1sM#fa| zzyXpKP+dp<j+ZZ}zd@|`Gwol8)WL#7dLs5h-BzG44+;?cj!G^_>=go%u7H4fmG%$U zrW+Y;8<*iSbdt!iC32MEw7^pXLw_R;?{uffE&ubB$DL5;^50xoYQ6@daYvHhj$V)= z;e#MEdaWRx=V)Vtwz>y#md6{ftFt=&&eNHhNJ7CG7C{2yN0C81h`G4b?O3zkA&LJ# z4)!VhSD-N!GNfZM+j7{I-rmf6t8dsb=Q5%}>2~6XL%J!&)x%Q`N|E5Qzh9B3aEMo| zKFo60YE}M?61+Ix4z?H-Z_5n`<e+L^deHDy(2M~49hSn8hd}btx3&ac#q*Z~d>8F{ zf7JfDg1<QV;0ip1v-*nv8LRH6yWGIx#@gj)H-tYvbpO9Y7~@IjjgQ7?K>zj24_b50 z9%={@{RSuVoXf9yfjbWxN;4`8Z*M&W2{nFDV3bwWBaD%K<rha<EsRYWUF*=_ToeYU zX3TIDE~t{lAYLIb%7pl1Ay^4~9RSsd7`SCN0;?iDHB~+to(g27to<rm^D?FaU;S@^ zlm;=qD>RW77@sk42HpZC#66m)U|RxSB;W18MG!)qu5>$s{1H4R-b9uQfhYq^B1Hx* zEi5!OG=?_?fa^yZDhcKWFK?~6&}y9xaq0k937-A+z}%uDD>E}xxwwc(Gf1%^j0gVT z0;06-fFqECf|k`Ia{)}P*4NqX(|v!ggXaQ}aY4ZB&j1Mv_=JQbF5vv9s7N@t2drH1 z-vcQpeurM0uRekVd{Il)OMsQ6l{WenBZx5Rye>fm5`>A-(fGtfmgHV%C#Rs`;JJwJ zFRSS`z!_amE>yk%0z4{;iuhhDWbO>Jz^(i`{cqn0QY0-Q<W7JZ0kV5gF_Q*fZ*y}^ zcm_RNDUq_kpaw>km!~JhC4vjyg8MQ7vggYepe_Tq58VAQb`YAS+`PPOsF!YTKy?K- zkNv|#2s;KZJP4(j)L@g&Q^^~Kgsf$-w*#-`<lYr9wMWH(BW92>_zPI0Km<{^wH@%e zua6cC4ymaju;R_fFLug0>PRfCYwU8866$pz*np@mR~Hvx%<+hboPw>(cEA+K2@EPO zfEKBpR3Hp~JAT%$1q20w4+LgQ7=<|)WJ4BDLSiB@Qh`-XU40CcD*2-ug!Ez{&-L~e zVMI|p0;VWj2jrEO-!J?K`ZSCz@8H0RmXes*5xg+K-3b`~5HT^+UnJD;nGcFWR#uDv zZ)<y7%xzmwK>`03h0?+LRm^yPu?E^%@WXlj-p$3ux^^18!9f^Kii9kTBOvwlujmXO zj?B(NyI^dLOuwO}MgMkUYQM!Xi94jNO@jao_q76egwx!-Nq#->qY(oN=x1=(rp)d% zd`Ff4@MeL`jKY&&oj!aZCTF&<C@)u(lgrtJgf@^e4;_FH$SR1C%7u;=gX!NSUx8TN zyXa(~SNcI7F-3S_xw3}FKKSO4AmKhI$ge=p!s-O5zlF)XAiWi}cdHd7Xe}-dt%EBb zW(pwsHSe_pGE8Em#jWuTHpdBOjBkEGKmgbgS(}0}s5TcJJ^i6s^z*Otn2WarlWB`; z(A_sdo(d4VpTCEAFJMg*-nii~Td%@Jaj|A8y3h-TBnqsfq)H+ZTC6DTw-aFZ1xrDY zar)#-@VM%;*n@M?2kRZMAc={o1S&MBeL#Gs2APlh$2!8m90k3MQ$u<kh@(K`RZmR> zubvTjV_7vZ;J{THQ)MVpQd48h;-)c_**o}<Q!8xCCY15qlMm#p@aOUTxD7_U><dx> zFz0MBxB!t1I4$zykIv0yq@=LpT+-hvF3c2iUX5@r1sPJ~LOLXh=i}XZ-Ph3fj;p0o zV6#Xu+J1r=6E_Y)b07`R_<L&W0Mf8Pq#V3GOpt(?hN2W$XTUKB{34z`n*qP7AFd}r zZzrdwejOkG*pLgRqhPP9DLe4LgK;zZK&RFF=-W5MTv8oGDICYFVd9S7Lrxa>I8IJt zd<)vnk4sAxu_Y>JwgxDQ)#WKIPOrY}w{YgE$L(qmbiN2K)=Bc&T}#k+xnnAjWNuj# z5fuea!!lA*AX?l25gdqdR838pMO}kC_)RAj2Zmj11*NXNnCP&ivY1eb3=dDE+X{I0 z+3ej$<UPK%S4|6fH|sH$H*~p`mAjBt2p0OFCxIV$U%(8U>-O!`lWMwc$aOde*D2a= zYe4@rg~h}SbaXbnYqz(y3h=;DCYS*STu>qBGhRsy6zylA9Re}XiqjEz%jvm5Fc}0E zz=srtG2y8C*##Z&lCO8Pwu&`=6-&8>89@XDz<doCD+8Z!5GRx>YE~G`!DnEuWu_{G zl-}SD$b3GYc;+Cw*LOEBFRz9{R$hK&b6+|ywj3k2(Ft&@ZD508989+X9A{wJIa5Ju zBt!)R!|z2QPeWTBHWn7h^t6*ALqf7|fCgC>0iSpFI{-sEjOE38s%w)EoCI7u7*1eP zCt>;rPgI5Ng(?*gL;$546kBk!F-kmC3|MRztLs8k(7k(OLqi|l*?D<2l`4YGEtriv zI#zu&`UAmq>F>9NXro}jz);6ftgqcDQNKOCEk?DL1HSwS7M5XOV8?@&8{##=!zWv_ z6vR2-N=U1xXelYRfG7+u4L+b9gmvTYwvQkfbay*~Ede+@l$Vx*T;(P37X^TR4o-@1 zHgWu66?(M2a56GEDU;_^dlc~%>~4S-Et8C4izg<o*r*p~ebR{r3x{&u+7i&)7LG#j zn^i3)RmiJe=7BQC61GE1MkYBaX=DY?8C+##e%V179V`)|I?iCs2YFjg4I=+CeEhAc zd`wdBcX9sbk9(rLhKkB!Ge<4N9+i&2;{quytQ=1sWDp^*Ub_Z4E#`N0bakh}L?C^E zPsr~al)$+PtYA%p5e8>$J@@yh^kzi;K0Kr(CwHWUw_8U;V?`_lv@5G?YkMLfWj_XA z1nQOWev6q}+ho;Zd;)_0-rmyU;>CwizE2>!nv<D1z<dhKfPsBnYdaZt4Na+)=B2IB zCsZ=3v{WYJ2}EtMS<hTc1}_53LAt!*KVM&XJZlXJ>CU2o+WSunxFFDq`!?t0ndV&n zIRK{hiiN#{gM~L1Jk~M>1_of^<F-@ZyLJe73G0tYc;~O*qe_$G;{=3+5K9ctGa)I7 z=cV!<&VmT6zPlcvv%}E3K>+~)$e^<Wq3*nvfroicK&ni=JB&swv8$9A{oDVka{A9N a_rwh(1BK#moBrcWASb0LS&lUF|9=2g9LCfD diff --git a/public/develop/images/flows/03_Register_of_AEF_GetAuth.png b/public/develop/images/flows/03_Register_of_AEF_GetAuth.png deleted file mode 100644 index f200f9fe444a9a06c8a6e59b31d241d1ea3fdb35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44751 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Ð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 Nls?gzP^{w+^?w!E=gj~B diff --git a/public/develop/images/flows/04_AEF_API_Provider_registration.png b/public/develop/images/flows/04_AEF_API_Provider_registration.png deleted file mode 100644 index 091f4901bb64c6755747758d6add38e5d4773561..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51100 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®7>aUpnqEStdFOp2R1LC#Xq+r$3u8-S@cWO-M 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 P5Ehb`R+g%eFb?`3eW&F` diff --git a/public/develop/images/flows/05_AEF_Publish.png b/public/develop/images/flows/05_AEF_Publish.png deleted file mode 100644 index 1bfb90e51198c72f338fcb65986d546d9e96ba03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43247 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 JDKv7q^xsmyM+^V} diff --git a/public/develop/images/flows/06_Invoker_Register_GetAuth.png b/public/develop/images/flows/06_Invoker_Register_GetAuth.png deleted file mode 100644 index f200f9fe444a9a06c8a6e59b31d241d1ea3fdb35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44751 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Ð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 Nls?gzP^{w+^?w!E=gj~B diff --git a/public/develop/images/flows/07_Invoker_Onboarding.png b/public/develop/images/flows/07_Invoker_Onboarding.png deleted file mode 100644 index 9cd4b2d9fc99daa0f285a0f9e5cf77d9c51ea17c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64059 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 diff --git a/public/develop/images/flows/08_Invoker_Discover_AEF.png b/public/develop/images/flows/08_Invoker_Discover_AEF.png deleted file mode 100644 index 20b2f04f94444833bbea04832620434593f89bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43087 zcmcHhbyQW~7r={d2|;NA2?-JD?gph14j~-}knZjl5#>k-NF7QJ(%s!94H8GXySw3T zzrXR`9pk+_#{K8s;~$%`-D~YN=bm$}nx7S>sw{`|l>8|G05}Tr((eHPl>h)9Szw}o zcT$^zK7g0UCW>;>z{9_PKbvx50pKN|ApKUuD`j`i(~ns5n)7f&DZNgtiBKLh<03Nn z6oGKlMuy_tP7$y+Xt_;j8fg=0%vKq{&0@m*6aCyr^2>;V{DDB7{q#-GYox6_=0~(( z(FK+J->EL^1GBC}qOR)$28bQumm&C)m>F1zVvon*A2cDwk4SlF{@t6vF{S_S|LQ*s z{JYX<2!tp7_sDiA7vaB0Rp&S@{$26&Uvw+|yGpuuBtH3f&2{*{ucX^x5Bp`vw$ozk z$0Q!hYl-Q-a~1KcUtIjW-p8vj7_4R?ph3670w?*{by&>v`qUaQ)}6Ges<xT1S^XUy z78Z7oP7i^j0V-l=8pCN~FFeK~*m!tcrz@=ir-!=>JWAnliMf{kiGegR5k|(`?z$&W zo;Wrh$<nS9)3_zMg{Y2I`<!jJ3csMDnwNi3K4k}dhr_2AnLKy@mg)6NVR|oq#PAbO zFAL&2%1IBfIfMvQUn~SJ{Jz~B%|y*fZ|M&W4-cPS_t=|0W8OoP+(Z~l5K2OzC5BD! z)zuH0Z}#tQE+j5yT|MXAkrP9sbUv%ma*we|zsJT_SdAhgUI+x-Uu|@Cbzwbc1%k+U zEPyvIF2@r?rcGp57(sC?+VKeq$%E^ybr*A<3lReIq=Iyy6xDS!G&B)O>LDX*?TJq^ zvWM*WJ-5ddVqODZBO@JVs@XK=<QgvKeQO-%;L*{e*^p!=_3Xq!3r$T1m9*U>FYv}> zk-h-!XCc@1+xwe?PZ)Rspq#)<9-fnajuugm-NcTi+OtW03|tDYd)bPLiX4@6_WtAV zG*a{`Y1jbRUL(JwuKT;2J&%7cp;u1%%^4mY0k*%;pze4iLrO*TNE%rTwVjDBhBhdt z2oeBkUdv%uCmRdSJ(O4^?6+4N>2gt2(D(m-uP}qleiiS0BjK2@bvE_(_Wt&qtviZ( zq1;^2RO{{AHl$IY|6=Q-<iW`%-wQ6&Zp>iS6)NaJM(sdqUtixl1qA{bE`EM~F){zC za`SG8Y>T-6^{nqfQx)ZRtYH~UJ|XRfOe`8VweXMP6&8cs;^Y^jDDImhZ{y9O$ewUA zQ~*!x^n2N_{QT(XXrR<?iW`bV7U^pjajcHYQR67_@bOjs`t?id3obBHV$=eIJ%u92 z{`_fgZ%09r3%ljA_IEQQ7|97+9`0|*c^qe9a1l?3#m+L*9?1!|qQgTcKwd#%)Ezoj zIhrYl;qVRLW%V}!6j|fAu<s;@Vu?c`c!=Wbwj|}8B$BmrU8q|D7=y-F(tOPfguf8j zZ*TC6b|sL65Q5$XePI)xG+pD^VmDO|N#>W4lS6I2y*hD+8Z~-x0caQ)FET&#+x-QA zjEszOR&5OpQnhx_P)XPgF0Xe=Tq!UBP|4>xNii`dvz*)0RkqgFdBr>BtPJ$@&m_}) z_v@-`kwfVc3#6~_2L%>L3rbl<Ja+$XjpZE7H#Kw*AW2{OU9BYm_+(^x4?-4tRW`(c zAVuV`_>J9C`{yW$d%@w8n~Q@BpQdgP-_uR5!28=_iHAn*62nvx&*oMt=%T8@z4BK5 zd`n>9N-4FtA1Ux!fm>4Pft`Vl?hNm6w_@1Pcprn>&xs5jjb?lk3@n?|s-^?0)Ft+_ z;x|1K_Zd6&$Q{1NgSVhK^~EYl+~@#R;H@(h8F+gn2YiLWj`5lUj(Zs%El%n?PM|Jx z0#-BC_HW;QEE_mp>wol;m323bxtr-B;|mqH7FWGJ`_Jw~>$Sc(;LTX&{YIko{%jra z{rh)S0|PtOq}0?skA}djH4>myuSiBlrrS+Z6Lf@tk7D($8MU{meS?EpjPHnKa>nv@ zd>TCV0OPh`^p6b&gQXuj*g264Vxjmpa3@hh$w2gO>*m^8Qa~^=S<rbo1$4XNbP2n^ zrJu1#P+Aur?mYoPufvys+s<T!xvpu~e3NhBVH?I5T*_mHs=$W;;1Ya>go46ONdW>u z4{B^|{AV3bndau^-4e1K+WvJ0?14k5X9o-E*;|AR$|0XWyYJ6>kNkYAo~=ZH_F<vf zUpDlvW+VLj8fa-BrJS!ss;ov|LB@3ADFqxTG$?P;v7VD&P~d=}cNJ{>Ewz-C6smeI ze@&awQ4qe34j9KzwclVqx%EOqJqMF`Ha5}&4a-bq3=Iu;CW|88j)<q@0k={`88+jQ zTyw3?DZ?ASw?{n!4zpIX8^>Ov04FFcp7`ZUCl;*&_bwQ5LdpiT!Q;^zuyg^$ajJan zPnKeO;QbZo;QN0;&xxc=_dic^cEkn3%MJtF_tosbEFXLJeQgCDJ{*^)qon12`^?8X zO+dWbe#YbSaH%TGX{in~Bm40JYUGHKYPz`pvuDr1hpBvbxpKF49|hIc3Ig&fDi<8y zr<-cP*RZf7m8<g^N4Dqv=X*2hKHE&DFs_T=(X?Qf(yIxUMWKzm?i(7qKOIxa*tU=V z=mw?cGLhEPo33-+0KXnJIk}#WPOWhp3hfJ7?IfdAUyYf60g0KFb++^aDrBtX?tJE& z`RM3KIfsWcL=y8Z&UheX#3=TNJZCINg-~+8@kH5l`EaR&3HDA=@#Y}#p&);IspE^p z?V%JvD&+Dju&cAP6LcR6z+yP<4s=JL^(z4_X((ts1GG`1CgEJuV1RtMzl(6+DJU&H zY<akI1l<(t>C>3lSZcq+HXE!)unn1VQOXcV1PoTc7O$^YY4r#Q`JN&5<qvOaTH5`3 zvZGJaJlM^GA@&aJVTxR%Y($9?>eLnES=ETLEQixNLUCTGns<IBz(4G!2ULl=PAn6g zI`JhTU7A!XpYiki!Hz_~%EtUOFyzaZiyfqjgd_GP&#)+JAeFS=?q9CVNIX)`mz;bn zd(prmHSpud4-G9XEw;ft^&FI-*9u^?K)Q<^3W(jZG~XWglU!{(nf~UHQTup-pDf^* zmX_wgiZA&1*686np)9D^jJukcm^dyWA!q0MWLUy+z=Sju!3b>5)EuCnZ?=C~cJb(| z%{d2S1BNoMY~IYCM+wrG>)=t3C(cVZ`?di35O_T(ET|H4C{bNq-96@F`!hm9(B^O+ zd1hieHl0m=p$_<4?`|t8Z)LT)+8ZliKW$c~lV5ZX_L81kf4bIOz)mi^uyFS?iQ(l| zPP#+w(qq%!)zwu?&|dc&4vLYHR&ZI&vMIZ{diP}TQ-Q90=a`S}2Ko&oUAzhGMCywb zV|X2AYr(#sJTqs(?_?0PD39&&ux#s!DN&p8+`#*j^#56WjA#C@UuJvLRe-8J@1NF> zs6vq}OibW#2+|aZEx8GQbDD4D^WWG@vg)67;J7T~|D|!-|09FF|NlzVOS0UdNOvgC zPiuI#b$4NR?~<kz<|6=xV1yx1@g>7`G5MU4nxE~1OL6MBOH(qxc_vkrQ*p(rF`Dao zG>CmsNuZF>-gmhP|6@%wrMM7AABNw~{aW~|0~L*Y45LB}BP{r3DXT5TLP6@=5cXA{ zf>H>6HH|h9@2bI(pv$sD!qZ!xlB9or6cZkfa&?<B&a;6;qkQuu9wzJl-n88w_e+OG zg+h!pW`^~(%?3^eRvkNw9bt&Q{7Sn^<o3ZITe`bGmJ)+iSt6OdT&Jd+jxBiKno*K| zw#wRN`<199W(Oy0KR33N8j&GAB73*K=)d<zVDt;s^CoDq?2Hco0^NR$4ry7(8Vk9J zN=E}CSJ2)r3J%qx`c$2KRxK*tcshgj;l&?$P<lm=C!qAhgL(Nrw+2^h>ql^R{^5k= zWc~N=mtE?JWZGs{bHf^j{?|g&R+mV2Ie%O8I}>`#&j-ilo;a@ctKhJuyqvpcric;7 z)p}@S`7}chx<Oq1q@Dj4m$8ssLT2-S`pve6<r{k7mS`HL4{y2E8?dJje?flD-TJ?( zd?kVe$snWFXjt-4YU29^Uc1xS&j0prDDPv|jZK&F8m-9#u|=dS9g-KK_M^2Xi)OqN zI{d#^M*n+d;eW3rG$h^91Z<gXj!XYnS`aMFJyD>wd@u-QwcEv)OhBE%4}rt4C*S>_ zQxJ7Aw8y`|S&7l#(3j)m;{{qK|G(1|t*C|M1~2EOKedmz?xTpQ*2dCR_`5@a#nBl; zugJ8TW2JzwnrQxyBWE42xcsNl1)_LId3#yT_r(n1X-lWWIMpr};a@R=sv1ttsW_e( z92I9cf53eNxIsBQS>$;7YW6u)H7ISY@o)Pv`k0RWYOZ%byIK|IT3_e1q`3LA7+F|V zq8hPFKvxU>=qg)B#b(f|!nqVtpjsKfEQLL(+0L&kr;pX;`dE~s>bRzDOz_f~^vl?K zS{%|n+M1>xH;DGlX60z$9Mtl;-@nhvhxZp)5PNy#kZch7pd@(vm^=em=VIJhPvEx- z&kMr#7MOnN)+%UKwZC5&#oqWBn}y>mP+NwlhFZ;olU5@emb7b8?RaDS(1VCMuBnJh z3^vg<M6oJeIGWU`L%eQ~+hMl|dsxoFDM$7luZO;)$k>TMYW`tS@H*a~x7dnOwfOV% z@28&f^s8a5(PvLX+!T3VXwGPRI85YIo*%}in9+vBh^_6dTy@q;*xVhaah3)C4!_V^ z{V^KeF<Ij;_fUw4fq5QBdRnFZz<+@q=y9oI(Ke-FYlWp;nYN&11z%<#v?oC#%>6h4 z3Q<2Z>vvoo$+PBlvLc+G_m8J6v#hH9dCs>)M1%@WTBoCl*@s13k#=Gl-Jhjzg(TJ< zggw6_$O8Mm;8I`FWhE{_ipwcz*Hl{cT{m+tl6<dE?d*-Jj%%LL$ybKLb@tklMf3;T z8(b4eEY^}gnUE=4wbJAA)eb3~Ut+2+{<x9lzcGhw7hW}ZyP|a@`=ymP@A;y(I_^~a zrZ79Y;BUjPD9s^p`m(JO)SD(;M<2(K4q~^H+IcZ-%g6mW*?kU{&CXx7?Emf+eHZFg zmY13@{llB3kH{-ebxzZ-;_f1kXG{zZ!k=0x%u3ZwQ<vqz^{w()Z$eZc_);t`$@yLL z$muNJ4KoIAPNb(dXZpLm|MoC&Z*n&2megqlQ+W(PPXaAN5R7oTkU#Dab#vgSRXl<W z7~$1aH-jR>nd-A`@)5RA0eo1tRlI6tHgnoB3RL}3t0p`XP#i7HW(I_1Du~Q~Wm@H9 z*W-q$5=o7+0#^Bj*33bMao_sTUaY9TbSsjNR5kST0%%^_FGQm&B70%eS^j_a1n}%; zxc_LvP0>KN`9g|yu{GJ3Dv_M9i|vRYQ;wd?Uq%h$SidW^Jt(tqF1wg_c9pg|bd9~4 zeQ3Y1b{I?SotaMzu-wrKqxQcZ3>~MKvYjL%1DfwX91V$m(V3UF3dQf+(jrPPw1pS% zglIU<x<k%1h?rf>OIm*sP?D6~8Ggak)-}`=`Cg>zw&T^)k9THawJm?$OPx?y>~yod zf^eXk7T_0tMNi5M<GG+bnmr19@V+|I4}Wa4cdlMeQJ5#*wZZ>BO%SoN>@Km1zs^2b z^iIfgs~(XdmN~;9aML2<qwKpuGE#-X;9d^@eD@{NpUd&B)d`g*<f+Ye^QF)Ix!4y3 z!Xy-Dd#u8?VN|OAYvK7eLyNxTGI9D&KY9zxJnVFZfru|<%)UO`HovfdIS4m|TUj9l zA3DaXImx@GvOyww?^kWY2&W;kS3(<M$-zh1!t<}+AfL!+rxl^7XX?UC+(z6r^8%_( zYROHBpvX6QUib6&&k0)&jIZ&&Y2^!VO;zm`(O#caE;IKoOS5#9{@mF}S8|6;Xy_sf z<~Mb8zq?Cv5t*idw={V*waiOu5SQPmk$L48f5R&B$!!YF2l$2#Lb4-xL^kWQ`?@1B zDC&h#SRqGe*3>q)3put0utwcNV{>#Kh%0P3OS76sVqZywe1Ww%KXuD@!F3^9i*#=Q zTBJ`maDAG5*1)a#3<u|~Q6{rfi7H)Bb@ixE7$71_uuS;A_!nRENSQLWb@cie=Vqn` zhKp65*2{jyMyF`06s2M%M`(V3JYIqRQU@H!Joc=va<G{9=QKSVqEP0Xk+wG;KFr0> zE1Yd|cU)h>E-`-k7|0Yt1)y=}S+ngdv5vO=BO233%V)k%WvCpsDP~#QSKaC(Q~G8a z1!AKqh%%^OEWop>90TU(D@;$;x!M%@DTY}sbVjF3+qfl>_>zmGB0kR~CmrOykK;I` z<*+-#cFygtJhsk}*>|Z3s}c9)uu4eyp;u$l#t<ES<>pvcR~pY}df(TBpvq-u+zvOB z25+8vrm5nk-!6Z{%dT>m8tA)ftf#H`>ecuZAd2^P?e`vC=44Mj-xX_g>37zbe#W2^ zw8=}WEA@%gFu#tQe7Jg37+{2%)ac5dN9w}g=jO#-tnflKHHK+TXE=GQTrZj%vKwCs zFVpFFu1n=K-<mHhIPUEq^%8Yh{}3t|Sc&5U7#WLyyO&Rvs(R|CMaygUjkf$EB1O79 z)++TsJX^2hS#j7M%hLbjldw)PA)z~VN@A2wH=QYMOWNi1x7Q6K=(IZCEv6e^v0Gk* zb?vEeb)krdOF6QaFfntHI`~1b*CzUxaV#PYO_H~3tSGL^Jtfuh)K#eKg-0qgV-~tA z=AhH7y@oPZ)e6kmidp|tjex$7tgsq2UR&ack7DhaQd#9s9sA~8zwk5$_n!Z~oaAL( z;F$3jRv{?*Ks1QEwQMyvP`T4Or72SGHA;WXS?enA7t*V{FYZ!r+&|AMTZ!6gN;vIQ zc|SNj<LeRbNJV&k(jA-B#oduSRPwSun_ku#H~E+KH06a#&cG<W+`x6^pu}Bujns}8 zobb_`vpQWToc(9y)Wmv*`wGL1^FBX=)(4^>R{ih$8fEl-J#46`DI1+Mw-aen1>^6X z&oaU#;Q~T#5X$kX$?7`yjr)q0LZ*sDnF_1eIG#6Z_4!{5eWXbA4H8#bJt>8f8r%bM zyF_%9pXr!8ZH!nDSXkDH+$pui`%e`zg%A(OhU;L>F>im|Q)+PtYfvH1bK#ZYlD)$S zlG?K5Kj>d@e=p*9+|MEImF?bdp*6pw#YUD@kIVtysO2#rdxc+p3XhC=JkH2P2#jDm zo|29hzD)e2JHN`r(O9OKGW8mFKX%v1PQGOKi_y*JO#QQiG@b9sR}bs<nWT}~QwmZI zk7poQ@wZxrI-{Ac$H^)<31~w)=F7SJ66}gsW}_e4C{_anRio!RlO<fcL*fT%)$vjc z${akuT_)C~QLL7}ySKNW^R~KfP-L1MFFC=lP}rQIGh7q`F8ycj2^~_GAR*m}PoO!^ z5Cemz9l+v(>+>noY5m~jQS6f6`%krd)enk^Su@_`rWNgleCK;nO(p7P);*>kinm+0 z)<Il8+;tc@yK5}i`;3BNy1m~|rkf~!R6~nspp8fd73hEk>zaAT5*XscmZS@;o~%i; z&=AQ~U^75V6^gJGn{Pg}&3P)<@0<rnI9{gfO`QDN@v&n>mg_PCjmPH{OoB9m)t`)U zX+jvqFO~<d@|lx&qZ@l40kTN$!Q)_|5W>Rw<38*cObg!n3+V!WdCYN{ub<FhbC}2X zebe426+vu-_v|yeYT-*ZUk4n8*{OJaQ%*6<DJ{7se_PSW#Mn)hq%<}=L^xF-kd0ec zcCy(9t!ZjeDh)Y3h^E*r^=onS)vfdGPHnn&gPoOJ9#RTK`mf$Cn>fzIk3RS;(|_BF zYWOSi=TG`Aa(HgK#%m`jnXc^EVx%*AF5uSvCI$UQka?@yf$i9J=>8_~1tWY-y1$cV zE_m;c%C~qCtQ6;>*!fic_77Ns`g_8nD@{fpO&m8xSr6^1tT!@Zr-TQ?_&Sy9_s_h5 zAVluS$oHqhofJe;6_U-vHS~kl<#H%*Lb^^SW2J)a0yX~r5bH6#bb>5Iej0qXkfWYb z78h55{8MkMn!Ydd`Klt|FF1ZE?)Ajpp<3qTxHYeuN%B-bsBXjEiDEhb5$C%i)w`qa zfZ6z>)_*vfVcuYtUubF0Qceh^y2||`n#8h50KLn#>O$2j|4&6~Dt`I-g*^r?75wP* z#}cZq{k?J0E}LboghSO>p%pHSZz{8Y)x`9v+>SV$Fn>RbJLPw>RcI{vE$;hFnJ1cZ zApjS5(WQaxSJ%tUu->Q^{`+P!p*nQ7WVv&tYIdW9$AFZ>?k@Y_;SUme8Ll=Dbv5U$ z`h^<&s@p6kRJxD)bq@U<D#Lykncn4vO0{*K8|#%hjU$`JXuzEI`Fd=JK7W*`(`BbA z$DNAWS)lm%umgcann>WXzluugxvYhja{9i#4_$Kqu?o3=7%$|m{`jKqB;LY|B-N7; z$k<UlVI%~8#KmnS@L0%UJGwX_WO%<Mep+FrISOXNbZau|kq0i_C$g*b@lab^U-$+a zFgNs{O6*ex73aZ*i>{fwad)r*nJzkAZ}SifM);#lH~|b{75GhP?LI8M>1?DWo&0cp zeBV)di@&m<OWp8ielynm#w(x{94XSusi27zW?pyS%$mpb+v>ef!2#aA>yJzss0iu& z7O%RpE>06d%o;3|NL;9??S=+mW?;$?!X8V8TMeWi{}y)+{Du8S4Vy!#S<mCwugXSU zJB=HDwv!XAh4hn5KHj(GWTy0`ly&_0lB3weF7)#hX1K7qY6&brxY~A$iQ};D9kU3x zfAKk+oxgBbe7vUU&2XT^X=i~^K#N8^G1Qr<IGBWb)1K>z^-Ywh@ZR8t;SHmEps>`( z-2tDgQJR?FB?dKXOF0W(7nvpIx=Eb*mI=>qOLo*B8UK!e&eD-NSO&Z&dSRCUgDD~l z7jmytN|Y##YhcvFcLB@(W7*>1o`!*Px<ip~RrQax^!pXNDw~yAZ^dB?lGMQAdYhcz zy}Phm1UGQGc7vBK!C7j_qV{sFzSuc9Zt3;J#_h%@e@d;bmAVB;{liqAN=v*qdyZ#9 zd{Yd>*zPkTzDVb$_aQ(yHu~lSHVANDhDN59vz8PHGQplWCt`h56tJ7lV-j!L#@~YN z)cH2(Dfvy`)2in*9nBV0yuZld!9Mz7-Xyw4-=KLtrtA*cpLlmHc!JvCSTL$lXOzSE zpIPuF<Ds;+-Z#B*zBb5$=U<YH@oC11<r{E0STO*M%<N(bMzUim&b~xH^HZ%u`V+gi zErrt`47Vyu0#f#f+#|qc<7B6qMGLiR$Amo&cP+u)$zpp1u7%mf&R=vO{<a>MvDgtA z|JK9R!LW^xV~88Q=C8k~7_Zx)7~z+w-35>S`3c!};P5)Uw<wlyEGj+ec-gYDPIp-O z2^T?RaQm`x1Mm4{29Zocd|Z$8+Z_HfMeQuosoKE4lZL40x>AHnkygDnT}MirJ{Hf( zfZqc{E3aR4gb{%wTwTV|S~?4pINV+}swmI9Y-pv>@!#Hocs3Is_pb|{#j52p*QhBs z4<0A>=4tEBY6Kr}0k4%i4li}a4p@24`iAW@Jzho3ORv{=zY16r1cZW$?&VX{ox2wy zZ>jG*+vE-gYAt7jyd_w9P+m~-ek-HhDA%3ud=mdlr$4nrFBgWajcW0}$RidxwhC={ zGu_CvnK?}2cX~i}5&l4Hj@t2*YMS5iXuW5j5*MggztyIpj}?nq8uYS!n3lq%AsU2b z5wioBxGs$13Cz9`4HEEt(qYTEA3yHP?XtQ*+esK4@0B;PQ=e{+vvLpYvwF^nt<k-b zQP3)PUT6;yoWT)``9wK6+Zdc<c(38oxhL$wE9kZ6?-@=m^m9&;nw`TP*Yj_Y*mT$4 z@W9?o1_$YeVEgIz57HN82C6y~yPQ!k#K4W$$^kM$%26hv^#tPNaKhQuhnt>#+OElw zbql$0tEzFGznC(p_SYK^`q$lK0vIB8D~?+dRBt9KtCBD7TD)gO4Hdt5(eN|Z{w!sD z{hQz6R27O;?C&!{&<fMbkaLa9;fdGTAL#l@vy76*d-g%~wDwE&MQWZ3B_{bw<(L7N z=2ws50z3xhfr;77sj<PdlB{cM#Uj*xxSdXlsud6n5{Ayd*KW3iB$RrpIvVyl!j-Vu z%7^b}-+tLPM;9dv6-gDyM<Hth#*|-$knbrSC=ZSe5h+w-1`;_xEI5#f^-UmjD_c^R zei?@*5M_;0r?<Fp#im<5sZxy2Uv~HA14`juIGYp6co8o~{a0J5L?jGmTYOOf)_ZqU zjwwR84A44{Du-^Xq3R|A%Z^H6LJtbLWK1vk8>s%%-Q^V^Dse&>fh92WD#H1UrY%xo z#Sv$=vdiS0`t+HAvvgHiD4kPqR<)WtCX~Ui{4qe$|2;_gC$ltiBF%n}h^8Dd;C+A& zCuX%E077v$>+OfgZLM4%-t=oJ#L=ia7%ur%wCJ~pFbG!Db|_RqDTc3h`yn$IM~GAt z9Z9aw=FEeJ<EDZsR&$jbt7U|i`t+R<RDXH}hqvnYkFJ3?_-HSQ0DQ-{`~RO@0Irjf zEcai5MW?4L#4<^ZRt>EpfkLCzOlQ(nKkgXel(QwDjvjs;)v#UN`Ad#g?NQoXW6}h- zq6Aem&Po_`fA<hn9ILc&R>SbP_t^a1OX;h^s+XGWLz4jxlXjIwUJ|<Mn3YcvpaQz) zpZy!8f!5|vJ<`5*s&2ke?Wh!Hl%UQ_`Sjr$i~hE<j)o}mY0HfpiL--A6yQ0B{&4cA z7(&xlLH&pZI!@D%mId4bghX@Q&nSkUK8LT_MkZl)9j=eb>>ow>&lklNX>Wv3L8m*V zKjSr(#kQ&q-`alg8{P--pHc8S@8-4=53cw58h*|))Yma_Qu3WAdhMH1z`sW=k$-Xc zDAjX7kN>CTGvKzITc$Gf$}x4Pep0mWDbVl-*Ncz+6(Ww0H5!p<r`@{;Z4bBCTwtnD zK=MMhZEx9mHMgebl?h(;AMbjm=jb+<r*19qt*yjaIDQW7)ly&!4|F+sx{!QwR}b9? zHl40$?Al>2TJv?_)TXgOkbV516rypSyaf<-6wNvN%zoXM!Z^PNyYH6`SATme<W$x~ z5PGf@Sb$-A`_t#jmG5~ox7oq81zAl$w~4OY;f)o+{VeMXiL0S^l8ljAfbm@D;6uvQ zN3(BcpZh%Vz06<fF=MP&G=^<ZG+Jfq?rO*(8+Ik}fX*Hn=Sl>#c=mP~A5`5Ps&1~5 zj(Y?cb0s^}mn8%iwW0d7+}`7f*NjPw8&9S@ILHg>EM--EYeew90>`~pIJ88X`otmu z!XkS*d19~Hy)Zw0kg4c+Tj4H20I5K%e!V(PCO&AsJsiJb;O4~v_laD+m4UBO-=e(` zzl%F^zNMvH#a1w`6wlnuxk=$oX)n1G8!b)(z(~r=sZ5Ean%gFAs-qk`Rn3J%st-kk zna5bL*U^q+!q)A-sap1iNCs#ModOEOiXXxAE5luZR?yh3wSHPnGJ1!o>dNeI9kBa5 zDJ5uyl~K;nx!Wc1?ym>bEIbHjc|U61J1P%OBC+q@q=2e>MPdLYDobcs40>;oL`~R$ zPUzzxz8RGW%6b3I*5-aKho|MqQK^Eio0oMz6VDr4QCq>WUgPPyTnychCCJa65LK$r z%Y$!aWsK2de`2`Cq+0yN(!h~a1J^D!PM|sOsww{Nr8Sw%j(Bj0dS65|39B{>5&Z^A z9Xi&L3wP9xxY^cPNKKeY6Zu$+qc-qUH&Q^zOC6tK$|_X9;cnnktqJ4epv-O!G>A3O zAhyW5Xq=Dkmp=Wp#fAW_d*|gTVT5}rR($)BPl7Rl9ez9StD>nGzHkfl5qC*7=CZ?V z%=i64G7!ycx9}kNbW+0n-TVf-d4Z3DIQ*o=UH_uNPst-%yD}7`$K!h;K?tI_bwV+- zOGz`qSs2)a7u()5h2SG%C7L~<IacR?g;Xp&J}8+TvhYwn4nkK9AY`Qp7J6Os7YATl z&eZHGU^axPo4hInzNf~jFiuO@Y`5hN``xzbQ_fVSaML`*cFCPQ1=C{2xoL7nY*!%k zG{LIa=y0=4@4BBh9lu;CP#-I8)_YzmCC#i5qX+CR@+($9C#4PG)l~B%roHYgUPv3O zbFa*|@tnONRei;h=nnC}S<5RMjTRH`rXFG=%Ii~%uF#cXII*_1`d0d!U%9k2ILSm1 za&&h@%ClLoeETWHDl}m?y82Lhg^eRFP-CtQLuNEs$n0c(cZFe?zWOT<{j;CAsmvaA zO)<Y01U~$3B;M)@&Z?F66v=yKX`W&x{jt7SbNwxn=BGOf05d^X+>CG9h)floDQ7kZ zphyj@od!oY48Uv6r~;As%Ft_liGeDu*5SBCbPb)CWjvrCkB>`u6OLdq?Am#@bv%lC z1GN5G;D1Vw(Q$Y5>@6&NEHZBX=GK$G9sxDklt^zD5&Z38inJgj1D9f%xeV3)@^{tD zIq+4@RJ0su0A9!ES<Hr-=bQD<Us$6C?aoTVmLko4xLsi;uYwKz?+JiQ>m!%>Rs2Dk z&vaCP{5!j7{nZL*t!O-2UdTsgU9x%TnIV<rBQBI+y<x5TY<{dPGUE&CSnt?R0zznt zn~_p+8zRx4cW3<od7C61)wjuA#_?5~@OOmYmBO9H>E95*xVB#oKJBUSC)2$uQ_J9x z5FrDevq4#OJA_8J&!Sjfy>9va1Srz$F34BW6wTkA;L|*+b2%Xb>zjI2B3*T?^$`oq z{F1KFV-2akk|WfbK@C$EVUR0;pV#<OBbnwgsTTsSM*nVpO-qGS3u><h4lFBajrRKW zJ)eBV+SYyaT$U4D5nwiiB5$Qw+@ZGN)E;()ShNszw?QxaPprNy8dFexPYQ6|+628n zpH1%3OLqQu$TK4?JEEcw!9rdaOMZ~C8G44u&4kSXiG5=jefTB{(BcSLL;LnHvJuBP z+;mO=fKxe@mg;!6hREFf=Y*73-4fYwucvPuk=%Zh5<Roxxr5YP+>*JlnSy{CFH}I( z=b(rXL)LaJhj?Qu<mJY|7h!S!Jlh1c$m~2ZU%Y)`r+tkwrp#BTcHZ)RX|Vw3Z8p_@ zxoFo0_aCk_%d${@0SvHrdzs0g6DL;QW6g`1zZ@$z)VeXs2+t&&zbx=kpO!J`#)lCP z#E4ywIclLPy)GZRtMwxRZWp9HXI&M2hZ2geQ*aBIep_(G=k`g}5p?I}@16(}PwfT% zM8hl%mT~Fy6LzeV_y9!`Pw`yEOUHKR>?-M3U5zZe_Y9k@>I`J}>{G3>3ex(fJaVS7 z`J*wh;jykhKigcCi<d@bTmz3x7j5ubQ|^7<b{zM~-3^+|+jv)??qEkoqG6EXFyqP2 z!-5BBbTwG(!}G1#mQ4>Rk;71zNqrw5H;$bb>b`f)<~7+{_OXPaXE4uoYERBCLdSh{ zpe1K_4UL6iS}P|72&zqFgd#~E>Xj=)j@N&R$zerQObl#Lb3Y-X@oDHR)qNoKy;-c* z^OxPQf|HZHYdMjAxRLAreAwk8(+ts|hL2MN<*vuBPg&moQD)93C!{?3qwWcph6j~p zaG5@?5qXHlk{nGjd$3=51bqD#G3o9<1>Xy%`>{3{Xz&N$2Kmtyo?Z1d%6~DECM^cr zaVu$5jE#qSzy8AsyNsqOg4W2_p<MUplTCZV4vRa}0ee*aJXlG$C%rX%x+yLqJ8!({ zizmfzLA6#(t&mhUJcTJ&6aZYHT62E>d)|dMhnFRhlB*lwn5XE}sOFiM*sfZRZ6byf z$nfRLZduw8TP7U`N`*giixLw&s!slv=4Y98)F;9zX|X~^{QhkAX$G0r-%^pAduIU9 zuij&2{_=a1Q@JuuBiD#cCvYL;qoe2pxIBX`h1%LXmL$QxK!;YPQ853OVft0|F2|)u zTc1b|j&Hy=+lBIt-H<@R{XyDNY<FZLuSZB=*Mh*oVI9kX=X)Z^;l??B{_zCIP0VtK z<L2B}MhlMjremOzHlO{QC~4qtsdtW$;1Jc+yYkQ-INYOM2%Jy{&6f=8z0$_v`)L(w z5k_!Fs?MuvO&~kybA1q<;Q=Iq4pOr&lpf$|Z{DEmeTGdkk*ECi;e9f`Bo9S@692)R z@3Mxh<cSXOl4y|g&qaYU-?z&7@tnKN*dB4=E0rf!<f_=|M6_bQ2j9QqV*#S)i=8vB z@6xU>m?4@G6sjTFWRXjf0tb+j9Bg4XCC-I$9yPUzgom>vu~$>%&mNW<BMzE4m(JA$ z*bM7-Qh3tWAZ~k7NVTz}A=|NgsBSy}3|Ux6i0)Bx<<?n!Q*9)c?Nr7b<;`+TxNL?} zxivJg_H$yV#%dqVT#IoNo_5_%;N9B)t&}_P*(Qj?harBa-Su!+9Ip@ETrK%J`1*H? zfkRmImMr)y;nLu%i}BeT2MpkEOnGLhMkFkJQN}k9dAD`3lQYj}wVe2Yum}63q}F-I zA^oBEi6p_##dddTB(H8ZBlpqzJm@BS>4nzQ0~alv7+rO|{XIsk{>vX{x)+3vZ;McG zUraap8%@06u|_;N8(Iij&kYS=Fgyb6=9(KiW#pvMN3m5fHFeb)vrCm8EPBrydQQ{s zFPl^(^51u7{7p!6-k&WTCJ{S3ybP<sN%ETcE>T@&+Oo@pWXk}2suXD<aX0QTj369+ zkEBl~djv&F=b(?iSNQ<}NL|!RkoOgD&b17a)p(^U#?xoWglJNHwxc{OPK)ZydBmq> zx%@gj0D*S{ofR5(ArqGpysy6^th)5y=JtJwATvbxg%3G(r;T9CRfx*CUJ<9=$?<@j zJG%8Q$#ky`IWc%rFc&Y6k*6t*?MInD0^h<IS=pf{H<3}z*AZ1+iq)7Z-XEj0&2Vb+ z2r4!l55~pw><iW(0+u3shXY;D4cbDY=k#jqx=(h))RSxl_6_QN7#MUS^1;FNyS8Sx z5azH*i?IcL;X=#l&7~%NI{p>G^YJa$7uDIt^M0ERQ8}n@-fb&X(1s>ZU^8sj2MA`W zYH1Wq%;xAPH{~?OO~80Y!=FB)^>u?}FbRp%4_uNy+kHut+2>$Nro~y&xJ|ua+!&>! z9w)J%s!0>_hi^gxH)cs1woYoujovkw+Ol4>aexZM3vj)}pTE7{5SetC4?JnbEs9-+ z#Hgxj)SC`}T$prFoJuf%V&7Y#QL)*VZiI>R1i>hKUZ1}|jyf1dG^mw*dk3#Eti=PQ z6?~2l?tsODtA5v1JNb&|^uDY2;mZ&a+=Y?MGl{g?l??3!tNid!v?Wi7WUS#@hD*Zk z^tNZ$_6v87N&Ip%v@u@2OQS5qYuJv46?;EqR_kk`!oK0U`-&#N|1+O@*F-NZ-2QC+ z&V!pJu<epy?%8stzxYAqxYSADyqSx%f3slG&rY$U$rrbl1yd)J+>?TBMAAHdZ|e@; z_-Hl!%1zhK){)Zx8m}6fU=?q4dQ&%M*+M2!Zkrr`)IDW0mp!M5++CM0a1J*0Cd?u& zIgHorBDwU40;kL4d@~itC)~29iVh3)b%Pd1wM`A@RM(4R=wvcK#1O>&$<GTVT<K3L zL>%^z*_y7VQad%j*o*=f4@@yo0EQ{D66t()Q>#!G)}?bw@v#i|3iAR__$L#gQQ1+} z!Ke3q{bAYOEGp(^8&PC`xM;-tR!;Wi#V+^S&k%H{Uo^Kij++y`Tub;Bx|PifXDThH zru~IO`qGY1dWeq0r?Viuz^`4Q57ly5*)KyA-XQVP*?tgD*l=BJ&GVmm)p6N;UsK|x z#dsWDpUwT_eNn1fV{yLegmG1j!7WY;m{!9PPYDt7P@7@r7#a|&mN}|pf-gbd#xDxO zm!Rf#`MX>~CIgXH5Y4`CJYs8~Q;fMVx{m3;WcLx%>8^dYbcgbYn1nCnfcwH8BG4=$ zV!92#eeMx=txEZ7%vd(q5?x6_XHwuhHBoxsN~<Sl-hF*o!+rBEhEHP(KLCp!>ka)_ z;ronQrI_*f@jShTIlFm_5M0v+5+Rq0<$>+>^<CvuVKBXyU0ht8kx?EW&Cl>LpYB<H zDe$w8s-&P6@p=XtZ|mkfR@kbDJ8!1_Z=3k5g_ojyquDo3A9XXw&lQVq-p=$Luo%99 z4K~k&wWF9h@_2Cj=?)K>3#&meR`4FwHZ;Cb_X9h~-BAm<%KS@%ETK1F=>(O_<+uxT zci?Zl8F0h3zyXA2OPmU3)sEBtxxel_?3K(>qMh3MqE2Y6SyTn<gNC=-<3Xp%k>~Vs zyn~0Z;XP2ecdnwupJ7OJ0Gq`r23j6^ME~WLFQ@^nA7*4YKa8JLp>_SiK49)wH?J{^ z;>PIWPT6!#5W-T9BQgKO>R2vEC~1&Y2j7m}RRceWR%vc|P9tN7u9qy*T~W1Ah%u5_ ziNq?k496P#jBTTip*n7z66v0bAcHRnjWQ=nz1A0Gm|}t*)xArVvGgx~KW|3D_5se^ z(B~pHgra$l4_~7D(o03BCkeEw8|tXVtmQHOA)+2UM$jo$epct*DPnYqTmS9AfZrab z6)X0xT&5iH89|ykAcCb_0Fx`1N&K`dIQkTT4X?5Hd&XISf)S;EL0D;3!s5ZYn~L9S zo`av&Rkd)?BF#;`a@o~7|DcgjV9NWY>qdqj6zO05EUG}~s2*?&B}8}4?WJPUkz|C& ziYaSbM;5U5c+C+EIt2^qaAMfPmz|$KgH@yTC{%yVA2CW0TN`SxAnr=y?a-G@R-AN_ z98H5Ej@x<4k)Sk?NGq5{BXJjKp<p75jRvFZS8$O6J$9GLGj83B8KyC%NS5*D`$~p_ zz_#%CB}#QsL!_Pj)bJB6MR}gy=e<sGdrICPWMz7VU?ymaU-K`)`4p>Vd1w_rYet}r zC9LAzNn}H+H~iHY_=#lnI`qb`d|l6q;v)DS8*rk3uG-A7%|ANl3>8o#8VuuyB1x4I zLeZ1%pdPGnGOgp6Al*^N^40RnrQ1I%Qo@#`0ZBD%20iO|5>}dS)z|PPGD8y`0?Z`{ zF3iFmVlD_i5t<-4k6@&tg-DJD({(Pp=E3lSMp%bSUu9T9j`H)B#wa?HOWP!Wzo}?6 zeq!$ZZHl1i-z0?zZmtt;q63L0o`R@hv*_gJM>>QO54<f47Q)2r;%xkxNAC-6M5Y)& z@uTIJ0h4#a*QGVjx9i_A!k1ph$GSmR2H&CuEkWWU;Ki;#98V!dHvJ#0r@ARItQ4(W zB^g5rt+if;n0UqVy*8{2C6LsaSK<-P0B5~QN|naA@0klENN?Jmz(#7tMGV-&-(UGi z%}ax&?BT`Sg}+NtXoy%6i)aRAYz1jTEM!L9mCFewNryU*=}l7#dkH|@Wj<+F&bAF^ zV^ymRMcwT7-LMYL5sJ3(&KxO6bdf(Z@(x~<1{UcWo>AoFantY)KE>uB>x#2LpC|hD z+X14<2>&1$_5odTw9zb~kf8gk7@SyV-t310m~JFn8B(62p*xUoxH0Gy(@W5mOaUf| zfR%(;psipt>NUZ$No6$5^7I|-)Mf&RNr>$rY~VZzz6&nhY7$RfZfUNpTHOK^bW>!? zKMI#%yOZt_2+~kOrcflGW_c*M>6?rafbx|y1>9C59%u_e=*}x~QP6~t*lSn?7c+Gy zrK(mE_~-?%Xvk#e_GL<svT_Kaxqf}sz^6$cf+9(Q5cSYWnD)r19H<j%QmPDfel%Rc z^KVZPG>exZ*+NjH(z(1OSD|t7{E&{Mb-eakXP-wXv2L5o-mS+|7E;F|AlJ{G6wqkK zDmcy@3e#G-z>MH}8iF665Z-2Ruh~kP*&4>nLi(vrzI6o^n`MM|!>IYV{w*@R?R^M- z>XPofU876K!dkAY$)d-LEle<-iiW65H8^aEZso0ZW)f}4X3Eg^bClPIMUOz?+6=Bv zOVlddB2q5gq6j8OWU~t3@7;Ua?EKEP&)d1p2TUK_<IGsf8}!z#;7DB&+sNliZ@clX z$!*n$I$&C|oZ1sUPnnH+dewMO<j(LCZFz|Tv2o7?R2wxWxW~V91Ed%<PAsgBCOT>u za|?|>>A|%t!Cs5o1CFKpXNo)&G8G>gFkwqNZHP})mlLSK;8UUw=lZH?R@wmJ2Rrn* zPa$aVHPmlp8chkawey&w`djr>s`LsOW4=A%pTSUKs9koy5ve0NT0X=hDcGTa?YJD2 zVzf)MXx2wIb&}5LK4%n->ez@j=^Qwhqnl<@E0Nk@4I^fih2D%kXX+083cOKY`vVIe zjT$)rL6SQWT0_`gju=8$IF~ncL2G{hQI)qN`L+!e%s5J)LG+pSEAldE*jkd`;=GI? z<{^-rI6Sdm9R?X2!%j&XZ)yP=z5~CiwE_+cyI>8YjoZCfA=rH5ReCn*qs(_#rh`oH z`G&7u`Cb#rxY9?FBi_BTdRNteM=rzD7)DsM(ekmn`ZQv9LIe3E!wQ9ukMGyDOQ3^_ zjYDv$P+jQw^@R3diAQj56VU{JL3M@Z;Fi(Lsy@b)ONsI|n8LcL+q3s~&YZAivdA?y zYzEEd&WB(TuK@Ity%e3INMtou6=hcIR)}gL>FNn5y!SDjT&L{`&C@}r#?Qn98!ex< zU1pLVyA#h_hv7@|(eU<Txs@KhsOKAG(9YJC&VBNVXz=Otl_Hrcwviu>X&Q6yH*5z3 z*BYkaR`)pnxI1{{v~Li8{XTRDiH-ER&p7(8B1{nE2<B23`_8N_LW`MU`>dJ<laKE# zKkolT^|HSalfstGUrFXRm*Tw5&C7EvDwG>A6D@by(ruXB66W{bBzI}j{!5QJ^IbM* zjRG3)Gud~2#uIkyKFg8iO&XeE4F}V=>m#F3>pcvR|4a0B{+H-moCf9=%S0e@8GFw3 zdCBU6HoPNONJHDyQvNR!i?i1WBuiHt8Yv88{jzcfE5}UA<YQJPYPChwF`>WD3_c{k zw38x#67TBP%buY%No#?y){E&>OVwb}clN$&?7n=bqORND-qG>t)2AY>0!A2ihbqy1 zBazLY;+g;DRD1o)sdlvnTXpa#2Q2(6(P@TlZ+KV4;}xxuM?G<RArlN?O%7~UHR3nD z1yj=VnIU7?u5|NIa9YWiluM;IBrrB~`1i23w)X2+%r6}@3eOB_5!naZT7MtAeclO> zYU5w+yX^mQBI^>Nl`iXYRaG9q70U<%)5<qa9=)mMt0^t*+;a12GL%tsg9^YbXo*J( z|NG_s_v@Bl7?$u#!*A!r9u{GZuU%YR{QC9l@89w(zsp&_NeQYEdb+dNq1KzYw`3T< zaG|?1@AIauThCXawa(SkZAnzXM@t?AcdUA*?5e@E?}YxflPe8P`&|T+LQJ+b$hs&f zC`3dz8!bj>S;JQZ6=Djt3ObgY1Szx%H1W~k*+=9Ae9qc6?fgGkv@Tve1vBUW7-gpj z#Ml;J^Tvec$DMsm!lYsCe-|UI_Crl}&Y@;_gQxz@9bI`eESt5Tj*e~+#5h0@(Dc{A zhJ;xNIK?InT@q9#k^x~wg=c7wIPgdLmi|*#*Y<zPdUySwvIaHNW&f!Dr!0ccWL)rG zv-d<@o41W9H4z|<2vUdA($ao@ek=A}!-CD-PMq0K`^&raDGpHx`27FZT!a5LxBGw1 ztpuCfUlMorg2>{BBA7Y>=YO|KymM8l!-`<kV~zj$^QY|GcOzr%G-uwjEGcAsfzF2) zBXK1+IOsFqSyoEahF<hm>HCxSnossAlF2&~sn(Wvje2>a^f(8<G$@O>{=oC47^<BG z>Zw5gzZXaB>2YjCtd^*Oh3Lln`h6}B-&Lc$ZY7>!lnkUpTFtf9M{T3`E4(Ze$HD5M zdG(Lo_<xGE%~t%8l%#;!J223QGUK!KnIu~|Rd1%J-wlLp_vae0f;pX+J44@%m3*j} z9yd6ihZ=XKq)<ryK3eIydoVDhB9O%7OWa|!&};U)3VMXf`uy8#1rTSsS^R`2N)?4* zTwMl1wW1-2mnfB_yq=z3)dPpbMy6~;{@x0mpwl8iV+JyJz~N?Q6g>lj<4pA)2z$27 zhNo>DSLi{Ehh9u{+2sy3u`n`jB1;wql6ZC+O!z>2j-1!(`-BY+7FNSncJgy}1FxeU zEmv!dk&Tn7JrB^e`pdbxjGV3DxL8=p!tOTS-e9$X`z0Lz5E?qmXJEw3?!RuTv;7V7 zbs+XtmXqeQ4I;Bn4RbF99Kd@PAe0*}zuAE&u?y0Sfgd1aj4+fS5Jaj5p~uZ<oXLaQ zbQ>E(sfsEp)PhdN5!4(IJG<RR?-LLadh`+uk|2Y%JD#VGx_UND{<>fSZM{)#qAo-D zVt*~cDBxzV#$S8^<hgdLO!#zlb)`bF$%I^1%gy^WG@<2Yz1l|pd>~8t&7cXcC=z5l zS-9jqzvfZ|!aN{cb-$JFcdP*VNffn&xM_Fz?d`2&%Uw0d!HM~t{%!Dd1oh3q_63t> z+-(c_^=t>(a@@zVgDhzYad&lbL3^7BO1IbvmIA-yO1<~l_5@$?-<H4!5Xc=DWTB-+ z1p+RYzJQ>cK5P6JDj#{xiI9*Ga=hbzpcarGaBW?nRRq?;`60M}?T`CiR)QfcJe)Uq zu*v5P#A`?0{U-}`0VfdWdI%N2*{z7Cm7Bag>I@?U!Qtm<H0<mS*QZ<J=^z{%0D{Q~ zMv!K*1`X!kPiw}_!=t(^E|OB@ng^s#-?P2_4}6`^l*5Z$0ckWY$9d7fV37CSo~=6p z$wN1&gwN^b&$pk@-dfE!UNNNmy*JewUKl$;=Eu7vutN>~j${IDiu7ylLF)qZ{R1yJ zz7w`63QF@?h&vtF4CFkRg0Le9vz@hyUTPO|@!aoSKO})9*=vRT{A+baCZ@V}j6)FS z3Iz4h18Up**v#}@73}2hVu4VyufHFUS{xh5QBKX@^KC&(P`@CkANp`+t%K}ps-shk z$CpeCxZY|F1EpMATIzm)XESN?LK-fA{KKLDAz%^@SHqyiJZICZ^ggiwbXo%Z0|M?r z8@qjwIQ~rw93J&h|HHvShEKQ7W$osmr3HjWrz$K1L0DbC#(|Q@Vjzr=0nE>1glD4$ z2KihauhGgyiawZvff|GwcRg;p(JnXtzqtSrFC^|SO;-%uS0V)NFIS?Nn3zD|JYCQk zQM}WwH^INBVh<90ybuokYE}se2`;WOy<p`W*YR96G2io95Ij5G8UvZ|M%N8x)2<%s zKoHq0Q<1o<9F5{OZVduywYv?8ha`}vj%U-)H$S@-YiiZI|G@x(ueLmKKiwQXJw0_^ z>ArFexZgK=Ir!#GOqwqM^3m6G$uEuL5UYrd=cA;g<gA0|BE&Fx(1Q-|CxTJp;r1kv z%hUk`BteZb!dwFA$wEKq#;?@2hE-7thv3(1LDv%Z5K!e(QTypikgT5&?3WPl7~T}& z8lM_=Tkd?avI2sdAc?#0(eTePHIZkn4-ub-Q-n-eL5Pr}#um9>g)~%DR-WYDLlFXT zWQ&TazzM3$qgWO3Cpb9n4RhUvt#0KN6%iG4;Hd*Pvu?(gAhMavZ=cWA210wCJv}$R zg7^0qEeqZosj|T!h|5hMaCe3T{o&a08U&@2zyMTLnAVcRSFFjl#$!1IqH0m#xdPpw z>7E8TB%ZkHo5ID@hjnGte*Ck}e@f9d6~D_r<I%j493CFHx>JH@M^H<oeMo%!>G5ES z&<Tk5X&(dI_02XD%nft<Cs!aADio<-VG%(!G7RQ3r-}JaSKEtxXh(x0QE!sivqOxq z8&zdDWB#*G83{rlH{a&A;zP&d2hIsT+euPF&@@(3HNzWBNqPf6P(FM1UQZ9~4I;SS z10bRQrNVMJlALcFGyo7V1Vx9BzIAT~p~P;G?(gYIe>egg1a0sjMr%uy0oTy?x=4(| z!@{gb5nW;zv#0=jLP0kKSzB~MDC%=+1#0Ma$76r?3Z%`uAD(~fy4+Z7`($lxO`!Rl zRp)zpx)EE!#(}lHEqXQu2??@5yF}*O^GB@+nQ!@Glb!(%wn`^sDiT#1Q<c_ZbQB2k zmh9H11}E_X5Vt}}dLoT^1^NvL%!`BPM1Z2XZH_FZdd}CGVBiD)I*NX_8j$g;(!;<Z zuLOzQz*nHnXIj_WB8$P(9za*ii$D3sw1i3HhEvDh9mMeZb&9Zi-=4=e#9uIyjE`$* zYNDopQhfKWKCx$+{pF#9UaFZcfAS!--c1O6;lCp&9Oml5^AsHC8@<7U9JH(GzyO16 z#VACP*skA~7<{ollzP((1}pHC2GD1Ua&r&UMTQsLBI<-Cz<`H(Q7|p{3Bic^82fVh z8^^7B_?VONzo<rzWai)~iN6FRY0LF?LBoE%Ef~EfWX00cXUNA+eVXnat3k{^!Rf2b zEj-_!gXFg*-$xchB@2{_(JaLT5<{<lYVh95N}vMcJBus82hlG#Qvf55=Yl^50MGvX z`LqB3LEBqLRrP&uqo|+<M7m2-Qb0gDj}p?I3IZY^CEcK;(jc880s;bpq?AZWcej*) zgmiP~@%#SnxNqD$-h0Qm`;QNPV4t)1UTdy7pZUzWp9Sw>w_Zj0_y(VIdIkm?euHrL zdP&UQ&d!?<YQJ+b1gL5_KH1})hA^6+Uk|SgqdnzM5piB45<IBBau53f;@)*H^b4bI z2p^MWmRXkiNaPO%uDUYgrXUbw_^ey<>x{{YvI`vzT$Ja*pTEamt+M|V5<uqy-uvdx z>dkAVqDU#SA34SZK#-fAef)0XtGP;N{M~}W;cw3C;ITxgaC|QVhF=uM5APn9Rg~u^ zaU1`DcV}n8FE;w$xPgK3M6mLH4mqfF6od@Fs0(<YxiG4^;aM&D&qhpmuA!~2uD;G@ zxpz-(uuQv9|4GudD$Bu~fq{YP8dta^95yqxLJ|_QvzA1+Z)c>YJ~sUhuWavzhKAOF zaD#mmArjJ>C(VlY?%jj8>(>g3>xIoaVnKq#cD8=H%Hlu-Oko*qpW-^r8{@?1-O1iy z0`Ry(?mHhZFZcGG(2h{9$7Yfr^-ITP(fuI})c2&=)w^%cHKOh!H<wc76hul=jL8-r zI{a#WJ2f@sbACepR_9dEa)1%uRi5=egvGd?aM?TK-70NgcneKJqe9@DQ#^ghhYtkO z51CA^^pCZ~H0u&%x!+gIBC8uscO!IE3OirBe}^o*)epnq%`20}kPuoH5=qI`nwyh3 zwYO#XJ+HJN505X;zBncd?WWrI{`qR&(?ugrMMAQ?zMc{l_40RL=0aO!$}FCt_vroW zMs+_h3GZ0&C3Dpu{aWr$0R%r&<GKaH6#3ToZKnjO+GN8i;y@)KHnz;|?=P(aZ7s}l z4+X2Kd=EJs931eG`e17C7Qa>af!Uf@_ybL`Bep_M!&Kq4qO!8s9LvE_Hp+ThGDpCC zJBNpn@M^l#>cDN^GkkJ#A$b2eQvBqTG0t4Q_vy*u*4E0($~x+xBqJlk!+YxE-a{qe ziB0!WJughgG<@qNVV&XSdU3<a$w^RP;1h_c?%g-gUfuava!0)`Um)Y>0mRtD-~A5& z#kTyS5%V~MC`l2Xb3*kpAWFY*nLp1N$IZoszY=sAn!#X7I4G&9Hx?Heqvbw)_@G!^ z-TM{%GrV~&B2ojM=L-iVCFLX-Z<1n;D$Db(#LUt4@k{TK@1UgtdL}j#rg75oW*X}1 zCkGpy!$Pi`kJFR|e9qiTbpLE@)Onw}1gPrkQ;?d+JsB0eQR@-N(P>!g);~L&(Y8=s zQ?oTzlI78)7q6tG1TgrW93#P7Mn=X(fXG_N!jkOa%6voK&QkEz1PJu0>3uEwVj7!$ z;exZ`x>mY;8n6A!H*5B#9F*kbmKQnSypA2>ZdqZ&lWv1V4Ty7$wYR@zd}L*{4wy4f zGe1b^6?jKwWn}>Cyu~j8Gs3^8(6r)$ovf$74G+yg0!nc?tE6aULUt!wPS|<P33L`H zn8TVFwb2YIoie@!mfWA7nL>wX0WK8<Bm@PkN=)6&goK1RIXTD2$9sBuxEh8bjsVi? z?Zzpp*DbE`c~DIH!qk2E!QMonm0@spy;cS#bDVr(VPV2u1AZ7Pnn-gtyAki(uUavt zb8YL0N0*bc;H7;CSIL~?ntIk9$!ed9=gSR7OK}y_`YiY&X~dH6Tg7K(E#zwzyr{z` zMnj{}<)t(qu;3$j`w?|NY;kMwT7ROLr%O1Yv%y+X%1yzC;U=IJ!*#@-(QB?Z(%V}M z8YNe*T*=GJ+m<GOHHx;N=v<H_W<`7FPLQXCq2nGT4Yh$aww!Z#_gSaBSU00Bb7U#e z&?FaLJQvb%b2|b+Lm`5N_C3Yp*#3@zfx#f5$Q88r`1c!9F|U(dvAB|+z}vp$Af6#% z-jfQT{H2OdNMxj4-%m8OIiX~|9&|K|ymZ%DDl{}c{3zZlXcUA&#wI0Wot;*om4Q;{ z$<Cm=iuNi9U5F6vy*(a!<HBD*e}A3Nx_^Ttju0Rxh30SvO_Bi*fe!1~sLUcdH`m;> z4P>RbF#i4FXGaI19jiYqa6RJhj^D4Kg`*L`C%#^TFN8yKgVr1+LWTB;dQlPe6Rq4o z6%+OIy$kAo;26SzZ-V31gcRH^9I7HelTbg=Ufe)^Nv$8`9@tF|4i0Oz%b;u0lX!2z zJ@jsuRpllI<?_mkDVfXGjM!kPKq&sJeALy-UV_TUO&px~_Gj>@v$K}~KZjPGh@_3V zR?K`PbaMxd$>PCHFYOn!g5STWZ4pR_iSaWYYY8P?|I#x$qgGhR&cT6=g{2RxzQ9(u z1$;H2%|(amw6y7(t@;|@%Zr5BijYx}SJ(X;p+E=0z=F?#Dd&(z3eUyG1)w&V56b%M zmQc`TLdwqrqe0*XnngRm%>*Cd1{5v_FRx#C085ZvrwAK?nB&QWSh@;f_g-NaH+IAV zA`|BG=;Xv<fm}VW?8+~%vm<*M85xM<R*ydu!a7h>Qv;b4XWf<cjZY&ZclAmaC+!;U zlVO8IPjQ(sG00Fr{JYI((Ff{4mdOzj5f_k7%0y5d$E4`|^|-;!&#z63r>Uvg+}a8r zE~x{&@f6hYK(s<yMuvol=nPa$(qMIt6ixzq15(703#qy__M9HlvekiXdwctEY6RMQ zsk%qAy}iApSb^{$d|VtXEI)gDSL*jJA&b6mI|gX_=g*%Mm$7MS;drR%42bR-&p2Qj z<X{<CQ#kV&WDE2G71rYeIZBk7s)FGBKnf||45X5R@xFN;7UfM`o~=muU%!=aZ~ymK z3xopoJU&|5xgUWyIXZK4bAtl{5P?Wn*F)fhQa%X3oRfrP8x*F-0LlOwOnR~V_pcr# zOooQ(mbpnuN#`f~gjj(^MMb+Sy~QOxY}nTysH#SVhlk5C?(FW0c%PJ6HfT{;)Mu?V zrc@TS3Mz#{PV>0LB+wl@2OM8(nbBbAr%x;;x{8Bkc|kDw*TrAGgJcIL7f@=hV$zQ| zP4}&hnL5fQ?r@oR@$o@;9uTQ_FJ_Idc{z>Tt>On$DEW|;bq_m**F3^KGdx@g^5m*f zpb_K9g4~ajN$=|O0Vagmkdc<A7JNy2?;buK5h<yTsw#ZZwZU~rrHJTIKne79tS8D= zK~V%Ue<=h|V0h?3#yMD#)FS*Aeec&oPXS$3*)IS+1Ij=WCe3fUx)g2qm;?m{@85R@ zOaNmb;krpxISgSKj6(?g2*~6lb0V{0a-Ka4qqyIp=?-}N>C^Xtfh~~KfDBYreEfl* zaQFV^v?mC|fC$uYP@Z}C5WTbXvHSjYhx{8x+0I-MUxjzG_G+JYjgO64l<V)Vf5Zy> zK!-~!tp*lAanGa~D2=SFEY^^G8pcO4!2k5Fq>zel^}UuE8GAI@>GzEMRpnsH-Z@vp z*}&*%WvfKeorFYeD#5<JQT?_g9$wz+7F2?hAz@T7Odn8W)X-D<`Pj;K38JMvJC|PR z$5uB0x|(eFZ*eDbaT?Xv+DukpHzjIc?2j5<yLweI6!eTzQEgvY0Mv`NVUdsp*@r@g z?<^;Wu;R!53VAj-+(PY6SdWU~&J@_!otZ*DDEfAHb}kV3!DWWWBnKn@J?#BfOLeo< zybiT|8pVD4J3+=Wku*v%&*bEOcEqtm(5BcyE9LN98)5}y?BA%Wt=+n^Yieq$_Z4+6 z2$_ulCIQF`xrTU;=0c|Dt?hoj%BSEc`(pa}y6fIVMhbM7fPpSy30RN4tR`@+`@@tZ zgJErL4N63YwLAi{Sad@$Z9wp@u>&L3Iy|hEr>Sj(jf?Ahw4GU8yahy3d-(I|dT$XS zq4D|wxE>Z3R@E&t9`eH<!^8JsH9<5*WL~?00|aQ|7AF%^He@--%qW9q?$52lmDc0* z1x^Ql^n#3mf>`|X=g<87J^Nn|15~A@TS6&y{{b=kR4zezE<`I;kTEzBC3*R^$x1u8 zM{vgtr<*m`MP4B?!6o66^8~alv@h)d((^t&NMa)g1DC>slyHA<Z>r2vBkre_sMGuY zMyi)+lA%khtH)sSh1%={Z_m!pfeKO{EIamoIWsfE<!CT<GttPXAg<ryv%QSFqGH%_ z-P7ezNUtDcINqq7Rn8DU2LU7zHnxxtpMc^9C8+VTdR3Mo3qGy2us3gxz$4B;CICoO zJ88eG^fPPc{E%+0VX**pD)0j~z%}hIccUmo?x&LO?$xYyZc^6@ZUC&`(y{z=^Oskn znn%*puBP7u*`45xP)`X#L?wm4&=`ldiMzkQ9|HpeK8{4(!!|WHuY?@hHt?=N1v&<X zkf0z7Q3!=;k<V|#KAAr5f3t0Ji$*jtXB8+q5<12>`SY_g@V}b3Md%+9G;!NjgdDH4 z#l*w_B-E)pbAJbNiP%kU9v+;AwSwZ}K0x;Y96J2_x7v9<9?}v^%?F$bI>nA%iT6M+ zOBcj_06l|+bX_iPY<O=>-1l$%ez%mvz%;E;zZ~lmV?yV<ckiI00iN@X@!0ONkCx@r z{kZ~x0}T86IhHy_ZbW8S820WZf{TkQ$QXnW2f1%-{~7-ZVqpMslmO(xp{NJ}fcq8& zYg`8iXpJOti*5BKiF%*xVcftPx=n@(&$@u#AVo8%dN~hX6J(&C8yiQ1AX7b3UOr?M z>n4(goBK=0QKJI=qk-=34N#D3v46}Kmu#32A5R|uRA)aJ0T?H6IB!$*YJnyK+zH;w z)5GKW^XKC3JB%zWZwm4|egQ>_ezg%O31{IaGBT|I)dWEv$*eOz9Owy<BP7BKgq-Z^ z>sK}6W<8CKneY@qeG1$@n+u~Bae)x`4iq2(+}YZ0wuV#UQVFWo^`PR3-O~Dc&9n9x z$jJX5pRq+M<<ERy!2qAv8>*2zxauUFoC8+`1w6$&p0N6kgJ4Ze!72xj4}obCL=wSy z+<jd264<ia-h2HG7yHH61z#N>AH(W6+}-81frR9X-E95$@88!l9lo~VA=%<OEcl8Z zSC@8V@*0f~4?CY7{RMK<W9C-M`+B}jr~HH)gyU##B6aSw!1v99MjjocB_{TOVSPZr zE?h>#8%Gc+SE%inG9-LMR751jAQci5m_yz8@Q4T(2ZtCrMgSB!qY#LYh+7nVa(CVV z&;}YgXtLu>?;4CZwU|d)-UVA|Nl6LB!`Sv`Sb-+3VdNfl>1N}gkn`mW_uGf`(Q<&4 zdQycnnAm#YLD8>Xadj25;txzR8wZIla61la-Dx6~t-=L-k8=lsr!wRq@$~eBhoz>A zjgN2LsFc5^Bmy}{+{iE)b7v_iCoW%dC2$!Pl^TaPYGzzZkB<HeoDI0KXhusL8!@X9 zjyU;Y?i<{6bdBxpmVmmJiHi*DCLkxFe4oFQ8VXEI@&qL@vDU(64JPspEh1BujDiCA zPqTyLxva0Y#@0%Q=KNA1s0LXJ7%C<Xj_n^^fWEnUhvxu2Nl6p_{INDSUs);Sg-ji4 z87Zwo`5gTAT!WI1#na!GopskzEJ>*UdthB8UQ?v!nsEoQ3@BGJEAP`MLC=HFtAG2n zNDLB3ZJ%_CbJ+QrjqmL2Kn)@6w#3Zz^f~zGJbN_aAz~E%ec%74<rm-}NDnDU|LY^p z$gF-8D+a7N;5nG8{QYCnx&80uLTHljTKB!fWf-F6C`3rmk^{iZ>*k6<Vbn}dLZZR2 z&I1D-{bNqf4_WgkuTPiJ(7GiR6|oOvpP_vZwRh~QW-d>rxq-2U4k-QAb6QbRFYp@S z)EH<=KRP3M$0sI|(;aYTsQ&A(RGge>-`x#+z-JtLU7$)JU5Sm*3oR~QFU4TB`X9`n zERd)9!p5c!Bqd?ccHL@QadKPy{-J-1_!r*dgr5xllLB;OOW}#qa0v>!K~iFOBr-U+ z^q*9KkNN6rG#|SnHOYUO0UtAzKehvUWv=vIxdHh>GND`|#m)b(dBy*Iax&whU+B^i z%L*!S1aF&XXC>(9UbCyHsNiB@5nu%Z<^}-cA!ST#P+`3aiM1+A+1IZrqV5j1ww%Z} zA6T%POiWFyok8xBizGDb!-us7Z?vIXs5zap(b3k9PfJ6I?omnjOu;%H`(h0KlcN)m zmpUgjB##;`w1$U5CAOm@zvPR&jgj~MFysibVPy6@i|qgi?=Uf8T)$32N}5va2;d9& zR?a8i_WW_hExrd`-IkdX@VElkF}Jhx1-P+U9vmDT8VU?#h%N^#J{Jg)AnFBF(IGf) zP~iiXNQ)~K${2b1!ML|!-FU#|p=5-qLqJ2bIX_<l8n(pj+Ao=ayM@98;T^?9316RU zl|-)ut}LJux{Dn3JUk>Q??Hh8{%dP%`?$KH;S!Lz6$jreO3ao%+G612qa1?j$Kt?* zGzH^2hI-Wbz;lCi=f!;RZHf<KXhYQhQob`(!1eL*flflW9#2x2rmeBD8l)(una9ge zK+$B26Q${`{o=ena=10SV%Q6Ukth4>P~K?a{wzLuMRNLIa`~MX6~aP7CIIbJzFF|~ zl~E<y_xqur#KV}a&WeWsvT~jFF&YI)7b+aFsAPzj|I1;MvtdY-(?yR#h<9tMnimO^ zAYZ7Ra*?l|2XXTS2VZeBEK|@@l*#J%`m_p|T0T3*Qw&N?S^Z?dAi~Fi;2N?DMf+sH zjmo|00H&gpao5%+#$NL&Kv^7~e-?lmaM;x`IMl*KBqYzx%^gD_^lU(&3J+Y~2f0J5 z@`+2R5#+=`ZUK=9o1CXvlYoSz0xCMdBxUF1jMx>RebV@Mi33zrfM5hNlp!C0xiSqN zJez_C=i_q%=~Ve_9w8xex{s<X03;UI*H6dIGw$ksnS*(OwS<q44-+<gv%5f@Ee<>_ zlpDIbyKiA)ws&?K)O&&WXR*UQTUeAUpi2og$ED7MY;{Zj3X)f&7%=;<o^wFm2Zpb) zu@SIz-;44n?z;3FxHPc|30(SRpB%Hn#!Sf$Apa&JCawc;1PtbQoo6Ks=Rezq92gQA zCxD(;u3hg+6&i$O9co8fob&kTB>*7->p+Ez|FOswH{O2_>q8a<WB4{KtgF4f--3^$ zli%fG_aqFam1q#adokC|sZJv8d*H=ET2_aZ@zH=67o>|2S&NCe(88~wI15L0L&JK< zl^%GQ0!_AXnZdDnG_)Cdlq*VpotT&iwNYp<fTM)Nikr-^_5yGWkPnIw+m)SNT!I`} zd?z~q*hWfHo20yj{tU=6p|o+|g%<7A^_G2a;DB|63!S%SrfU}g6F#<4#aXh`ItH8r z(FUhc5Qr9X1TOAvQMYYytx9Ra_xbpS%6@tu|L2=+Y-~Vj6YmoP*`(sKa_c_|?4`g@ zJ{OR24${cpYUuLHS$5FB_P)MR)_mH}{1(a&zJ168Xb4a_fav3+qo2=sj>dV=B%5BL zQi!uTLGfolqaZ}XqX8SIKp&lWiJ$=H<%VD<e7Xdh6rgH*bad3$ry4Ey?1Iu9NSI2L z6X)~1xVQj}1X9c%fGaSrN|^><L$gTwN3-C8e}r-9?dW*%M-mO~E+Hy9khJvl6qP(c zLn~AK-{g1x@BQ%qKoa#ymg#TAvTBHmi7^qpZD{aCBCqPeJ<t#lF%n_b)z-p#+VlIt zhGG&*Ol31wEzHdYK<s;J>Tv*`v>I7ZOKYpcda8skKn_`H>0#ef@Ly#wqj+CmSO5Rl zEu+DZ{cOcStGx?ktxB43OWgseH{07omVzJJ0_CTOw{Pto9oNUdu0Syk*2o|r+_gYR zJ$SYDAx$1G(6O7ULKPY3<)Q0HOjJ}GS`JKFu!=syvWH;(BLEZfc)PiH;My#rA(h~} z8Ydr!S6W&MRrZq7QU^!Jg^u&{bKn&8P`(uKC-K{d0B?EXelG1mU6@APE74$ReIM#u z>rgPql{o9e+W>lQn*>aV&kr0ftRb*0;2=7m@n}>B21)~31b3Ap;dP{%rwLNLyFWm& zb+*Ab!&3}61OU=@)8B}jzMNP?sD4$6SX6wUiDEL?*j@l7F-0G7d4A_3%NjJ}@|elV zXRFiVJ(Q6dk*b0@K|_AR=r#8^*~?2ydtxekC0`iE1Q-rfDZ3|4gdqT&@z9I%)nY)! z5GGrZyYf@h)1dln!AH>@oV+<x2MfD;6g7Ml;SjZ8NK?6uk#!Y7Xnr^NfDyrK_WU{c zdBD--CD*QKG2OX?1D}R86&TTFd10sDs=B&~X=&YeAs&_k%D+#NJW5DIQ#AbI@^tnx zSsn_gAme`T*-t!;N4mOWei%0a>c%H0>o*j_1Z=xls4Xb!6g}31lG)?ORMKiPStTV+ zS1uQTiUD#CRLUWcwYRq;=mL@bc^b?{MzbiTYtVRxdFk%x2zm47rK4kkp@m@_6eGgI zQ1}Y`w49urq2UauO)ojP$A#LnYkw959c(CAa~ahG2Bs`4hoRF?CE@9bO-w}bZjkT- z#{t}nTw?P3|CergG5V7JzjOiq_gplrCDm@v)VIdqLlc4W1Lzzs(^P70DvO?O1+3Nm ziyP%Olc?SRE)Crll!I2uFwBl(e6(8!WYpryN`rPSJizx$iy|Qn=)r-RM!|ld`Y4o8 zUI(m*q$p_#RYrrE0!RagiQdRl?pn8V@cm1Ri-{!AU$OS*5B3tc-0n}cKrX<HCts~d zdJ`II@XaYNGP0Nbejx;wWhNl4=3e+aumtZctJedM_8%u+g7!+M+1m+un8)62oyrO; z3vQfCqKD6UZ3vv>ApPMIaYrUqM~Yf?VIio0UjgpCHK?Tf*^CqLqu`HR9jQF3j}^PK zEzw?)ei}Hug2sjWO=bE;Q7=W59OGb)QfE)kOu1D;WMrh`9e*Pd)MH7WTNVis-e~(v z_aF!mI*o|SXMh8MJkMM^;Lm7iYw|bSx&8e7Ks@@_!U8C0OVg{x8P%d7Fq+$gyNu?) zj!sY8nwzIkCC|fIQUrQ9h>F0WA3+kwYY+YsTugdg-0;|I)NkJ}S-ch^Z2ND18m`~j zZ{qkL3SJmh2Y};$LEBq>Xb@;C<xm>rQ_>)6sZ%W&2E}ByxO^z)lw@5)<D-g`$AH>O zLa;GekTJRx9=b6f1$ofCj}eK_-G%P^{i$zrR$pJckuL824b~i7Bbhvg5oo1>T$S5# z@@Cv*Rb7~E_HrpRs)OB0z}wuCD7^`1)y9AcbHGZvI6H=|3{+W&^b56f2g$LogEF|~ zAmxh>LWI(4;nb)iLm!8pzP^mCEbPs&S9dtWfIw!egQhb>0IiM310^RML8Za}cH(28 zWvGRnScHX70K@^-gkx!G>AL^xl$oKi{`)#gPN|sx$`W%*z|~L-IWUTfPC-5lM7JhR zmQr!y+hxTl4Akt|vA}WX&hwv9bigPZ8yn|1$fX$K{>w@vLtDc6;Z8gebf^a-?EY8R zP-TX>1c!rdIhgXFVu;1Oq9qh&;Lv4)#}XRs{BOTkOBZ$D0r;fJl>tr+`UMIGS7pK} zq+=MR@B|}v-9+J11pm2Ir?H*g*3weB>(&g#<=WO(0~q!D_q3TXVpzvs;)m?)x2T@+ zV*H!mK8K^@<6*&{&-{#aeSGSXsFO@e5_?w!bgjFe5PIh@p}lVb4?YX*B_&j!W`Kp3 zo+>udAi_|o_Hu{7-dC$e)Y84Q_!ml?E+`LqUgaz=j}>H0%4KLhg)j<geEJ2BvNAr3 z@W*fSo}f#OjgNOH-g}VMZ#`Mj&FAV2Oh`B-FIsm3)Jkb?DytDODsth%kn8(F?f|<E z*h40d%=`kKU(osFi--I_3m)OrPc|UI!nk@xS`Da(<s~5Rl;!15Ks4LL!~__dJxD4H zzd2#jIYBN1O|3FmB(I*U6pvD3U(f1C_$wBpqb_q*MWq)wnR=KVh%S2NFNR5tyrNT5 z3Wi@u9L@O;45$b6#V{#QQB#}o=mCvV6`hOPfnaOah>-wFD^Mb#4}i>TsLs>%wdCCD zYJ2!EC)lgw_T^EqB^U7OlOWcPWMN>)f+wJl{@K)I3Y-@r^It6shei}to9OH7qZpM! z0Ck0`BQp{J9lsB)2|3Ad6$q=_Fn~Y^=~yN}LIqWCl<+(JKV`T~l41~EOy`m)O>wKs z6|@)9YD7wdkAI;5$8KK5KZnf*kePj=$78VWfw=;c@P_4s&mi;c`SbYr`0LlNgTy>4 zszA60YX3#Ku&8J)xJB@{=@PydfU$rths`>4HN>F#0mKHN2b1StVF{2vlrn(~N`v#D zZd2t94GZ^S-w9|;7^;fUE`a0#kPK>b2k2IVmfVUDENhV1Fvx_FiF>&@Iq^xW4O4>s zMz$63=#_iatS!B|+V?9_ok=dy5OYf4hNQxSm}dYGczJjfnc&`F`wfupZ{_|BMux}) z>XaLskeHZ>2n!zxksUJdX!&etM`DOrfJ8|Y@IR2F4adtV5P-n=0E@$j-MDe15_+H5 z*r1N9J$3Z1rsfntl`D+)u#OR30KC4ow6Nfhmv5g2m4J9NNZG6CK0rvZp9i<l&vy>; z>o3YDpnHG?+VdD0n~6j_OCfwKBydvmTa#7J-<-feb0Y^?CY+B+ukFFM?(7B+1qKJh z9QKWl9s<*-sHpf5k^S)_SV){gVpZJW;2;dqn}yyUOvr+jRa9J^oo^u!s2*43Zy@5Q zh&}+aW@cud)PYSoj3Cfd61&d-abE`)UjU=8wL=ro2fL&MW0U___`B%f4wVK-?-hM1 z{zoePRzW4W(KVDmD&yl*%FW4fSP)AE!-b7Ufa!l+?T`(@M#OdVnche&jlFLCeU-0@ zp^zAYvHL<F9xO)L2&%VuA6VERN>>lSWK^-PEWdahOpA#5EL_pet?1;m2ZXf@^j*h5 z76|)Iyk9My27VXzsevdBp!}JcnU>k)+J;BgHHcYUs2Fp%8xp@~++^U)%-D>{S_cOm zp|S@Y92knA&skMv<son#*w?RBUhOP}sQ`AFpNSp%SgoeN-A7vdca(P3XJ`~y0q_Z? zony>c{n(Hxh+-71u*Une!jgLP+jmGqJ3Bgn-RLmWf%Flae~uJGw)%L5jX@w%%~YYF zvOpP!77`-FKL^y+)dh14d!R%DHwT?rl>F9T%FFMcJ40n3)f2oiSqbnPHo%!*SrLF$ zQfDY(Iq(sxpH$*rf*c&yfW|4pmqWSgtK4^&q0i-Tb6Nyw%77?;{|E5FkzykW_*78^ zFxT^f;?S4^*%wR)R1S*u%k$+$?-%jHF9EQ5!4^KiHJ!j#5evV5;UQsNtj{(yWMpI% zqYk^LPoGLkzB*nKa=h*@RjADn0JsuLAu~lMf)#+IUZ-Ndil2k_w~hX+Hdxfq?0{l7 zz&$2kqT&R=sC6iN0j>lh3A!g8folW`18VAr8<U3%krD^{`*H2h0B`|X+CDtIgoRLH zJ3Rp|&vq9`j2*XHpr0H<O-haco%1OH*94_lNU-YR%e8*x*;4~+3K=Pc&u7q-gf0d4 z<Zm_(AUpZRGWKopGqCjgJ<3oBH>z=755ij;${U3IC%>|wD1sRcO*8m@x8*KG9`FH5 zy!;Sr-yi?r{sYgmblo*hK07WhPL+i(qX&_GqxJvVFz~;GFaNt;2d^q`Ml9%Nw?<?O zSpu{;<3a(8{Q$6SMx`VTAXlva!$sCUfgT!3TG~eh;x<N@<6~Eb!e|lbNhtKBiu<{+ z(2OTZl_j8THI8pOm6ey5S3p2OL_|bDpb`qlVq#(<B9q`s`}<4&VW(8+*MclnR#x`+ zDOxSt?xsKLjR`=26B83qLjo3xg9L*8CKhBv6QX?msqK50A$Y*p9~>O;DM3JhiVQ^m z)(F^0=w-9Xy(aFy!z*sLmZxttamO%XTz##0=PTrb6&3MvjE{SU#*FzXmH5o*5lH%I z+5q&cuc4byIhP#{HZ}(+qwnwA{P_(8c$)<uEGgvdjk)`YuD7w9sxt2YQXmOsBEVc! zEY4qDRs?#s%^rT2(8(GC?bXrnMRj#`>Uq}xKF`d>g?l27R@_#5nn=Sb8N*miAcgnR zcykGb22WL5>{Hto?qN5TatIiNQ>y*vGqQKyK@|Zt3_)zu!3vR8SD0}a6^lOt-a^n} zHzE9J5q@TR0eF#Z43A=ZS8fLWXvMh&PkrPizUPf**t`1;_oIAqF5KIloLVv(eXQ>W z2-H2?0u=6-WCYXm|JZ_3H$n9>-b^n(yPF%ki5vSc_vGz1d7QkKnp&oM9;}}=XW2Vb zVM3d>ia)RwbFOtuGq{Wi4{dul6nz)^Xj~R{=q_eiKb@OiYh2uHcyYI-jx}5+OS?e9 zQ`cjwBnN3VH<LDHa1cJBMhOP2T>w@B9NQ>$(o?clhI`EHKc)>~e4F8QBt~GGxAD09 zIQVRX3m@E?JzU31eLx`@>Yg$BZh6vst)23qL+57_Sy2D_zL1J0<%h3dZ-(1Zxqmgj z%O7ys-&05gQ->9Z1j9M@@}s2?;Y2fBEZl%iB2pi$;nwyxuDjP6KH>oCn8{UAP1D`I z<<OI+-eyaoFxoB3&VtG9g~y`kVVJ{FG9tOOvZ9G!>LpH|#J2d2;+1`mCH5}!50=6k z#;cRZ^_t{Nm7CMD2zwQcrBb#3oL~K)^O;fSZ`_CTrvzjN_v+e`1;R_lJ3L;v?JPcm z;4UqVA+7c@2{hU4+=FfW=BU(f&w1m_G#9|LbtVlh1qs|NCfCp*3k?YY&!%0F%@UIG zbZkuO%J$>``2(oI$h0^KXRt2XyY8=FSoG-=HyQReH9nvB|9o<1QWdjdZ5m6+!1{hp z6V{4IUvu3Obp@uMqn!7vLm@Z9;t6)64WT(ZM`m->RxrD{*;n9{?*E)3_8LyHL7hTp z?#Cr#&4gY@#OK}zuZ;-?4+*(t_zUdG*Ae*GZJIT<<DhNdnWMTYsj-`1NANGD_}A&Q zht)+0`}DbKy~MflKF>Yd5c7Y`yr$XDW~MqFZJ20?|5)pDjH(&nOczH|(*=lAZnDl1 zsxjXtj$K=~Bt@$gduGDZH##vbg~S^hBsdTEG$S8>F=$k{boSO*9<~P3$(X6qc~L)q zdhPKBM<9YO-t4|Uo0x&)g*Kh^*WW_S=z}NAJE6`s7hN9q0aHQPO}0W_Mg_hH+z&QI zzbuS3ne2a+MczDqc<7>Cn3ioqm&umP<1nN%sIYf^+5PX3`tILg1`m;TrrI*u`~}io zrOE3j`Zvldi~7_IB1PYmSN$3pN}6%z>(>0eI)$7b4vRUXPdgTNq_4$C%JwYHbX&$t zw9_YSpB#->mB)}-=6vdkN-tEdHqx%t@n1j18=iO1=`k%xNNq=UtdBQNl<7XsKjz<x zXzmDP#$(VlZ&>K=Yuy>BwH1Hz(WJ50x0!O^Aze~mC+^yIMZZq$b+?-hM_+<9&s^Df z`J0yxrfaLMdPAR8AezqVK0Y4h|3s4^?A-oA%c@@YwQ-eN?&^CYx9W@O^#?UsZ^Zed zFU8Y~>E#rpdvVefec3qgUT&_|MQqNbbB_G>&7SUN?fS-9xjz@WINVE&{lKy_{pg!V znYKPdfNk!ykV9qwkz83m^OXD3^{u}${#49v)KhMbcaHQrq@Npz#OnO6pQP{<*J`OO zxtw+5E1;Qe#T?Ldd@+&ML@F=$`Xe%~cevI}$NI%LpUvj)o8rK4q_bpye&}F;8F}pX z(!5&p=zPRfx*9{Boiv8)bCU+uC&#q9yRioZyD^Xar*PT~jSf$>UJs=c$zcm?_2P)( zA(@q#SBJ_ZP2SFTFT2K)PmE2_oIAcCO?vp$@M841%=g^k$>%S=yNApVD9hKbZsMhd zG~{y$?6i=OX(y0=CJWj*j1d*-{d7A+*j>tYg(+5-4x4vvs8^_$s#6F5W43hMZdXI- z*M~dW=&YZN1&Rv{9dg2~yO}$2y2(c~3oF|u!X+-<#hcy;@y0g3!80Kryd)1=5NvGX zPBkMB;-?RI=@(4Mh<syg5yVr<(G>RuyStC5Qx#l4GyG*9{egzC5?yB>A~U4a3+wMo zzqURiB!}|$%hZBk6AK0ty#QlD<zMKybj^J-L7Dg_>{)Kw#@<v|Xvv`!2SXn$8_9y0 zW^2E0{j_9|c3qtl^LjaZP)N<zu~W@>=ZpWXN{9Epls1hrugCm|<Pb3`<mG&3l8AGv z@|BM88rvey+u@Yfc2;#y<>wXyYu=T|;A?RDi23@dP!{hSxU?Ge3an*gn>|FFSFFq} zS>=hoMrV-2ZW`7P;UR;*89kDw{PZckppiIIwN~@2tENrD)Mr)#p?}ylRoHv4xf3ZL zvD{7Y8t`Y_79l@8l)2O^y3g{2`UdXr)nCuHtiwAL9BgO$!%rK^6`tRkS6209662;Q zB%hEZFMHgLZ=8mcKGQ@mVl)1(BRPXg=!xk28jauz+e?9>(}Y=S8IIk*x)RlzZtVM; zy=te{(=}S@>XI6VyTuL6PZXS;oM^}h#_9^T`YxV46n#FvjGh!8!=w3UEJ1R$lXufh z-HBbi;3;{0W;lluLo+@0ig*k+wkdf~W;phPbBMx0=UchNZwVQL2p`iS|9mAt{VnI# z8?$?<ZU>fThLnv>_A$~N3L07xg>pXOLRg(VZ`dx^vc!4b&Mj|*iQP~h;25d1Iz9Yx zf<WYd;7j0&SzyF1vEIkkh|eUS_*ojK;^YN#*!NPKA8j_pnpuQohL@=ob8#KJZ&^-! zYDh_v9;}$so-(TLbq%AfQgLZ6#kN_buyy(U;?Wnf4!p6(cu(rFa;4)zXVJ`5=2!ys z3?5DH-X300F6LbJ>BsE7ykg9Ek2XAnT+`iWbHi7@-4$6VTI@?C%wIpfyT)WbK>quO zN!rX$`T#5iKKJaz^3YpKtL9<bi-dnljtr<L1jqF{Z!g8AS4DNk#ORrNVTPTYkL`a( zGRBTSC7UV!`lC(BW8dW<BVqR#nTKrN+nDL-m-#$k(L4L|QRm1_rV#|)rc)4}iDg#w zz)$p{SmTXHS5@kD2wV&07$vt{DqOxMd>STpr4d!CjeZbv*FG#!Xd+maTLhQMd24ZV z)0&#vmn%15@$I5>3dgm+u%~1v){kAWn=V2cwp#`=q~m)Sjhs#<s%Ik@?_Ta)qhiME zWMkCz<nl~Y&e%OFNywFbN*ZYu8Nx_{gWmptqcbhVHdjKvR?kW3opQ}3Y>4KwIyj-! zBk)_VGu1>fHx~~n&2~;0F3I?Hv0nH|O|;9-lvrS$fDy|BGKDCU>Ox{xywNH0YEJ`Q z5;}N)HxSAHDR?*frZo2X9}lXgKBB@?r)MHD-?@zHjxYAI=@qhdjWZHYp0>@W+^#*0 z=y}@wNZen+QA@ZkS_(lNA1k4@yXaD(Kdey{(~+EpW5lvp-)ZlLY>8~RWBX)vLgY(m zgX?3AES#;uc;hi?_K~+7RMHM2sf$gt8egLvRvMG6s!KU$`gc!HoT|Tg{B67DcaD3R z<iyLKu^76<Q!=KH>_5a0x)<Bi5I)s5jFc>m+*SBhEXu;c5TH)!w-}0eu+^h&dq7Yw zlXCHX4k^#csXB+Q!ujFU#cJspyLQ|<*OXgod?Bek5wGki-kS;Uy|t#?SUKBZ!rF@` z9NtrmI_jm$PdbR-5Yb;*8y%Oi<WjRLbEP3kuZdO&;Q)!Vwz37nKRpi~O^dKjr`h19 zRcC0JFk-~4Q3se=aLLwZBfGe}s@iw$^WHTN2yqJijU*HhK4HPEN6<Z_EECo2FAgmn z=-1BbH+z<ls=~^6G>~LEvHOy3?fdbj&!#-{`gv|q<nOJv6@1T2#cob|bOMF=%m>2k z6E&S&vmL@z1u>7L)uVsNi6I4h24dgH9<F_OSx#7RpV)O%Ldci>HmUB;kqKQS-1<nj zVg85(FAZ^eO;X#tvF!kLPFXJ;ZBCQ!US6pSL!H}1gEGui%+(i>c=FwDv2I`II=t^} zTtsB}rmlkparRkR>bZ~?2&f`5fALHc-tQe~454Jnd$1n^x&jFG@8M+lqM52Mx(Vf+ zl0VEmd7Mq4*6_U|XZYmCqLP76qDtB7ZiLSKyVTnsIDau_(7Ku4a4N5e`V%Ui$;!4h zQoSMY^+5|#yz<e*BN5L?!!a*fC6;oYX(~DL^2GY5W{Zg<n>eEyo3|yrhaaq-6?1`{ zw8>z7kCAfP<vD&TGv?Zq5gY!&pASS>M~KXT&`O?i4%Vor&=WIvcWITy*|p>WqHxCP z`;Th>u8DA3j94`TLp9;k(}n;ZgMj&IZw_wk&~OP~k$vUG)YVMynvB!cs(w`|tc&_F zsht)cE1l>MaUH5%aoci1%WnhJtzaD@8C4i#L)@-nCK$rr6r}CaJO=f05fH?-<?4?D zbBD|=+l$0b#Z$Qt&gZ3qe^m~~F{p5KejD2{s2QgZi1(>^WW8azF`&j$-pC!sV}W~z zq_0fPWS%xkmp-5>)69<<Pu}JTS#7w>@w8|ev&n-dWL8R}_xU3eG8wF9A+uJ0X0CA9 zXhFy^RsKnY@fcSP?(^kUefOikEhK_rS^|XVDzqgI6)!CmU=y+=ci;5tnFiOD%=2%C zj~z8xzOD`y7M5pQA4W6A$xsT>(f0MWl+Bmf*U9>P%lY_lw!VBYzjrq7(M5fTH>=P> zs8;Zqh})Uf=F^hj<1O#sNL_fE#_(^{w71oHo_Z23nitN{L=uYD%aOo)D-+1Gw%4X> z$nt{7!$YGWJ+?0K!lIAT7b4f^YYo$GB>U>8)unn!L^2(Hpm4YoKfLaQprdMo;&}%q zWnLU_BOwVHc1in-w}ID?KMiwEM@i2MiF{qhZjNqpp0QS#=lZCZ!0pCOcD74g(vO8i zeRmBB#TwbDeoZJEe=maaC?Y)D>2hA8d@XnDz{1Xkb=LDNSw2f=!h}8Nkf(tn(P^V+ zWtPf%c4YU|eLnvAsj%;U&j)9F0(Pd$V+JB@CFjHP@7#Zi143CVH5gVDaW^QVjuzCi z3?J-V)(<IfKLo_~Ht=1C?vJ=_%n`}$z_?NMNA+^FbaM4ou-VM8LA<K_L+${3DUBd3 z&Xz|Cy{SA_$G;y%AFE&))QC9Qu}ioJlhX|~xSHGORVZsLZpi5y$b~3$C^M%vS#<we z^=?64v=6T2bn6|TpRi;_Q}9;Fn!6%%S$|z8!$*FW+V3XKES#oRAK)?PoKf!oBO!rV z8ugan`drLpAeG$6C+%Iz?IY!yR~717jo!8#(X`u%?=TIrBA%@f>(n67zE8GHtNGzU zZ4QG%{lzLrl<tl+PxO$?iw(A~YFJF#Z_NCKg+O;mIqiJiivsz{Zfo<W?(?Div4&!5 z+W1UX|9Jk`NUAY%I?c!G$)}ou_>9U?Z`PlaMJxoYh6#B)H2Yrcx37&i&UU%2q^w?C z`_|!<j7;XQ-4-Sd!V|t&ITl$>8j0W8PM7!B-naG+`s<=a8zA4Q2@Wf6oCOxq<}dLe zW6?}SmhxrHrMTJO+yQt&^JL0T1z&TAb+#(r$Hj6wuX!HuGL`7fU0)%O+%m<5<zHi& zPuBhXKHN_^=&%uM!Lsc^PnAu+f!&0u{(V6KU7bBIuCv7e_JUQeFLX{uK9FAh`daaU z^bK6;_ZbRF`Cc;;I=(x{rPMW%WZ^^#TB^i>p*aUpj{@2&H@yy)1a8I`H~6soH%F_b z)hvF!Fo~X9Ty-2=_Bua5F$$M?q3CwVN#mDTwT{TVsH?G1_zLjbPBy(fu&U}K2mdCv zjVf0fzBL`G&Db{)lYs=@<)SY4)Z4$e2<I3yh(*s%2iJy@3e{vwcR~t`z7|;%xkwb( zzSj-J6RtgNJJvXLv11@Gp@=s-LJGB$4qo4vkl3_jCAAy-X7y*$op+g|*FAMMOJV(0 z1wr!$Mq4D!rPc0%1dW-5kdr7r-B7U(a~hkDk=m~fxd~nQQ2CBuy@t<Ot{J$$(akq$ zlzn1GAhlB{!drjl(OBv{YG)S3n4_`8nRHPU`1njBd~JgNeYkEeC-?38Lch##DW3>L zW}=3<DWM%hz{vroWbA~hT5Dgd<^A|f%d80g_(+PmU_3TXR?o-p=@H_t?nId#yNY67 z;d#aOIctie@+)^IqjE_~uw9msJBh~UQ&hwa)OA`poRwu!t~M)fA|hO$G)Mzfow_Uo zc0FBeY|QAqcgnVRrPmopXmqyB#wJ>o!w}S<9$HQ5>p;v9p#4z!ujP82{Z{{;^d;R# z+v#)Bw2iwrL*+l;ZDyFIe6{c}Nq*tao3n{(Dk10BH%)i;ii>hcJ8i_6;+0LRsg`+P zS0-sbqz`b|N#AL~isAZU|7)E2Cg(5Cw~yR3+bSZ2)5JIb5F^)K9{MO-;jX-j=tzkS zZN|Ex;m7NKHfPM1R#T8wm&Szry?$TfCSwJo%Cn(iFW>Oo;FR3)Uuj{d#QDru-!lEu zs>|*PIBmw0`#f^#I(xE3&m4gjG2s}iV6EHyvnoimX91JZE3<1-n&0^S4W-rU^`o~s zx2YQTVrh@LJ{i!K=r`ERo(xA5%3eO<4PL}_4xnFq`l~AviH}_8KTr6<NO1FpI&C2P zX*X_=F&Vfhvn65#ofW%62lBV)>VNeDs7g`pPYvG=%Bed2DzDIqb6c!^+a_i}-dDsU z>&L6BXH!&vIEIo#aC5m@n<GqwT$Y!8RCJ_^ZEXtgE~%uG^ca>(Td#U7*?ueEZ-2D# z;|9hl=f$dSlJL*~a;AH9U%TgBI<+VLCNB=dwX@pCRG<INLUvZrK^u3iVz!G*>7muS z*U^#Q<~7@n%kzb`G=l2FnxO$b#)RRc=S?rK;>Y-2yj)xt@-MtgoE5xB9*)<|?aMTC zMz{7snQQ$M(KkVTQWD}xT~?V})Za_3ljN8FJezHweBJq4{Ol++RG^gO&*Ym$7nR!< zothL1H{DnG`70gM_jas8@r1oN((&XTU3~q^9h4*NX)rnYlP@_0^EQ{{2W=kq%CD8U z9>VNb&nK&e$4N+tbu2a8_;JkbvO|b*9(I$K>ak|5j<rhV3N)wHg<;xM?<(R-94^YX zm;~0bh9-*o{OsGt!WCd1bPwXHxPxI5l7Be4Ldj{)gWqm_w;6{oySR@RL0A3oJMFLD z<{>rXE$p?)jUAO6r?m@j@r20;x$q3!zKsLz@bTl#r3h{1dO@ivcg-NY9Zg{hHhD!- z46g|fx`2B9>ZJL~7&fXZ_kI46cvIO1^Lnc!#TUZAv-P_MO46o!-f_i>*=bXw*<tzv z`2Oq8_?#c1iD|0$&C~NHRZ|#I`ReRV%yiW|#B>4I(Ov7RSha1}ZIdm=TTk_{_7*Ms z8w55(YLe|X2Hq})W*jcL4f?vIDt%+c)0<<&ZEB|{R@ydP<EN^Z^EsF}uSwD?6nheU zaJV48q8mTFdJ939srrVSicXPD@`)FfqJi17DR!<N{5M2gZp&Oo9|b+dzRGvs5o}y1 z9g6l8bJ_dyJK#Q<vS_jM`_(3HMV3XnfFX)-%Wv4sLU$94$pm!TVmq1Dx277L7<RvB zw3pGie*@4|bSIbWUS8S*gS>2BB#VyL(AQ8g<nQH;8v2{0?727`3bXF2VR$?0!erP% zV~&-wLG^^<wA(w$5+_HVv;jCY;e>L96COegn}aWg@OHm<Nfc`84|L?Eb?LVgb|BK< zFQ;NQJ$k)oT;j6VWpiOebR|u!#@TY^&)5q|I|;hm88t5&N>4=)bd**FZ=&ayDdn?! zi`<FhR*78<M|!By3D~ogz1RK}_RotU{Y8xQUHPhN1dzYC+i%iWr>zbMb@FURI0W>? zEfR?}RaV+DRPO$;=PCZ+<VGrDYotZV1e8frsZ;nRDPWMTr>{*D`z@x9&UMgLw*QC@ z=B@|cV$MEs7)-XQ6{{kJ1$pi{xH+gpV<6%>hxzOzq;%y>Vl+wSXA(kPE`|Wxli#+L zKH%M11E&}j@j=h4dNBy;<)u+Gbs2FN@4pZ92luYf1?*i9VUGPP?T|`qS#g!Fc_Et5 zjFzn-3|^QL&uBR6Y&Y_9C1`pnjw_2ui%>aR>A2m3bt8RyoENbtqsZvVPnW?Qg*b}8 z8tpgN_+Hp;a*22q4=JxBD=yU^`}%XOO}LpwyqQH7=a(!3I>vYMGaJ-TC-RM6Mlx9) zkd?g{)bw{wxuEo&cd1VQ$vzUgcre0A4e1|tTgGV1rdXFky}@&1yWZ&lshx-F3JQKY zr_}xEDvT9QGo`ynhYC5}iBwVq=&+sgmo}AQ1YLH)SKU`?ts!N>Ek>Wu9z01szu127 z>gmi&(Xmg=#8t)j3XlE>SrRz7{K@pv@FXwqIgSz~vS$3)O^AeuBvjhZMSRBey0eIV zxg<;ZJZ8a4@_X{97Ww4`;NESYlQa_kLXY%ZF(ykl_zX!$bfm14<-*cH`)JL(;=@mk zQccXo-^s<0as`9C0qU>i8oPUp$>qP3(xS$g3pK{gJVXUZ#9uj3W=z?8`s}yJwUYx; zkDbqPfqS;gSwo(Yg{dNlfU5z0s{xLo4SHPh<1tq;P4uvvoQXK2^zEr%GshzItm?=7 zXx+JfQ;<dMwqRkqHtf9Ld)%S5(Ylaz{fP7ISJTWDYWt=;ROI-`+yz1%uZAbI<#!M? zodbeBgS^i&(x2cX(IdH{bg>w<y-NIOkAaG!pq|Mx%CMDH0VTGmX)urICngK|d`h<; zay%d)g9jSkJtC<8>Bkl0sM8hzG3U3_SvAw;1WWuRz9=2sV4J1lov1O>-lQ)-`!t_2 zduk54KmU7Jb8CXfaEYb;L}^kbqe07<b~j|7-kselA;P3uENJ1@_D1%MLrzDrJqPlQ znQr{OxTj=6@Xqh$7Dp&yZB3-Jkh^pb&WHj-E?vNZbOv6Bb%1(GE|Y#hRPeytoISp5 zbFz+c!w9^NPOk4SfACqYEs#43oE;Sd!pn_h9rNNox6Hgsw>Uk)+aOnrC&!5N#Adc{ zenTAaU01i-^v}5Hb-Bdv23#A_@&$vT0e;cv6Ve%6i_g!v`J~A^nyx<i6|*C9D%j7* zYdfGA5bB0x?d+T7Oq&0-*jM<DXX8;c!uLRnk-hTB=L%ir{+C_V?LeM%)sS~yK|E*P zl)NT-B)m!l^m4Dqen|CqgnD*#e)V<RXulCbh|E*^6%HL6Uu#7lS0l0K^Kj+a$~;Qs zxGfbgKP`|mA@v@y7HBQBteLwLBw&<s>~dU>mws-}9Do<G8^AN^C_pn?mofaU^m%}8 ze5RRb)5lC|e58U-p`$~Yk)Z3u${@Y6ieC005rOFZF4ytvJ3-PM5AMaL59qu>bobT2 zMr1ND_aK<!885ej5x>x*y(<4?6}voo<6y)!>DzPMHzD6&Q(yq%2gpz12{D=2WoojN z`-lgzY6+*XrS{_HvYdv;#3xg|))uMPcpaYV;9+WnzNMa-n0pqO8F`1`oh;1Vd)=(g zSkB5eOczjFCz?(~N#s>6_cRzEJ;I_SmB@lUqtkyL0q<e1_~@5lZ#-9sdgHoYq()mp zB*ziRGpUf*E57wmH1_Z#8fy9qzNAKle0CQl@9aYlY9@#|6>Y_fm}eZlftkK-m`*2B z`MsszrM;FFUVxOnAm}uJg;r;2h#y2uRDh4P(Py`ukkk;K_+(C=%%dslE)Tb4;3;}H zd+BO*l%2mZS;ReuBy0wvobdoHecI*0v`OK9Y~G73Jr2&ffi}AYujOCQW~Y0_mh4Mb z`9o!^TMlo&3``47%k|@mibi5eVOhxcmWElrVCv-A|JxL?zu)r4m?eImX7VZDTBl{! zfqRoZ5a4a@$niYKRRo<5scgI%?rjN%m`Tj+5uHISvLKt;5q6HB3Qu14#&FOOj$qKm zzPu1NV&SDe$;}?}TUy6QnqI$gy*weU#vwR|+?+YM`10NZ`tSHA-UgNWhrRes4<^pj zK+KEHa(}PL|1To5SKNc^Los2NyIkH^(ZV5iiB&#F>ru{hFTd}_(^cL~OMm?d9=TN8 z#J4X0C_hDH_PN$rYN@b3z|g^Ul?a_0dGcb31KbTmW0{)yP+m3RRVDH;;qv2i3&BQa zxhsdoJC7{6{@%ad<c`c6`(fGHv+z7HF?wlB%mssP&o?71MeyUb*(h1cp?HV4amdy} zHFEzTg$0WVi@rS8tP!UNm_P7TSO^V-?cNGM&rdYd>-dzy)2u*G^0+G1i|yY2+^T0} z>8_c2dl&A5p}<JEvYsI#nJ<~&Vi=?9;!!XEQKX~)-NhJKKsf2O9NJ^M=)HH=zi{yK zmo=5H)*003$Hfkk+KKnHgDrkwJs%Hk=WB9fc_L0h{PAx0K!O+*1?{DWjO35%0_>&= zyLBOM$vn;~^GERyv2i33OpmJ?Njr||TQW#_@R3D55geT~VM2Ff#<4zXj}C-ZsT9N+ zdDG+nB5OVI7%x0+`#FC;!CTBD5^QXtWALk{_f(N)@dX3Ry?9cVhkMMXr?de(J2!Vi zJGdBUb1f#u+kO82!6d+cO=m01AhWky=+lW2MCeu0@|KqsWgE=#W|6ITFwH7NU+--d z^O5;5EkQp3jeJ7h!pXY)*L}0dAeV%~)RFt*f3c(odz5iHNfo29FtJNE>i&$Jn>K%` zx3TC@UEqC37UYu~?nk@5E-=8E{mh&M%b{bVl#idZ$c#P!d3yc#P@qg*P-yHNW_Enf z6gt=Ip%5>Z^#04~Vpe}Oqn?*~nrZn7_Bs4TrK^{t87Yziy9;lO{X-j$HW?3piZo|; zO^LDTE_t()N$mvu)!Drh2|F`8l5&w+Mfty@Hu}hNH`jNZRKQYkwzwf#UXAY&0V4Ah z*YSX+hQ92Dl8(5)^2aX{t_9nb-ptHl6i35hbho{aGn7PB&S#tZN*J12Bd~dG5~JMO z-+Q~%5w>As``F^Xl5e1@UoEsAE(o4wUO4sTx!7_@HukG=rwjN+$fZ#D<Sy03o25eC zAmtv-NU2Z0FC&T9KZM6=+<NK9=th=s{*nn>$$e~oec5a7snu(|<iGu%TVh(h#}~!s zE8XU^>HP|~@=X(03;3Y{wteL<)7#70nKW5h`>D6rir4b%SNg&>uRVHIg=>oA-(=Rb zfFFj-{q$#R%6;Rn6(#MqKFU80-W|q_we#BDYkxj!rJM4-=xzABS2pQs7+vJwQ(I}J z81-IZ{J!e+-jq-0_Wo(s$G^0E!h*6Rhr7Wuil`Q{y!;c9>EZjw$14h*Cx;vUct5UY zYEJH1TEf<~^LF8G#_hGF@sAT;*)Y8Bxc0RyLzI`{Zu?t2{R96%N3PLJi{ab~v%ge` zL_9V%*5juad2$_ZGEYxLXlOFb^+$S*JlW}NzOb_%O7L$Qo$qKknoFF`NA$8M=S%A` zmjoC2AN{o}K6BGjcmh+Yu%y*{aWt!GXEdDlJSf?{IpSW0jpMK1Q*X0;@elzIqt)d( zjS9!>4{!Q=2-G(0-oCV5jx=&Rk?qwZyXp6;LD0LRc4uvpvQivo-SB)>;$cQ1znw&0 zZa5Kfn~{p4o+v3)!bQA3S2X^VQ+YQW5TrWSAh7Y|WN$A}rRVX{V%N{0Q`|I!Y<lYV zt1?&Ds=~P^`LU(G-@NVpay|=JhGeqhykOS)rQ6r@irof&ue07uLG#81+`DdPnLi_N zXzp61-Fx@+VBbASej<HgNkSKNG=n43KOMd+!{*B5X+<h1;9J-*oHohIHXJVcclsW6 zU3xYWxTz7v#%gJvt$f4v+56)c==hu?m3Lv?n_9#M-McF(49{wJ_-94fqbvt}<f-`S z)cnS~D1JGWpHI8Q-Ru9d20RxPosXNf;YZ$`?M6qwWqCZ?OLndic-worSM={uTx&+X z{loV=8+B-2vL<)*h)zCMAFVGk7SrPK4uu8A2Z!f<#x(Bu)EpV0`u0t!<j1w;xmB)C zS?rDzw>Erp^`c*LA7etIR(vni9gbgY_>JQ(Kg%9Av>MwVHMKk2a_LVis2=pIr%2CP zmUlL=w5#`Z8hZ1(>H7YY{T<i%v-R7YT0^4yKgZ~<IXu%7HPWy5y!;#K`hT=_=HXDa zaUYlT7?F@Y`<6A?$-aijHV93sv1H$uEXh)q>{&9hhK4MmEMt2LV;NhPh@@=M2oWOb z{Y}qxz3)HoT>hAA=FB<AeeU~r?wRZUe7;=Sj4WQF#q*3tO<A-W)Dw^D!*+UPdJ013 zXHL`h6Ve1~e`s~LYo80^5)a$x$l{NoEjaA|+?OtQIunV%YGzY))AoG!f*m?`Is1Vv zCbQ&>YY{e0bwED;#-dZ{W}`tom$)ebu^FJ#&D(F~5O%yEWvXGIW+U&_o2xe(nAj){ z1TA?OGUaA-fA9Wku{t8&ib)kFGKyRcY{jiltw%rO&Xf1;{r4Km!u2bAa=4GvuXX-d zYSFyD;|^xMeeV1F_el+C%D?E<W|0zCa#F|L;Lccerlh1Eq8zg;8KF+a`=evy&s?UE zl*qG!{M5U+wdqK-?jvs2t@?<gA@$!|{4>%wyd6?tWs=8CyHmt!cYj`JN^9c|kB@^; z$*BxElhjvF2<2;20VU(*h6{QQj?O}qQLm53nzS7)3)va$mHe1%`u)8B>mapL(zk+K zHrm+aJn^sy;<4FBwd<W0ayyatQ%sVdRDJx=l#8oln!Sv@wm@AVQqG}v0ZmNqtX{lZ zA(PY3PQP^e$kylcC^xf;wA0GHYj+!_{XTW|v|Q1zcv$dB$A-m7?SA9UoX;!oRc&uN z*|j8FS=meE%DHUD@rKWOI$xkWQ0ds5`xEMCla~seGGk{jRPwrb1W`G~g#98`a_;TN z;VZxAKFUO>d$DWjk22iW@2s*%BQjlyrBTHX`C}Ku>b9FYXD*q~lGDdyb=Yf4zMc)r z$g;FlS6XO4YG!-wy)xC;(bnQv^VR5R;h7+lwSst<|C^D>!@~Yuj-T_7W>3%vp4FU7 zLZ5VWP2$49?;3~QcP?p_6^E8r^5PTDPq3FQ`Ce=XsZ5`rnwqO=hQC(Q3QzibW~Kr8 z--&Enjad^OZkbI)g+o_2H-)gRrO)-K>BbG){iXVXoX__(u$7^C@$X~$kMLqy^y8{F zv?gU9Iqhysn)X#Ciku(S>eg!|o;J6ST8G9<&3x{g?=W$m$)dl#rEtx&x&}eXPLD4B zI{v{0rySjH+iO3EM7d%#Re3D}gkqzU+NUq;^`3LPKA0IrcT(1pGEDB!Hv_B4<eV<N zs)y}E$P;j}8;uY76>=rl*N9klIoEMmgY4($*LJ<8Sa`FQCeCiw^#y{LfOv2?i6K5G zPqO|g=*cHqx16>^K|tKc5D}Sq2F)1dBzt2itwCcsmaxhGa;$50hIcQ^?N(7Ys_KlR z1b(S4?<B_u7-Ij~>U`>-uI@5MI=Uvk{=w1`GHYH<i5CKeoZP5Zkw~_BCf=9cwq=eK z?k(S{!V>QfKdk1Ez|zP~<~W%KIV&>!GBuEiGESN(ZO2J#30nKA&ptB1x<5D`S>_ti zxpc#?ifxNO28-3VjaoKL3rKOH2!EB0A&T9hELD7z_fd`1$j`IrM;N3zKB^(jJ0tOB z7;}4+61}4;?-?|l$}PK_61<%`k0nH}5D*7n`!TMP()cGI)o8sMuq&KDhDKsPP|a3- zu^!@fX$nb}5~4H2ikF}7PAh4)5R}lQyFE2Gf(#N_^Ge;Jn8>+h_n_mu;fr#-bkt*0 zo9z`Uwh9?4UdA62@{`v8<Pu4(U=vV=T}MX76)j(k=yc>CiMf!4%+60OY97;_5J6;2 z?w4Vxv)JJ3!U>e%=(L=sxNlePDj-jU%Q-0uBXp3c3YmCQrA4n7iG}k<zQMnmW|MVK zJ7aEkc-;3=^jTPN?oVN{lEJ?@Iw<^ufyU{=mWU=hsPdwGgs60+ql}Lp5RUMKFdV;@ zV0Ri;k-=kzMt<T}q~e)+xgcA&mEpv~n(|%q?N`29j?TXJgP92@7~HG3C$7tC-JQs( z43$2ir9B88L+rTm1hbcEvcO>8c~KnwkNvafDRYV9`~sV%{}T6~=~}RAf4lN;;L7%V zc&y3g1VT>6)8?`A@zLR*t_1irMWpDE0D*=wT&}pJ#r!~IXpwl3<Cb~KdiVsUdb&(g z$0q0*ydH26>No3=8RSaSR2*t?p!%=-!(lExM-*LL368D4yoBCBFj1*B9BF-$moGEm z=&1@u8D)NrM#^loyo4|2M5JNG!??P6qj~K#L}q!VnVBvt0e6XquU<mb1qtx4LEV^a zw2HAfU3bnR%`XX=L^`2jBV8uyE_v-NM>;+;n^;<EvSiX8m>r*WK61(7#Xr{25v?F+ z@)*02bdSf>%;#hk3$7fi*c#3l%W^Z)+@@ASl~<dmxJ2=(a~E?Q7H1w;VyhP?MNJ)J zh!J*4d|%i3kiNL?<7l~*5EX<laxsd<o=W<alE*u=*v?9gG>^yL5I4065?rdNW=yOV zRz_sjLcLg(weSfZ%vw(QS!-(0O-?Tn?fkJ}Fl+UcBPV=jR=ysKH8*>Gm5wP^ti0x{ zVK?g;Gu=c3TXOtkL!2-%>`CQ%Uj|ZPBkB{MMariueHN&4gp}HbN|AILlCQsYG@)WF zGh@a#Dis-%S}FKA{(Xbv4Wl@$sm;PfW?VvLs4@QyyD|;oOj%LUt2}jCh0UWs<5c-X ziz~M;#?vt%Ec5z`OI{)C->tTmm#pT~*z7%q?#RZ9)?&K*4-&;YBY%g<QulMM$nRU6 zldo_X?Q`L@Ufim@v(nmGE}I3{m(E=}I_@2nr6FkPSBlZQCuK(`oQaI=A83%Z7S)RD z4;eQhyD17Ig1b8{?gU>yZKNS9+9rUy?{|*JmW(np;<PH%(<~Q+)@2bYoea5@d41`m zdvF5O2y}|;K(5locf7K)@_E88NR){A`1TqS$@x*-W{)S4Dvh;%C&phKF67H^&QJPu zG9>tGN(<;M&3tyB%w3^pQgb_@C1DZE8)Lit#`O+CV4^!BB{jwDU)G0pcuGHAdCjoI zs1gRV&(Y1^;|s@;NJJVRu`$f+hCH|UeJLj-vm<4JFTZbJnt|(&yBnqeL66<gEQ~6) zuvs{b+w!DE4+scJpVLzec}FHr2j`&jn_$OW|NWH7-sX!3n|hPDlAYw}=#CWG-D$n; zKF5x|N$VWFLgQsbTFzshi_%Q9gou%BFF^zni9-6kYzR5_%BV+#D(3F&;ZwCG&hE)* zZGO&-%2&HI-%1kc=I_(Bv6#Ip$4Ync%~Hqt)vc$=DnxLWe@<h+j1{1hI-uY+H9$V0 zsa=Us)ryNt&=8Doo(}6;cy@N!3hS7fs->fZ!xX){)3?8uv{KK67O%K6KV3EwbQf0& z6{9yI2^GQ1Ox<-u+S0td#LOm}uDy2pDfUr$S3Qf8nKZLY?^}iI#WTSr-_DpZWBq5F za}mY!iyq%_swZX5br8HW((D+w{NVM$!Wz7*Oe-ha44Jby!7%DLct*99oEee1qrZ7C zSlut&e%!pFPEVlJSlw^NnXK7D>I_~>S$*z7js1y*vwX}PXf@Bo8TFs?#70!o26^M` zGX6I?SySM&ZQ{G0&{E=DLqYM#(WOZRZE=LoXtY&&X?d^w%!lw7C$t<<<|u_Bjk99m z`E9$?7xCn;v2E4=G@>>Rj!J%?N8lcD2`qQC?`+GTi<^2S{O(fikkz+mbDFLaW{SzJ zOyOmoy*4!GUWIcQ(K(35*F7?{B?ugGa(zlVrSeXx*7$5n0HW4VBt!`xg$?P{bR~K^ z*u6c)fp%vQ?Ym;;^FfhvqH0&BaYFU+7y}vEbacG1m_XW}2cDq?3oT<3<aDtwG<3TA zoFx)oX{pSqxU`j??-__7d~o-{M9|&>p}=8W_zA?l>ow0JoL5%&F9msCxlCGRe$R^` zE(dq45jV+pjO>U0NGxP+<0eFTok&Ch*$PLO5sHa3;mxEDnMRN%H@QaZs^{}Hy@4)n zo96w>9sfklY|4<-j~{O=(EZ>IA{+PfzKnY>+7gs!kQw?tKtx$zL@<W58osTGLu2^u z^Rw<8QEH1r_d;kruPfL&DpX*25N!D$?c~bM_z86a1{vn8-Bk1Tl3p)-5C^Hs$G$2x zF+qi&eVB7lCK7M^^PTS$|NXP)74;vDt&Yn|m^bZRv>@{@QBastqzLcjB;Voq@G|#y z<}4|e0aG@_<=EV{Y)5cDea5qi2YELggTXw0yyDx8v@FdyNq*SM80Xg3@EXs%qP@<6 z{qkw~!?ovYc$H5vbjD+K=CdhDO;^2l!)#u?WxUY&zynj}F@xY`Mr-}ZN1zAXkK1Y9 zLMrQ9xE73q(Euo}l%A(9>|vKEzSmgG{XL!8V>=xFvsI1#>)l2b6(K75-inEIh5@MZ zswyv6S6KC4<|2&`o>*IDl9dkTLK}%>I;M=}<N=oqi{kV1hb~(&>axC}n!hIL^0zr! zsJ<$#B+P&wn?*(>VLq^hUMpRod3GI-*Xx+$rj3;#9N>|IE9rtU`spPu7{U_Z?p!H7 zOTHorT8PMvIG&-M^ncFA7M^a-EzFOuZbDUop-o5%FHVrA;b*1!hx{1q20`)W^Mwuy zc7tcntOxbeZYG}4EX*)WFR7>~a{=9Z!W(U~l?{z2M8Q+?w3^($3Yw~vD4!NvM}=EL zF?8sG29N8SgH~a@2TqoT*S%XQT*S;6_r+;P-bZp3?aBUa7SwTQmbd>k3rEevw2rxP zv4XeRTfr_`CX^w?*GK>BOJ~OYMwl9>M7@NZ5>`|v=y6J$r$$2A|8}72$PilGijeJ+ zME8HX&Nd2_wUeX{JE9c#A7pcpQtCfO_zTbfb!E~PWO>n#NovoP3Jiul@jK9g>j8S} z8Q|{<2O<hlbZ`)o2-3*!Z9`@pk$<-&^AJg>yVacl@Kb1Bn&N2E+{y{qfrey}aDUC+ zo#&x>4}X$Rk`CLI4fc?YppIXh5hS|+xbik90sdpVaO2;qu<4yPo)}RvF;dh4Y7$~R zfMeu3d7p2FluZE8E^X`rXit*F?OOspK%dE^%LcP=NDlb<=4w2MNkGA2X*mJnmdb0* z>2tJVl9D~F_D$ZAHD{WQnZ-EoKJ^A+B>ed`U#oW-tf;J9Bw8bp19{4mtNu<74u|tB z9V?155x-{UgiP`)E54Q(JgTUu`1xif)DL`Y1t380{5&G-0jey3V;6~_e7TY%t!p^} z=v58ycR-jUiU`?~=tKbVzU_p-MjUQ_`TJnn27I#}QwGZa6;J>H2R$AT4q77Mt~oPY zUk0YUtgLhgt`lr^A|fuprU7$H3|&KzsO0%Rle=4w&gBP3Njc3lOcF~o0HTt{gJ8ZH z#89*S&royJXm^l^fh0j0grvZ60gAWN$$gY6Wrac|(e)1w&cfj#dLS!1yU~Bu9Dh|) zGqRfKGilRJMn>6dpreTdL{U;g0tI5svDF{@VYLiY6yzjET4j3x=vH~p4_M;C&+iLt zXfPZhih!ui?*stz`x2+K6Lbi85eP0IOXqW>jQzj>OtQ}m56=NzW^O)e=hZgh<3tKY z09!JE&vxko?PEYbexIr?FYhDnwEq~r3|1O-Ku_c7`I#lJ53o}I6Agmkx!>zSU|9rD zVqwKskmj?ZRlZ`t`3-nvGM6elsb#?_V`Xifosl7&ke-zl2(5s_;eclYEA>NYS)G<k z><9|*3hhA@1b9$Mp&kJ7wqC{6^(1Q!fTNbDeQo*`Vd4ALtW03>va=Py3kLY<1w44A z|73R@E?KF4JGj34ZRS};#oWdhG46~0`Vh?}+%?<+u<|lN{cuy;CM){&Cx8}F=dFEw zq|oAwC&K|@etqMD6<^p=?`lL}x*%td5vTJqaCplE=o%2%al5@;I03{Gp9z0{_NaSK zzZ9|J1A&~Gzjz(^vgM`5z-bfln`j@~d9(cuu-n|hpN`?D0L4_{GV$}1u|EPyyk3tH zci84JdoEH-09pBc39K+nX{XR@q!R}r94q=;mg^7o+FAbJV+BWx-ilv|#Qit0CA}6r zYk@X+9Za$Xe0Kz`Q;{jQu#lvV1e0HbI1x-d;Gzd5K=4Wtgo-HqcA4DU8dBb%h<?4e z=+G{W9=MPQPNS|a5JxU%y`QQ@YZr}>0!$#91ct+DE|s682#vMco-A=2K7ubeMq1** zIdYoyg2rS(J1B6!!{}cv)VNjJDFe2`&TKafGi@xr7Jz5qGXe)y*uI5{>U}y}80zpz zW@bHSrw>g&@b=qK6Jz6W$gF`j&xY6lB+?%uDFBk^jR6zp16s}s7k2w^uPM1fP~q(G z9N^lZR;BFB%x?SMI*vOM1`HiuQ=a8|U#e#L!<RCx|2fUI7TChiRxeHjlNJEsdF!=k zI+D>iPO?s1{l|zlz?#azo1fra2|~z5+a3UTWuS%~9%<ZiVcENdaS9CFB}oAlNG1#m zi!*asl0_L?jTIH^fUEvF`VCgASrE6L^=kEj!ErVIHpa=u${}7j;qU}rF$6pe{E`=Y zjU4>o=0L+MU|^nGa#6oz&^2A)m5sTjCHT~vo;-O1y8=3T0l3^LTmUQ@oN1U@yU1rg zT`T`3_*g?IEOQOK901qvZF8HCm`&DGmaRnHldTJ?fi(DgP)FjFVNiYmM?0wU!D9t7 zg2ktoQtoc`or6k<+c9Zr$_583I2Obb(z8hqYkT_+DCqiersn2v?4PKG+m4a6L;zv` z*=_6~*@V6BZs(?_GoU7c)n*e*gTj-Qkug3wxvc{ncDMazaA{FdWCz#|#3SDNIC;uK zS_rh<^tA0!Ah?Ubd6<yd3%{HIS<DW?bO)hZfYmp6K(5XwQdrJn+9jyH!Hm-GQ!k)! zXz=`NtqhvdmYn!kcdTF9RpfE4rt)e7$j8?myx2>x1xA(YEJ4$0S2jM9oD@MeK0dVq zBsA^N!_`$3--N}kyi=cr{1_0tTtto4Rl;q^3q))n8aW^hroX~mj&~PNIzxGfpqjEW zQg>7T^?sNY4H7asU0{5Zpwf{*b%9j?;cFRcJwgFrhMFsK{`}E)!5<E`<DN4l$K>Ju zHazA+h!QoEgzTUvIlV=s6dy39spP@n7zS-(Q&TXYx<KGVY|q0?ePKr6y+46|rXA8r zKw38U+508i@DI3CiYC;7q#DW^MEVfw2KHdRFC1a7eNVMLxy%I!T&JpqoS}SGf*+IH zwtNocy3D(Q?A^X&ciIhZG>MiKZ~t@!ri@=m1StvJe4f2{;SGKA&Ye3XVHeBZl+@qZ zK-W{?RzX3$ISKlq;l93Ri2_h}gab2;ve^dtRf_8F<7y%x*Kkju;kFnUZUJW@DUNB9 zh-z@Raq!;;Tz`9OOTeI?K==i!);UeS#M*}}k|cv<))LfYH3)S{`?3H|BpJ~1*kr-* z2fE)&FDocD=PX(Xf7Qih70ktqx_$lqpzC(*$x#9+4%lTZE!#lT3MTWnLQc}g+aROf z3s&)L3<Yl~n3ByH@2jI97Zj+27v3Npu3bGO1wi^x-Pv1ZS961;qFfr0PyfV!<64Dj z3@8ptD_ji?`yrfy5kcW8UY#44bAh-eC=FeP>_cEp$I$^`-YFbPzBMwVs+N|PP;X#R zfANZd3(Tz=;t#c8Pu@C+F%g_vFu!TM-}%`KCJdn1=zzja5~afb0Cu;~ymDpg{M^4* zm_{(#v~CY6ld>L0OD}^m0H!rZB%SSb=dVLip?;);!<_4XpZqtaD)jqXg~-VKNncLj jac}7FJ?sCS!5yhnjDOfe%U0bZZE2u;MW<TpM%4cRwPs8T diff --git a/public/develop/images/flows/09_Invoker_Create_Security_Context.png b/public/develop/images/flows/09_Invoker_Create_Security_Context.png deleted file mode 100644 index bb655e0e38e8394b3aaa024ada0f13c2f21c2b4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43568 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 diff --git a/public/develop/images/flows/10_Invoker_Get_Token.png b/public/develop/images/flows/10_Invoker_Get_Token.png deleted file mode 100644 index 2e39f52a3d12efa8c19ea3032957e9f48d890d0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55546 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 CaPF-D diff --git a/public/develop/images/flows/11_Invoker_Send_Request_to_AEF_Service_API.png b/public/develop/images/flows/11_Invoker_Send_Request_to_AEF_Service_API.png deleted file mode 100644 index 1e4a87c54b04d2d6524da2617fa615dab7318dc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26214 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 G9{mp%Cp}jH diff --git a/public/develop/images/logos/Open CAPIF Logo Screen_B_W Slogan NEG.png b/public/develop/images/logos/Open CAPIF Logo Screen_B_W Slogan NEG.png deleted file mode 100644 index d0061b6f859094be2b4c4d9e73047ebbe2524e98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22786 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 diff --git a/public/develop/images/logos/Open CAPIF Logo Screen_Colour Slogan NEG@3x.png b/public/develop/images/logos/Open CAPIF Logo Screen_Colour Slogan NEG@3x.png deleted file mode 100644 index 06f34e564036a3bff31f3e85311ca144d2346d2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93037 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 LD2Nw}8u<MmF~4t6 diff --git a/public/develop/images/logos/OpenCAPIF.png b/public/develop/images/logos/OpenCAPIF.png deleted file mode 100644 index 57562abe95af2699d7dbb34fe43ecc686d3c910e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24999 zcmZr&30TbA`~S{NGt)9ltEOq2_RunEN?N}ynus=glqu1ax{@hrGt;DnR!b4N)26tV zQj&-^L}Xf!XjKf_kV4{rhI=c1f6p@yWzIS8dC$9k-uIkjHy1iyoGcDO5PpS|g9ikm zRzna%L=*#lGtu0e2mTTZaoV&8f+VDcA4FSs>^BIaKr0+<*G8Q3{r2OBO@l5;v+rg+ zghJUPWVb@?2MrBU93SbD&;<<HlsI>)xMLmo0VP5rk-&7&k00a_8h$~@R&@@ClLtPw zDi4>-)D0Xov`%?ZtML1%0tOq*i<%uqt1|Sdt*xbkVRb6$&enDoE;5deyt!rmUDN5e zQL=2k+o-U(ffXTj_83fp2<EmtHemzfe@7wauO(7t*a~%DZFD^|qL??GtAZP0|FNe6 zMg|Il5%TKSu3BYYWQ(#}4D!Y{tIN~k9x8T^(SGfImKBKL`INPyUSzv57>tcDqgVP` zp9bqmKwYWmKmYOUzfl+&@SV9;q~S?@PS(IsdtK!reoMO`w)oEhCFuFgZWVu#t;-HS z-qd~7!C<4PRlqLRt@c09=O}V^C%$C7Lk@@2<u6OTNs?!Eiuj$`IqxKYQ3V^!(lq?M zObVikqKw9FX`L+0D;zLb+eY5Cc(qM;%SY|UkMH%0L6GTT%ULd=_>&Y--&$KhxCD36 zmY?GB-&Tb`46`{L#O${LPea(@r%S>H&CW8^Dn8O89lrcYd?PeVyimAAc;7-dudJmD zx?S-0rr-WtfG0moy71ew?BTsRkX4lrrPf|>zCA%oesVrFXz+ui#C(3@g;EHOSmFm` zi{o20?$d?xJ#R=Y^0#jbMIGweM=qIhk;&5;Ngdrwp8sty6vF&AKpWb0c>}d}Iu}+h z7UM3>_#gT;exu(JT9$vq2b!|*iXYu;POU-({&84H@^4a#-|^po;P~*<j#Cz?vr77N z6PaSaQG*8LBdU7?C|ScCSYzV&ht?UFd7BmP+z;^^`{mf3V{2_-gYTlbVV=|p<gP#I zS@N5nnLy9RL~_DDs8X_3<5d<Ifwg`gfZGpL9s+-UnT~bB@4vNtL(Cv9u(NP2n9lu! zLE~r~4)^Q(zT}0iCtsiCEfqawYX#-JagRn+ldeiuv(kDX*5zJw!n8D=U&Q@mKe9NR zxfLgK�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 S$=kpWfT$ic%C~Nj-2VZ(KF2=* diff --git a/public/develop/images/logos/OpenCAPIF.webp b/public/develop/images/logos/OpenCAPIF.webp deleted file mode 100644 index 8ae5c10e186e12481f1e65f36b69ac722f057775..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7218 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 A(f|Me diff --git a/public/develop/images/logos/OpenCAPIF_Small.png b/public/develop/images/logos/OpenCAPIF_Small.png deleted file mode 100644 index 8e904bbabca310de26524d8159f80f874e84ce09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3747 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 N002ovPDHLkV1gy$AKU-{ diff --git a/public/develop/images/logos/OpenCAPIF_Square.png b/public/develop/images/logos/OpenCAPIF_Square.png deleted file mode 100644 index 7b558faff76fcbcd6887cd39d867b75805a522d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7831 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 NnO(LtE`#5Q{U6qRp4|Wd diff --git a/public/develop/images/logos/OpenCAPIF_Square.webp b/public/develop/images/logos/OpenCAPIF_Square.webp deleted file mode 100644 index f3535f6dadd6d625469c06b256d2aa7405b719d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3068 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 K`KTf6zlw5&ZS`{i diff --git a/public/develop/search/search_index.json b/public/develop/search/search_index.json index 9fa4ab0..93022f8 100644 --- a/public/develop/search/search_index.json +++ b/public/develop/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Home","text":"<p>Welcome to the ETSI TeraFlowSDN (TFS) Controller wiki!</p> <p>This wiki provides a walkthrough on how to prepare your environment for executing and contributing to the ETSI SDG TeraFlowSDN. Besides, it describes how to run some example experiments.</p>"},{"location":"#try-teraflowsdn-release-30","title":"Try TeraFlowSDN Release 3.0","text":"<p>The new release launched on April 24th, 2024 incorporates a number of new features, improvements, and bug resolutions. Try it by following the guides below, and feel free to give us your feedback. See the Release Notes.</p>"},{"location":"#requisites","title":"Requisites","text":"<p>The guides and walkthroughs below make some reasonable assumptions to simplify the deployment of the TFS controller, the execution of experiments and tests, and the development of new contributions. In particular, we assume:</p> <ul> <li>A physical server or virtual machine for running the TFS controller with the following minimum specifications (check section Configure your Machine for additional details):</li> <li>4 cores / vCPUs</li> <li>8 GB of RAM (10 GB of RAM if you want to develop)</li> <li>60 GB of disk (100 GB of disk if you want to develop)</li> <li>1 NIC card</li> <li>VSCode with the Remote SSH extension</li> <li>Working machine software:</li> <li>Ubuntu Server 22.04.4 LTS or Ubuntu Server 20.04.6 LTS</li> <li>MicroK8s v1.24.17</li> </ul> <p>Use the Wiki menu in the right side of this page to navigate through the various contents of this wiki.</p>"},{"location":"#guides-and-walkthroughs","title":"Guides and Walkthroughs","text":"<p>The following guides and walkthroughs are provided:</p> <ul> <li>1. Deployment Guide</li> <li>2. Development Guide</li> <li>3. Run Experiments</li> <li>4. Features and Bugs</li> <li>5. Supported SBIs and Network Elements</li> <li>6. Supported NBIs</li> <li>7. Supported Service Handlers</li> <li>8. Troubleshooting</li> </ul>"},{"location":"#tutorials-and-tfs-virtual-machine","title":"Tutorials and TFS Virtual Machine","text":"<p>This section provides access to the links and all the materials prepared for the tutorials and hackfests involving ETSI TeraFlowSDN.</p> <ul> <li>TFS Hackfest #3 (Castelldefels, 16-17 October 2023)</li> <li> <p>The link includes explanatory material on P4 for TeraFlowSDN, the set of guided walkthrough, and the details on the interactive sessions the participants addressed (and recordings), as well as a TFS Virtual Machine (Release 2.1).</p> </li> <li> <p>TFS Hackfest #2 (Madrid, 20-21 June 2023)</p> </li> <li> <p>The link includes explanatory material on gNMI and ContainerLab for TeraFlowSDN, the set of challenges the participants addressed (and recordings), as well as a TFS Virtual Machine (Pre-Release 2.1).</p> </li> <li> <p>OFC SC472 (San Diego, 6 March 2023)</p> </li> <li> <p>The link includes a tutorial-style slide deck, as well as a TFS Virtual Machine (Release 2).</p> </li> <li> <p>TFS Hackfest #1 (Amsterdam, 20 October 2022)</p> </li> <li>The link includes a tutorial-style slide deck (and recordings), as well as a TFS Virtual Machine (Pre-Release 2).</li> </ul>"},{"location":"#versions","title":"Versions","text":"<p>New versions of TeraFlowSDN are periodically released. Each release is properly tagged and a branch is kept for its future bug fixing, if needed.</p> <ul> <li>The branch master, points always to the latest stable version of the TeraFlowSDN controller.</li> <li>The branches release/X.Y.Z, point to the code for the different release versions indicated in branch name.</li> <li>Code in these branches can be considered stable, and no new features are planned.</li> <li>In case of bugs, point releases increasing revision number (Z) might be created.</li> <li>The main development branch is named as develop.</li> <li>Use with care! Might not be stable.</li> <li>The latest developments and contributions are added to this branch for testing and validation before reaching a release. </li> </ul> <p>To choose the appropriate branch, follow the steps described in 1.3. Deploy TeraFlowSDN > Checkout the Appropriate Git Branch</p>"},{"location":"#events","title":"Events","text":"<p>Find here after the list of past and future TFS Events:</p> <ul> <li>ETSI TeraFlowSDN Events </li> </ul>"},{"location":"#contact","title":"Contact","text":"<p>If your environment does not fit with the proposed assumptions and you experience issues preparing it to work with the ETSI TeraFlowSDN controller, contact the ETSI TeraFlowSDN SDG team through Slack</p>"},{"location":"FAQ/","title":"Frequently Asked Questions (FAQ)","text":""},{"location":"FAQ/#does-the-user-have-to-develop-the-3-elements-of-the-provider-aef-amf-and-apf","title":"Does the user have to develop the 3 elements of the provider (AEF, AMF and APF)?","text":"<p>No, you only have to make the request to the \"/onboarding\" endpoint. In it you must specify a CSR for the AEF, APF and AMF and you will receive the certificates for each of them in the response.</p>"},{"location":"FAQ/#there-is-one-party-that-publishes-the-api-and-another-that-exposes-it-what-is-the-difference","title":"There is one party that publishes the API and another that exposes it, what is the difference?","text":"<p>There are different services, the APF, intended for publishing the APIs, and the AEF, intended so that the invoker can call it. The APF is what connects to the Capif Core Function to publish the service and when the service is up, you need the AEF service so that invokers can connect to it.</p>"},{"location":"FAQ/#before-publishing-an-api-do-you-have-to-be-registered-in-capif","title":"Before publishing an API, do you have to be registered in CAPIF?","text":"<p>Yes, before publishing an API you must register using the POST /register endpoint.</p>"},{"location":"FAQ/#where-is-the-registration-done","title":"Where is the registration done?","text":"<p>Registration is done in a REST API outside of the CAPIF specification taht we have implemented.</p>"},{"location":"FAQ/#is-the-username-and-password-chosen-by-the-user-when-registering-or-is-it-assigned-when-requesting-registration-to-capif-public-instance","title":"Is the username and password chosen by the user when registering or is it assigned when requesting registration to CAPIF public instance?","text":"<p>When you make the request to the \"/endpoint\" of register, you will be returned a username and a password determined by CAPIF.</p>"},{"location":"FAQ/#what-is-a-csr","title":"What is a CSR?","text":"<p>A CSR is a Certificate Signing Request. It is a generated data block where the certificate is planned to be installed and contains key information such as public key, organization, and location, and is used to request a certificate from a certificate authority (CA). In CAPIF, 3 CSRs are necessary to register a provider, for AEF, APF and AMF.</p>"},{"location":"FAQ/#when-doing-the-register_provider-where-can-i-find-the-csrs-that-are-generated","title":"When doing the register_provider where can I find the CSRs that are generated?","text":"<p>When using the \"register_provider\" command, if you add the \"debug\" option, it shows you a json with the data used to register the provider. There we can find in the body a list of 3 elements corresponding to AEF, APF and AMF. IN each of them, the apiProbPubKey field corresponds to the CSR.</p>"},{"location":"FAQ/#how-to-use-the-example-client-capif_invoker_gui","title":"How to use the example client (CAPIF_INVOKER_GUI)?","text":"<p>First you have to make a \"./run.sh host:port\" indicating the address of the public CAPIF. Once the Docker containers are up, you have to do a \"./terminal_to_py_netapp.sh\" and then a \"python main.py\". At this point we will find ourselves in a console with some predefined commands to use the Client. If we press tab twice it will bring up the list of available commands.</p>"},{"location":"FAQ/#where-is-the-capif-public-instance-located","title":"Where is the CAPIF public instance located?","text":"<p>The CAPIF public instance can be found at the following URLs: - capif.mobilesandbox.cloud:37211 (HTTPS) - capif.mobilesandbox.cloud:37212 (HTTP)</p>"},{"location":"FAQ/#do-you-have-to-publish-3-apis-one-for-each-instance","title":"Do you have to publish 3 APIs? one for each instance?","text":"<p>No, you only have to publish a single API but each component is responsible for a specific service, whether publishing or exposing.</p>"},{"location":"FAQ/#once-the-api-is-published-is-it-always-active-or-do-you-have-to-republish-it-every-time-you-want-to-use-it","title":"Once the API is published, is it always active? Or do you have to republish it every time you want to use it?","text":"<p>It is better to unsubscribe the API every time you exit the application since otherwise it could be republished and it would be double.</p>"},{"location":"FAQ/#would-the-same-username-and-password-be-valid-for-different-invokers","title":"Would the same username and password be valid for different invokers?","text":"<p>Yes, a user can have multiple invokers at the same time, and as such, the username and password would be the same.</p>"},{"location":"FAQ/#what-is-the-notfication-destination-field-in-the-register_invoker-request","title":"What is the notfication destination field in the register_invoker request?","text":"<p>This is the callback URL used to notify events. CAPIF has an Event service to subscribe to that notifies actions such as a subscription to an API, a change in the state of an API...</p>"},{"location":"FAQ/#is-the-notification_destination-a-required-field-in-the-register_invoker","title":"Is the notification_destination a required field in the register_invoker","text":"<p>No, it is not mandatory, but if you do not enter it you will not receive any CAPIF events. For example, the APF may delete the API, you will not be notified that the API is no longer available.</p>"},{"location":"FAQ/#what-is-the-purpose-of-the-discover_service-function-in-the-invoker-client","title":"What is the purpose of the \"discover_service\" function in the invoker client?","text":"<p>The discover_service returns a json with all the services that exist exposed in CAPIF at that moment.</p>"},{"location":"FAQ/#what-is-the-purpose-of-the-get_security_auth-function-in-the-invoker-client","title":"What is the purpose of the \"get_security_auth\" function in the invoker client?","text":"<p>Sirve para pedir el token o para refrescarlo en caso de que haya caducado. You have to use that token to call the API from the invoker.</p>"},{"location":"FAQ/#what-is-the-purpose-of-the-register_security_context-function-in-the-invoker-client","title":"What is the purpose of the \"register_security_context\" function in the invoker client?","text":"<p>To consume the API it is necessary to have a Security Context registered with the data and the authentication method.</p>"},{"location":"FAQ/#is-a-user-the-same-as-an-exposer","title":"Is a user the same as an exposer?","text":"<p>No, a user registers in CAPIF and once done can have the role of invoker, provider or both.</p>"},{"location":"FAQ/#where-can-i-put-my-endpoint","title":"Where can I put my endpoint?","text":"<p>You have to set your endpoint when doing the \"publish_service\" functionality: <code>publish_service capif_ops/config_files/service_api_description_hello.json</code></p> <p>In the file \"service_api_description_hello.json\" you configure the service that is going to be exposed and by developing one to suit you, you expose your API.</p>"},{"location":"architecture/","title":"Architecture","text":""},{"location":"architecture/#architecture","title":"Architecture","text":"<p>The CAPIF architecture has three main components, Register Service, Vault and CCF, which are represented in the following image:</p> <p></p> <p>Each component is separated into different namespaces and all communications between them use Rest APIs.</p> <p>Apart from the communication between components, there are 2 other entities that can use them:</p> <ul> <li>Admin/superadmin: Responsible for managing users with the Register or carrying out special operations in the CCF.</li> <li>Users: They are those who want to use CAPIF, registering as a user in the Register and as Invoker or Provider in the CCF.</li> </ul>"},{"location":"architecture/#register-ns","title":"Register NS","text":"<p>This namespace belongs to the Register service, and we find 2 components:</p> <ul> <li>Register Service: It is responsible for managing all users who use CAPIF, in addition to providing the necessary information for its use.</li> <li>Register MONGO DATABASE: It is the Register database, in it we store all the information about registered users.</li> </ul>"},{"location":"architecture/#vault-ns","title":"Vault NS","text":"<p>This namespace belongs to Vault. </p> <p>This component is responsible for managing all CAPIF certificates, so other components such as the Register or the CCF communicate with it to create new certificates or request keys.</p>"},{"location":"architecture/#mon-ns","title":"Mon NS","text":"<p>This is the main namespace of CAPIF, since it contains all the CCF services in addition to other components:</p> <ul> <li>NGINX: Responsible for acting as a reverse proxy to distribute CAPIF requests to the different services, controlling whether or not they are authorized to access them.</li> <li>REDIS: Used for internal communication of services.</li> <li>CAPIF MONGO DATABASE: CAPIF database, where all information related to CAPIF services such as invokers, registered providers or published services is stored.</li> <li>HELPER: Service that simplifies integration with third parties such as external management portals.</li> </ul>"},{"location":"architecture/#new-architecture","title":"New Architecture","text":"<p>You can check the details of all these changes in the conversation on the OCF wiki.</p>"},{"location":"releasenotes/","title":"Releasenotes","text":""},{"location":"releasenotes/#release-100","title":"Release 1.0.0","text":""},{"location":"releasenotes/#new-features","title":"New Features","text":""},{"location":"releasenotes/#registration-flow-improved","title":"Registration Flow improved","text":"<ul> <li>Eliminated access from CAPIF to the Register user database when onboarding is performed.</li> <li>Isolation between CCF and Register services, interaction now is only by HTTPS requested between Register, CCF and Vault.</li> <li>Eliminated the \"role\" in user creation.<ul> <li>Now a user can be an invoker or a provider at the same time</li> </ul> </li> <li>Administrator User:<ul> <li>New entity in charge of registering and managing users of the register service.</li> </ul> </li> <li>UUID to identify users.<ul> <li>When you create a user, a uuid is associated with it</li> <li>The uuid will be contained in the token requested by the user and will be used to relate invokers and providers with users.</li> </ul> </li> <li>Endpoints changed and created:<ul> <li>Administrator endpoints:<ul> <li>/createUser: /register endpoint changed to createUser. Used to register new users.</li> <li>/deleteUser: /remove endpoint changed to this. Used to delete users and all the entities they had created.</li> <li>/login: Allows administrator to log in to obtain the necessary tokens for their requests.</li> <li>/refresh: Retrieve new access token token.</li> <li>/getUsers: Returns the list with all registered users.</li> </ul> </li> <li>Customer User:<ul> <li>/getauth now also returns the urls needed to use CAPIF, used by customer.</li> </ul> </li> </ul> </li> <li> <p>Security improvements:</p> <ul> <li>/login uses basic auth with administrator credentials.</li> <li>/getauth uses basic auth with customer user credentials.</li> <li>Other requests use the administrator access token obtained from login.</li> </ul> </li> <li> <p>Current fields on user creation by administrator:</p> </li> </ul> <pre><code>required_fields = {\n \"username\": str,\n \"password\": str,\n \"enterprise\": str,\n \"country\": str,\n \"email\": str,\n \"purpose\": str\n}\n\noptional_fields = {\n \"phone_number\": str,\n \"company_web\": str,\n \"description\": str\n}\n</code></pre> <ul> <li>Test plan has been updated with the new register flow. Please check OCF Registration Flow</li> <li>Video with explanation and demonstration of new register flow New Registration Demo</li> </ul>"},{"location":"releasenotes/#new-opencapif-architecture","title":"New OpenCAPIF architecture","text":"<ul> <li>New arquitecture with separated namespaces for Vault, CCF and Register components. Communication between them now are only allowed by using REST APIs.</li> <li> <p>New helper service inside CCF, it will simplify integration with third parties like external management portals.</p> </li> <li> <p>Helper endpoints:</p> <ul> <li>/getInvokers : Get the list of invokers from CAPIF</li> <li>/getProviders: Get the list of providers from CAPIF</li> <li>/getServices : Get the list of services published in CAPIF</li> <li>/getSecurityContext : Get the list of security contexts from CAPIF</li> <li>/getEvents : Get the list of events subscriptions from CAPIF</li> <li>/deleteEntities: Removes all entities registered by a user from the register</li> </ul> </li> <li> <p>Security in the helper</p> <ul> <li>To make requests to the helper you will need a superadmin certificate and password.</li> </ul> </li> </ul>"},{"location":"releasenotes/#events-api-upgrade","title":"Events API Upgrade","text":"<ul> <li>The event management at CCF is improved, EventNotification include Event Details with required information.</li> <li>Events updated:<ul> <li>SERVICE_API_AVAILABLE and SERVICE_API_UNAVAILABLE with apiIds</li> <li>SERVICE_API_UPDATE with serviceAPIDescriptions</li> <li>API_INVOKER_ONBOARDED, API_INVOKER_UPDATED, API_INVOKER_OFFBOARDED with apiInvokerIds.</li> </ul> </li> <li>Events Included:<ul> <li>SERVICE_API_INVOCATION_SUCCESS and SERVICE_API_INVOCATION_FAILURE with invocationLogs</li> </ul> </li> <li>Test plan include 7 new tests in order to check new events implemented and scenarios of each notification implemented, with a complete check of Event Notification.</li> <li>Test plan documentation includes the new event tests OCF Event test plan documentation.</li> </ul>"},{"location":"releasenotes/#inital-implementation-of-cicd","title":"Inital implementation of CI/CD","text":"<ul> <li>The inital implementation of CI/CD on gitlab was performed.</li> <li>Detailed information in the CICD Wiki.</li> <li>Implement initial CI/CD:<ul> <li>Description of the CI process.<ul> <li>In CI phase, created design, jobs and security checks when a branch is pushed.</li> <li>The CI has jobs as:<ul> <li>Linting code, unit test (if needed),</li> <li>Build and push artifacts (images) in Git OCI register</li> <li>Security checks,</li> <li>SCA, CVS, SAST</li> <li>The vulnerabilities are exposed in Merge Request panel to be solved.</li> </ul> </li> </ul> </li> <li>Description of the CD process:<ul> <li>Defined the environments to OCF.<ul> <li>Production env.</li> <li>Pre-production env.</li> <li>Validation env.</li> <li>Dev-1, dev-2\u2026 envs (ephemeral)</li> </ul> </li> <li>Defined the naming convention to OCF releases<ul> <li>Tag in prod: v0.0.1-release</li> <li>Tag non-prod: v0.0.1-rc</li> <li>Other tags: v0.0.1-test, v0.0.1-smt</li> </ul> </li> <li>Defined the jobs of CD<ul> <li>CD ensures the deployment in multiple envs. Therefore, the CD pipeline has deploy-ocf, delete-ocf (if needed) jobs</li> </ul> </li> </ul> </li> <li>ETSI HIVE Labs:<ul> <li>Designed, created and the Kuberntes OCF cluster is running to support OCFs deployments.</li> <li>Iterating with ETSI HIVE\u2019s support to solve computing issues.<ul> <li>CPU compatibilities with OCF services (MongoDB): Fixed</li> </ul> </li> </ul> </li> </ul> </li> </ul>"},{"location":"releasenotes/#documentation","title":"Documentation","text":""},{"location":"releasenotes/#improvements-on-documentation","title":"Improvements on documentation","text":"<ul> <li>Documentation stored in OCF Documentation Repository</li> <li>Continuous Integration included at repository for web documentation:<ul> <li>Develop version of documentation is automatically generated on each merge to develop branch.</li> <li>Tagged version from main create documentation with related tag as version.</li> </ul> </li> </ul>"},{"location":"releasenotes/#technical-debt-solved","title":"Technical Debt Solved","text":""},{"location":"releasenotes/#improved-testing-with-robot-in-order-to-cover","title":"Improved Testing with Robot in order to cover","text":"<ul> <li>Support of new Register flows.</li> <li>Allow different URLs for register, ccf and vault services.</li> <li>New Variables included to manage new architecture under test.</li> <li>Mock server developed to add the functionality of write tests involving notification from Service Under Test.</li> <li>Docker image improved generation and libraries upgraded to Robot Framework 7.</li> </ul>"},{"location":"releasenotes/#improved-security-on-db","title":"Improved security on DB","text":"<ul> <li>Credentials requested to access mongo databases.</li> <li>Credentials requested also by mongo-express.</li> </ul>"},{"location":"releasenotes/#scripts-upgraded","title":"Scripts upgraded","text":"<ul> <li>Docker compose version 2 used on them.</li> <li>New cleaning script developed.</li> <li>Scripts upgraded:<ul> <li>check_services_are_running.sh: Checks if all essential services (Vault, CCF and Register) are running.</li> <li>clean_capif_docker_services.sh: Shutdowns and removes all services essential services.</li> <li>clean_capif_temporary_files.sh: Removes temporaly files from local repository. </li> <li>run.sh: Launch Essential services locally using docker compose, also monitoring can be launched.</li> <li>run_capif_tests.sh: Launch Robot Framwork Tests.</li> <li>show_logs.sh: Show locally logs of Services running.</li> <li>run_mock_server.sh: Launch mock server locally on all interfaces. This axiliary server is only used by tagged mockserver tests on Robot Framework.</li> <li>clean_mock_server.sh: Remove mock server local deployment.</li> <li>deploy.sh: This script simplify the way to download capif repository.</li> </ul> </li> </ul>"},{"location":"releasenotes/#codebase-improvements","title":"Codebase Improvements","text":"<ul> <li>Documentation is now on splitted repository OCF Documentation Repository</li> <li>Test plan was moved to OCF Documentation Repository</li> <li>Obsolote data is removed.</li> <li>Repository Reorganization: Enhanced structure and maintainability with a better directory layout and clearer module separation.</li> <li>Code Quality Enhancements: Refactored code and fixed known issues</li> </ul>"},{"location":"releasenotes/#migration-to-gunicorn","title":"Migration to GUNICORN","text":"<ul> <li>Include production server on each microservice: Release 0 use Flask developer server, now we use GUNICORN.</li> </ul>"},{"location":"releasenotes/#release-00","title":"Release 0.0","text":"<p>The APIs included in Release 0.0 are:</p> <ul> <li>JWT Authentication APIs</li> <li>CAPIF Invoker Management API</li> <li>CAPIF Publish API</li> <li>CAPIF Discover API</li> <li>CAPIF Security API</li> <li>CAPIF Events API</li> <li>CAPIF Provider Management API</li> </ul> <p>This Release also includes a Robot Test Suite for all those services and a Postman Test Suite for simple testing.</p>"},{"location":"deployment_guide/deployment_guide/","title":"1. Deployment Guide","text":"<p>This section walks you through the process of deploying TeraFlowSDN on top of a machine running MicroK8s Kubernetes platform. The guide includes the details on configuring and installing the machine, installing and configuring MicroK8s, and deploying and reporting the status of the TeraFlowSDN controller.</p>"},{"location":"deployment_guide/deployment_guide/#11-configure-your-machine","title":"1.1. Configure your Machine","text":"<p>In this section, we describe how to configure a machine (physical or virtual) to be used as the deployment, execution, and development environment for the ETSI TeraFlowSDN controller. Choose your preferred environment below and follow the instructions provided.</p> <p>NOTE: If you already have a remote physical server fitting the requirements specified in this section feel free to use it instead of deploying a local VM. Check 1.1.1. Physical Server for further details.</p> <p>Virtualization platforms tested are:</p> <ul> <li>Physical Server</li> <li>Oracle Virtual Box</li> <li>VMWare Fusion</li> <li>OpenStack</li> <li>Vagrant Box</li> </ul>"},{"location":"deployment_guide/deployment_guide/#111-physical-server","title":"1.1.1. Physical ServerServer SpecificationsClusterized DeploymentNetworkingOperating SystemUpgrade the Ubuntu distribution","text":"<p>This section describes how to configure a physical server for running ETSI TeraFlowSDN(TFS) controller.</p> <p>Minimum Server Specifications for development and basic deployment</p> <ul> <li>CPU: 4 cores</li> <li>RAM: 8 GB</li> <li>Disk: 60 GB</li> <li>1 GbE NIC</li> </ul> <p>Recommended Server Specifications for development and basic deployment</p> <ul> <li>CPU: 6 cores</li> <li>RAM: 12 GB</li> <li>Disk: 80 GB</li> <li>1 GbE NIC</li> </ul> <p>Server Specifications for best development and deployment experience</p> <ul> <li>CPU: 8 cores</li> <li>RAM: 32 GB</li> <li>Disk: 120 GB</li> <li>1 GbE NIC</li> </ul> <p>NOTE: the specifications listed above are provided as a reference. They depend also on the CPU clock frequency, the RAM memory, the disk technology and speed, etc.</p> <p>For development purposes, it is recommended to run the VSCode IDE (or the IDE of your choice) in a more powerful server, for instance, the recommended server specifications for development and basic deployment.</p> <p>Given that TeraFlowSDN follows a micro-services architecture, for the deployment, it might be better to use many clusterized servers with many slower cores than a single server with few highly performant cores.</p> <p>You might consider creating a cluster of machines each featuring, at least, the minimum server specifications. That solution brings you scalability in the future.</p> <p>No explicit indications are given in terms of networking besides that servers need access to the Internet for downloading dependencies, binaries, and packages while building and deploying the TeraFlowSDN components.</p> <p>Besides that, the network requirements are essentially the same than that required for running a classical Kubernetes environment. To facilitate the deployment, we extensively use MicroK8s, thus the network requirements are, essentially, the same demanded by MicroK8s, especially, if you consider creating a Kubernetes cluster.</p> <p>As a reference, the other deployment solutions based on VMs assume the VM is connected to a virtual network configured with the IP range <code>10.0.2.0/24</code> and have the gateway at IP <code>10.0.2.1</code>. The VMs have the IP address <code>10.0.2.10</code>.</p> <p>The minimum required ports to be accessible are: - 22/SSH : for management purposes - 80/HTTP : for the TeraFlowSDN WebUI and Grafana dashboard - 8081/HTTPS : for the CockroachDB WebUI</p> <p>Other ports might be required if you consider to deploy addons such as Kubernetes observability, etc. The details on these ports are left appart given they might vary depending on the Kubernetes environment you use.</p> <p>The recommended Operating System for deploying TeraFlowSDN is Ubuntu Server 22.04 LTS or Ubuntu Server 20.04 LTS. Other version might work, but we have not tested them. We strongly recommend using Long Term Support (LTS) versions as they provide better stability.</p> <p>Below we provide some installation guidelines: - Installation Language: English - Autodetect your keyboard - If asked, select \"Ubuntu Server\" (do not select \"Ubuntu Server (minimized)\"). - Configure static network specifications (adapt them based on your particular setup):</p> Interface IPv4 Method Subnet Address Gateway Name servers Search domains enp0s3 Manual 10.0.2.0/24 10.0.2.10 10.0.2.1 8.8.8.8,8.8.4.4 <ul> <li>Leave proxy and mirror addresses as they are</li> <li>Let the installer self-upgrade (if asked).</li> <li>Use an entire disk for the installation</li> <li>Disable setup of the disk as LVM group</li> <li>Double check that NO swap space is allocated in the partition table. Kubernetes does not work properly with SWAP.</li> <li>Configure your user and system names:</li> <li>User name: <code>TeraFlowSDN</code></li> <li>Server's name: <code>tfs-vm</code></li> <li>Username: <code>tfs</code></li> <li>Password: <code>tfs123</code></li> <li>Install Open SSH Server</li> <li>Import SSH keys, if any.</li> <li>Featured Server Snaps</li> <li>Do not install featured server snaps. It will be done manually later to illustrate how to uninstall and reinstall them in case of trouble with.</li> <li>Let the system install and upgrade the packages.</li> <li>This operation might take some minutes depending on how old is the Optical Drive ISO image you use and your Internet connection speed.</li> <li>Restart the VM when the installation is completed.</li> </ul> <pre><code>sudo apt-get update -y\nsudo apt-get dist-upgrade -y\n</code></pre> <ul> <li>If asked to restart services, restart the default ones proposed.</li> <li>Restart the VM when the installation is completed.</li> </ul>"},{"location":"deployment_guide/deployment_guide/#112-oracle-virtual-box","title":"1.1.2. Oracle Virtual BoxCreate a NAT Network in VirtualBoxCreate VM in VirtualBox:Install Ubuntu 22.04 LTS Operating System","text":"<p>This section describes how to configure a VM for running ETSI TeraFlowSDN(TFS) controller using Oracle VirtualBox. It has been tested with VirtualBox up to version 6.1.40 r154048.</p> <p>In \"Oracle VM VirtualBox Manager\", Menu \"File > Preferences... > Network\", create a NAT network with the following specifications:</p> Name CIDR DHCP IPv6 TFS-NAT-Net 10.0.2.0/24 Disabled Disabled <p>Within the newly created \"TFS-NAT-Net\" NAT network, configure the following IPv4 forwarding rules:</p> Name Protocol Host IP Host Port Guest IP Guest Port SSH TCP 127.0.0.1 2200 10.0.2.10 22 HTTP TCP 127.0.0.1 8080 10.0.2.10 80 <p>Note: IP address 10.0.2.10 is the one that will be assigned to the VM.</p> <ul> <li>Name: TFS-VM</li> <li>Type/Version: Linux / Ubuntu (64-bit)</li> <li>CPU (*): 4 vCPUs @ 100% execution capacity</li> <li>RAM: 8 GB</li> <li>Disk: 60 GB, Virtual Disk Image (VDI), Dynamically allocated</li> <li>Optical Drive ISO Image: \"ubuntu-22.04.X-live-server-amd64.iso\"</li> <li>Download the latest Long Term Support (LTS) version of the Ubuntu Server image from Ubuntu 22.04 LTS, e.g., \"ubuntu-22.04.X-live-server-amd64.iso\".</li> <li>Note: use Ubuntu Server image instead of Ubuntu Desktop to create a lightweight VM.</li> <li>Network Adapter 1 (*): enabled, attached to NAT Network \"TFS-NAT-Net\"</li> <li>Minor adjustments (*):</li> <li>Audio: disabled</li> <li>Boot order: disable \"Floppy\"</li> </ul> <p>Note: (*) settings to be editing after the VM is created.</p> <p>In \"Oracle VM VirtualBox Manager\", start the VM in normal mode, and follow the installation procedure. Below we provide some installation guidelines: - Installation Language: English - Autodetect your keyboard - If asked, select \"Ubuntu Server\" (do not select \"Ubuntu Server (minimized)\"). - Configure static network specifications:</p> Interface IPv4 Method Subnet Address Gateway Name servers Search domains enp0s3 Manual 10.0.2.0/24 10.0.2.10 10.0.2.1 8.8.8.8,8.8.4.4 <ul> <li>Leave proxy and mirror addresses as they are</li> <li>Let the installer self-upgrade (if asked).</li> <li>Use an entire disk for the installation</li> <li>Disable setup of the disk as LVM group</li> <li>Double check that NO swap space is allocated in the partition table. Kubernetes does not work properly with SWAP.</li> <li>Configure your user and system names:</li> <li>User name: TeraFlowSDN</li> <li>Server's name: tfs-vm</li> <li>Username: tfs</li> <li>Password: tfs123</li> <li>Install Open SSH Server</li> <li>Import SSH keys, if any.</li> <li>Featured Server Snaps</li> <li>Do not install featured server snaps. It will be done manually later to illustrate how to uninstall and reinstall them in case of trouble with.</li> <li>Let the system install and upgrade the packages.</li> <li>This operation might take some minutes depending on how old is the Optical Drive ISO image you use and your Internet connection speed.</li> <li>Restart the VM when the installation is completed.</li> </ul> <p>Upgrade the Ubuntu distribution</p> <pre><code>sudo apt-get update -y\nsudo apt-get dist-upgrade -y\n</code></pre> <ul> <li>If asked to restart services, restart the default ones proposed.</li> <li>Restart the VM when the installation is completed.</li> </ul> <p>Install VirtualBox Guest Additions On VirtualBox Manager, open the VM main screen. If you are running the VM in headless mode, right click over the VM in the VirtualBox Manager window and click \"Show\". If a dialog informing about how to leave the interface of the VM is shown, confirm pressing \"Switch\" button. The interface of the VM should appear.</p> <p>Click menu \"Device > Insert Guest Additions CD image...\"</p> <p>On the VM terminal, type:</p> <pre><code>sudo apt-get install -y linux-headers-$(uname -r) build-essential dkms\n # This command might take some minutes depending on your VM specs and your Internet access speed.\nsudo mount /dev/cdrom /mnt/\ncd /mnt/\nsudo ./VBoxLinuxAdditions.run\n # This command might take some minutes depending on your VM specs.\nsudo reboot\n</code></pre>"},{"location":"deployment_guide/deployment_guide/#113-vmware-fusion","title":"1.1.3. VMWare FusionCreate VM in VMWare Fusion:Install Ubuntu 22.04.1 LTS Operating SystemUpgrade the Ubuntu distribution","text":"<p>This section describes how to configure a VM for running ETSI TeraFlowSDN(TFS) controller using VMWare Fusion. It has been tested with VMWare Fusion version 12 and 13.</p> <p>In \"VMWare Fusion\" manager, create a new network from the \"Settings/Network\" menu.</p> <ul> <li>Unlock to make changes</li> <li>Press the + icon and create a new network</li> <li>Change the name to TFS-NAT-Net</li> <li>Check \"Allow virtual machines on this network to connect to external network (NAT)\"</li> <li>Do not check \"Enable IPv6\"</li> <li>Add port forwarding for HTTP and SSH</li> <li>Uncheck \"Provide address on this network via DHCP\"</li> </ul> <p>Create a new VM an Ubuntu 22.04.1 ISO:</p> <ul> <li>Display Name: TeraFlowSDN</li> <li>Username: tfs</li> <li>Password: tfs123</li> </ul> <p>On the next screen press \"Customize Settings\", save the VM and in \"Settings\" change: - Change to use 4 CPUs - Change to access 8 GB of RAM - Change disk to size 60 GB - Change the network interface to use the previously created TFS-NAT-Net</p> <p>Run the VM to start the installation.</p> <p>The installation will be automatic, without any configuration required.</p> <ul> <li>Configure the guest IP, gateway and DNS:</li> </ul> <p>Using the Network Settings for the wired connection, set the IP to 10.0.2.10, the mask to 255.255.255.0, the gateway to 10.0.2.2 and the DNS to 10.0.2.2.</p> <ul> <li>Disable and remove swap file:</li> </ul> <p>$ sudo swapoff -a $ sudo rm /swapfile</p> <p>Then you can remove or comment the /swapfile entry in /etc/fstab</p> <ul> <li>Install Open SSH Server</li> <li> <p>Import SSH keys, if any.</p> </li> <li> <p>Restart the VM when the installation is completed.</p> </li> </ul> <pre><code>sudo apt-get update -y\nsudo apt-get dist-upgrade -y\n</code></pre>"},{"location":"deployment_guide/deployment_guide/#114-openstack","title":"1.1.4. OpenStackCreate a Security Group in OpenStack <p> In OpenStack, go to Project - Network - Security Groups - Create Security Group with name TFS</p> <p>Add the following rules:</p> Direction Ether Type IP Protocol Port Range Remote IP Prefix Ingress IPv4 TCP 22 (SSH) 0.0.0.0/0 Ingress IPv4 TCP 2200 0.0.0.0/0 Ingress IPv4 TCP 8080 0.0.0.0/0 Ingress IPv4 TCP 80 0.0.0.0/0 Egress IPv4 Any Any 0.0.0.0/0 Egress IPv6 Any Any ::/0 <p>Note: The IP address will be assigned depending on the network you have configured inside OpenStack. This IP will have to be modified in TeraFlow configuration files which by default use IP 10.0.2.10</p> Create a flavour <p></p> <p>From dashboard (Horizon)</p> <p>Go to Admin - Compute - Flavors and press Create Flavor</p> <ul> <li>Name: TFS</li> <li>VCPUs: 4</li> <li>RAM (MB): 8192</li> <li>Root Disk (GB): 60</li> </ul> <p>From CLI</p> <pre><code> openstack flavor create TFS --id auto --ram 8192 --disk 60 --vcpus 8\n</code></pre> Create an instance in OpenStack: <p></p> <ul> <li>Instance name: TFS-VM</li> <li>Origin: [Ubuntu-22.04 cloud image] (https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img)</li> <li>Create new volume: No</li> <li>Flavor: TFS</li> <li>Networks: extnet </li> <li>Security Groups: TFS</li> <li>Configuration: Include the following cloud-config</li> </ul> <pre><code>#cloud-config\n# Modifies the password for the VM instance\nusername: ubuntu\npassword: <your-password>\nchpasswd: { expire: False }\nssh_pwauth: True\n</code></pre> Upgrade the Ubuntu distribution <p></p> <pre><code>sudo apt-get update -y\nsudo apt-get dist-upgrade -y\n</code></pre> <ul> <li>If asked to restart services, restart the default ones proposed.</li> <li>Restart the VM when the installation is completed.</li> </ul>","text":"<p>This section describes how to configure a VM for running ETSI TeraFlowSDN(TFS) controller using OpenStack. It has been tested with OpenStack Kolla up to Yoga version. </p>"},{"location":"deployment_guide/deployment_guide/#115-vagrant-box","title":"1.1.5. Vagrant Box <p>","text":""},{"location":"deployment_guide/deployment_guide/#12-install-microk8s","title":"1.2. Install MicroK8s","text":"<p>This section describes how to deploy the MicroK8s Kubernetes platform and configure it to be used with ETSI TeraFlowSDN controller. Besides, Docker is installed to build docker images for the ETSI TeraFlowSDN controller.</p> <p>The steps described in this section might take some minutes depending on your internet connection speed and the resources assigned to your VM, or the specifications of your physical server.</p> <p>To facilitate work, these steps are easier to be executed through an SSH connection, for instance using tools like PuTTY or MobaXterm.</p> Upgrade the Ubuntu distribution <p> Skip this step if you already did it during the creation of the VM.</p> <pre><code>sudo apt-get update -y\nsudo apt-get dist-upgrade -y\n</code></pre> Install prerequisites <p></p> <pre><code>sudo apt-get install -y ca-certificates curl gnupg lsb-release snapd jq\n</code></pre> Install Docker CE <p> Install Docker CE and Docker BuildX plugin</p> <pre><code>sudo apt-get install -y docker.io docker-buildx\n</code></pre> <p>NOTE: Starting from Docker v23, Build architecture has been updated and <code>docker build</code> command entered into deprecation process in favor of the new <code>docker buildx build</code> command. Package <code>docker-buildx</code> provides the new <code>docker buildx build</code> command.</p> <p>Add key \"insecure-registries\" with the private repository to the daemon configuration. It is done in two commands since sometimes read from and write to same file might cause trouble.</p> <pre><code>if [ -s /etc/docker/daemon.json ]; then cat /etc/docker/daemon.json; else echo '{}'; fi \\\n | jq 'if has(\"insecure-registries\") then . else .+ {\"insecure-registries\": []} end' -- \\\n | jq '.\"insecure-registries\" |= (.+ [\"localhost:32000\"] | unique)' -- \\\n | tee tmp.daemon.json\nsudo mv tmp.daemon.json /etc/docker/daemon.json\nsudo chown root:root /etc/docker/daemon.json\nsudo chmod 600 /etc/docker/daemon.json\n</code></pre> <p>Restart the Docker daemon</p> <pre><code>sudo systemctl restart docker\n</code></pre> Install MicroK8s <p></p> <p>Important: Some TeraFlowSDN dependencies need to be executed on top of MicroK8s/Kubernetes v1.24. It is not guaranteed (by now) to run on newer versions.</p> <pre><code># Install MicroK8s\nsudo snap install microk8s --classic --channel=1.24/stable\n\n# Create alias for command \"microk8s.kubectl\" to be usable as \"kubectl\"\nsudo snap alias microk8s.kubectl kubectl\n</code></pre> <p>It is important to make sure that <code>ufw</code> will not interfere with the internal pod-to-pod and pod-to-Internet traffic. To do so, first check the status. If <code>ufw</code> is active, use the following command to enable the communication.</p> <pre><code>\n# Verify status of ufw firewall\nsudo ufw status\n\n# If ufw is active, install following rules to enable access pod-to-pod and pod-to-internet\nsudo ufw allow in on cni0 && sudo ufw allow out on cni0\nsudo ufw default allow routed\n</code></pre> <p>NOTE: MicroK8s can be used to compose a Highly Available Kubernetes cluster enabling you to construct an environment combining the CPU, RAM and storage resources of multiple machines. If you are interested in this procedure, review the official instructions in How to build a highly available Kubernetes cluster with MicroK8s, in particular, the step Create a MicroK8s multi-node cluster.</p> <p>References:</p> <ul> <li>The lightweight Kubernetes > Install MicroK8s</li> <li>Install a local Kubernetes with MicroK8s</li> <li>How to build a highly available Kubernetes cluster with MicroK8s</li> </ul> Add user to the docker and microk8s groups <p></p> <p>It is important that your user has the permission to run <code>docker</code> and <code>microk8s</code> in the terminal. To allow this, you need to add your user to the <code>docker</code> and <code>microk8s</code> groups with the following commands:</p> <pre><code>sudo usermod -a -G docker $USER\nsudo usermod -a -G microk8s $USER\nsudo chown -f -R $USER $HOME/.kube\nsudo reboot\n</code></pre> <p>In case that you get trouble executing the following commands, might due to the .kube folder is not automatically provisioned into your home folder, you may follow the steps below:</p> <pre><code>mkdir -p $HOME/.kube\nsudo chown -f -R $USER $HOME/.kube\nmicrok8s config > $HOME/.kube/config\nsudo reboot\n</code></pre> Check status of Kubernetes and addons <p> To retrieve the status of Kubernetes once, run the following command:</p> <pre><code>microk8s.status --wait-ready\n</code></pre> <p>To retrieve the status of Kubernetes periodically (e.g., every 1 second), run the following command:</p> <pre><code>watch -n 1 microk8s.status --wait-ready\n</code></pre> Check all resources in Kubernetes <p> To retrieve the status of the Kubernetes resources once, run the following command:</p> <pre><code>kubectl get all --all-namespaces\n</code></pre> <p>To retrieve the status of the Kubernetes resources periodically (e.g., every 1 second), run the following command:</p> <pre><code>watch -n 1 kubectl get all --all-namespaces\n</code></pre> Enable addons <p></p> <p>First, we need to enable the community plugins (maintained by third parties):</p> <pre><code>microk8s.enable community\n</code></pre> <p>The Addons to be enabled are:</p> <ul> <li><code>dns</code>: enables resolving the pods and services by name</li> <li><code>helm3</code>: required to install NATS</li> <li><code>hostpath-storage</code>: enables providing storage for the pods (required by <code>registry</code>)</li> <li><code>ingress</code>: deploys an ingress controller to expose the microservices outside Kubernetes</li> <li><code>registry</code>: deploys a private registry for the TFS controller images</li> <li><code>linkerd</code>: deploys the linkerd service mesh used for load balancing among replicas</li> <li><code>prometheus</code>: set of tools that enable TFS observability through per-component instrumentation</li> <li><code>metrics-server</code>: deploys the Kubernetes metrics server for API access to service metrics</li> </ul> <pre><code>microk8s.enable dns helm3 hostpath-storage ingress registry prometheus metrics-server linkerd\n</code></pre> <p>Important: Enabling some of the addons might take few minutes. Do not proceed with next steps until the addons are ready. Otherwise, the deployment might fail. To confirm everything is up and running:</p> <ol> <li>Periodically Check the status of Kubernetes until you see the addons [dns, ha-cluster, helm3, hostpath-storage, ingress, linkerd, metrics-server, prometheus, registry, storage] in the enabled block.</li> <li>Periodically Check Kubernetes resources until all pods are Ready and Running.</li> <li>If it takes too long for the Pods to be ready, we observed that rebooting the machine may help.</li> </ol> <p>Then, create aliases to make the commands easier to access:</p> <pre><code>sudo snap alias microk8s.helm3 helm3\nsudo snap alias microk8s.linkerd linkerd\n</code></pre> <p>To validate that <code>linkerd</code> is working correctly, run:</p> <pre><code>linkerd check\n</code></pre> <p>To validate that the <code>metrics-server</code> is working correctly, run:</p> <pre><code>kubectl top pods --all-namespaces\n</code></pre> <p>and you should see a screen similar to the <code>top</code> command in Linux, showing the columns namespace, pod name, CPU (cores), and MEMORY (bytes).</p> <p>In case pods are not starting, check information from pods logs. For example, linkerd is sensitive for proper /etc/resolv.conf syntax.</p> <pre><code>kubectl logs <podname> --namespace <namespace>\n</code></pre> <p>If the command shows an error message, also restarting the machine might help.</p> Stop, Restart, and Redeploy <p> Find below some additional commands you might need while you work with MicroK8s:</p> <pre><code>microk8s.stop # stop MicroK8s cluster (for instance, before power off your computer)\nmicrok8s.start # start MicroK8s cluster\nmicrok8s.reset # reset infrastructure to a clean state\n</code></pre> <p>If the following commands does not work to recover the MicroK8s cluster, you can redeploy it.</p> <p>If you want to keep MicroK8s configuration, use:</p> <pre><code>sudo snap remove microk8s\n</code></pre> <p>If you need to completely drop MicroK8s and its complete configuration, use:</p> <pre><code>sudo snap remove microk8s --purge\nsudo apt-get remove --purge docker.io docker-buildx\n</code></pre> <p>IMPORTANT: After uninstalling MicroK8s, it is convenient to reboot the computer (the VM if you work on a VM, or the physical computer if you use a physical computer). Otherwise, there are system configurations that are not correctly cleaned. Especially in what port forwarding and firewall rules matters.</p> <p>After the reboot, redeploy as it is described in this section.</p>"},{"location":"deployment_guide/deployment_guide/#13-deploy-teraflowsdn","title":"1.3. Deploy TeraFlowSDN","text":"<p>This section describes how to deploy TeraFlowSDN controller on top of MicroK8s using the environment configured in the previous sections.</p> Install prerequisites <p></p> <pre><code>sudo apt-get install -y git curl jq\n</code></pre> Clone the Git repository of the TeraFlowSDN controller <p> Clone from ETSI-hosted GitLab code repository:</p> <pre><code>mkdir ~/tfs-ctrl\ngit clone https://labs.etsi.org/rep/tfs/controller.git ~/tfs-ctrl\n</code></pre> <p>Important: The original H2020-TeraFlow project hosted on GitLab.com has been archieved and will not receive further contributions/updates. Please, clone from ETSI-hosted GitLab code repository.</p> Checkout the appropriate Git branch <p> TeraFlowSDN controller versions can be found in the appropriate release tags and/or branches as described in Home > Versions.</p> <p>By default the branch master is checked out and points to the latest stable version of the TeraFlowSDN controller, while branch develop contains the latest developments and contributions under test and validation.</p> <p>To switch to the appropriate branch run the following command, changing <code>develop</code> by the name of the branch you want to deploy:</p> <pre><code>cd ~/tfs-ctrl\ngit checkout develop\n</code></pre> Prepare a deployment script with the deployment settings <p> Create a new deployment script, e.g., <code>my_deploy.sh</code>, adding the appropriate settings as follows. This section provides just an overview of the available settings. An example <code>my_deploy.sh</code> script is provided in the root folder of the project for your convenience with full description of all the settings.</p> <p>Note: The example <code>my_deploy.sh</code> script provides reasonable settings for deploying a functional and complete enough TeraFlowSDN controller, and a brief description of their meaning. To see extended descriptions, check scripts in the <code>deploy</code> folder.</p> <pre><code>cd ~/tfs-ctrl\ntee my_deploy.sh >/dev/null << EOF\n# ----- TeraFlowSDN ------------------------------------------------------------\nexport TFS_REGISTRY_IMAGES=\"http://localhost:32000/tfs/\"\nexport TFS_COMPONENTS=\"context device ztp monitoring pathcomp service slice nbi webui load_generator\"\nexport TFS_IMAGE_TAG=\"dev\"\nexport TFS_K8S_NAMESPACE=\"tfs\"\nexport TFS_EXTRA_MANIFESTS=\"manifests/nginx_ingress_http.yaml\"\nexport TFS_GRAFANA_PASSWORD=\"admin123+\"\nexport TFS_SKIP_BUILD=\"\"\n\n# ----- CockroachDB ------------------------------------------------------------\nexport CRDB_NAMESPACE=\"crdb\"\nexport CRDB_EXT_PORT_SQL=\"26257\"\nexport CRDB_EXT_PORT_HTTP=\"8081\"\nexport CRDB_USERNAME=\"tfs\"\nexport CRDB_PASSWORD=\"tfs123\"\nexport CRDB_DATABASE=\"tfs\"\nexport CRDB_DEPLOY_MODE=\"single\"\nexport CRDB_DROP_DATABASE_IF_EXISTS=\"YES\"\nexport CRDB_REDEPLOY=\"\"\n\n# ----- NATS -------------------------------------------------------------------\nexport NATS_NAMESPACE=\"nats\"\nexport NATS_EXT_PORT_CLIENT=\"4222\"\nexport NATS_EXT_PORT_HTTP=\"8222\"\nexport NATS_REDEPLOY=\"\"\n\n# ----- QuestDB ----------------------------------------------------------------\nexport QDB_NAMESPACE=\"qdb\"\nexport QDB_EXT_PORT_SQL=\"8812\"\nexport QDB_EXT_PORT_ILP=\"9009\"\nexport QDB_EXT_PORT_HTTP=\"9000\"\nexport QDB_USERNAME=\"admin\"\nexport QDB_PASSWORD=\"quest\"\nexport QDB_TABLE_MONITORING_KPIS=\"tfs_monitoring_kpis\"\nexport QDB_TABLE_SLICE_GROUPS=\"tfs_slice_groups\"\nexport QDB_DROP_TABLES_IF_EXIST=\"YES\"\nexport QDB_REDEPLOY=\"\"\n\nEOF\n</code></pre> <p>The settings are organized in 4 sections: - Section <code>TeraFlowSDN</code>: - <code>TFS_REGISTRY_IMAGE</code> enables to specify the private Docker registry to be used, by default, we assume to use the Docker respository enabled in MicroK8s. - <code>TFS_COMPONENTS</code> specifies the components their Docker image will be rebuilt, uploaded to the private Docker registry, and deployed in Kubernetes. - <code>TFS_IMAGE_TAG</code> defines the tag to be used for Docker images being rebuilt and uploaded to the private Docker registry. - <code>TFS_K8S_NAMESPACE</code> specifies the name of the Kubernetes namespace to be used for deploying the TFS components. - <code>TFS_EXTRA_MANIFESTS</code> enables to provide additional manifests to be applied into the Kubernetes environment during the deployment. Typical use case is to deploy ingress controllers, service monitors for Prometheus, etc. - <code>TFS_GRAFANA_PASSWORD</code> lets you specify the password you want to use for the <code>admin</code> user of the Grafana instance being deployed and linked to the Monitoring component. - <code>TFS_SKIP_BUILD</code>, if set to <code>YES</code>, prevents rebuilding the Docker images. That means, the deploy script will redeploy existing Docker images without rebuilding/updating them.</p> <ul> <li>Section <code>CockroachDB</code>: enables to configure the deployment of the backend CockroachDB database.</li> <li> <p>Check example script <code>my_deploy.sh</code> for further details.</p> </li> <li> <p>Section <code>NATS</code>: enables to configure the deployment of the backend NATS message broker.</p> </li> <li> <p>Check example script <code>my_deploy.sh</code> for further details.</p> </li> <li> <p>Section <code>QuestDB</code>: enables to configure the deployment of the backend QuestDB timeseries database.</p> </li> <li>Check example script <code>my_deploy.sh</code> for further details.</li> </ul> Confirm that MicroK8s is running <p></p> <p>Run the following command:</p> <pre><code>microk8s status\n</code></pre> <p>If it is reported <code>microk8s is not running, try microk8s start</code>, run the following command to start MicroK8s:</p> <pre><code>microk8s start\n</code></pre> <p>Confirm everything is up and running:</p> <ol> <li>Periodically Check the status of Kubernetes until you see the addons [dns, ha-cluster, helm3, hostpath-storage, ingress, registry, storage] in the enabled block.</li> <li>Periodically Check Kubernetes resources until all pods are Ready and Running.</li> </ol> Deploy TFS controller <p> First, source the deployment settings defined in the previous section. This way, you do not need to specify the environment variables in each and every command you execute to operate the TFS controller. Be aware to re-source the file if you open new terminal sessions. Then, run the following command to deploy TeraFlowSDN controller on top of the MicroK8s Kubernetes platform.</p> <pre><code>cd ~/tfs-ctrl\nsource my_deploy.sh\n./deploy/all.sh\n</code></pre> <p>The script performs the following steps:</p> <ul> <li>Executes script <code>./deploy/crdb.sh</code> to automate deployment of CockroachDB database used by Context component.</li> <li>The script automatically checks if CockroachDB is already deployed.</li> <li>If there are settings instructing to drop the database and/or redeploy CockroachDB, it does the appropriate actions to honor them as defined in previous section.</li> <li>Executes script <code>./deploy/nats.sh</code> to automate deployment of NATS message broker used by Context component.</li> <li>The script automatically checks if NATS is already deployed.</li> <li>If there are settings instructing to redeploy the message broker, it does the appropriate actions to honor them as defined in previous section.</li> <li>Executes script <code>./deploy/qdb.sh</code> to automate deployment of QuestDB timeseries database used by Monitoring component.</li> <li>The script automatically checks if QuestDB is already deployed.</li> <li>If there are settings instructing to redeploy the timeseries database, it does the appropriate actions to honor them as defined in previous section.</li> <li>Executes script <code>./deploy/tfs.sh</code> to automate deployment of TeraFlowSDN.</li> <li>Creates the namespace defined in <code>TFS_K8S_NAMESPACE</code></li> <li>Creates secrets for CockroachDB, NATS, and QuestDB to be used by Context and Monitoring components.</li> <li>Builds the Docker images for the components defined in <code>TFS_COMPONENTS</code></li> <li>Tags the Docker images with the value of <code>TFS_IMAGE_TAG</code></li> <li>Pushes the Docker images to the repository defined in <code>TFS_REGISTRY_IMAGE</code></li> <li>Deploys the components defined in <code>TFS_COMPONENTS</code></li> <li>Creates the file <code>tfs_runtime_env_vars.sh</code> with the environment variables for the components defined in <code>TFS_COMPONENTS</code> defining their local host addresses and their port numbers.</li> <li>Applies extra manifests defined in <code>TFS_EXTRA_MANIFESTS</code> such as:<ul> <li>Creating an ingress controller listening at port 80 for HTTP connections to enable external access to the TeraFlowSDN WebUI, Grafana Dashboards, and Compute NBI interfaces.</li> <li>Deploying service monitors to enable monitoring the performance of the components, device drivers and service handlers.</li> </ul> </li> <li>Initialize and configure the Grafana dashboards (if Monitoring component is deployed)</li> <li>Report a summary of the deployment</li> <li>See Show Deployment and Logs</li> </ul>"},{"location":"deployment_guide/deployment_guide/#14-webui-and-grafana-dashboards","title":"1.4. WebUI and Grafana Dashboards","text":"<p>This section describes how to get access to the TeraFlowSDN controller WebUI and the monitoring Grafana dashboards.</p> Access the TeraFlowSDN WebUI <p> If you followed the installation steps based on MicroK8s, you got an ingress controller installed that exposes on TCP port 80.</p> <p>Besides, the ingress controller defines the following reverse proxy paths (on your local machine):</p> <ul> <li><code>http://127.0.0.1/webui</code>: points to the WebUI of TeraFlowSDN.</li> <li><code>http://127.0.0.1/grafana</code>: points to the Grafana dashboards. This endpoint brings access to the monitoring dashboards of TeraFlowSDN. The credentials for the <code>admin</code>user are those defined in the <code>my_deploy.sh</code> script, in the <code>TFS_GRAFANA_PASSWORD</code> variable.</li> <li><code>http://127.0.0.1/restconf</code>: points to the Compute component NBI based on RestCONF. This endpoint enables connecting external software, such as ETSI OpenSourceMANO NFV Orchestrator, to TeraFlowSDN.</li> </ul> <p>Note: In the creation of the VM, a forward from host TCP port 8080 to VM's TCP port 80 is configured, so the WebUIs and REST APIs of TeraFlowSDN should be exposed on the endpoint <code>127.0.0.1:8080</code> of your local machine instead of <code>127.0.0.1:80</code>.</p>"},{"location":"deployment_guide/deployment_guide/#15-show-deployment-and-logs","title":"1.5. Show Deployment and Logs","text":"<p>This section presents some helper scripts to inspect the status of the deployment and the logs of the components. These scripts are particularly helpful for troubleshooting during execution of experiments, development, and debugging.</p> Report the deployment of the TFS controller <p></p> <p>The summary report given at the end of the Deploy TFS controller procedure can be generated manually at any time by running the following command. You can avoid sourcing <code>my_deploy.sh</code> if it has been already done.</p> <pre><code>cd ~/tfs-ctrl\nsource my_deploy.sh\n./deploy/show.sh\n</code></pre> <p>Use this script to validate that all the pods, deployments, replica sets, ingress controller, etc. are ready and have the appropriate state, e.g., running for Pods, and the services are deployed and have appropriate IP addresses and port numbers.</p> Report the log of a specific TFS controller component <p></p> <p>A number of scripts are pre-created in the <code>scripts</code> folder to facilitate the inspection of the component logs. For instance, to dump the log of the Context component, run the following command. You can avoid sourcing <code>my_deploy.sh</code> if it has been already done.</p> <pre><code>source my_deploy.sh\n./scripts/show_logs_context.sh\n</code></pre>"},{"location":"deployment_guide/configure_your_machine/configure_your_machine/","title":"Configure your machine","text":"<p>In this section, we describe how to configure a machine (physical or virtual) to be used as the deployment, execution, and development environment for the ETSI TeraFlowSDN controller. Choose your preferred environment below and follow the instructions provided.</p> <p>NOTE: If you already have a remote physical server fitting the requirements specified in this section feel free to use it instead of deploying a local VM. Check 1.1.1. Physical Server for further details.</p> <p>Virtualization platforms tested are: - 1.1.1. Physical Server - 1.1.2. Oracle Virtual Box - 1.1.3. VMWare Fusion - 1.1.4. OpenStack - 1.1.5. Vagrant Box</p> <p>Other virtualization environments might be used; in that case, you will need to adapt these instructions to your particular case. If you want to contribute with details on how you used other hypervisors or platforms, contact the TFS team through Slack.</p>"},{"location":"deployment_guide/configure_your_machine/openstack/","title":"Openstack","text":"<p>This page describes how to configure a VM for running ETSI TeraFlowSDN(TFS) controller using OpenStack. It has been tested with OpenStack Kolla up to Yoga version. </p>"},{"location":"deployment_guide/configure_your_machine/openstack/#create-a-security-group-in-openstack","title":"Create a Security Group in OpenStack","text":"<p>In OpenStack, go to Project - Network - Security Groups - Create Security Group with name TFS</p> <p>Add the following rules:</p> Direction Ether Type IP Protocol Port Range Remote IP Prefix Ingress IPv4 TCP 22 (SSH) 0.0.0.0/0 Ingress IPv4 TCP 2200 0.0.0.0/0 Ingress IPv4 TCP 8080 0.0.0.0/0 Ingress IPv4 TCP 80 0.0.0.0/0 Egress IPv4 Any Any 0.0.0.0/0 Egress IPv6 Any Any ::/0 <p>Note: The IP address will be assigned depending on the network you have configured inside OpenStack. This IP will have to be modified in TeraFlow configuration files which by default use IP 10.0.2.10</p>"},{"location":"deployment_guide/configure_your_machine/openstack/#create-a-flavour","title":"Create a flavour","text":""},{"location":"deployment_guide/configure_your_machine/openstack/#from-dashboard-horizon","title":"From dashboard (Horizon)","text":"<p>Go to Admin - Compute - Flavors and press Create Flavor</p> <ul> <li>Name: TFS</li> <li>VCPUs: 4</li> <li>RAM (MB): 8192</li> <li>Root Disk (GB): 60</li> </ul>"},{"location":"deployment_guide/configure_your_machine/openstack/#from-cli","title":"From CLI","text":"<pre><code> openstack flavor create TFS --id auto --ram 8192 --disk 60 --vcpus 8\n</code></pre>"},{"location":"deployment_guide/configure_your_machine/openstack/#create-an-instance-in-openstack","title":"Create an instance in OpenStack:","text":"<ul> <li>Instance name: TFS-VM</li> <li>Origin: [Ubuntu-22.04 cloud image] (https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img)</li> <li>Create new volume: No</li> <li>Flavor: TFS</li> <li>Networks: extnet </li> <li>Security Groups: TFS</li> <li>Configuration: Include the following cloud-config</li> </ul> <pre><code>#cloud-config\n# Modifies the password for the VM instance\nusername: ubuntu\npassword: <your-password>\nchpasswd: { expire: False }\nssh_pwauth: True\n</code></pre>"},{"location":"deployment_guide/configure_your_machine/openstack/#upgrade-the-ubuntu-distribution","title":"Upgrade the Ubuntu distribution","text":"<pre><code>sudo apt-get update -y\nsudo apt-get dist-upgrade -y\n</code></pre> <ul> <li>If asked to restart services, restart the default ones proposed.</li> <li>Restart the VM when the installation is completed.</li> </ul>"},{"location":"deployment_guide/configure_your_machine/oracle_virtual_box/","title":"Oracle virtual box","text":"<p>This page describes how to configure a VM for running ETSI TeraFlowSDN(TFS) controller using Oracle VirtualBox. It has been tested with VirtualBox up to version 6.1.40 r154048.</p>"},{"location":"deployment_guide/configure_your_machine/oracle_virtual_box/#create-a-nat-network-in-virtualbox","title":"Create a NAT Network in VirtualBox","text":"<p>In \"Oracle VM VirtualBox Manager\", Menu \"File > Preferences... > Network\", create a NAT network with the following specifications:</p> Name CIDR DHCP IPv6 TFS-NAT-Net 10.0.2.0/24 Disabled Disabled <p>Within the newly created \"TFS-NAT-Net\" NAT network, configure the following IPv4 forwarding rules:</p> Name Protocol Host IP Host Port Guest IP Guest Port SSH TCP 127.0.0.1 2200 10.0.2.10 22 HTTP TCP 127.0.0.1 8080 10.0.2.10 80 <p>Note: IP address 10.0.2.10 is the one that will be assigned to the VM.</p>"},{"location":"deployment_guide/configure_your_machine/oracle_virtual_box/#create-vm-in-virtualbox","title":"Create VM in VirtualBox:","text":"<ul> <li>Name: TFS-VM</li> <li>Type/Version: Linux / Ubuntu (64-bit)</li> <li>CPU (*): 4 vCPUs @ 100% execution capacity</li> <li>RAM: 8 GB</li> <li>Disk: 60 GB, Virtual Disk Image (VDI), Dynamically allocated</li> <li>Optical Drive ISO Image: \"ubuntu-22.04.X-live-server-amd64.iso\"</li> <li>Download the latest Long Term Support (LTS) version of the Ubuntu Server image from Ubuntu 22.04 LTS, e.g., \"ubuntu-22.04.X-live-server-amd64.iso\".</li> <li>Note: use Ubuntu Server image instead of Ubuntu Desktop to create a lightweight VM.</li> <li>Network Adapter 1 (*): enabled, attached to NAT Network \"TFS-NAT-Net\"</li> <li>Minor adjustments (*):</li> <li>Audio: disabled</li> <li>Boot order: disable \"Floppy\"</li> </ul> <p>Note: (*) settings to be editing after the VM is created.</p>"},{"location":"deployment_guide/configure_your_machine/oracle_virtual_box/#install-ubuntu-2204-lts-operating-system","title":"Install Ubuntu 22.04 LTS Operating System","text":"<p>In \"Oracle VM VirtualBox Manager\", start the VM in normal mode, and follow the installation procedure. Below we provide some installation guidelines: - Installation Language: English - Autodetect your keyboard - If asked, select \"Ubuntu Server\" (do not select \"Ubuntu Server (minimized)\"). - Configure static network specifications:</p> Interface IPv4 Method Subnet Address Gateway Name servers Search domains enp0s3 Manual 10.0.2.0/24 10.0.2.10 10.0.2.1 8.8.8.8,8.8.4.4 <ul> <li>Leave proxy and mirror addresses as they are</li> <li>Let the installer self-upgrade (if asked).</li> <li>Use an entire disk for the installation</li> <li>Disable setup of the disk as LVM group</li> <li>Double check that NO swap space is allocated in the partition table. Kubernetes does not work properly with SWAP.</li> <li>Configure your user and system names:</li> <li>User name: TeraFlowSDN</li> <li>Server's name: tfs-vm</li> <li>Username: tfs</li> <li>Password: tfs123</li> <li>Install Open SSH Server</li> <li>Import SSH keys, if any.</li> <li>Featured Server Snaps</li> <li>Do not install featured server snaps. It will be done manually later to illustrate how to uninstall and reinstall them in case of trouble with.</li> <li>Let the system install and upgrade the packages.</li> <li>This operation might take some minutes depending on how old is the Optical Drive ISO image you use and your Internet connection speed.</li> <li>Restart the VM when the installation is completed.</li> </ul>"},{"location":"deployment_guide/configure_your_machine/oracle_virtual_box/#upgrade-the-ubuntu-distribution","title":"Upgrade the Ubuntu distribution","text":"<pre><code>sudo apt-get update -y\nsudo apt-get dist-upgrade -y\n</code></pre> <ul> <li>If asked to restart services, restart the default ones proposed.</li> <li>Restart the VM when the installation is completed.</li> </ul>"},{"location":"deployment_guide/configure_your_machine/oracle_virtual_box/#install-virtualbox-guest-additions","title":"Install VirtualBox Guest Additions","text":"<p>On VirtualBox Manager, open the VM main screen. If you are running the VM in headless mode, right click over the VM in the VirtualBox Manager window and click \"Show\". If a dialog informing about how to leave the interface of the VM is shown, confirm pressing \"Switch\" button. The interface of the VM should appear.</p> <p>Click menu \"Device > Insert Guest Additions CD image...\"</p> <p>On the VM terminal, type:</p> <pre><code>sudo apt-get install -y linux-headers-$(uname -r) build-essential dkms\n # This command might take some minutes depending on your VM specs and your Internet access speed.\nsudo mount /dev/cdrom /mnt/\ncd /mnt/\nsudo ./VBoxLinuxAdditions.run\n # This command might take some minutes depending on your VM specs.\nsudo reboot\n</code></pre>"},{"location":"deployment_guide/configure_your_machine/physical_server/","title":"Physical server","text":"<p>This page describes how to configure a physical server for running ETSI TeraFlowSDN(TFS) controller.</p>"},{"location":"deployment_guide/configure_your_machine/physical_server/#server-specifications","title":"Server Specifications","text":""},{"location":"deployment_guide/configure_your_machine/physical_server/#minimum-server-specifications-for-development-and-basic-deployment","title":"Minimum Server Specifications for development and basic deployment","text":"<ul> <li>CPU: 4 cores</li> <li>RAM: 8 GB</li> <li>Disk: 60 GB</li> <li>1 GbE NIC</li> </ul>"},{"location":"deployment_guide/configure_your_machine/physical_server/#recommended-server-specifications-for-development-and-basic-deployment","title":"Recommended Server Specifications for development and basic deployment","text":"<ul> <li>CPU: 6 cores</li> <li>RAM: 12 GB</li> <li>Disk: 80 GB</li> <li>1 GbE NIC</li> </ul>"},{"location":"deployment_guide/configure_your_machine/physical_server/#server-specifications-for-best-development-and-deployment-experience","title":"Server Specifications for best development and deployment experience","text":"<ul> <li>CPU: 8 cores</li> <li>RAM: 32 GB</li> <li>Disk: 120 GB</li> <li>1 GbE NIC</li> </ul> <p>NOTE: the specifications listed above are provided as a reference. They depend also on the CPU clock frequency, the RAM memory, the disk technology and speed, etc.</p> <p>For development purposes, it is recommended to run the VSCode IDE (or the IDE of your choice) in a more powerful server, for instance, the recommended server specifications for development and basic deployment.</p> <p>Given that TeraFlowSDN follows a micro-services architecture, for the deployment, it might be better to use many clusterized servers with many slower cores than a single server with few highly performant cores.</p>"},{"location":"deployment_guide/configure_your_machine/physical_server/#clusterized-deployment","title":"Clusterized Deployment","text":"<p>You might consider creating a cluster of machines each featuring, at least, the minimum server specifications. That solution brings you scalability in the future.</p>"},{"location":"deployment_guide/configure_your_machine/physical_server/#networking","title":"Networking","text":"<p>No explicit indications are given in terms of networking besides that servers need access to the Internet for downloading dependencies, binaries, and packages while building and deploying the TeraFlowSDN components.</p> <p>Besides that, the network requirements are essentially the same than that required for running a classical Kubernetes environment. To facilitate the deployment, we extensively use MicroK8s, thus the network requirements are, essentially, the same demanded by MicroK8s, especially, if you consider creating a Kubernetes cluster.</p> <p>As a reference, the other deployment solutions based on VMs assume the VM is connected to a virtual network configured with the IP range <code>10.0.2.0/24</code> and have the gateway at IP <code>10.0.2.1</code>. The VMs have the IP address <code>10.0.2.10</code>.</p> <p>The minimum required ports to be accessible are: - 22/SSH : for management purposes - 80/HTTP : for the TeraFlowSDN WebUI and Grafana dashboard - 8081/HTTPS : for the CockroachDB WebUI</p> <p>Other ports might be required if you consider to deploy addons such as Kubernetes observability, etc. The details on these ports are left appart given they might vary depending on the Kubernetes environment you use.</p>"},{"location":"deployment_guide/configure_your_machine/physical_server/#operating-system","title":"Operating System","text":"<p>The recommended Operating System for deploying TeraFlowSDN is Ubuntu Server 22.04 LTS or Ubuntu Server 20.04 LTS. Other version might work, but we have not tested them. We strongly recommend using Long Term Support (LTS) versions as they provide better stability.</p> <p>Below we provide some installation guidelines: - Installation Language: English - Autodetect your keyboard - If asked, select \"Ubuntu Server\" (do not select \"Ubuntu Server (minimized)\"). - Configure static network specifications (adapt them based on your particular setup):</p> Interface IPv4 Method Subnet Address Gateway Name servers Search domains enp0s3 Manual 10.0.2.0/24 10.0.2.10 10.0.2.1 8.8.8.8,8.8.4.4 <ul> <li>Leave proxy and mirror addresses as they are</li> <li>Let the installer self-upgrade (if asked).</li> <li>Use an entire disk for the installation</li> <li>Disable setup of the disk as LVM group</li> <li>Double check that NO swap space is allocated in the partition table. Kubernetes does not work properly with SWAP.</li> <li>Configure your user and system names:</li> <li>User name: <code>TeraFlowSDN</code></li> <li>Server's name: <code>tfs-vm</code></li> <li>Username: <code>tfs</code></li> <li>Password: <code>tfs123</code></li> <li>Install Open SSH Server</li> <li>Import SSH keys, if any.</li> <li>Featured Server Snaps</li> <li>Do not install featured server snaps. It will be done manually later to illustrate how to uninstall and reinstall them in case of trouble with.</li> <li>Let the system install and upgrade the packages.</li> <li>This operation might take some minutes depending on how old is the Optical Drive ISO image you use and your Internet connection speed.</li> <li>Restart the VM when the installation is completed.</li> </ul>"},{"location":"deployment_guide/configure_your_machine/physical_server/#upgrade-the-ubuntu-distribution","title":"Upgrade the Ubuntu distribution","text":"<pre><code>sudo apt-get update -y\nsudo apt-get dist-upgrade -y\n</code></pre> <ul> <li>If asked to restart services, restart the default ones proposed.</li> <li>Restart the VM when the installation is completed.</li> </ul>"},{"location":"deployment_guide/configure_your_machine/vagrant_box/","title":"Vagrant box","text":"<p>This page describes how to create a Vagrant Box, using the base virtual machine configured in Oracle Virtual Box.</p>"},{"location":"deployment_guide/configure_your_machine/vagrant_box/#virtual-machine-specifications","title":"Virtual Machine specifications","text":"<p>Most of the specifications can be as specified in the Oracle Virtual Box page, however, there are a few particularities to Vagrant that must be accommodated, such as: - Virtual Hard Disk - Size: 60GB (at least) - Type: VMDK</p> <p></p> <p>Also, before initiating the VM and installing the OS, we'll need to: - Disable Floppy in the 'Boot Order' - Disable audio - Disable USB - Ensure Network Adapter 1 is set to NAT</p>"},{"location":"deployment_guide/configure_your_machine/vagrant_box/#network-configurations","title":"Network configurations","text":"<p>At Network Adapt 1, the following port-forwarding rule must be set.</p> Name Protocol Host IP Host Port Guest IP Guest Port SSH TCP 2222 22 <p></p>"},{"location":"deployment_guide/configure_your_machine/vagrant_box/#installing-the-os","title":"Installing the OS","text":"<p>For a Vagrant Box, it is generally suggested that the ISO's server version is used, as it is intended to be used via SSH, and any web GUI is expected to be forwarded to the host.</p> <p></p> <p></p> <p></p> <p>Make sure the disk is not configured as an LVM group!</p> <p></p>"},{"location":"deployment_guide/configure_your_machine/vagrant_box/#vagrant-ser","title":"Vagrant ser","text":"<p>Vagrant expects by default, that in the box's OS exists the user <code>vagrant</code> with the password also being <code>vagrant</code>.</p> <p></p>"},{"location":"deployment_guide/configure_your_machine/vagrant_box/#ssh","title":"SSH","text":"<p>Vagrant uses SSH to connect to the boxes, so installing it now will save the hassle of doing it later.</p> <p></p>"},{"location":"deployment_guide/configure_your_machine/vagrant_box/#features-server-snaps","title":"Features server snaps","text":"<p>Do not install featured server snaps. It will be done manually later to illustrate how to uninstall and reinstall them in case of trouble with.</p>"},{"location":"deployment_guide/configure_your_machine/vagrant_box/#updates","title":"Updates","text":"<p>Let the system install and upgrade the packages. This operation might take some minutes depending on how old is the Optical Drive ISO image you use and your Internet connection speed.</p>"},{"location":"deployment_guide/configure_your_machine/vagrant_box/#upgrade-the-ubuntu-distribution","title":"Upgrade the Ubuntu distribution","text":"<pre><code>sudo apt-get update -y\nsudo apt-get dist-upgrade -y\n</code></pre> <ul> <li>If asked to restart services, restart the default ones proposed.</li> <li>Restart the VM when the installation is completed.</li> </ul>"},{"location":"deployment_guide/configure_your_machine/vagrant_box/#install-virtualbox-guest-additions","title":"Install VirtualBox Guest Additions","text":"<p>On VirtualBox Manager, open the VM main screen. If you are running the VM in headless mode, right-click over the VM in the VirtualBox Manager window, and click \"Show\". If a dialog informing about how to leave the interface of the VM is shown, confirm by pressing the \"Switch\" button. The interface of the VM should appear.</p> <p>Click the menu \"Device > Insert Guest Additions CD image...\"</p> <p>On the VM terminal, type:</p> <pre><code>sudo apt-get install -y linux-headers-$(uname -r) build-essential dkms\n # This command might take some minutes depending on your VM specs and your Internet access speed.\nsudo mount /dev/cdrom /mnt/\ncd /mnt/\nsudo ./VBoxLinuxAdditions.run\n # This command might take some minutes depending on your VM specs.\nsudo reboot\n</code></pre>"},{"location":"deployment_guide/configure_your_machine/vagrant_box/#etsi-tfs-installation","title":"ETSI TFS Installation","text":"<p>After this, proceed to 1.2. Install Microk8s, after which, return to this wiki to finish the Vagrant Box creation.</p>"},{"location":"deployment_guide/configure_your_machine/vagrant_box/#box-configuration-and-creation","title":"Box configuration and creation","text":"<p>Make sure the ETSI TFS controller is correctly configured. You will not be able to change it after!</p> <p>It is advisable to do the next configurations from a host's terminal, via a SSH connection.</p> <pre><code>ssh -p 2222 vagrant@127.0.0.1\n</code></pre>"},{"location":"deployment_guide/configure_your_machine/vagrant_box/#set-root-password","title":"Set root password","text":"<p>Set the root password to <code>vagrant</code>.</p> <pre><code>sudo passwd root\n</code></pre>"},{"location":"deployment_guide/configure_your_machine/vagrant_box/#set-the-superuser","title":"Set the superuser","text":"<p>Set up the Vagrant user so that it\u2019s able to use sudo without being prompted for a password. Anything in the <code>/etc/sudoers.d/*</code> directory is included in the sudoers privileges when created by the root user. Create a new sudo file.</p> <pre><code>sudo visudo -f /etc/sudoers.d/vagrant\n</code></pre> <p>and add the following lines</p> <pre><code># add vagrant user\nvagrant ALL=(ALL) NOPASSWD:ALL\n</code></pre> <p>You can now test that it works by running a simple command.</p> <pre><code>sudo pwd\n</code></pre> <p>Issuing this command should result in an immediate response without a request for a password.</p>"},{"location":"deployment_guide/configure_your_machine/vagrant_box/#install-the-vagrant-key","title":"Install the Vagrant key","text":"<p>Vagrant uses a default set of SSH keys for you to directly connect to boxes via the CLI command <code>vagrant ssh</code>, after which it creates a new set of SSH keys for your new box. Because of this, we need to load the default key to be able to access the box after created.</p> <pre><code>chmod 0700 /home/vagrant/.ssh\nwget --no-check-certificate https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub -O /home/vagrant/.ssh/authorized_keys\nchmod 0600 /home/vagrant/.ssh/authorized_keys\nchown -R vagrant /home/vagrant/.ssh\n</code></pre>"},{"location":"deployment_guide/configure_your_machine/vagrant_box/#configure-the-openssh-server","title":"Configure the OpenSSH Server","text":"<p>Edit the <code>/etc/ssh/sshd_config</code> file:</p> <pre><code>sudo vim /etc/ssh/sshd_config\n</code></pre> <p>And uncomment the following line:</p> <pre><code>AuthorizedKeysFile %h/.ssh/authorized_keys\n</code></pre> <p>Then restart SSH.</p> <pre><code>sudo service ssh restart\n</code></pre>"},{"location":"deployment_guide/configure_your_machine/vagrant_box/#package-the-box","title":"Package the box","text":"<p>Before you package the box, if you intend to make your box public, it is best to clean your bash history with:</p> <pre><code>history -c\n</code></pre> <p>Exit the SSH connection, and at you're host machine, package the VM:</p> <pre><code>vagrant package --base teraflowsdncontroller --output teraflowsdncontroller.box\n</code></pre>"},{"location":"deployment_guide/configure_your_machine/vagrant_box/#test-run-the-box","title":"Test run the box","text":"<p>Add the base box to you local Vagrant box list:</p> <pre><code>vagrant box add --name teraflowsdncontroller ./teraflowsdncontroller.box\n</code></pre> <p>Now you should try to run it, for that you'll need to create a Vagrantfile. For a simple run, this is the minimal required code for this box:</p> <pre><code># -*- mode: ruby -*-\n# vi: set ft=ruby :\n\nVagrant.configure(\"2\") do |config|\n config.vm.box = \"teraflowsdncontroller\"\n config.vm.box_version = \"1.1.0\"\n config.vm.network :forwarded_port, host: 8080 ,guest: 80\nend\n</code></pre> <p>Now you'll be able to spin up the virtual machine by issuing the command:</p> <pre><code>vagrant up\n</code></pre> <p>And connect to the machine using:</p> <pre><code>vagrant ssh\n</code></pre>"},{"location":"deployment_guide/configure_your_machine/vagrant_box/#pre-configured-boxes","title":"Pre-configured boxes","text":"<p>If you do not wish to create your own Vagrant Box, you can use one of the existing ones created by TFS contributors. - davidjosearaujo/teraflowsdncontroller - ... </p> <p>To use them, you simply have to create a Vagrantfile and run <code>vagrant up controller</code> in the same directory. The following example Vagrantfile already allows you to do just that, with the bonus of exposing the multiple management GUIs to your <code>localhost</code>.</p> <pre><code>Vagrant.configure(\"2\") do |config|\n\n config.vm.define \"controller\" do |controller|\n controller.vm.box = \"davidjosearaujo/teraflowsdncontroller\"\n controller.vm.network \"forwarded_port\", guest: 80, host: 8080 # WebUI\n controller.vm.network \"forwarded_port\", guest: 8084, host: 50750 # Linkerd Viz Dashboard\n controller.vm.network \"forwarded_port\", guest: 8081, host: 8081 # CockroachDB Dashboard\n controller.vm.network \"forwarded_port\", guest: 8222, host: 8222 # NATS Dashboard\n controller.vm.network \"forwarded_port\", guest: 9000, host: 9000 # QuestDB Dashboard\n controller.vm.network \"forwarded_port\", guest: 9090, host: 9090 # Prometheus Dashboard\n\n # Setup Linkerd Viz reverse proxy\n ## Copy config file\n controller.vm.provision \"file\" do |f|\n f.source = \"./reverse-proxy-linkerdviz.sh\"\n f.destination = \"./reverse-proxy-linkerdviz.sh\"\n end\n ## Execute configuration file\n controller.vm.provision \"shell\" do |s|\n s.inline = \"chmod +x ./reverse-proxy-linkerdviz.sh && ./reverse-proxy-linkerdviz.sh\"\n end\n\n # Update controller source code to the desired branch\n if ENV['BRANCH'] != nil\n controller.vm.provision \"shell\" do |s|\n s.inline = \"cd ./tfs-ctrl && git pull && git switch \" + ENV['BRANCH']\n end\n end\n\n end\nend\n</code></pre> <p>This Vagrantfile also allows for optional repository updates on startup by running the command with a specified environment variable <code>BRANCH</code></p> <pre><code>BRANCH=develop vagrant up controller\n</code></pre>"},{"location":"deployment_guide/configure_your_machine/vagrant_box/#linkerd-dns-rebinding-bypass","title":"Linkerd DNS rebinding bypass","text":"<p>Because of Linkerd's security measures against DNS rebinding, a reverse proxy, that modifies the request's header <code>Host</code> field, is needed to expose the GUI to the host. The previous Vagrantfile already deploys such configurations, for that, all you need to do is create the <code>reverse-proxy-linkerdviz.sh</code> file in the same directory. The content of this file is displayed below.</p> <pre><code># Install NGINX\nsudo apt update && sudo apt install nginx -y\n\n# NGINX reverse proxy configuration\necho 'server {\n listen 8084;\n\n location / {\n proxy_pass http://127.0.0.1:50750;\n proxy_set_header Host localhost;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n }\n}' > /home/vagrant/expose-linkerd\n\n# Create symlink of the NGINX configuration file\nsudo ln -s /home/vagrant/expose-linkerd /etc/nginx/sites-enabled/\n\n# Commit the reverse proxy configurations\nsudo systemctl restart nginx\n\n# Enable start on login\necho \"linkerd viz dashboard &\" >> .profile\n\n# Start dashboard\nlinkerd viz dashboard &\n\necho \"Linkerd Viz dashboard running!\"\n</code></pre>"},{"location":"deployment_guide/configure_your_machine/vm_ware_fusion/","title":"Vm ware fusion","text":"<p>This page describes how to configure a VM for running ETSI TeraFlowSDN(TFS) controller using VMWare Fusion. It has been tested with VMWare Fusion version 12 and 13.</p>"},{"location":"deployment_guide/configure_your_machine/vm_ware_fusion/#create-vm-in-vmware-fusion","title":"Create VM in VMWare Fusion:","text":"<p>In \"VMWare Fusion\" manager, create a new network from the \"Settings/Network\" menu.</p> <ul> <li>Unlock to make changes</li> <li>Press the + icon and create a new network</li> <li>Change the name to TFS-NAT-Net</li> <li>Check \"Allow virtual machines on this network to connect to external network (NAT)\"</li> <li>Do not check \"Enable IPv6\"</li> <li>Add port forwarding for HTTP and SSH</li> <li>Uncheck \"Provide address on this network via DHCP\"</li> </ul> <p>Create a new VM an Ubuntu 22.04.1 ISO:</p> <ul> <li>Display Name: TeraFlowSDN</li> <li>Username: tfs</li> <li>Password: tfs123</li> </ul> <p>On the next screen press \"Customize Settings\", save the VM and in \"Settings\" change: - Change to use 4 CPUs - Change to access 8 GB of RAM - Change disk to size 60 GB - Change the network interface to use the previously created TFS-NAT-Net</p> <p>Run the VM to start the installation.</p>"},{"location":"deployment_guide/configure_your_machine/vm_ware_fusion/#install-ubuntu-22041-lts-operating-system","title":"Install Ubuntu 22.04.1 LTS Operating System","text":"<p>The installation will be automatic, without any configuration required.</p> <ul> <li>Configure the guest IP, gateway and DNS:</li> </ul> <p>Using the Network Settings for the wired connection, set the IP to 10.0.2.10, the mask to 255.255.255.0, the gateway to 10.0.2.2 and the DNS to 10.0.2.2.</p> <ul> <li>Disable and remove swap file:</li> </ul> <p>$ sudo swapoff -a $ sudo rm /swapfile</p> <p>Then you can remove or comment the /swapfile entry in /etc/fstab</p> <ul> <li>Install Open SSH Server</li> <li> <p>Import SSH keys, if any.</p> </li> <li> <p>Restart the VM when the installation is completed.</p> </li> </ul>"},{"location":"deployment_guide/configure_your_machine/vm_ware_fusion/#upgrade-the-ubuntu-distribution","title":"Upgrade the Ubuntu distribution","text":"<pre><code>sudo apt-get update -y\nsudo apt-get dist-upgrade -y\n</code></pre>"},{"location":"deployment_guide/deploy_TeraFlowSDN/deploy_TeraFlowSDN/","title":"deploy TeraFlowSDN","text":"<p>This section describes how to deploy TeraFlowSDN controller on top of MicroK8s using the environment configured in the previous sections.</p>"},{"location":"deployment_guide/deploy_TeraFlowSDN/deploy_TeraFlowSDN/#install-prerequisites","title":"Install prerequisites","text":"<pre><code>sudo apt-get install -y git curl jq\n</code></pre>"},{"location":"deployment_guide/deploy_TeraFlowSDN/deploy_TeraFlowSDN/#clone-the-git-repository-of-the-teraflowsdn-controller","title":"Clone the Git repository of the TeraFlowSDN controller","text":"<p>Clone from ETSI-hosted GitLab code repository:</p> <pre><code>mkdir ~/tfs-ctrl\ngit clone https://labs.etsi.org/rep/tfs/controller.git ~/tfs-ctrl\n</code></pre> <p>Important: The original H2020-TeraFlow project hosted on GitLab.com has been archieved and will not receive further contributions/updates. Please, clone from ETSI-hosted GitLab code repository.</p>"},{"location":"deployment_guide/deploy_TeraFlowSDN/deploy_TeraFlowSDN/#checkout-the-appropriate-git-branch","title":"Checkout the appropriate Git branch","text":"<p>TeraFlowSDN controller versions can be found in the appropriate release tags and/or branches as described in Home > Versions.</p> <p>By default the branch master is checked out and points to the latest stable version of the TeraFlowSDN controller, while branch develop contains the latest developments and contributions under test and validation.</p> <p>To switch to the appropriate branch run the following command, changing <code>develop</code> by the name of the branch you want to deploy:</p> <pre><code>cd ~/tfs-ctrl\ngit checkout develop\n</code></pre>"},{"location":"deployment_guide/deploy_TeraFlowSDN/deploy_TeraFlowSDN/#prepare-a-deployment-script-with-the-deployment-settings","title":"Prepare a deployment script with the deployment settings","text":"<p>Create a new deployment script, e.g., <code>my_deploy.sh</code>, adding the appropriate settings as follows. This section provides just an overview of the available settings. An example <code>my_deploy.sh</code> script is provided in the root folder of the project for your convenience with full description of all the settings.</p> <p>Note: The example <code>my_deploy.sh</code> script provides reasonable settings for deploying a functional and complete enough TeraFlowSDN controller, and a brief description of their meaning. To see extended descriptions, check scripts in the <code>deploy</code> folder.</p> <pre><code>cd ~/tfs-ctrl\ntee my_deploy.sh >/dev/null << EOF\n# ----- TeraFlowSDN ------------------------------------------------------------\nexport TFS_REGISTRY_IMAGES=\"http://localhost:32000/tfs/\"\nexport TFS_COMPONENTS=\"context device ztp monitoring pathcomp service slice nbi webui load_generator\"\nexport TFS_IMAGE_TAG=\"dev\"\nexport TFS_K8S_NAMESPACE=\"tfs\"\nexport TFS_EXTRA_MANIFESTS=\"manifests/nginx_ingress_http.yaml\"\nexport TFS_GRAFANA_PASSWORD=\"admin123+\"\nexport TFS_SKIP_BUILD=\"\"\n\n# ----- CockroachDB ------------------------------------------------------------\nexport CRDB_NAMESPACE=\"crdb\"\nexport CRDB_EXT_PORT_SQL=\"26257\"\nexport CRDB_EXT_PORT_HTTP=\"8081\"\nexport CRDB_USERNAME=\"tfs\"\nexport CRDB_PASSWORD=\"tfs123\"\nexport CRDB_DATABASE=\"tfs\"\nexport CRDB_DEPLOY_MODE=\"single\"\nexport CRDB_DROP_DATABASE_IF_EXISTS=\"YES\"\nexport CRDB_REDEPLOY=\"\"\n\n# ----- NATS -------------------------------------------------------------------\nexport NATS_NAMESPACE=\"nats\"\nexport NATS_EXT_PORT_CLIENT=\"4222\"\nexport NATS_EXT_PORT_HTTP=\"8222\"\nexport NATS_REDEPLOY=\"\"\n\n# ----- QuestDB ----------------------------------------------------------------\nexport QDB_NAMESPACE=\"qdb\"\nexport QDB_EXT_PORT_SQL=\"8812\"\nexport QDB_EXT_PORT_ILP=\"9009\"\nexport QDB_EXT_PORT_HTTP=\"9000\"\nexport QDB_USERNAME=\"admin\"\nexport QDB_PASSWORD=\"quest\"\nexport QDB_TABLE_MONITORING_KPIS=\"tfs_monitoring_kpis\"\nexport QDB_TABLE_SLICE_GROUPS=\"tfs_slice_groups\"\nexport QDB_DROP_TABLES_IF_EXIST=\"YES\"\nexport QDB_REDEPLOY=\"\"\n\nEOF\n</code></pre> <p>The settings are organized in 4 sections: - Section <code>TeraFlowSDN</code>: - <code>TFS_REGISTRY_IMAGE</code> enables to specify the private Docker registry to be used, by default, we assume to use the Docker respository enabled in MicroK8s. - <code>TFS_COMPONENTS</code> specifies the components their Docker image will be rebuilt, uploaded to the private Docker registry, and deployed in Kubernetes. - <code>TFS_IMAGE_TAG</code> defines the tag to be used for Docker images being rebuilt and uploaded to the private Docker registry. - <code>TFS_K8S_NAMESPACE</code> specifies the name of the Kubernetes namespace to be used for deploying the TFS components. - <code>TFS_EXTRA_MANIFESTS</code> enables to provide additional manifests to be applied into the Kubernetes environment during the deployment. Typical use case is to deploy ingress controllers, service monitors for Prometheus, etc. - <code>TFS_GRAFANA_PASSWORD</code> lets you specify the password you want to use for the <code>admin</code> user of the Grafana instance being deployed and linked to the Monitoring component. - <code>TFS_SKIP_BUILD</code>, if set to <code>YES</code>, prevents rebuilding the Docker images. That means, the deploy script will redeploy existing Docker images without rebuilding/updating them.</p> <ul> <li>Section <code>CockroachDB</code>: enables to configure the deployment of the backend CockroachDB database.</li> <li> <p>Check example script <code>my_deploy.sh</code> for further details.</p> </li> <li> <p>Section <code>NATS</code>: enables to configure the deployment of the backend NATS message broker.</p> </li> <li> <p>Check example script <code>my_deploy.sh</code> for further details.</p> </li> <li> <p>Section <code>QuestDB</code>: enables to configure the deployment of the backend QuestDB timeseries database.</p> </li> <li>Check example script <code>my_deploy.sh</code> for further details.</li> </ul>"},{"location":"deployment_guide/deploy_TeraFlowSDN/deploy_TeraFlowSDN/#confirm-that-microk8s-is-running","title":"Confirm that MicroK8s is running","text":"<p>Run the following command:</p> <pre><code>microk8s status\n</code></pre> <p>If it is reported <code>microk8s is not running, try microk8s start</code>, run the following command to start MicroK8s:</p> <pre><code>microk8s start\n</code></pre> <p>Confirm everything is up and running:</p> <ol> <li>Periodically Check the status of Kubernetes until you see the addons [dns, ha-cluster, helm3, hostpath-storage, ingress, registry, storage] in the enabled block.</li> <li>Periodically Check Kubernetes resources until all pods are Ready and Running.</li> </ol>"},{"location":"deployment_guide/deploy_TeraFlowSDN/deploy_TeraFlowSDN/#deploy-tfs-controller","title":"Deploy TFS controller","text":"<p>First, source the deployment settings defined in the previous section. This way, you do not need to specify the environment variables in each and every command you execute to operate the TFS controller. Be aware to re-source the file if you open new terminal sessions. Then, run the following command to deploy TeraFlowSDN controller on top of the MicroK8s Kubernetes platform.</p> <pre><code>cd ~/tfs-ctrl\nsource my_deploy.sh\n./deploy/all.sh\n</code></pre> <p>The script performs the following steps: - Executes script <code>./deploy/crdb.sh</code> to automate deployment of CockroachDB database used by Context component. - The script automatically checks if CockroachDB is already deployed. - If there are settings instructing to drop the database and/or redeploy CockroachDB, it does the appropriate actions to honor them as defined in previous section. - Executes script <code>./deploy/nats.sh</code> to automate deployment of NATS message broker used by Context component. - The script automatically checks if NATS is already deployed. - If there are settings instructing to redeploy the message broker, it does the appropriate actions to honor them as defined in previous section. - Executes script <code>./deploy/qdb.sh</code> to automate deployment of QuestDB timeseries database used by Monitoring component. - The script automatically checks if QuestDB is already deployed. - If there are settings instructing to redeploy the timeseries database, it does the appropriate actions to honor them as defined in previous section. - Executes script <code>./deploy/tfs.sh</code> to automate deployment of TeraFlowSDN. - Creates the namespace defined in <code>TFS_K8S_NAMESPACE</code> - Creates secrets for CockroachDB, NATS, and QuestDB to be used by Context and Monitoring components. - Builds the Docker images for the components defined in <code>TFS_COMPONENTS</code> - Tags the Docker images with the value of <code>TFS_IMAGE_TAG</code> - Pushes the Docker images to the repository defined in <code>TFS_REGISTRY_IMAGE</code> - Deploys the components defined in <code>TFS_COMPONENTS</code> - Creates the file <code>tfs_runtime_env_vars.sh</code> with the environment variables for the components defined in <code>TFS_COMPONENTS</code> defining their local host addresses and their port numbers. - Applies extra manifests defined in <code>TFS_EXTRA_MANIFESTS</code> such as: - Creating an ingress controller listening at port 80 for HTTP connections to enable external access to the TeraFlowSDN WebUI, Grafana Dashboards, and Compute NBI interfaces. - Deploying service monitors to enable monitoring the performance of the components, device drivers and service handlers. - Initialize and configure the Grafana dashboards (if Monitoring component is deployed) - Report a summary of the deployment - See Show Deployment and Logs</p>"},{"location":"deployment_guide/install_micro_k8s/install_micro_k8s/","title":"Install micro k8s","text":"<p>This section describes how to deploy the MicroK8s Kubernetes platform and configure it to be used with ETSI TeraFlowSDN controller. Besides, Docker is installed to build docker images for the ETSI TeraFlowSDN controller.</p> <p>The steps described in this section might take some minutes depending on your internet connection speed and the resources assigned to your VM, or the specifications of your physical server.</p> <p>To facilitate work, these steps are easier to be executed through an SSH connection, for instance using tools like PuTTY or MobaXterm.</p>"},{"location":"deployment_guide/install_micro_k8s/install_micro_k8s/#upgrade-the-ubuntu-distribution","title":"Upgrade the Ubuntu distribution","text":"<p>Skip this step if you already did it during the creation of the VM.</p> <pre><code>sudo apt-get update -y\nsudo apt-get dist-upgrade -y\n</code></pre>"},{"location":"deployment_guide/install_micro_k8s/install_micro_k8s/#install-prerequisites","title":"Install prerequisites","text":"<pre><code>sudo apt-get install -y ca-certificates curl gnupg lsb-release snapd jq\n</code></pre>"},{"location":"deployment_guide/install_micro_k8s/install_micro_k8s/#install-docker-ce","title":"Install Docker CE","text":"<p>Install Docker CE and Docker BuildX plugin</p> <pre><code>sudo apt-get install -y docker.io docker-buildx\n</code></pre> <p>NOTE: Starting from Docker v23, Build architecture has been updated and <code>docker build</code> command entered into deprecation process in favor of the new <code>docker buildx build</code> command. Package <code>docker-buildx</code> provides the new <code>docker buildx build</code> command.</p> <p>Add key \"insecure-registries\" with the private repository to the daemon configuration. It is done in two commands since sometimes read from and write to same file might cause trouble.</p> <pre><code>if [ -s /etc/docker/daemon.json ]; then cat /etc/docker/daemon.json; else echo '{}'; fi \\\n | jq 'if has(\"insecure-registries\") then . else .+ {\"insecure-registries\": []} end' -- \\\n | jq '.\"insecure-registries\" |= (.+ [\"localhost:32000\"] | unique)' -- \\\n | tee tmp.daemon.json\nsudo mv tmp.daemon.json /etc/docker/daemon.json\nsudo chown root:root /etc/docker/daemon.json\nsudo chmod 600 /etc/docker/daemon.json\n</code></pre> <p>Restart the Docker daemon</p> <pre><code>sudo systemctl restart docker\n</code></pre>"},{"location":"deployment_guide/install_micro_k8s/install_micro_k8s/#install-microk8s","title":"Install MicroK8s","text":"<p>Important: Some TeraFlowSDN dependencies need to be executed on top of MicroK8s/Kubernetes v1.24. It is not guaranteed (by now) to run on newer versions.</p> <pre><code># Install MicroK8s\nsudo snap install microk8s --classic --channel=1.24/stable\n\n# Create alias for command \"microk8s.kubectl\" to be usable as \"kubectl\"\nsudo snap alias microk8s.kubectl kubectl\n</code></pre> <p>It is important to make sure that <code>ufw</code> will not interfere with the internal pod-to-pod and pod-to-Internet traffic. To do so, first check the status. If <code>ufw</code> is active, use the following command to enable the communication.</p> <pre><code>\n# Verify status of ufw firewall\nsudo ufw status\n\n# If ufw is active, install following rules to enable access pod-to-pod and pod-to-internet\nsudo ufw allow in on cni0 && sudo ufw allow out on cni0\nsudo ufw default allow routed\n</code></pre> <p>NOTE: MicroK8s can be used to compose a Highly Available Kubernetes cluster enabling you to construct an environment combining the CPU, RAM and storage resources of multiple machines. If you are interested in this procedure, review the official instructions in How to build a highly available Kubernetes cluster with MicroK8s, in particular, the step Create a MicroK8s multi-node cluster.</p>"},{"location":"deployment_guide/install_micro_k8s/install_micro_k8s/#references","title":"References:","text":"<ul> <li>The lightweight Kubernetes > Install MicroK8s</li> <li>Install a local Kubernetes with MicroK8s</li> <li>How to build a highly available Kubernetes cluster with MicroK8s</li> </ul>"},{"location":"deployment_guide/install_micro_k8s/install_micro_k8s/#add-user-to-the-docker-and-microk8s-groups","title":"Add user to the docker and microk8s groups","text":"<p>It is important that your user has the permission to run <code>docker</code> and <code>microk8s</code> in the terminal. To allow this, you need to add your user to the <code>docker</code> and <code>microk8s</code> groups with the following commands:</p> <pre><code>sudo usermod -a -G docker $USER\nsudo usermod -a -G microk8s $USER\nsudo chown -f -R $USER $HOME/.kube\nsudo reboot\n</code></pre> <p>In case that you get trouble executing the following commands, might due to the .kube folder is not automatically provisioned into your home folder, you may follow the steps below:</p> <pre><code>mkdir -p $HOME/.kube\nsudo chown -f -R $USER $HOME/.kube\nmicrok8s config > $HOME/.kube/config\nsudo reboot\n</code></pre>"},{"location":"deployment_guide/install_micro_k8s/install_micro_k8s/#check-status-of-kubernetes-and-addons","title":"Check status of Kubernetes and addons","text":"<p>To retrieve the status of Kubernetes once, run the following command:</p> <pre><code>microk8s.status --wait-ready\n</code></pre> <p>To retrieve the status of Kubernetes periodically (e.g., every 1 second), run the following command:</p> <pre><code>watch -n 1 microk8s.status --wait-ready\n</code></pre>"},{"location":"deployment_guide/install_micro_k8s/install_micro_k8s/#check-all-resources-in-kubernetes","title":"Check all resources in Kubernetes","text":"<p>To retrieve the status of the Kubernetes resources once, run the following command:</p> <pre><code>kubectl get all --all-namespaces\n</code></pre> <p>To retrieve the status of the Kubernetes resources periodically (e.g., every 1 second), run the following command:</p> <pre><code>watch -n 1 kubectl get all --all-namespaces\n</code></pre>"},{"location":"deployment_guide/install_micro_k8s/install_micro_k8s/#enable-addons","title":"Enable addons","text":"<p>First, we need to enable the community plugins (maintained by third parties):</p> <pre><code>microk8s.enable community\n</code></pre> <p>The Addons to be enabled are: - <code>dns</code>: enables resolving the pods and services by name - <code>helm3</code>: required to install NATS - <code>hostpath-storage</code>: enables providing storage for the pods (required by <code>registry</code>) - <code>ingress</code>: deploys an ingress controller to expose the microservices outside Kubernetes - <code>registry</code>: deploys a private registry for the TFS controller images - <code>linkerd</code>: deploys the linkerd service mesh used for load balancing among replicas - <code>prometheus</code>: set of tools that enable TFS observability through per-component instrumentation - <code>metrics-server</code>: deploys the Kubernetes metrics server for API access to service metrics</p> <pre><code>microk8s.enable dns helm3 hostpath-storage ingress registry prometheus metrics-server linkerd\n</code></pre> <p>Important: Enabling some of the addons might take few minutes. Do not proceed with next steps until the addons are ready. Otherwise, the deployment might fail. To confirm everything is up and running: 1. Periodically Check the status of Kubernetes until you see the addons [dns, ha-cluster, helm3, hostpath-storage, ingress, linkerd, metrics-server, prometheus, registry, storage] in the enabled block. 2. Periodically Check Kubernetes resources until all pods are Ready and Running. 3. If it takes too long for the Pods to be ready, we observed that rebooting the machine may help.</p> <p>Then, create aliases to make the commands easier to access:</p> <pre><code>sudo snap alias microk8s.helm3 helm3\nsudo snap alias microk8s.linkerd linkerd\n</code></pre> <p>To validate that <code>linkerd</code> is working correctly, run:</p> <pre><code>linkerd check\n</code></pre> <p>To validate that the <code>metrics-server</code> is working correctly, run:</p> <pre><code>kubectl top pods --all-namespaces\n</code></pre> <p>and you should see a screen similar to the <code>top</code> command in Linux, showing the columns namespace, pod name, CPU (cores), and MEMORY (bytes).</p> <p>In case pods are not starting, check information from pods logs. For example, linkerd is sensitive for proper /etc/resolv.conf syntax.</p> <pre><code>kubectl logs <podname> --namespace <namespace>\n</code></pre> <p>If the command shows an error message, also restarting the machine might help.</p>"},{"location":"deployment_guide/install_micro_k8s/install_micro_k8s/#stop-restart-and-redeploy","title":"Stop, Restart, and Redeploy","text":"<p>Find below some additional commands you might need while you work with MicroK8s:</p> <pre><code>microk8s.stop # stop MicroK8s cluster (for instance, before power off your computer)\nmicrok8s.start # start MicroK8s cluster\nmicrok8s.reset # reset infrastructure to a clean state\n</code></pre> <p>If the following commands does not work to recover the MicroK8s cluster, you can redeploy it.</p> <p>If you want to keep MicroK8s configuration, use:</p> <pre><code>sudo snap remove microk8s\n</code></pre> <p>If you need to completely drop MicroK8s and its complete configuration, use:</p> <pre><code>sudo snap remove microk8s --purge\nsudo apt-get remove --purge docker.io docker-buildx\n</code></pre> <p>IMPORTANT: After uninstalling MicroK8s, it is convenient to reboot the computer (the VM if you work on a VM, or the physical computer if you use a physical computer). Otherwise, there are system configurations that are not correctly cleaned. Especially in what port forwarding and firewall rules matters.</p> <p>After the reboot, redeploy as it is described in this section.</p>"},{"location":"deployment_guide/show_deployment_and_logs/show_deployment_and_logs/","title":"Show deployment and logs","text":"<p>This section presents some helper scripts to inspect the status of the deployment and the logs of the components. These scripts are particularly helpful for troubleshooting during execution of experiments, development, and debugging.</p>"},{"location":"deployment_guide/show_deployment_and_logs/show_deployment_and_logs/#report-the-deployment-of-the-tfs-controller","title":"Report the deployment of the TFS controller","text":"<p>The summary report given at the end of the Deploy TFS controller procedure can be generated manually at any time by running the following command. You can avoid sourcing <code>my_deploy.sh</code> if it has been already done.</p> <pre><code>cd ~/tfs-ctrl\nsource my_deploy.sh\n./deploy/show.sh\n</code></pre> <p>Use this script to validate that all the pods, deployments, replica sets, ingress controller, etc. are ready and have the appropriate state, e.g., running for Pods, and the services are deployed and have appropriate IP addresses and port numbers.</p>"},{"location":"deployment_guide/show_deployment_and_logs/show_deployment_and_logs/#report-the-log-of-a-specific-tfs-controller-component","title":"Report the log of a specific TFS controller component","text":"<p>A number of scripts are pre-created in the <code>scripts</code> folder to facilitate the inspection of the component logs. For instance, to dump the log of the Context component, run the following command. You can avoid sourcing <code>my_deploy.sh</code> if it has been already done.</p> <pre><code>source my_deploy.sh\n./scripts/show_logs_context.sh\n</code></pre>"},{"location":"deployment_guide/webUI_and_grafana_dashboards/webUI_and_grafana_dashboards/","title":"webUI and grafana dashboards","text":"<p>This section describes how to get access to the TeraFlowSDN controller WebUI and the monitoring Grafana dashboards.</p>"},{"location":"deployment_guide/webUI_and_grafana_dashboards/webUI_and_grafana_dashboards/#access-the-teraflowsdn-webui","title":"Access the TeraFlowSDN WebUI","text":"<p>If you followed the installation steps based on MicroK8s, you got an ingress controller installed that exposes on TCP port 80.</p> <p>Besides, the ingress controller defines the following reverse proxy paths (on your local machine): - <code>http://127.0.0.1/webui</code>: points to the WebUI of TeraFlowSDN. - <code>http://127.0.0.1/grafana</code>: points to the Grafana dashboards. This endpoint brings access to the monitoring dashboards of TeraFlowSDN. The credentials for the <code>admin</code>user are those defined in the <code>my_deploy.sh</code> script, in the <code>TFS_GRAFANA_PASSWORD</code> variable. - <code>http://127.0.0.1/restconf</code>: points to the Compute component NBI based on RestCONF. This endpoint enables connecting external software, such as ETSI OpenSourceMANO NFV Orchestrator, to TeraFlowSDN.</p> <p>Note: In the creation of the VM, a forward from host TCP port 8080 to VM's TCP port 80 is configured, so the WebUIs and REST APIs of TeraFlowSDN should be exposed on the endpoint <code>127.0.0.1:8080</code> of your local machine instead of <code>127.0.0.1:80</code>.</p>"},{"location":"development_guide/development_guide/","title":"2. Development Guide","text":""},{"location":"development_guide/development_guide/#21-configure-environment","title":"2.1. Configure Environment","text":""},{"location":"development_guide/development_guide/#211-python","title":"2.1.1. PythonUpgrade the Ubuntu distribution <p>Skip this step if you already did it during the installation of your machine.</p> <pre><code>sudo apt-get update -y\nsudo apt-get dist-upgrade -y\n</code></pre> Install PyEnv dependencies <p></p> <pre><code>sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget \\\n curl llvm git libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev\n</code></pre> Install PyEnv <p></p> <p>We recommend installing PyEnv through PyEnv Installer. Below you can find the instructions, but we refer you to the link for updated instructions.</p> <pre><code>curl https://pyenv.run | bash\n# When finished, edit ~/.bash_profile // ~/.profile // ~/.bashrc as the installer proposes.\n# In general, it means to append the following lines to ~/.bashrc:\nexport PYENV_ROOT=\"$HOME/.pyenv\"\ncommand -v pyenv >/dev/null || export PATH=\"$PYENV_ROOT/bin:$PATH\"\neval \"$(pyenv init -)\"\neval \"$(pyenv virtualenv-init -)\"\n</code></pre> <p>In case .bashrc is not linked properly to your profile, you may need to append the following line into your local .profile file:</p> <pre><code># Open ~/.profile and append this line:\n+source \"$HOME\"/.bashrc\n</code></pre> Restart the machine <p> Restart the machine for all the changes to take effect.</p> <pre><code>sudo reboot\n</code></pre> Install Python 3.9 over PyEnv <p></p> <p>ETSI TeraFlowSDN uses Python 3.9 by default. You should install the latest stable update of Python 3.9, i.e., avoid \"-dev\" versions. To find the latest version available in PyEnv, you can run the following command:</p> <pre><code>pyenv install --list | grep \" 3.9\"\n</code></pre> <p>At the time of writing, this command will output the following list:</p> <pre><code> 3.9.0\n 3.9-dev\n 3.9.1\n 3.9.2\n 3.9.4\n 3.9.5\n 3.9.6\n 3.9.7\n 3.9.8\n 3.9.9\n 3.9.10\n 3.9.11\n 3.9.12\n 3.9.13\n 3.9.14 \n 3.9.15\n 3.9.16 ** always select the latest version **\n</code></pre> <p>Therefore, the latest stable version is Python 3.9.16. To install this version, you should run:</p> <pre><code>pyenv install 3.9.16\n # This command might take some minutes depending on your Internet connection speed \n # and the performance of your machine.\n</code></pre> Create the Virtual Environment for TeraFlowSDN <p> The following commands create a virtual environment named as <code>tfs</code> using Python 3.9 and associate that environment with the current folder, i.e., <code>~/tfs-ctrl</code>. That way, when you are in that folder, the associated virtual environment will be used, thus inheriting the Python interpreter, i.e., Python 3.9, and the Python packages installed on it.</p> <pre><code>cd ~/tfs-ctrl\npyenv virtualenv 3.9.16 tfs\npyenv local 3.9.16/envs/tfs\n</code></pre> <p>After completing these commands, you should see in your prompt that now you're within the virtual environment <code>3.9.16/envs/tfs</code> on folder <code>~/tfs-ctrl</code>:</p> <pre><code>(3.9.16/envs/tfs) tfs@tfs-vm:~/tfs-ctrl$\n</code></pre> <p>In case that the correct pyenv does not get automatically activated when you change to the tfs-ctrl/ folder, then execute the following command:</p> <pre><code>cd ~/tfs-ctrl\npyenv activate 3.9.16/envs/tfs\n</code></pre> Install the basic Python packages within the virtual environment <p> From within the <code>3.9.16/envs/tfs</code> environment on folder <code>~/tfs-ctrl</code>, run the following commands to install the basic Python packages required to work with TeraFlowSDN.</p> <pre><code>cd ~/tfs-ctrl\n./install_requirements.sh\n</code></pre> <p>Some dependencies require to re-load the session, so log-out and log-in again.</p> Generate the Python code from the gRPC Proto messages and services <p></p> <p>The components, e.g., microservices, of the TeraFlowSDN controller, in general, use a gRPC-based open API to interoperate. All the protocol definitions can be found in sub-folder <code>proto</code> within the root project folder. For additional details on gRPC, visit the official web-page gRPC.</p> <p>In order to interact with the components, (re-)generate the Python code from gRPC definitions running the following command:</p> <pre><code>cd ~/tfs-ctrl\nproto/generate_code_python.sh\n</code></pre>","text":"<p>This section describes how to configure the Python environment to run experiments and develop code for the ETSI TeraFlowSDN controller. In particular, we use PyEnv to install the appropriate version of Python and manage the virtual environments.</p>"},{"location":"development_guide/development_guide/#212-java-quarkus","title":"2.1.2. Java (Quarkus) <p>This section describe the steps needed to create a development environment for TFS components implemented in Java. Currently, ZTP and Policy components have been developed in Java (version 11) and use the Quarkus framework, which enables kubernetes-native development.</p> Install JDK <p> To begin, make sure that you have java installed and in the correct version</p> <pre><code>java --version\n</code></pre> <p>If you don't have java installed you will get an error like the following:</p> <pre><code>Command 'java' not found, but can be installed with:\n\nsudo apt install default-jre # version 2:1.11-72build1, or\nsudo apt install openjdk-11-jre-headless # version 11.0.14+9-0ubuntu2\nsudo apt install openjdk-17-jre-headless # version 17.0.2+8-1\nsudo apt install openjdk-18-jre-headless # version 18~36ea-1\nsudo apt install openjdk-8-jre-headless # version 8u312-b07-0ubuntu1\n</code></pre> <p>In which case you should use the following command to install the correct version:</p> <pre><code>sudo apt install openjdk-11-jre-headless\n</code></pre> <p>Else you should get something like the following:</p> <pre><code>openjdk 11.0.18 2023-01-17\nOpenJDK Runtime Environment (build 11.0.18+10-post-Ubuntu-0ubuntu120.04.1)\nOpenJDK 64-Bit Server VM (build 11.0.18+10-post-Ubuntu-0ubuntu120.04.1, mixed mode, sharing)\n</code></pre> Compiling and testing existing components <p> In the root directory of the existing Java components you will find an executable maven wrapper named <code>mvnw</code>. You could use this executable, which is already configured in pair with the components, instead of your local maven installation. So for example if you want to compile the project you would run the following:</p> <pre><code>./mvnw compile\n</code></pre> VS Code Quarkus plugin <p> In case you are using VS Code for development, we suggest to install the official Quarkus extension. The extension should be able to automatically find the current open project and integrate with the above <code>mvnw</code> maven wrapper, making it easier to control the maven lifecycle. Make sure that you open the specific component directory (i.e., <code>src/ztp</code> or <code>src/policy</code>) and not the general controller one (i.e., <code>src</code>.</p> New Java TFS component <p></p> <p>Sample Project</p> <p>If you want to create a new TFS component written in Java you could generate a new Quarkus project based on the following project:</p> <p>TFS Sample Quarkus Project</p> <p>In that way, you should have most of the libraries you would need to integrate with the rest of the TFS Components. Feel free however to add or remove libraries depending on your needs.</p> <p>Initial setup</p> <p>If you used the sample project above, you should have a project with a basic structure. However there are some steps that you should take before starting development.</p> <p>First make sure that you copy the protobuff files, that are found in the root directory of the TFS SDN controller, to the <code>new-component/src/main/proto</code> directory.</p> <p>Next you should create the following files:</p> <ul> <li><code>new-component/.gitlab-ci.yml</code></li> <li><code>new-component/Dockerfile</code></li> <li><code>new-component/src/resources/application.yaml</code></li> </ul> <p>We suggest to copy the respective files from existing components (Automation and Policy) and change them according to your needs.</p>","text":""},{"location":"development_guide/development_guide/#213-java-maven","title":"2.1.3. Java (Maven) <p>Page under construction</p>","text":""},{"location":"development_guide/development_guide/#214-rust","title":"2.1.4. Rust <p>Page under construction</p>","text":""},{"location":"development_guide/development_guide/#215-erlang","title":"2.1.5. Erlang <p>This section describes how to configure the Erlang environment to run experiments and develop code for the ETSI TeraFlowSDN controller.</p> <p>First we need to install Erlang. There is multiple way, for development we will be using ASDF, a tool that allows the installation of multiple version of Erlang at the same time, and switch from one version to the other at will.</p> <ul> <li>First, install any missing dependencies:</li> </ul> <pre><code>sudo apt install curl git autoconf libncurses-dev build-essential m4 libssl-dev \n</code></pre> <ul> <li>Download ASDF tool to the local account:</li> </ul> <pre><code>git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.10.2\n</code></pre> <ul> <li>Make ASDF activate on login by adding these lines at the end of the <code>~/.bashrc</code> file:</li> </ul> <pre><code>. $HOME/.asdf/asdf.sh\n. $HOME/.asdf/completions/asdf.bash\n</code></pre> <ul> <li>Logout and log back in to activate ASDF.</li> </ul> <p>ASDF supports multiple tools by installing there corresponding plugins.</p> <ul> <li>Install ASDF plugin for Erlang:</li> </ul> <pre><code>asdf plugin add erlang https://github.com/asdf-vm/asdf-erlang.git\n</code></pre> <ul> <li>Install a version of Erlang:</li> </ul> <pre><code>asdf install erlang 24.3.4.2\n</code></pre> <ul> <li>Activate Erlang locally for TFS controller. This will create a local file called <code>.tool-versions</code> defining which version of the tools to use when running under the current directory:</li> </ul> <pre><code>cd tfs-ctrl/\nasdf local erlang 24.3.4.2\n</code></pre> <p>Erlang projects uses a build tool called rebar3. It is used to manager project dependenecies, compile a project and generate project releases.</p> <ul> <li>Install rebar3 localy from source:</li> </ul> <pre><code>cd ~\ngit clone https://github.com/erlang/rebar3.git\ncd rebar3\nasdf local erlang 24.3.4.2\n./bootstrap\n./rebar3 local install\n</code></pre> <ul> <li>Update <code>~/.bashrc</code> to use rebar3 by adding this line at the end:</li> </ul> <pre><code>export PATH=$HOME/.cache/rebar3/bin:$PATH\n</code></pre> <ul> <li>Logout and log back in.</li> </ul>","text":""},{"location":"development_guide/development_guide/#216-kotlin","title":"2.1.6. Kotlin <p>This section describes the steps needed to establish a development environment for TFS (TeraFlowSDN) components implemented in Kotlin. Currently, the <code>Gateway</code> component stands as the sole component developed in Kotlin.</p> Install Kotlin <p> To begin, make sure that you have kotlin installed and its current version:</p> <pre><code>kotlin -version\n</code></pre> <p>If you don't have kotlin installed you will get an error like the following:</p> <pre><code>Command 'kotlin' not found, but can be installed with:\nsudo snap install --classic kotlin\n</code></pre> <p>In which case you should use the following command to install the correct version:</p> <pre><code> sudo snap install --classic kotlin\n</code></pre> <p>Currently, the recommended version is 1.6.21, which uses Java Runtime Environment (JRE) version 11.</p> Compiling and testing existing components <p> To compile a Kotlin project using Gradle, similarly to using the Maven wrapper (mvnw) for Java projects, you can use the Gradle wrapper (gradlew) within the root directory of your Kotlin component, specifically the gateway directory.</p> <p>Navigate to the gateway directory within your Kotlin project. Ensure that it contains the gradlew script along with the gradle directory. Then, create a directory named <code>proto</code> and move all the files with extension <code>.proto</code> in this way:</p> <pre><code>mkdir proto\ncp ../../../proto/*.proto ./proto \n</code></pre> <p>For building the application, open a terminal or command prompt, navigate to the gateway directory, and run the following command:</p> <pre><code>./gradlew build\n</code></pre> <p>The following program runs the gateway application:</p> <pre><code>./gradlew runServer \n</code></pre> New Kotlin TFS component <p></p> <p>Sample Project</p> <p>If you want to create a new TFS component written in Kotlin you could generate a Kotlin project using <code>gradle</code>. The recommended version is 7.1. Follow the following Gradle guide for its installation. For building the prokect follow this link instead.</p> <p>From inside the new project directory, run the init task using the following command in a terminal: <code>gradle init</code>. </p> <p>The output will look like this:</p> <pre><code>$ gradle init\n\nSelect type of project to generate:\n 1: basic\n 2: application\n 3: library\n 4: Gradle plugin\nEnter selection (default: basic) [1..4] 2\n\nSelect implementation language:\n 1: C++\n 2: Groovy\n 3: Java\n 4: Kotlin\n 5: Scala\n 6: Swift\nEnter selection (default: Java) [1..6] 4\n\nSelect build script DSL:\n 1: Groovy\n 2: Kotlin\nEnter selection (default: Groovy) [1..2] 1\n\nProject name (default: demo):\nSource package (default: demo):\n\n\nBUILD SUCCESSFUL\n2 actionable tasks: 2 executed\n</code></pre> <p>Initial setup</p> <p>The <code>gradle init</code> command generates the new project. </p> <p>First, ensure the protobuf files are copied from the root directory of the TFS SDN controller. Run the following command in the directory of the new project:</p> <pre><code>mkdir proto \ncp TFS/project/root/path/proto/*.proto ./proto/\n</code></pre> <p>The file <code>build.gradle.ktl</code> is fundamental as it manages dependencies. Adjust it for adding external libraries. </p> <p>Next you should create the following files:</p> <ol> <li><code>new-component/.gitlab-ci.yml</code></li> <li><code>new-component/Dockerfile</code></li> </ol> <p>We recommend leveraging the structures and configurations found in the files of existing components for inspiration.</p> <p>Docker Container This project operates with Docker containers. Ensure the production of the container version for your component. To generate the container version of the project, modify the 'new-component/Dockerfile.' Execute the following command from the project's root directory:</p> <pre><code>docker build -t new-image -f new-component/Dockerfile ./\n</code></pre>","text":""},{"location":"development_guide/development_guide/#22-configure-vscode","title":"2.2. Configure VScode","text":"Install VSCode and the required extensions <p>If not already done, install VSCode and the \"Remote SSH\" extension on your local machine, not in the VM.</p> <p>Note: \"Python\" extension is not required here. It will be installed later on the VSCode server running on the VM.</p> Configure the \"Remote SSH\" extension <p></p> <ul> <li>Go to left icon \"Remote Explorer\"</li> <li>Click the \"gear\" icon next to \"SSH TARGETS\" on top of \"Remote Explorer\" bar</li> <li>Choose to edit \"<...>/.ssh/config\" file (or equivalent)</li> <li>Add the following entry (assuming previous port forwarding configuration):</li> </ul> <pre><code>Host TFS-VM\n HostName 127.0.0.1\n Port 2200\n ForwardX11 no\n User tfs\n</code></pre> <ul> <li>Save the file</li> <li>An entry \"TFS-VM\" should appear on \"SSH TARGETS\".</li> </ul> Connect VSCode to the VM through \"Remote SSH\" extension <p></p> <ul> <li>Right-click on \"TFS-VM\"</li> <li>Select \"Connect to Host in Current Window\"</li> <li>Reply to the questions asked</li> <li>Platform of the remote host \"TFS-VM\": Linux</li> <li>\"TFS-VM\" has fingerprint \"\". Do you want to continue?: Continue <li>Type tfs user's password: tfs123</li> <li>You should be now connected to the TFS-VM.</li> <p>Note: if you get a connection error message, the reason might be due to wrong SSH server fingerprint. Edit file \"<...>/.ssh/known_hosts\" on your local user account, check if there is a line starting with \"[127.0.0.1]:2200\" (assuming previous port forwarding configuration), remove the entire line, save the file, and retry connection.</p> Add SSH key to prevent typing the password every time <p> This step creates an SSH key in the VM and installs it on the VSCode to prevent having to type the password every time.</p> <ul> <li>In VSCode (connected to the VM), click menu \"Terminal > New Terminal\"</li> <li>Run the following commands on the VM's terminal through VSCode</li> </ul> <pre><code>ssh-keygen -t rsa -b 4096 -f ~/.ssh/tfs-vm.key\n # leave password empty\nssh-copy-id -i ~/.ssh/tfs-vm.key.pub tfs@10.0.2.10\n # tfs@10.0.2.10's password: <type tfs user's password: tfs123>\nrm .ssh/known_hosts \n</code></pre> <ul> <li>In VSCode, click left \"Explorer\" panel to expand, if not expanded, and click \"Open Folder\" button.</li> <li>Choose \"/home/tfs/\"</li> <li>Type tfs user's password when asked</li> <li>Trust authors of the \"/home/tfs [SSH: TFS-VM]\" folder when asked</li> <li>Right click on the file \"tfs-vm.key\" in the file explorer</li> <li>Select \"Download...\" option</li> <li>Download the file into your user's accout \".ssh\" folder</li> <li> <p>Delete files \"tfs-vm.key\" and \"tfs-vm.key.pub\" on the TFS-VM.</p> </li> <li> <p>In VSCode, click left \"Remote Explorer\" panel to expand</p> </li> <li>Click the \"gear\" icon next to \"SSH TARGETS\" on top of \"Remote Explorer\" bar</li> <li>Choose to edit \"<...>/.ssh/config\" file (or equivalent)</li> <li>Find entry \"Host TFS-VM\" and update it as follows:</li> </ul> <pre><code>Host TFS-VM\n HostName 127.0.0.1\n Port 2200\n ForwardX11 no\n User tfs\n IdentityFile \"<path to the downloaded identity private key file>\"\n</code></pre> <ul> <li>Save the file</li> <li>From now, VSCode will use the identity file to connect to the TFS-VM instead of the user's password.</li> </ul> Install VSCode Python Extension (in VSCode server) <p> This step installs Python extensions in VSCode server running in the VM.</p> <ul> <li>In VSCode (connected to the VM), click left button \"Extensions\"</li> <li>Search \"Python\" extension in the extension Marketplace.</li> <li> <p>Install official \"Python\" extension released by Microsoft.</p> <ul> <li>By default, since you're connected to the VM, it will be installed in the VSCode server running in the VM.</li> </ul> </li> <li> <p>In VSCode (connected to the VM), click left button \"Explorer\"</p> </li> <li>Click \"Ctrl+Alt+P\" and type \"Python: Select Interpreter\". Select option \"Python: 3.9.13 64-bit ('tfs')\"</li> </ul> Define environment variables for VSCode <p> The source code in the TFS controller project is hosted in folder <code>src/</code>. To help VSCode find the Python modules and packages, add the following file into your working space root folder:</p> <pre><code>echo \"PYTHONPATH=./src\" >> ~/tfs-ctrl/.env\n</code></pre>"},{"location":"development_guide/development_guide/#23-develop-a-component-wip","title":"2.3. Develop A Component (WIP)","text":"<p>Page under construction</p>"},{"location":"development_guide/configure_environment/configure_environment/","title":"Configure environment","text":"<ul> <li>2.1.1. Python</li> <li>2.1.2. Java (Quarkus)</li> <li>2.1.3. Java (Maven)</li> <li>2.1.4. Rust</li> <li>2.1.5. Erlang</li> <li>2.1.6. Kotlin</li> </ul>"},{"location":"development_guide/configure_environment/java_quarkus/","title":"Java quarkus","text":"<p>This section describe the steps needed to create a development environment for TFS components implemented in Java. Currently, ZTP and Policy components have been developed in Java (version 11) and use the Quarkus framework, which enables kubernetes-native development.</p>"},{"location":"development_guide/configure_environment/java_quarkus/#install-jdk","title":"Install JDK","text":"<p>To begin, make sure that you have java installed and in the correct version</p> <pre><code>java --version\n</code></pre> <p>If you don't have java installed you will get an error like the following:</p> <pre><code>Command 'java' not found, but can be installed with:\n\nsudo apt install default-jre # version 2:1.11-72build1, or\nsudo apt install openjdk-11-jre-headless # version 11.0.14+9-0ubuntu2\nsudo apt install openjdk-17-jre-headless # version 17.0.2+8-1\nsudo apt install openjdk-18-jre-headless # version 18~36ea-1\nsudo apt install openjdk-8-jre-headless # version 8u312-b07-0ubuntu1\n</code></pre> <p>In which case you should use the following command to install the correct version:</p> <pre><code>sudo apt install openjdk-11-jre-headless\n</code></pre> <p>Else you should get something like the following:</p> <pre><code>openjdk 11.0.18 2023-01-17\nOpenJDK Runtime Environment (build 11.0.18+10-post-Ubuntu-0ubuntu120.04.1)\nOpenJDK 64-Bit Server VM (build 11.0.18+10-post-Ubuntu-0ubuntu120.04.1, mixed mode, sharing)\n</code></pre>"},{"location":"development_guide/configure_environment/java_quarkus/#compiling-and-testing-existing-components","title":"Compiling and testing existing components","text":"<p>In the root directory of the existing Java components you will find an executable maven wrapper named <code>mvnw</code>. You could use this executable, which is already configured in pair with the components, instead of your local maven installation. So for example if you want to compile the project you would run the following:</p> <pre><code>./mvnw compile\n</code></pre>"},{"location":"development_guide/configure_environment/java_quarkus/#vs-code-quarkus-plugin","title":"VS Code Quarkus plugin","text":"<p>In case you are using VS Code for development, we suggest to install the official Quarkus extension. The extension should be able to automatically find the current open project and integrate with the above <code>mvnw</code> maven wrapper, making it easier to control the maven lifecycle. Make sure that you open the specific component directory (i.e., <code>src/ztp</code> or <code>src/policy</code>) and not the general controller one (i.e., <code>src</code>.</p>"},{"location":"development_guide/configure_environment/java_quarkus/#new-java-tfs-component","title":"New Java TFS component","text":""},{"location":"development_guide/configure_environment/java_quarkus/#sample-project","title":"Sample Project","text":"<p>If you want to create a new TFS component written in Java you could generate a new Quarkus project based on the following project:</p> <p>TFS Sample Quarkus Project</p> <p>In that way, you should have most of the libraries you would need to integrate with the rest of the TFS Components. Feel free however to add or remove libraries depending on your needs.</p>"},{"location":"development_guide/configure_environment/java_quarkus/#initial-setup","title":"Initial setup","text":"<p>If you used the sample project above, you should have a project with a basic structure. However there are some steps that you should take before starting development.</p> <p>First make sure that you copy the protobuff files, that are found in the root directory of the TFS SDN controller, to the <code>new-component/src/main/proto</code> directory.</p> <p>Next you should create the following files: * <code>new-component/.gitlab-ci.yml</code> * <code>new-component/Dockerfile</code> * <code>new-component/src/resources/application.yaml</code></p> <p>We suggest to copy the respective files from existing components (Automation and Policy) and change them according to your needs.</p>"},{"location":"development_guide/configure_environment/python/","title":"Python","text":"<p>This section describes how to configure the Python environment to run experiments and develop code for the ETSI TeraFlowSDN controller. In particular, we use PyEnv to install the appropriate version of Python and manage the virtual environments.</p>"},{"location":"development_guide/configure_environment/python/#upgrade-the-ubuntu-distribution","title":"Upgrade the Ubuntu distribution","text":"<p>Skip this step if you already did it during the installation of your machine.</p> <pre><code>sudo apt-get update -y\nsudo apt-get dist-upgrade -y\n</code></pre>"},{"location":"development_guide/configure_environment/python/#install-pyenv-dependencies","title":"Install PyEnv dependencies","text":"<pre><code>sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget \\\n curl llvm git libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev\n</code></pre>"},{"location":"development_guide/configure_environment/python/#install-pyenv","title":"Install PyEnv","text":"<p>We recommend installing PyEnv through PyEnv Installer. Below you can find the instructions, but we refer you to the link for updated instructions.</p> <pre><code>curl https://pyenv.run | bash\n# When finished, edit ~/.bash_profile // ~/.profile // ~/.bashrc as the installer proposes.\n# In general, it means to append the following lines to ~/.bashrc:\nexport PYENV_ROOT=\"$HOME/.pyenv\"\ncommand -v pyenv >/dev/null || export PATH=\"$PYENV_ROOT/bin:$PATH\"\neval \"$(pyenv init -)\"\neval \"$(pyenv virtualenv-init -)\"\n</code></pre> <p>In case .bashrc is not linked properly to your profile, you may need to append the following line into your local .profile file:</p> <pre><code># Open ~/.profile and append this line:\n+source \"$HOME\"/.bashrc\n</code></pre>"},{"location":"development_guide/configure_environment/python/#restart-the-machine","title":"Restart the machine","text":"<p>Restart the machine for all the changes to take effect.</p> <pre><code>sudo reboot\n</code></pre>"},{"location":"development_guide/configure_environment/python/#install-python-39-over-pyenv","title":"Install Python 3.9 over PyEnv","text":"<p>ETSI TeraFlowSDN uses Python 3.9 by default. You should install the latest stable update of Python 3.9, i.e., avoid \"-dev\" versions. To find the latest version available in PyEnv, you can run the following command:</p> <pre><code>pyenv install --list | grep \" 3.9\"\n</code></pre> <p>At the time of writing, this command will output the following list:</p> <pre><code> 3.9.0\n 3.9-dev\n 3.9.1\n 3.9.2\n 3.9.4\n 3.9.5\n 3.9.6\n 3.9.7\n 3.9.8\n 3.9.9\n 3.9.10\n 3.9.11\n 3.9.12\n 3.9.13\n 3.9.14 \n 3.9.15\n 3.9.16 ** always select the latest version **\n</code></pre> <p>Therefore, the latest stable version is Python 3.9.16. To install this version, you should run:</p> <pre><code>pyenv install 3.9.16\n # This command might take some minutes depending on your Internet connection speed \n # and the performance of your machine.\n</code></pre>"},{"location":"development_guide/configure_environment/python/#create-the-virtual-environment-for-teraflowsdn","title":"Create the Virtual Environment for TeraFlowSDN","text":"<p>The following commands create a virtual environment named as <code>tfs</code> using Python 3.9 and associate that environment with the current folder, i.e., <code>~/tfs-ctrl</code>. That way, when you are in that folder, the associated virtual environment will be used, thus inheriting the Python interpreter, i.e., Python 3.9, and the Python packages installed on it.</p> <pre><code>cd ~/tfs-ctrl\npyenv virtualenv 3.9.16 tfs\npyenv local 3.9.16/envs/tfs\n</code></pre> <p>After completing these commands, you should see in your prompt that now you're within the virtual environment <code>3.9.16/envs/tfs</code> on folder <code>~/tfs-ctrl</code>:</p> <pre><code>(3.9.16/envs/tfs) tfs@tfs-vm:~/tfs-ctrl$\n</code></pre> <p>In case that the correct pyenv does not get automatically activated when you change to the tfs-ctrl/ folder, then execute the following command:</p> <pre><code>cd ~/tfs-ctrl\npyenv activate 3.9.16/envs/tfs\n</code></pre>"},{"location":"development_guide/configure_environment/python/#install-the-basic-python-packages-within-the-virtual-environment","title":"Install the basic Python packages within the virtual environment","text":"<p>From within the <code>3.9.16/envs/tfs</code> environment on folder <code>~/tfs-ctrl</code>, run the following commands to install the basic Python packages required to work with TeraFlowSDN.</p> <pre><code>cd ~/tfs-ctrl\n./install_requirements.sh\n</code></pre> <p>Some dependencies require to re-load the session, so log-out and log-in again.</p>"},{"location":"development_guide/configure_environment/python/#generate-the-python-code-from-the-grpc-proto-messages-and-services","title":"Generate the Python code from the gRPC Proto messages and services","text":"<p>The components, e.g., microservices, of the TeraFlowSDN controller, in general, use a gRPC-based open API to interoperate. All the protocol definitions can be found in sub-folder <code>proto</code> within the root project folder. For additional details on gRPC, visit the official web-page gRPC.</p> <p>In order to interact with the components, (re-)generate the Python code from gRPC definitions running the following command:</p> <pre><code>cd ~/tfs-ctrl\nproto/generate_code_python.sh\n</code></pre>"},{"location":"testing/postman/","title":"Postman","text":"<p>In this section we can use Postman to publish an API as a provider and use it as an invoker.</p>"},{"location":"testing/postman/#requisites","title":"Requisites","text":"<ul> <li>We will need to have Node.js installed since we will use a small script to create the CSRs of the certificates.</li> <li>An instance of CAPIF (If it is not local, certain variables would have to be modified both in the Node.js script and in the Postman environment variables).</li> </ul>"},{"location":"testing/postman/#first-steps","title":"First steps","text":"<ol> <li>Install the Node dependencies package.json to run the script with:</li> </ol> <pre><code>npm i\n</code></pre> <ol> <li>Run the script.js with the following command:</li> </ol> <pre><code>node script.js\n</code></pre> <ol> <li>Import Postman collection and environment variables (CAPIF.postman_collection.json and CAPIF.postman_environment.json)</li> <li>Select CAPIF Environment before start testing.</li> </ol>"},{"location":"testing/postman/#remote-capif","title":"Remote CAPIF","text":"<p>If the CAPIF is not local, the host and port of both the CAPIF and the register would have to be specified in the variables, and the CAPIF_HOSTNAME in the script, necessary to obtain the server certificate.</p> <p>Enviroments in Postman</p> <pre><code>CAPIF_HOSTNAME capifcore\nCAPIF_PORT 8080\nREGISTER_HOSTNAME register\nREGISTER_PORT 8084\n</code></pre> <p>Const in script.js</p> <pre><code>CAPIF_HOSTNAME capifcore\n</code></pre>"},{"location":"testing/postman/#capif-flows","title":"CAPIF Flows","text":"<p>Once the first steps have been taken, we can now use Postman requests. These requests are numbered in the order that must be followed to obtain everything necessary from CAPIF.</p>"},{"location":"testing/postman/#creation-of-user-by-admin","title":"Creation of User by Admin","text":"<p>The first step would be for an administrator to create a user with which a provider and an invoker will be created. To do this, the admin must log in to obtain the token needed in admin requests.</p>"},{"location":"testing/postman/#01-login_admin","title":"01-Login_admin","text":""},{"location":"testing/postman/#02-creation-of-user","title":"02-Creation of User","text":""},{"location":"testing/postman/#publication-of-an-api","title":"Publication of an API","text":"<p>The next step is to register a provider using the user created by the administrator in order to publish an API.</p>"},{"location":"testing/postman/#03-getauth_provider","title":"03-getauth_provider","text":""},{"location":"testing/postman/#04-onboard_provider","title":"04-onboard_provider","text":"<p>At this point we move on to using certificate authentication in CAPIF. In Postman it is necessary to add the certificates manually and using more than one certificate for the same host as we do in CAPIF complicates things. For this reason, we use the script to overwrite a certificate and a key when it is necessary to have a specific one.</p> <p>To configure go to settings in Postman and open the certificates section. </p> <ul> <li>Here, activate the CA certificates option and add the ca_cert.pem file found in the Responses folder.</li> <li>Adds a client certificate specifying the CAPIF host being used and the files client_cert.crt and client_key.key in the Responses folder.</li> </ul> <p>Once this is done, the node script will be in charge of changing the certificate that is necessary in each request.</p>"},{"location":"testing/postman/#05-publish_api","title":"05-publish_api","text":"<p>Once the api is published, we can start it. In this case we have a test one created in python called hello_api.py that can be executed with the following command:</p> <pre><code>python3 hello_api.py\n</code></pre> <p>The API publication interface is set to localhost with port 8088, so the service must be set up locally. If you wanted to build it on another site, you would have to change the interface description in the body of publish_api.</p> <p>With this the provider part would be finished.</p>"},{"location":"testing/postman/#calling-the-api","title":"Calling the API","text":"<p>Finally, we will create an invoker with the user given by the administrator to be able to use the published api.</p>"},{"location":"testing/postman/#06-getauth_invoker","title":"06-getauth_invoker","text":""},{"location":"testing/postman/#07-onboard_invoker","title":"07-onboard_invoker","text":"<p>At this point we move on to using certificate authentication in CAPIF. If you did not configure the provider's certificates, you would have to do it now.</p>"},{"location":"testing/postman/#08-discover","title":"08-discover","text":""},{"location":"testing/postman/#09-security_context","title":"09-security_context","text":""},{"location":"testing/postman/#10-get_token","title":"10-get_token","text":""},{"location":"testing/postman/#11-call_service","title":"11-call_service","text":"<p>With this, we would have made the API call and finished the flow.</p>"},{"location":"testing/postman/#other-requests","title":"Other requests","text":"<p>Other requests that we have added are the following:</p> <ul> <li>offboard_provider Performs offboarding of the provider, thereby eliminating the published APIs.</li> <li>offboard_invoker Offboards the invoker, also eliminating access to the APIs of that invoker.</li> <li>remove_user Delete the user.</li> <li>refresh_admin_token Return a new access token to the admin.</li> </ul>"},{"location":"testing/postman/#notes","title":"Notes","text":"<ul> <li>This process is designed to teach how requests are made in Postman and the flow that should be followed to publish and use an API.</li> <li>It is possible that if external CAPIFs are used (Public CAPIF) the test data may already be used or the API already registered.</li> <li>It is necessary to have the Node service running to make the certificate change for the requests, otherwise it will not work.</li> <li>We are working on adding more requests to the Postman collection.</li> <li>This collection is a testing guide and is recommended for testing purposes only.</li> </ul>"},{"location":"testing/robotframework/","title":"Robot Framework","text":""},{"location":"testing/robotframework/#steps-to-test","title":"Steps to Test","text":"<p>To run any test locally you will need docker and docker-compose installed in order run services and execute test plan. Steps will be:</p> <ul> <li> <p>Run All Services: See section Run All CAPIF Services</p> </li> <li> <p>Run desired tests: At this point we have 2 options:</p> </li> <li> <p>Using helper script: Script Test Execution</p> </li> <li>Build robot docker image and execute manually robot docker: Manual Build And Test Execution</li> </ul>"},{"location":"testing/robotframework/#script-test-execution","title":"Script Test Execution","text":"<p>This script will build robot docker image if it's need and execute tests selected by \"include\" option. Just go to service folder, execute and follow steps.</p> <pre><code>./run_capif_tests.sh --include <TAG>\n</code></pre> <p>Results will be stored at /results <p>Please check parameters (include) under Test Execution at Manual Build And Test Execution.</p>"},{"location":"testing/robotframework/#mock-server","title":"Mock Server","text":"<p>Some tests on Test Plans require mockserver. That mock server must be deployed and reachable by Robot Framework and CCF under test.</p> <p>To run Mock Server locally you can just execute the next script:</p> <pre><code>cd services\n./run_mock_server.sh\n\nor\n./run.sh -s\n</code></pre> <p>If you want to launch only tests that not needed mockserver, just add \"--exclude mockserver\" parameter to robot execution:</p> <pre><code>./run_capif_tests.sh --include <TAG> --exclude mockserver\n</code></pre> <p>After run tests the Mock Server can be removed from local deployment:</p> <pre><code>./clean_mock_server.sh\n\nor\n./clean_capif_docker_services.sh -s\n</code></pre>"},{"location":"testing/robotframework/#manual-build-and-test-execution","title":"Manual Build And Test Execution","text":"<ul> <li>Build Robot docker image:</li> </ul> <pre><code>cd tools/robot\ndocker build . -t capif-robot-test:latest\n</code></pre> <ul> <li>Tests Execution:</li> </ul> <p>Execute all tests locally:</p> <pre><code><PATH_TO_REPOSITORY>=path in local machine to repository cloned.\n<PATH_RESULT_FOLDER>=path to a folder on local machine to store results of Robot Framework execution.\n<CAPIF_HOSTNAME>=Is the hostname set when run.sh is executed, by default it is capifcore.\n<CAPIF_HTTP_PORT>=This is the port to reach when robot framework want to reach CAPIF deployment using http, this should be set to port without TLS set on Nginx, 8080 by default.\n<CAPIF_HTTPS_PORT>=This is the port to be used when we want to use https connection, this should be set to port with TLS set on Nginx, 443 by default\n<CAPIF_REGISTER>=This is the hostname of register service deployed. By default it is register.\n<CAPIF_REGISTER_PORT>=This is the port to be used to reach register service deployed. By default it is 8084.\n<CAPIF_VAULT>=This is the hostname of vault service. By default it is vault.\n<CAPIF_VAULT_PORT>=This is the port to be used to reach vault service. By default it is 8200.\n<CAPIF_VAULT_TOKEN>=Vault token to be used on request through vault. By default it is \"read-ca-token\".\n<MOCK_SERVER_URL>=Setup Mock server url to be used in notifications at tests marked with mockserver tag. By default it is not set.\n\nTo execute all tests run :\ndocker run -ti --rm --network=\"host\" \\\n --add-host host.docker.internal:host-gateway \\\n --add-host vault:host-gateway \\\n --add-host register:host-gateway \\\n --add-host mock-server:host-gateway \\\n -v <PATH_TO_REPOSITORY>/tests:/opt/robot-tests/tests \\\n -v <PATH_RESULT_FOLDER>:/opt/robot-tests/results capif-robot-test:latest \\\n --variable CAPIF_HOSTNAME:$CAPIF_HOSTNAME \\\n --variable CAPIF_HTTP_PORT:$CAPIF_HTTP_PORT \\\n --variable CAPIF_HTTPS_PORT:$CAPIF_HTTPS_PORT \\\n --variable CAPIF_REGISTER:$CAPIF_REGISTER \\\n --variable CAPIF_REGISTER_PORT:$CAPIF_REGISTER_PORT \\\n --variable CAPIF_VAULT:$CAPIF_VAULT \\\n --variable CAPIF_VAULT_PORT:$CAPIF_VAULT_PORT \\\n --variable CAPIF_VAULT_TOKEN:$CAPIF_VAULT_TOKEN \\\n --variable MOCK_SERVER_URL:$MOCK_SERVER_URL \\\n --include all\n</code></pre> <p>Execute specific tests locally:</p> <pre><code>To run more specific tests, for example, only one functionality:\n<TAG>=Select one from list:\n \"capif_api_acl\",\n \"capif_api_auditing_service\",\n \"capif_api_discover_service\",\n \"capif_api_events\",\n \"capif_api_invoker_management\",\n \"capif_api_logging_service\",\n \"capif_api_provider_management\",\n \"capif_api_publish_service\",\n \"capif_security_api\n\nAnd Run:\ndocker run -ti --rm --network=\"host\" \\\n --add-host host.docker.internal:host-gateway \\\n --add-host vault:host-gateway \\\n --add-host register:host-gateway \\\n --add-host mock-server:host-gateway \\\n -v <PATH_TO_REPOSITORY>/tests:/opt/robot-tests/tests \\\n -v <PATH_RESULT_FOLDER>:/opt/robot-tests/results capif-robot-test:latest \\\n --variable CAPIF_HOSTNAME:$CAPIF_HOSTNAME \\\n --variable CAPIF_HTTP_PORT:$CAPIF_HTTP_PORT \\\n --variable CAPIF_HTTPS_PORT:$CAPIF_HTTPS_PORT \\\n --variable CAPIF_REGISTER:$CAPIF_REGISTER \\\n --variable CAPIF_REGISTER_PORT:$CAPIF_REGISTER_PORT \\\n --variable CAPIF_VAULT:$CAPIF_VAULT \\\n --variable CAPIF_VAULT_PORT:$CAPIF_VAULT_PORT \\\n --variable CAPIF_VAULT_TOKEN:$CAPIF_VAULT_TOKEN \\\n --variable MOCK_SERVER_URL:$MOCK_SERVER_URL \\\n --include <TAG>\n</code></pre>"},{"location":"testing/robotframework/#test-result-review","title":"Test result review","text":"<p>In order to Review results after tests, you can check general report at /report.html or if you need more detailed information /log.html, example: <ul> <li> <p>Report: </p> </li> <li> <p>Detailed information: </p> </li> </ul> <p>NOTE: If you need more detail at Robot Framework Logs you can set log level option just adding to command --loglevel DEBUG</p>"},{"location":"testing/testplan/","title":"Test Plan Index","text":"<p>List of Common API Services implemented:</p> <ul> <li>Common Operations</li> <li>Api Invoker Management</li> <li>Api Provider Management</li> <li>Api Publish Service</li> <li>Api Discover Service</li> <li>Api Events Service</li> <li>Api Security Service</li> <li>Api Logging Service</li> <li>Api Auditing Service</li> <li>Api Access Control Policy</li> </ul>"},{"location":"testing/testplan/api_access_control_policy/","title":"Test Plan for CAPIF Api Access Control Policy","text":"<p>At this documentation you will have all information and related files and examples of test plan for this API.</p>"},{"location":"testing/testplan/api_access_control_policy/#test-case-1-retrieve-acl","title":"Test Case 1: Retrieve ACL","text":"<p>Test ID: capif_api_acl-1</p> <p>Description:</p> <p>This test case will check that an API Provider can retrieve ACL from CAPIF</p> <p>Pre-Conditions:</p> <ul> <li>API Provider had a Service API Published on CAPIF</li> <li>API Invoker had a Security Context for Service API published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Provider at CCF.</li> <li>Publish a provider API with name service_1</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Provider Get ACL information.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform Invoker Onboarding store apiInvokerId</p> </li> <li>Discover published APIs</li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li> <p>Provider Retrieve ACL</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId}?aef-id=${aef_id}</li> <li>Use serviceApiId and aefId</li> <li>Use AEF Provider Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>ACL Response:<ol> <li>200 OK Response.</li> <li>body returned must accomplish AccessControlPolicyList data structure.</li> <li>apiInvokerPolicies must:<ol> <li>contain only one object.</li> <li>apiInvokerId must match apiInvokerId registered previously.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_access_control_policy/#test-case-2-retrieve-acl-with-2-service-apis-published","title":"Test Case 2: Retrieve ACL with 2 Service APIs published","text":"<p>Test ID: capif_api_acl-2</p> <p>Description:</p> <p>This test case will check that an API Provider can retrieve ACL from CAPIF for 2 different serviceApis published.</p> <p>Pre-Conditions:</p> <ul> <li>API Provider had two Service API Published on CAPIF</li> <li>API Invoker had a Security Context for both Service APIs published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Provider at CCF.</li> <li>Publish a provider API with name service_1 and service_2</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Provider Get ACL information for service_1.</li> <li>Provider Get ACL information for service_2.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_2</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform Invoker Onboarding store apiInvokerId</p> </li> <li>Discover published APIs</li> <li> <p>Create Security Context for this Invoker for both published APIs</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li> <p>Provider Retrieve ACL for serviceApiId1</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId1}?aef-id=${aef_id}</li> <li>Use serviceApiId and aefId</li> <li>Use AEF Provider Certificate</li> </ul> </li> <li> <p>Provider Retrieve ACL for serviceApiId2</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId2}?aef-id=${aef_id}</li> <li>Use serviceApiId and aefId</li> <li>Use AEF Provider Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>ACL Response:<ol> <li>200 OK Response.</li> <li>body returned must accomplish AccessControlPolicyList data structure.</li> <li>apiInvokerPolicies must:<ol> <li>contain one object.</li> <li>apiInvokerId must match apiInvokerId registered previously.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_access_control_policy/#test-case-3-retrieve-acl-with-security-context-created-by-two-different-invokers","title":"Test Case 3: Retrieve ACL with security context created by two different Invokers","text":"<p>Test ID: capif_api_acl-3</p> <p>Description:</p> <p>This test case will check that an API Provider can retrieve ACL from CAPIF containing 2 objects.</p> <p>Pre-Conditions:</p> <ul> <li>API Provider had a Service API Published on CAPIF</li> <li>Two API Invokers had a Security Context for same Service API published by provider.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Provider at CCF.</li> <li>Publish a provider API with name service_1 and service_2</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Provider Get ACL information.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform Invoker Onboarding store apiInvokerId</p> </li> <li>Discover published APIs</li> <li> <p>Create Security Context for this Invoker for both published APIs</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li> <p>Repeat previous 3 steps in order to have a new Invoker.</p> </li> <li> <p>Provider Retrieve ACL for serviceApiId</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId1}?aef-id=${aef_id}</li> <li>Use serviceApiId and aefId</li> <li>Use AEF Provider Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>ACL Response:<ol> <li>200 OK Response.</li> <li>body returned must accomplish AccessControlPolicyList data structure.</li> <li>apiInvokerPolicies must:<ol> <li>Contain two objects.</li> <li>One object must match with apiInvokerId1 and the other one with apiInvokerId2 an registered previously.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_access_control_policy/#test-case-4-retrieve-acl-filtered-by-api-invoker-id","title":"Test Case 4: Retrieve ACL filtered by api-invoker-id","text":"<p>Test ID: capif_api_acl-4</p> <p>Description:</p> <p>This test case will check that an API Provider can retrieve ACL filtering by apiInvokerId from CAPIF containing 1 objects.</p> <p>Pre-Conditions:</p> <ul> <li>API Provider had a Service API Published on CAPIF</li> <li>Two API Invokers had a Security Context for same Service API published by provider.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Provider at CCF.</li> <li>Publish a provider API with name service_1 and service_2</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Provider Get ACL information with query parameter indicating first api-invoker-id.</li> <li>Provider Get ACL information with query parameter indicating second api-invoker-id.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform Invoker Onboarding store apiInvokerId</p> </li> <li>Discover published APIs</li> <li> <p>Create Security Context for this Invoker for both published APIs</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li> <p>Repeat previous 3 steps in order to have a new Invoker.</p> </li> <li> <p>Provider Retrieve ACL for serviceApiId1</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId}?aef-id=${aef_id}&api-invoker-id={apiInvokerId1}</li> <li>Use serviceApiId, aefId and apiInvokerId1</li> <li>Use AEF Provider Certificate</li> </ul> </li> <li> <p>Provider Retrieve ACL for serviceApiId2</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId}?aef-id=${aef_id}&api-invoker-id={apiInvokerId2}</li> <li>Use serviceApiId, aefId and apiInvokerId2</li> <li>Use AEF Provider Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>ACL Response:</p> <ol> <li>200 OK Response.</li> <li>body returned must accomplish AccessControlPolicyList data structure.</li> <li>apiInvokerPolicies must:<ol> <li>Contain one objects.</li> <li>Object must match with apiInvokerId1.</li> </ol> </li> </ol> </li> <li> <p>ACL Response:</p> <ol> <li>200 OK Response.</li> <li>body returned must accomplish AccessControlPolicyList data structure.</li> <li>apiInvokerPolicies must:<ol> <li>Contain one objects.</li> <li>Object must match with apiInvokerId2.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_access_control_policy/#test-case-5-retrieve-acl-filtered-by-supported-features","title":"Test Case 5: Retrieve ACL filtered by supported-features","text":"<p>Test ID: capif_api_acl-5</p> <p>Description:</p> <p>CURRENTLY NOT SUPPORTED FEATURE</p> <p>This test case will check that an API Provider can retrieve ACL filtering by supportedFeatures from CAPIF containing 1 objects.</p> <p>Pre-Conditions:</p> <ul> <li>API Provider had a Service API Published on CAPIF</li> <li>Two API Invokers had a Security Context for same Service API published by provider.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Provider at CCF.</li> <li>Publish a provider API with name service_1 and service_2</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Provider Get ACL information with query parameter indicating first supported-features.</li> <li>Provider Get ACL information with query parameter indicating second supported-features.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform Invoker Onboarding store apiInvokerId</p> </li> <li>Discover published APIs</li> <li> <p>Create Security Context for this Invoker for both published APIs</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li> <p>Repeat previous 3 steps in order to have a new Invoker.</p> </li> <li> <p>Provider Retrieve ACL for serviceApiId</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId1}?aef-id=${aef_id}&supported-features={apiInvokerId1}</li> <li>Use serviceApiId, aefId and apiInvokerId1</li> <li>Use AEF Provider Certificate</li> </ul> </li> <li> <p>Provider Retrieve ACL for serviceApiId</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId1}?aef-id=${aef_id}&supported-features={apiInvokerId2}</li> <li>Use serviceApiId, aefId and apiInvokerId2</li> <li>Use AEF Provider Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>ACL Response:</p> <ol> <li>200 OK Response.</li> <li>body returned must accomplish AccessControlPolicyList data structure.</li> <li>apiInvokerPolicies must:<ol> <li>Contain one objects.</li> <li>Object must match with supportedFeatures1.</li> </ol> </li> </ol> </li> <li> <p>ACL Response:</p> <ol> <li>200 OK Response.</li> <li>body returned must accomplish AccessControlPolicyList data structure.</li> <li>apiInvokerPolicies must:<ol> <li>Contain one objects.</li> <li>Object must match with supportedFeatures1.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_access_control_policy/#test-case-6-retrieve-acl-with-aef-id-not-valid","title":"Test Case 6: Retrieve ACL with aef-id not valid","text":"<p>Test ID: capif_api_acl-6</p> <p>Description:</p> <p>This test case will check that an API Provider can't retrieve ACL from CAPIF if aef-id is not valid</p> <p>Pre-Conditions:</p> <ul> <li>API Provider had a Service API Published on CAPIF</li> <li>API Invoker had a Security Context for Service API published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Provider at CCF.</li> <li>Publish a provider API with name service_1</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Provider Get ACL information.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform Invoker Onboarding store apiInvokerId</p> </li> <li>Discover published APIs</li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li> <p>Provider Retrieve ACL</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId}?aef-id=${AEF_ID_NOT_VALID}</li> <li>Use serviceApiId and AEF_ID_NOT_VALID</li> <li>Use AEF Provider Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>ACL Response:<ol> <li>404 Not Found Response.</li> <li>body returned must accomplish Problem Details data structure.</li> <li>apiInvokerPolicies must:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"No ACLs found for the requested service: {service_api_id}, aef_id: {aef_id}, invoker: {api_invoker_id} and supportedFeatures: {supported_features}\".</li> <li>cause with message \"Wrong id\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_access_control_policy/#test-case-7-retrieve-acl-with-service-id-not-valid","title":"Test Case 7: Retrieve ACL with service-id not valid","text":"<p>Test ID: capif_api_acl-7</p> <p>Description:</p> <p>This test case will check that an API Provider can't retrieve ACL from CAPIF if service-api-id is not valid</p> <p>Pre-Conditions:</p> <ul> <li>API Provider had a Service API Published on CAPIF</li> <li>API Invoker had a Security Context for Service API published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Provider at CCF.</li> <li>Publish a provider API with name service_1</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Provider Get ACL information.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform Invoker Onboarding store apiInvokerId</p> </li> <li>Discover published APIs</li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li> <p>Provider Retrieve ACL</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${NOT_VALID_SERVICE_API_ID}?aef-id=${aef_id}</li> <li>Use NOT_VALID_SERVICE_API_ID and aef_id</li> <li>Use AEF Provider Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>ACL Response:<ol> <li>404 Not Found Response.</li> <li>body returned must accomplish Problem Details data structure.</li> <li>apiInvokerPolicies must:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"No ACLs found for the requested service: {service_api_id}, aef_id: {aef_id}, invoker: {api_invoker_id} and supportedFeatures: {supported_features}\".</li> <li>cause with message \"Wrong id\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_access_control_policy/#test-case-8-retrieve-acl-with-service-api-id-and-aef-id-not-valid","title":"Test Case 8: Retrieve ACL with service-api-id and aef-id not valid","text":"<p>Test ID: capif_api_acl-8</p> <p>Description:</p> <p>This test case will check that an API Provider can't retrieve ACL from CAPIF if service-api-id and aef-id are not valid</p> <p>Pre-Conditions:</p> <ul> <li>API Provider had a Service API Published on CAPIF</li> <li>API Invoker had a Security Context for Service API published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Provider at CCF.</li> <li>Publish a provider API with name service_1</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Provider Get ACL information.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform Invoker Onboarding store apiInvokerId</p> </li> <li>Discover published APIs</li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li> <p>Provider Retrieve ACL</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${NOT_VALID_SERVICE_API_ID}?aef-id=${AEF_ID_NOT_VALID}</li> <li>Use NOT_VALID_SERVICE_API_ID and aef_id</li> <li>Use AEF Provider Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>ACL Response:<ol> <li>404 Not Found Response.</li> <li>body returned must accomplish Problem Details data structure.</li> <li>apiInvokerPolicies must:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"No ACLs found for the requested service: {NOT_VALID_SERVICE_API_ID}, aef_id: {AEF_ID_NOT_VALID}, invoker: {api_invoker_id} and supportedFeatures: {supported_features}\".</li> <li>cause with message \"Wrong id\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_access_control_policy/#test-case-9-retrieve-acl-without-securitycontext-created-previously-by-invoker","title":"Test Case 9: Retrieve ACL without SecurityContext created previously by Invoker","text":"<p>Test ID: capif_api_acl-9</p> <p>Description:</p> <p>This test case will check that an API Provider can't retrieve ACL if no invoker had requested Security Context to CAPIF</p> <p>Pre-Conditions:</p> <ul> <li>API Provider had a Service API Published on CAPIF</li> <li>API Invoker created but no Security Context for Service API published had been requested.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Provider at CCF.</li> <li>Publish a provider API with name service_1</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Provider Get ACL information.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform Invoker Onboarding store apiInvokerId</p> </li> <li> <p>Discover published APIs</p> </li> <li> <p>Provider Retrieve ACL</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId}?aef-id=${aef_id}</li> <li>Use serviceApiId and aefId</li> <li>Use AEF Provider Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>ACL Response:<ol> <li>404 Not Found Response.</li> <li>body returned must accomplish Problem Details data structure.</li> <li>apiInvokerPolicies must:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"No ACLs found for the requested service: {NOT_VALID_SERVICE_API_ID}, aef_id: {AEF_ID_NOT_VALID}, invoker: {api_invoker_id} and supportedFeatures: {supported_features}\".</li> <li>cause with message \"Wrong id\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_access_control_policy/#test-case-10-retrieve-acl-filtered-by-api-invoker-id-not-present","title":"Test Case 10: Retrieve ACL filtered by api-invoker-id not present","text":"<p>Test ID: capif_api_acl-10</p> <p>Description:</p> <p>This test case will check that an API Provider get not found response if filter by not valid api-invoker-id doesn't match any registered ACL.</p> <p>Pre-Conditions:</p> <ul> <li>API Provider had a Service API Published on CAPIF</li> <li>API Invoker had a Security Context for Service API published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Provider at CCF.</li> <li>Publish a provider API with name service_1</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Provider Get ACL information.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform Invoker Onboarding store apiInvokerId</p> </li> <li>Discover published APIs</li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li> <p>Provider Retrieve ACL</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId}?aef-id=${aef_id}&api-invoker-id={NOT_VALID_API_INVOKER_ID}</li> <li>Use serviceApiId, aefId and NOT_VALID_API_INVOKER_ID</li> <li>Use AEF Provider Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>ACL Response:<ol> <li>404 Not Found Response.</li> <li>body returned must accomplish Problem Details data structure.</li> <li>apiInvokerPolicies must:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"No ACLs found for the requested service: {NOT_VALID_SERVICE_API_ID}, aef_id: {AEF_ID_NOT_VALID}, invoker: {api_invoker_id} and supportedFeatures: {supported_features}\".</li> <li>cause with message \"Wrong id\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_access_control_policy/#test-case-11-retrieve-acl-with-apf-certificate","title":"Test Case 11: Retrieve ACL with APF Certificate","text":"<p>Test ID: capif_api_acl-11</p> <p>Description:</p> <p>This test case will check that an API Provider can't retrieve ACL from CAPIF using APF Certificate</p> <p>Pre-Conditions:</p> <ul> <li>API Provider had a Service API Published on CAPIF</li> <li>API Invoker had a Security Context for Service API published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Provider at CCF.</li> <li>Publish a provider API with name service_1</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Provider Get ACL information.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform Invoker Onboarding store apiInvokerId</p> </li> <li>Discover published APIs</li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li> <p>Provider Retrieve ACL</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId}?aef-id=${aef_id}</li> <li>Use serviceApiId and aefId</li> <li>Use APF Provider Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Logging Service must accomplish:<ol> <li>401 Unauthorized</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"Role not authorized for this API route\".</li> <li>cause with message \"Certificate not authorized\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_access_control_policy/#test-case-12-retrieve-acl-with-amf-certificate","title":"Test Case 12: Retrieve ACL with AMF Certificate","text":"<p>Test ID: capif_api_acl-12</p> <p>Description:</p> <p>This test case will check that an API Provider can't retrieve ACL from CAPIF using AMF Certificate</p> <p>Pre-Conditions:</p> <ul> <li>API Provider had a Service API Published on CAPIF</li> <li>API Invoker had a Security Context for Service API published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Provider at CCF.</li> <li>Publish a provider API with name service_1</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Provider Get ACL information.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform Invoker Onboarding store apiInvokerId</p> </li> <li>Discover published APIs</li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li> <p>Provider Retrieve ACL</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId}?aef-id=${aef_id}</li> <li>Use serviceApiId and aefId</li> <li>Use AMF Provider Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Logging Service must accomplish:<ol> <li>401 Unauthorized</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"Role not authorized for this API route\".</li> <li>cause with message \"Certificate not authorized\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_access_control_policy/#test-case-13-retrieve-acl-with-invoker-certificate","title":"Test Case 13: Retrieve ACL with Invoker Certificate","text":"<p>Test ID: capif_api_acl-13</p> <p>Description:</p> <p>This test case will check that an API Provider can't retrieve ACL from CAPIF using Invoker Certificate</p> <p>Pre-Conditions:</p> <ul> <li>API Provider had a Service API Published on CAPIF</li> <li>API Invoker had a Security Context for Service API published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Provider at CCF.</li> <li>Publish a provider API with name service_1</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Provider Get ACL information.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform Invoker Onboarding store apiInvokerId</p> </li> <li>Discover published APIs</li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li> <p>Provider Retrieve ACL</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId}?aef-id=${aef_id}</li> <li>Use serviceApiId and aefId</li> <li>Use Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Logging Service must accomplish:<ol> <li>401 Unauthorized</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"Role not authorized for this API route\".</li> <li>cause with message \"Certificate not authorized\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_access_control_policy/#test-case-14-no-acl-for-invoker-after-be-removed","title":"Test Case 14: No ACL for invoker after be removed","text":"<p>Test ID: capif_api_acl-14</p> <p>Description:</p> <p>This test case will check that ACLs are removed after invoker is removed.</p> <p>Pre-Conditions:</p> <ul> <li>API Provider had a Service API Published on CAPIF</li> <li>API Invoker had a Security Context for Service API published and ACL is present</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Provider at CCF.</li> <li>Publish a provider API with name service_1</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Provider Get ACL information of invoker.</li> <li>Remove Invoker from CAPIF.</li> <li>Provider Get ACL information of invoker.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform Invoker Onboarding store apiInvokerId</p> </li> <li>Discover published APIs</li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li> <p>Provider Retrieve ACL</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId}?aef-id=${aef_id}&api-invoker-id={api-invoker-id}</li> <li>Use serviceApiId, aefId and api-invoker-id</li> <li>Use AEF Provider Certificate</li> </ul> </li> <li>Remove Invoker from CAPIF</li> <li>Provider Retrieve ACL<ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId}?aef-id=${aef_id}&api-invoker-id={api-invoker-id}</li> <li>Use serviceApiId, aefId and api-invoker-id</li> <li>Use AEF Provider Certificate</li> </ul> </li> </ol> <p>Expected Result: 1. ACL Response: 1. 200 OK Response. 2. body returned must accomplish AccessControlPolicyList data structure. 3. apiInvokerPolicies must: 1. contain only one object. 2. apiInvokerId must match apiInvokerId registered previously.</p> <ol> <li>ACL Response:<ol> <li>404 Not Found Response.</li> <li>body returned must accomplish Problem Details data structure.</li> <li>apiInvokerPolicies must:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"No ACLs found for the requested service: {NOT_VALID_SERVICE_API_ID}, aef_id: {AEF_ID_NOT_VALID}, invoker: None and supportedFeatures: None\".</li> <li>cause with message \"Wrong id\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_auditing_service/","title":"Test Plan for CAPIF Api Auditing Service","text":"<p>At this documentation you will have all information and related files and examples of test plan for this API.</p>"},{"location":"testing/testplan/api_auditing_service/#test-case-1-get-capif-log-entry","title":"Test Case 1: Get CAPIF Log Entry.","text":"<p>Test ID: capif_api_auditing-1</p> <p>Description:</p> <p>This test case will check that a CAPIF AMF can get log entry to Logging Service</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF provider is pre-authorised (has valid AMF cert from CAPIF Authority)</li> <li>Service exist in CAPIF</li> <li>Invoker exist in CAPIF</li> <li>Log Entry exist in CAPIF</li> </ul> <p>Execution Steps: 1. Register Provider and Invoker CCF 2. Publish Service 3. Create Log Entry 4. Get Log Entry</p> <p>Information of Test:</p> <ol> <li> <p>Perform provider onboarding, invoker onboarding </p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Create Log Entry:</p> <ul> <li>Send POST to https://{CAPIF_HOSTNAME}/api-invocation-logs/v1/{aefId}/logs</li> <li>body log entry request body</li> <li>Use AEF Certificate</li> </ul> </li> <li> <p>Get Log:</p> <ol> <li>Send GET to https://{CAPIF_HOSTNAME}/logs/v1/apiInvocationLogs?aef-id={aefId}&api-invoker-id={api-invoker-id}</li> <li>Use AMF Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Logging Service must accomplish:<ol> <li>200 OK</li> <li>Response Body must follow InvocationLog data structure with:<ul> <li>aefId</li> <li>apiInvokerId</li> <li>logs</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_auditing_service/#test-case-2-get-capif-log-entry-with-no-log-entry-in-capif","title":"Test Case 2: Get CAPIF Log Entry With no Log entry in CAPIF.","text":"<p>Test ID: capif_api_auditing-2</p> <p>Description:</p> <p>This test case will check that a CAPIF AEF can create log entry to Logging Service</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF provider is pre-authorised (has valid AMF cert from CAPIF Authority)</li> <li>Service exist in CAPIF</li> <li>Invoker exist in CAPIF</li> </ul> <p>Execution Steps: 1. Register Provider and Invoker CCF 2. Publish Service 3. Get Log Entry</p> <p>Information of Test:</p> <ol> <li> <p>Perform provider onboarding, invoker onboarding </p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Get Log:</p> <ol> <li>Send GET to https://{CAPIF_HOSTNAME}/logs/v1/apiInvocationLogs?aef-id={aefId}&api-invoker-id={api-invoker-id}</li> <li>Use AMF Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Logging Service must accomplish:<ol> <li>404 Not Found</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>title with message \"Not Found Log Entry in CAPIF\".</li> <li>cause with message \"Not Exist Logs with the filters applied\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_auditing_service/#test-case-3-get-capif-log-entry-without-aef-id-and-api-invoker-id","title":"Test Case 3: Get CAPIF Log Entry without aef-id and api-invoker-id.","text":"<p>Test ID: capif_api_auditing-3</p> <p>Description:</p> <p>This test case will check that a CAPIF AEF can create log entry to Logging Service</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF provider is no pre-authorised (has no valid AMF cert from CAPIF Authority)</li> <li>Service exist in CAPIF</li> <li>Invoker exist in CAPIF</li> <li>Log Entry exist in CAPIF</li> </ul> <p>Execution Steps: 1. Register Provider and Invoker CCF 2. Publish Service 3. Create Log Entry 4. Get Log Entry</p> <p>Information of Test:</p> <ol> <li> <p>Perform provider onboarding, invoker onboarding </p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Create Log Entry:</p> <ul> <li>Send POST to https://{CAPIF_HOSTNAME}/api-invocation-logs/v1/{aefId}/logs</li> <li>body log entry request body</li> <li>Use AEF Certificate</li> </ul> </li> <li> <p>Get Log:</p> <ol> <li>Send GET to https://{CAPIF_HOSTNAME}/logs/v1/apiInvocationLogs</li> <li>Use AMF Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Logging Service must accomplish:<ol> <li>400 Bad Request</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 400</li> <li>title with message \"Bad Request\"</li> <li>detail with message \"aef_id and api_invoker_id parameters are mandatory\".</li> <li>cause with message \"Mandatory parameters missing\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_auditing_service/#test-case-4-get-capif-log-entry-with-filtter-api-version","title":"Test Case 4: Get CAPIF Log Entry with filtter api-version.","text":"<p>Test ID: capif_api_auditing-4</p> <p>Description:</p> <p>This test case will check that a CAPIF AMF can get log entry to Logging Service</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF provider is pre-authorised (has valid AMF cert from CAPIF Authority)</li> <li>Service exist in CAPIF</li> <li>Invoker exist in CAPIF</li> <li>Log Entry exist in CAPIF</li> </ul> <p>Execution Steps: 1. Register Provider and Invoker CCF 2. Publish Service 3. Create Log Entry 4. Get Log Entry</p> <p>Information of Test:</p> <ol> <li> <p>Perform provider onboarding, invoker onboarding </p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Create Log Entry:</p> <ul> <li>Send POST to https://{CAPIF_HOSTNAME}/api-invocation-logs/v1/{aefId}/logs</li> <li>body log entry request body</li> <li>Use AEF Certificate</li> </ul> </li> <li> <p>Get Log:</p> <ol> <li>Send GET to https://{CAPIF_HOSTNAME}/logs/v1/apiInvocationLogs?aef-id={aefId}&api-invoker-id={api-invoker-id}&api-version={v1}</li> <li>Use AMF Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Logging Service must accomplish:<ol> <li>200 OK</li> <li>Response Body must follow InvocationLog data structure with:<ul> <li>aefId</li> <li>apiInvokerId</li> <li>logs</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_auditing_service/#test-case-5-get-capif-log-entry-with-filter-api-version-but-not-exist-in-log-entry","title":"Test Case 5: Get CAPIF Log Entry with filter api-version but not exist in log entry.","text":"<p>Test ID: capif_api_auditing-4</p> <p>Description:</p> <p>This test case will check that a CAPIF AMF can get log entry to Logging Service</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF provider is pre-authorised (has valid AMF cert from CAPIF Authority)</li> <li>Service exist in CAPIF</li> <li>Invoker exist in CAPIF</li> <li>Log Entry exist in CAPIF</li> </ul> <p>Execution Steps: 1. Register Provider and Invoker CCF 2. Publish Service 3. Create Log Entry 4. Get Log Entry</p> <p>Information of Test:</p> <ol> <li> <p>Perform provider onboarding, invoker onboarding </p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Create Log Entry:</p> <ul> <li>Send POST to https://{CAPIF_HOSTNAME}/api-invocation-logs/v1/{aefId}/logs</li> <li>body log entry request body</li> <li>Use AEF Certificate</li> </ul> </li> <li> <p>Get Log:</p> <ol> <li>Send GET to https://{CAPIF_HOSTNAME}/logs/v1/apiInvocationLogs?aef-id={aefId}&api-invoker-id={api-invoker-id}&api-version={v58}</li> <li>Use AMF Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Logging Service must accomplish:<ol> <li>404 Not Found</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>detail with message \"Parameters do not match any log entry\"</li> <li>cause with message \"No logs found\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_discover_service/","title":"Test Plan for CAPIF Discover Service","text":"<p>At this documentation you will have all information and related files and examples of test plan for this API.</p>"},{"location":"testing/testplan/api_discover_service/#test-case-1-discover-published-service-apis-by-authorised-api-invoker","title":"Test Case 1: Discover Published service APIs by Authorised API Invoker","text":"<p>Test ID: capif_api_discover_service-1</p> <p>Description:</p> <p>This test case will check if Network App (Invoker) can discover published service APIs.</p> <p>Pre-Conditions:</p> <ul> <li>Service APIs are published.</li> <li>Network App was registered previously</li> <li>Network App was onboarded previously with {onboardingId}</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API at CCF</li> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Discover Service APIs by Invoker</li> </ol> <p>Information of Test:</p> <ol> <li>Perform Provider Registration and Invoker Onboarding</li> <li>Publish Service API at CCF:<ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li>Request Discover Published APIs:<ul> <li>Send GET to https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}</li> <li>Param api-invoker-id is mandatory</li> <li>Use Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Publish request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiId</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId}</li> </ol> </li> <li> <p>Response to Onboard request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li>Response to Discover Request By Invoker:<ol> <li>200 OK response.</li> <li>Response body must follow DiscoveredAPIs data structure:<ul> <li>Check if DiscoveredAPIs contains the API Published previously</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_discover_service/#test-case-2-discover-published-service-apis-by-non-authorised-api-invoker","title":"Test Case 2: Discover Published service APIs by Non Authorised API Invoker","text":"<p>Test ID: capif_api_discover_service-2</p> <p>Description:</p> <p>This test case will check that an API Publisher can't discover published APIs because is not authorized.</p> <p>Pre-Conditions:</p> <ul> <li>Service APIs are published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API at CCF</li> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Discover Service APIs by no invoker entity</li> </ol> <p>Information of Test:</p> <ol> <li>Perform Provider Registration and Invoker Onboarding</li> <li>Publish Service API at CCF:<ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li>Request Discover Published APIs by no invoker entity:<ul> <li>Send GET to https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}</li> <li>Param api-invoker-id is mandatory</li> <li>Use not Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Publish request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiId</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId}</li> </ol> </li> <li> <p>Response to Onboard request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li> <p>Response to Discover Request By no invoker entity:</p> <ol> <li>401 Unauthorized</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"User not authorized\".</li> <li>cause with message \"Certificate not authorized\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_discover_service/#test-case-3-discover-published-service-apis-by-not-registered-api-invoker","title":"Test Case 3: Discover Published service APIs by not registered API Invoker","text":"<p>Test ID: capif_api_discover_service-3</p> <p>Description:</p> <p>This test case will check that a not registered invoker is forbidden to discover published APIs.</p> <p>Pre-Conditions:</p> <ul> <li>Service APIs are published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API at CCF</li> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Discover Service APIs by Publisher</li> </ol> <p>Information of Test:</p> <ol> <li>Perform Provider Registration and Invoker Onboarding</li> <li>Publish Service API at CCF:<ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li>Request Discover Published APIs with not valid apiInvoker:<ul> <li>Send GET to https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={INVOKER_NOT_REGISTERED}</li> <li>Param api-invoker-id is mandatory</li> <li>Using Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Publish request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiId</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId}</li> </ol> </li> <li> <p>Response to Onboard request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li> <p>Response to Discover Request By Invoker:</p> <ol> <li>404 Not Found</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"API Invoker does not exist\".</li> <li>cause with message \"API Invoker id not found\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_discover_service/#test-case-4-discover-published-service-apis-by-registered-api-invoker-with-1-result-filtered","title":"Test Case 4: Discover Published service APIs by registered API Invoker with 1 result filtered","text":"<p>Test ID: capif_api_discover_service-4</p> <p>Description:</p> <p>This test case will check if Network App (Invoker) can discover published service APIs.</p> <p>Pre-Conditions:</p> <ul> <li>At least 2 Service APIs are published.</li> <li>Network App was registered previously</li> <li>Network App was onboarded previously with {onboardingId}</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API service_1 and service_2 at CCF</li> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Discover Service APIs by Invoker.</li> <li>Discover filtered by api-name service_1 Service APIs by Invoker</li> </ol> <p>Information of Test:</p> <ol> <li>Perform Provider Registration and Invoker Onboarding</li> <li>Publish Service API at CCF:<ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li>Publish Service API at CCF:<ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_2</li> <li>Use APF Certificate</li> </ul> </li> <li>Request Discover Published APIs filtering by api-name:<ul> <li>Send GET to ccf_discover_url https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}&api-name=service_1**</li> <li>Param api-invoker-id is mandatory</li> <li>Using Invoker Certificate</li> <li>filter by api-name service_1</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Publish request must accomplish:<ol> <li>201 Created</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiId</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId}</li> </ol> </li> <li>Response to Onboard request must accomplish:<ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li>Response to Discover Request By Invoker:<ol> <li>200 OK response.</li> <li>Response body must follow DiscoveredAPIs data structure:<ul> <li>Check if DiscoveredAPIs contains previously registered Service APIs published.</li> </ul> </li> </ol> </li> <li>Response to Discover Request By Invoker:<ol> <li>200 OK response.</li> <li>Response body must follow DiscoveredAPIs data structure:<ul> <li>Check if DiscoveredAPIs contains only Service API published with api-name service_1</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_discover_service/#test-case-5-discover-published-service-apis-by-registered-api-invoker-filtered-with-no-match","title":"Test Case 5: Discover Published service APIs by registered API Invoker filtered with no match","text":"<p>Test ID: capif_api_discover_service-5</p> <p>Description:</p> <p>This test case will check if Network App (Invoker) can discover published service APIs.</p> <p>Pre-Conditions:</p> <ul> <li>At least 2 Service APIs are published.</li> <li>Network App was registered previously</li> <li>Network App was onboarded previously with {onboardingId}</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API service_1 and service_2 at CCF</li> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Discover Service APIs by Invoker.</li> <li>Discover filtered by api-name not published Service APIs by Invoker</li> </ol> <p>Information of Test:</p> <ol> <li>Perform Provider Registration and Invoker Onboarding</li> <li>Publish Service API at CCF:<ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li>Publish Service API at CCF:<ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_2</li> <li>Use APF Certificate</li> </ul> </li> <li>Request Discover Published APIs filtering by api-name not published:<ul> <li>Send GET to ccf_discover_url https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}&api-name=NOT_VALID_NAME</li> <li>Param api-invoker-id is mandatory</li> <li>Using Invoker Certificate</li> <li>filter by api-name NOT_VALID_NAME</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Publish request must accomplish:<ol> <li>201 Created</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiId</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId}</li> </ol> </li> <li>Response to Onboard request must accomplish:<ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li>Response to Discover Request By Invoker:<ol> <li>200 OK response.</li> <li>Response body must follow DiscoveredAPIs data structure:<ul> <li>Check if DiscoveredAPIs contains previously registered Service APIs published.</li> </ul> </li> </ol> </li> <li>Response to Discover Request By Invoker:<ol> <li>404 Not Found response.</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"API Invoker {api_invoker_id} has no API Published that accomplish filter conditions\".</li> <li>cause with message \"No API Published accomplish filter conditions\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_discover_service/#test-case-6-discover-published-service-apis-by-registered-api-invoker-not-filtered","title":"Test Case 6: Discover Published service APIs by registered API Invoker not filtered","text":"<p>Test ID: capif_api_discover_service-6</p> <p>Description:</p> <p>This test case will check if Network App (Invoker) can discover published service APIs.</p> <p>Pre-Conditions:</p> <ul> <li>2 Service APIs are published.</li> <li>Network App was registered previously</li> <li>Network App was onboarded previously with {onboardingId}</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API service_1 and service_2 at CCF</li> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Discover Service APIs by Invoker.</li> <li>Discover without filter by Invoker</li> </ol> <p>Information of Test:</p> <ol> <li>Perform Provider Registration and Invoker Onboarding</li> <li>Publish Service API at CCF:<ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li>Publish Service API at CCF:<ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_2</li> <li>Use APF Certificate</li> </ul> </li> <li>Request Discover Published APIs not filtered:<ul> <li>Send GET to ccf_discover_url https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}</li> <li>Param api-invoker-id is mandatory</li> <li>Using Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Publish request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiId</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId}</li> </ol> </li> <li> <p>Response to Onboard request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li> <p>Response to Discover Request By Invoker:</p> <ol> <li>200 OK response.</li> <li>Response body must follow DiscoveredAPIs data structure:<ul> <li>Check if DiscoveredAPIs contains the 2 previously registered Service APIs published.</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_events_service/","title":"Test Plan for CAPIF Api Events Service","text":"<p>At this documentation you will have all information and related files and examples of test plan for this API.</p>"},{"location":"testing/testplan/api_events_service/#test-case-1-creates-a-new-individual-capif-event-subscription","title":"Test Case 1: Creates a new individual CAPIF Event Subscription.","text":"<p>Test ID: capif_api_events-1</p> <p>Description:</p> <p>This test case will check that a CAPIF subscriber (Invoker or Publisher) can Subscribe to Events</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid InvokerId or apfId from CAPIF Authority)</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Subscribe to Events</li> <li>Retrieve {subscriberId} and {subscriptionId} from Location Header</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Invoker Onboarding</p> </li> <li> <p>Event Subscription:</p> <ol> <li>Send POST to https://{CAPIF_HOSTNAME}/capif-events/v1/{subscriberId}/subscriptions</li> <li>body event subscription request body</li> <li>Use Invoker Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Onboard request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li> <p>Response to Event Subscription must accomplish:</p> <ol> <li>201 Created</li> <li>The URI of the created resource shall be returned in the \"Location\" HTTP header, following this structure: {apiRoot}/capif-events/{apiVersion}/{subscriberId}/subscriptions/{subscriptionId}</li> <li>Response Body must follow EventSubscription data structure.</li> </ol> </li> <li> <p>Event Subscriptions are stored in CAPIF Database</p> </li> </ol>"},{"location":"testing/testplan/api_events_service/#test-case-2-creates-a-new-individual-capif-event-subscription-with-invalid-subscriberid","title":"Test Case 2: Creates a new individual CAPIF Event Subscription with Invalid SubscriberId","text":"<p>Test ID: capif_api_events-2</p> <p>Description:</p> <p>This test case will check that a CAPIF subscriber (Invoker or Publisher) cannot Subscribe to Events without valid SubcriberId</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is not pre-authorised (has invalid InvokerId or apfId)</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Subscribe to Events</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Invoker Onboarding</p> </li> <li> <p>Event Subscription:</p> <ol> <li>Send POST to https://{CAPIF_HOSTNAME}/capif-events/v1/{SUBSCRIBER_NOT_REGISTERED}/subscriptions</li> <li>body event subscription request body</li> <li>Use Invoker Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Onboard request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li> <p>Response to Event Subscription must accomplish:</p> <ol> <li>404 Not Found</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Invoker or APF or AEF or AMF Not found\".</li> <li>cause with message \"Subscriber Not Found\".</li> </ul> </li> </ol> </li> <li> <p>Event Subscriptions are not stored in CAPIF Database</p> </li> </ol>"},{"location":"testing/testplan/api_events_service/#test-case-3-deletes-an-individual-capif-event-subscription","title":"Test Case 3: Deletes an individual CAPIF Event Subscription","text":"<p>Test ID: capif_api_events-3</p> <p>Description:</p> <p>This test case will check that a CAPIF subscriber (Invoker or Publisher) can Delete an Event Subscription</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid InvokerId or apfId from CAPIF Authority)</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Subscribe to Events</li> <li>Retrieve {subscriberId} and {subscriptionId} from Location Header</li> <li>Remove Event Subscription</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Invoker Onboarding</p> </li> <li> <p>Event Subscription:</p> <ol> <li>Send POST to https://{CAPIF_HOSTNAME}/capif-events/v1/{subscriberId}/subscriptions</li> <li>body event subscription request body</li> <li>Use Invoker Certificate</li> </ol> </li> <li> <p>Remove Event Subscription:</p> <ol> <li>Send DELETE to https://{CAPIF_HOSTNAME}/capif-events/v1/{subscriberId}/subscriptions</li> <li>Use Invoker Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Onboard request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li> <p>Response to Event Subscription must accomplish:</p> <ol> <li>201 Created</li> <li>The URI of the created resource shall be returned in the \"Location\" HTTP header, following this structure: {apiRoot}/capif-events/{apiVersion}/{subscriberId}/subscriptions/{subscriptionId}</li> <li>Response Body must follow EventSubscription data structure.</li> </ol> </li> <li> <p>Event Subscriptions are stored in CAPIF Database</p> </li> <li> <p>Remove Event Subscription:</p> <ol> <li>204 No Content</li> </ol> </li> <li> <p>Event Subscription is not present at CAPIF Database.</p> </li> </ol>"},{"location":"testing/testplan/api_events_service/#test-case-4-deletes-an-individual-capif-event-subscription-with-invalid-subscriberid","title":"Test Case 4: Deletes an individual CAPIF Event Subscription with invalid SubscriberId","text":"<p>Test ID: capif_api_events-4</p> <p>Description:</p> <p>This test case will check that a CAPIF subscriber (Invoker or Publisher) cannot Delete to Events without valid SubcriberId</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid InvokerId or apfId).</li> <li>CAPIF subscriber is subscribed to Events.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Subscribe to Events</li> <li>Retrieve Location Header with subscriptionId.</li> <li>Remove Event Subscribed with not valid Subscriber.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Invoker Onboarding</p> </li> <li> <p>Event Subscription:</p> <ol> <li>Send POST to https://{CAPIF_HOSTNAME}/capif-events/v1/{subscriberId}/subscriptions</li> <li>body event subscription request body</li> <li>Use Invoker Certificate</li> </ol> </li> <li> <p>Remove Event Subcription with not valid subscriber:</p> <ol> <li>Send DELETE to https://{CAPIF_HOSTNAME}/capif-events/v1/{SUBSCRIBER_ID_NOT_VALID}/subscriptions/{subcriptionId}</li> <li>Use Invoker Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Onboard request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li> <p>Response to Event Subscription must accomplish:</p> <ol> <li>201 Created</li> <li>The URI of the created resource shall be returned in the \"Location\" HTTP header, following this structure: {apiRoot}/capif-events/{apiVersion}/{subscriberId}/subscriptions/{subscriptionId}</li> <li>Response Body must follow EventSubscription data structure.</li> </ol> </li> <li> <p>Event Subscriptions are stored in CAPIF Database</p> </li> <li> <p>Error Response Body must accomplish with ProblemDetails data structure with:</p> <ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Invoker or APF or AEF or AMF Not found\".</li> <li>cause with message \"Subscriber Not Found\".</li> </ul> </li> </ol>"},{"location":"testing/testplan/api_events_service/#test-case-5-deletes-an-individual-capif-event-subscription-with-invalid-subscriptionid","title":"Test Case 5: Deletes an individual CAPIF Event Subscription with invalid SubscriptionId","text":"<p>Test ID: capif_api_events-5</p> <p>Description:</p> <p>This test case will check that a CAPIF subscriber (Invoker or Publisher) cannot Delete an Event Subscription without valid SubscriptionId</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has invalid InvokerId or apfId).</li> <li>CAPIF subscriber is subscribed to Events.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Subscribe to Events</li> <li>Retrieve Location Header with subscriptionId.</li> <li>Remove Event Subscribed with not valid Subscriber.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Invoker Onboarding</p> </li> <li> <p>Event Subscription:</p> <ol> <li>Send POST to https://{CAPIF_HOSTNAME}/capif-events/v1/{subscriberId}/subscriptions</li> <li>body event subscription request body</li> <li>Use Invoker Certificate</li> </ol> </li> <li> <p>Remove Event Subcription with not valid subscriber:</p> <ol> <li>Send DELETE to to https://{CAPIF_HOSTNAME}/capif-events/v1/{subcriberId}/subscriptions/{SUBSCRIPTION_ID_NOT_VALID}</li> <li>Use Invoker Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Onboard request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li> <p>Response to Event Subscription must accomplish:</p> <ol> <li>201 Created</li> <li>The URI of the created resource shall be returned in the \"Location\" HTTP header, following this structure: {apiRoot}/capif-events/{apiVersion}/{subscriberId}/subscriptions/{subscriptionId}</li> <li>Response Body must follow EventSubscription data structure.</li> </ol> </li> <li> <p>Event Subscriptions are stored in CAPIF Database</p> </li> <li>Remove Event Subscription with not valid subscriber:<ol> <li>404 Not Found</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>detail with message \"Service API not existing\".</li> <li>cause with message \"Event API subscription id not found\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_events_service/#test-case-6-invoker-receives-service-api-invocation-events","title":"Test Case 6: Invoker receives Service API Invocation events","text":"<p>Test ID: capif_api_events-6, mockserver</p> <p>Description:</p> <p>This test case will check that a CAPIF Invoker subscribed to SERVICE_API_INVOCATION_SUCCESS and SERVICE_API_INVOCATION_FAILURE, receive the notification when AEF Send TO logging service result of invocations to their APIs.</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid InvokerId or apfId from CAPIF Authority)</li> <li>CAPIF provider is correctly registered and published APIs.</li> <li>API Provider had a Service API Published on CAPIF</li> <li>Mock Server is up and running to receive requests.</li> <li>Mock Server is clean.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register provider and publish one API at CCF</li> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Discover published APIs and extract apiIds and apiNames</li> <li>Subscribe to SERVICE_API_INVOCATION_SUCCESS and SERVICE_API_INVOCATION_FAILURE event filtering by aefId.</li> <li>Retrieve {subscriberId} and {subscriptionId} from Location Header</li> <li>Emulate Success and Failure on API invocation of provider by Invoker, using Invocation Logs API.</li> </ol> <p>Information of Test:</p> <ol> <li>Perform provider registration</li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform invoker onboarding</p> </li> <li> <p>Discover published APIs:</p> <ul> <li>Get Api Ids And Api Names from response.</li> </ul> </li> <li> <p>Event Subscription to SERVICE_API_INVOCATION_SUCCESS and SERVICE_API_INVOCATION_FAILURE of provider previously registered:</p> <ol> <li>Send POST to https://{CAPIF_HOSTNAME}/capif-events/v1/{subscriberId}/subscriptions</li> <li>body event subscription request body with:<ol> <li>events: ['SERVICE_API_INVOCATION_SUCCESS','SERVICE_API_INVOCATION_FAILURE']</li> <li>eventFilter: only receive events from provider's aefId.</li> </ol> </li> <li>Use Invoker Certificate</li> </ol> </li> <li> <p>Create Log Entry emulating provider receive Success and Failure api invocation from invoker:</p> <ol> <li>Send POST to https://{CAPIF_HOSTNAME}/api-invocation-logs/v1/{aefId}/logs</li> <li>body log entry request body with:<ol> <li>aefId from provider published.</li> <li>apiInvokerId from invoker onboarded.</li> <li>apiId of published API</li> <li>apiName of published API</li> <li>200 and 400 results in two logs.</li> </ol> </li> <li>Use AEF Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Event Subscription must accomplish:<ol> <li>201 Created</li> <li>The URI of the created resource shall be returned in the \"Location\" HTTP header, following this structure: {apiRoot}/capif-events/{apiVersion}/{subscriberId}/subscriptions/{subscriptionId}</li> <li>Response Body must follow EventSubscription data structure.</li> </ol> </li> <li>Response to creation of log entry on CCF must accomplish:<ol> <li>201 Created</li> <li>The URI of the created resource shall be returned in the \"Location\" HTTP header, following this structure: {apiRoot}/api-invocation-logs/{apiVersion}/{aefId}/subscriptions/{logId}</li> </ol> </li> <li>Mock Server received messages must accomplish:<ol> <li>Two Events have been received.</li> <li>Validate received events follow EventNotification data structure, with invocationLog in eventDetail parameter.<ol> <li>One should be SERVICE_API_INVOCATION_SUCCESS related with 200 result at Log.</li> <li>The other one must be SERVICE_API_INVOCATION_FAILURE related with 400 result at Log.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_events_service/#test-case-7-invoker-subscribe-to-service-api-available-and-unavailable-events","title":"Test Case 7: Invoker subscribe to Service API Available and Unavailable events","text":"<p>Test ID: capif_api_events-7, mockserver</p> <p>Description:</p> <p>This test case will check that a CAPIF Invoker subscribed to SERVICE_API_AVAILABLE and SERVICE_API_UNAVAILABLE, receive the notification when AEF publish and remove it. </p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid InvokerId or apfId from CAPIF Authority)</li> <li>CAPIF provider is correctly registered and published APIs.</li> <li>Mock Server is up and running to receive requests.</li> <li>Mock Server is clean.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register provider and publish one API at CCF</li> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Discover published APIs and extract apiIds and apiNames</li> <li>Subscribe to SERVICE_API_AVAILABLE and SERVICE_API_UNAVAILABLE event filtering by aefId.</li> <li>Retrieve {subscriberId} and {subscriptionId} from Location Header</li> <li>Provider publish new API.</li> <li>Provider remove published API.</li> </ol> <p>Information of Test:</p> <ol> <li>Perform provider registration</li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform invoker onboarding</p> </li> <li> <p>Discover published APIs:</p> <ul> <li>Get Api Ids And Api Names from response.</li> </ul> </li> <li> <p>Event Subscription to SERVICE_API_AVAILABLE and SERVICE_API_UNAVAILABLE of provider previously registered:</p> <ol> <li>Send POST to https://{CAPIF_HOSTNAME}/capif-events/v1/{subscriberId}/subscriptions</li> <li>body event subscription request body with:<ol> <li>events: ['SERVICE_API_AVAILABLE','SERVICE_API_UNAVAILABLE']</li> <li>eventFilter: only receive events from provider's aefId.</li> </ol> </li> <li>Use Invoker Certificate</li> </ol> </li> <li> <p>Publish new Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_2</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Remove published Service API at CCF:</p> <ul> <li>Send DELETE to resource URL https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{SERVICE_API_ID}</li> <li>Use APF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Event Subscription must accomplish:</p> <ol> <li>201 Created</li> <li>The URI of the created resource shall be returned in the \"Location\" HTTP header, following this structure: {apiRoot}/capif-events/{apiVersion}/{subscriberId}/subscriptions/{subscriptionId}</li> <li>Response Body must follow EventSubscription data structure.</li> </ol> </li> <li> <p>Mock Server received messages must accomplish:</p> <ol> <li>Two Events have been received.</li> <li>Validate received events follow EventNotification data structure, with apiIds in eventDetail parameter.<ol> <li>One should be SERVICE_API_AVAILABLE apiId of service_2 published API.</li> <li>The other one must be SERVICE_API_UNAVAILABLE apiId of service_1 published API.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_events_service/#test-case-8-invoker-subscribe-to-service-api-update","title":"Test Case 8: Invoker subscribe to Service API Update","text":"<p>Test ID: capif_api_events-8, mockserver</p> <p>Description:</p> <p>This test case will check that a CAPIF Invoker subscribed to SERVICE_API_UPDATE, receive the notification when AEF Update some information on API Published.</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid InvokerId or apfId from CAPIF Authority)</li> <li>CAPIF provider is correctly registered and published APIs.</li> <li>API Provider had a Service API Published on CAPIF</li> <li>Mock Server is up and running to receive requests.</li> <li>Mock Server is clean.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider and publish one API at CCF</li> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Discover published APIs and extract apiIds and apiNames</li> <li>Subscribe to SERVICE_API_UPDATE event filtering by aefId.</li> <li>Retrieve {subscriberId} and {subscriptionId} from Location Header at event subscription</li> <li>Provider update information of Service API Published.</li> </ol> <p>Information of Test:</p> <ol> <li>Check and Clean Mock Server</li> <li>Perform provider registration</li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> <li>Store serviceApiId</li> </ul> </li> <li> <p>Perform invoker onboarding</p> </li> <li> <p>Discover published APIs:</p> <ul> <li>Get Api Ids And Api Names from response.</li> </ul> </li> <li> <p>Event Subscription to SERVICE_API_UPDATE of provider previously registered:</p> <ol> <li>Send POST to https://{CAPIF_HOSTNAME}/capif-events/v1/{subscriberId}/subscriptions</li> <li>body event subscription request body with:<ol> <li>events: ['SERVICE_API_UPDATE']</li> <li>eventFilter: only receive events from provider's aefId.</li> </ol> </li> <li>Use Invoker Certificate</li> </ol> </li> <li> <p>Update published API at CCF:</p> <ul> <li>Send PUT to resource URL https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{serivceApiId}</li> <li>body [service api description] with overrided apiName to service_1_modified**</li> <li>Use APF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Event Subscription must accomplish:<ol> <li>201 Created</li> <li>The URI of the created resource shall be returned in the \"Location\" HTTP header, following this structure: {apiRoot}/capif-events/{apiVersion}/{subscriberId}/subscriptions/{subscriptionId}</li> <li>Response Body must follow EventSubscription data structure.</li> </ol> </li> <li>Response to Update Published Service API:<ol> <li>200 OK</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiName service_1_modified**</li> </ul> </li> </ol> </li> <li>Mock Server received messages must accomplish:<ol> <li>One Event has been received.</li> <li>Validate received events follow EventNotification data structure, with serviceAPIDescriptions in eventDetail parameter.<ol> <li>Event should be SERVICE_API_UPDATE with eventDetail with modified apiName.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_events_service/#test-case-9-provider-subscribe-to-api-invoker-events","title":"Test Case 9: Provider subscribe to API Invoker events","text":"<p>Test ID: capif_api_events-9, mockserver</p> <p>Description:</p> <p>This test case will check that a CAPIF Provider subscribed to API Invoker events (API_INVOKER_ONBOARDED, API_INVOKER_UPDATED and API_INVOKER_OFFBOARDED), receive the notifications when Invoker is onboarded, updated and removed respectively.</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid InvokerId or apfId from CAPIF Authority)</li> <li>CAPIF provider is correctly registered.</li> <li>Mock Server is up and running to receive requests.</li> <li>Mock Server is clean.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF</li> <li>Subscribe Provider to API_INVOKER_ONBOARDED, API_INVOKER_UPDATED and API_INVOKER_OFFBOARDED events.</li> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Update Onboarding Information at CCF with a minor change on \"notificationDestination\"</li> <li>Offboard Invoker</li> </ol> <p>Information of Test:</p> <ol> <li>Check and Clean Mock Server</li> <li>Perform provider registration</li> <li>Event Subscription to API_INVOKER_ONBOARDED, API_INVOKER_UPDATED and API_INVOKER_OFFBOARDED events:<ol> <li>Send POST to https://{CAPIF_HOSTNAME}/capif-events/v1/{subscriberId}/subscriptions</li> <li>body event subscription request body with:<ol> <li>events: ['API_INVOKER_ONBOARDED', 'API_INVOKER_UPDATED', 'API_INVOKER_OFFBOARDED']</li> </ol> </li> <li>Use Provider AMF Certificate</li> </ol> </li> <li>Perform invoker onboarding</li> <li>Update information of previously onboarded Invoker:<ul> <li>Send PUT to https://{CAPIF_HOSTNAME}/api-invoker-management/v1/onboardedInvokers/{onboardingId}</li> <li>Reference Request Body is: [put invoker onboarding body]</li> <li>\"notificationDestination\": \"http://host.docker.internal:8086/netapp_new_callback\",</li> </ul> </li> <li>Offboard:<ul> <li>Send DELETE to https://{CAPIF_HOSTNAME}/api-invoker-management/v1/onboardedInvokers/{onboardingId}</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Event Subscription must accomplish:<ol> <li>201 Created</li> <li>The URI of the created resource shall be returned in the \"Location\" HTTP header, following this structure: {apiRoot}/capif-events/{apiVersion}/{subscriberId}/subscriptions/{subscriptionId}</li> <li>Response Body must follow EventSubscription data structure.</li> </ol> </li> <li>Response to Onboard request must accomplish:<ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li>Response to Update Request (PUT) with minor change must contain:<ol> <li>200 OK response.</li> <li>notificationDestination on response must contain the new value</li> </ol> </li> <li>Response to Offboard Request (DELETE) must contain:<ol> <li>204 No Content</li> </ol> </li> <li>Mock Server received messages must accomplish:<ol> <li>Three Events have been received.</li> <li>Validate received events follow EventNotification data structure, with apiInvokerIds in eventDetail parameter.<ol> <li>One Event should be API_INVOKER_ONBOARDED with eventDetail with modified apiInvokerId.</li> <li>One Event should be API_INVOKER_UPDATED with eventDetail with modified apiInvokerId.</li> <li>One Event should be API_INVOKER_OFFBOARDED with eventDetail with modified apiInvokerId.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_events_service/#test-case-10-provider-subscribed-to-acl-update-event","title":"Test Case 10: Provider subscribed to ACL update event","text":"<p>Test ID: capif_api_events-10, mockserver</p> <p>Description:</p> <p>This test case will check that a CAPIF Provider subscribed to ACCESS_CONTROL_POLICY_UPDATE receive a notification when ACL Changes.</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid InvokerId or apfId from CAPIF Authority)</li> <li>CAPIF provider is correctly registered.</li> <li>API Provider had one Service API Published on CAPIF</li> <li>API Invoker had a Security Context for the Service API published by provider.</li> <li>Mock Server is up and running to receive requests.</li> <li>Mock Server is clean.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF.</li> <li>Publish a provider API with name service_1.</li> <li>Register Invoker and Onboard Invoker at CCF.</li> <li>Subscribe Provider to ACCESS_CONTROL_POLICY_UPDATE event.</li> <li>Discover APIs filtered by aef_id</li> <li>Create Security Context for Invoker.</li> <li>Provider Retrieve ACL</li> </ol> <p>Information of Test:</p> <ol> <li>Check and Clean Mock Server</li> <li>Perform provider registration</li> <li>Perform invoker onboarding</li> <li>Event Subscription to ACCESS_CONTROL_POLICY_UPDATE event:<ol> <li>Send POST to https://{CAPIF_HOSTNAME}/capif-events/v1/{subscriberId}/subscriptions</li> <li>body event subscription request body with:<ol> <li>events: ['ACCESS_CONTROL_POLICY_UPDATE']</li> <li>eventFilters: apiInvokerIds array with apiInvokerId of invoker</li> </ol> </li> <li>Use Provider AMF Certificate</li> </ol> </li> <li>Discover published APIs</li> <li>Create Security Context for Invoker<ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li>Provider Retrieve ACL<ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId}?aef-id=${aef_id}</li> <li>Use serviceApiId and aefId</li> <li>Use AEF Provider Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Event Subscription must accomplish:<ol> <li>201 Created</li> <li>The URI of the created resource shall be returned in the \"Location\" HTTP header, following this structure: {apiRoot}/capif-events/{apiVersion}/{subscriberId}/subscriptions/{subscriptionId}</li> <li>Response Body must follow EventSubscription data structure.</li> </ol> </li> <li>Create security context:<ol> <li>201 Created response.</li> <li>body returned must accomplish ServiceSecurity data structure.</li> <li>Location Header must contain the new resource URL {apiRoot}/capif-security/v1/trustedInvokers/{apiInvokerId}</li> </ol> </li> <li>ACL Response:<ol> <li>200 OK Response.</li> <li>body returned must accomplish AccessControlPolicyList data structure.</li> <li>apiInvokerPolicies must:<ol> <li>contain only one object.</li> <li>apiInvokerId must match apiInvokerId registered previously.</li> </ol> </li> </ol> </li> <li>Mock Server received messages must accomplish:<ol> <li>One Event has been received.</li> <li>Validate received event follow EventNotification data structure, with accCtrlPolListExt in eventDetail parameter.<ol> <li>One Event should be ACCESS_CONTROL_POLICY_UPDATE with eventDetail with accCtrlPolListExt including the apiId and apiInvokerPolicies.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_events_service/#test-case-11-provider-receives-an-acl-unavailable-event-when-invoker-remove-security-context","title":"Test Case 11: Provider receives an ACL unavailable event when invoker remove Security Context.","text":"<p>Test ID: capif_api_events-11, mockserver</p> <p>Description:</p> <p>This test case will check that a CAPIF Invoker subscribed to ACCESS_CONTROL_POLICY_UNAVAILABLE will receive the notification when AEF remove Security Context created previously.</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid InvokerId or apfId from CAPIF Authority)</li> <li>CAPIF provider is correctly registered.</li> <li>API Provider had one Service API Published on CAPIF</li> <li>Mock Server is up and running to receive requests.</li> <li>Mock Server is clean.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF.</li> <li>Publish a provider API with name service_1.</li> <li>Register Invoker and Onboard Invoker at CCF.</li> <li>Subscribe Invoker to ACCESS_CONTROL_POLICY_UNAVAILABLE event.</li> <li>Discover APIs filtered by aef_id</li> <li>Create Security Context for Invoker.</li> <li>Provider Retrieve ACL.</li> <li>Remove Security Context for Invoker.</li> </ol> <p>Information of Test:</p> <ol> <li>Check and Clean Mock Server</li> <li>Perform provider registration</li> <li>Perform invoker onboarding</li> <li>Event Subscription to ACCESS_CONTROL_POLICY_UNAVAILABLE event:<ol> <li>Send POST to https://{CAPIF_HOSTNAME}/capif-events/v1/{subscriberId}/subscriptions</li> <li>body event subscription request body with:<ol> <li>events: ['ACCESS_CONTROL_POLICY_UNAVAILABLE']</li> <li>eventFilters: apiInvokerIds array with apiInvokerId of invoker</li> </ol> </li> <li>Use Invoker Certificate</li> </ol> </li> <li>Discover published APIs</li> <li>Create Security Context for Invoker<ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li>Provider Retrieve ACL<ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId}?aef-id=${aef_id}</li> <li>Use serviceApiId and aefId</li> <li>Use AEF Provider Certificate</li> </ul> </li> <li>Delete Security Context of Invoker by Provider:<ul> <li>Send DELETE https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>Use AEF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Event Subscription must accomplish:<ol> <li>201 Created</li> <li>The URI of the created resource shall be returned in the \"Location\" HTTP header, following this structure: {apiRoot}/capif-events/{apiVersion}/{subscriberId}/subscriptions/{subscriptionId}</li> <li>Response Body must follow EventSubscription data structure.</li> </ol> </li> <li>Create security context:<ol> <li>201 Created response.</li> <li>body returned must accomplish ServiceSecurity data structure.</li> <li>Location Header must contain the new resource URL {apiRoot}/capif-security/v1/trustedInvokers/{apiInvokerId}</li> </ol> </li> <li>ACL Response:<ol> <li>200 OK Response.</li> <li>body returned must accomplish AccessControlPolicyList data structure.</li> <li>apiInvokerPolicies must:<ol> <li>contain only one object.</li> <li>apiInvokerId must match apiInvokerId registered previously.</li> </ol> </li> </ol> </li> <li>Delete security context:<ol> <li>204 No Content response.</li> </ol> </li> <li>Mock Server received messages must accomplish:<ol> <li>One Event has been received.</li> <li>Validate received event follow EventNotification data structure, without eventDetail parameter.<ol> <li>One Event should be ACCESS_CONTROL_POLICY_UNAVAILABLE without eventDetail.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_events_service/#test-case-12-invoker-receives-an-invoker-authorization-revoked-and-acl-unavailable-event-when-provider-revoke-invoker-authorization","title":"Test Case 12: Invoker receives an Invoker Authorization Revoked and ACL unavailable event when Provider revoke Invoker Authorization.","text":"<p>Test ID: capif_api_events-12, mockserver</p> <p>Description:</p> <p>This test case will check that a CAPIF Invoker subscribed to API_INVOKER_AUTHORIZATION_REVOKED and ACCESS_CONTROL_POLICY_UNAVAILABLE receive both notification when AEF revoke invoker's authorization.</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid InvokerId or apfId from CAPIF Authority)</li> <li>CAPIF provider is correctly registered.</li> <li>API Provider had one Service API Published on CAPIF</li> <li>Mock Server is up and running to receive requests.</li> <li>Mock Server is clean.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF.</li> <li>Publish a provider API with name service_1.</li> <li>Register Invoker and Onboard Invoker at CCF.</li> <li>Subscribe Invoker to ACCESS_CONTROL_POLICY_UNAVAILABLE and API_INVOKER_AUTHORIZATION_REVOKED events.</li> <li>Discover APIs filtered by aef_id</li> <li>Create Security Context for Invoker.</li> <li>Revoke Authorization by Provider.</li> </ol> <p>Information of Test:</p> <ol> <li>Check and Clean Mock Server</li> <li>Perform provider registration</li> <li>Perform invoker onboarding</li> <li>Event Subscription to ACCESS_CONTROL_POLICY_UNAVAILABLE and API_INVOKER_AUTHORIZATION_REVOKED event:<ol> <li>Send POST to https://{CAPIF_HOSTNAME}/capif-events/v1/{subscriberId}/subscriptions</li> <li>body event subscription request body with:<ol> <li>events: ['ACCESS_CONTROL_POLICY_UNAVAILABLE','API_INVOKER_AUTHORIZATION_REVOKED']</li> <li>eventFilters: apiInvokerIds array with apiInvokerId of invoker</li> </ol> </li> <li>Use Invoker Certificate</li> </ol> </li> <li>Discover published APIs</li> <li>Create Security Context for Invoker<ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li>Revoke Authorization by Provider:<ul> <li>Send POST https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}/delete</li> <li>body security notification body</li> <li>Using AEF Certificate.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Event Subscription must accomplish:<ol> <li>201 Created</li> <li>The URI of the created resource shall be returned in the \"Location\" HTTP header, following this structure: {apiRoot}/capif-events/{apiVersion}/{subscriberId}/subscriptions/{subscriptionId}</li> <li>Response Body must follow EventSubscription data structure.</li> </ol> </li> <li>Create security context:<ol> <li>201 Created response.</li> <li>body returned must accomplish ServiceSecurity data structure.</li> <li>Location Header must contain the new resource URL {apiRoot}/capif-security/v1/trustedInvokers/{apiInvokerId}</li> </ol> </li> <li>Revoke Authorization:<ol> <li>204 No Content response.</li> </ol> </li> <li>Mock Server received messages must accomplish:<ol> <li>Two Events has been received.</li> <li>Validate received event follow EventNotification data structure, without eventDetail parameter.<ol> <li>One Event should be ACCESS_CONTROL_POLICY_UNAVAILABLE without eventDetail.</li> <li>One Event should be API_INVOKER_AUTHORIZATION_REVOKED without eventDetail.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_invoker_management/","title":"Test Plan for CAPIF Api Invoker Management","text":"<p>At this documentation you will have all information and related files and examples of test plan for this API.</p>"},{"location":"testing/testplan/api_invoker_management/#test-case-1-onboard-network-app","title":"Test Case 1: Onboard Network App","text":"<p>Test ID: capif_api_invoker_management-1</p> <p>Description:</p> <p>This test will try to register new Network App at CAPIF Core.</p> <p>Pre-Conditions:</p> <ul> <li>Network App was not registered previously</li> <li>Network App was not onboarded previously</li> <li>Preconditions: The administrator must have previously registered the User.</li> </ul> <p>Execution Steps:</p> <ol> <li>Retrieve access_token by User from register</li> <li>Onboard Invoker at CCF</li> <li>Store signed Certificate</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Create public and private key at invoker</p> </li> <li> <p>Retrieve access_token by User:</p> <ul> <li>Send GET to https://${CAPIF_REGISTER}:${CAPIF_REGISTER_PORT}/getauth</li> <li>Include basic Auth Header with Admin user/password</li> <li>Retrieve access_token and the urls needed for next requests from response body user_getauth_response_body_example</li> </ul> </li> <li> <p>Onboard Invoker:</p> <ul> <li>Send POST to https://{CAPIF_HOSTNAME}/api-invoker-management/v1/onboardedInvokers</li> <li>Reference Request Body: invoker onboarding body</li> <li>\"onboardingInformation\"->\"apiInvokerPublicKey\": must contain public key generated by Invoker.</li> <li>Send in Authorization Header the Bearer access_token obtained previously (Authorization:Bearer ${access_token})</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Onboard request must accomplish:<ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> </ol>"},{"location":"testing/testplan/api_invoker_management/#test-case-2-onboard-network-app-already-onboarded","title":"Test Case 2: Onboard Network App Already onboarded","text":"<p>Test ID: capif_api_invoker_management-2</p> <p>Description:</p> <p>This test will check second onboard of same Network App is not allowed.</p> <p>Pre-Conditions:</p> <ul> <li>Network App was registered previously</li> <li>Network App was onboarded previously</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Network App at CCF</li> <li>Onboard Network App at CCF</li> <li>Store signed Certificate at Network App</li> <li>Onboard Again the Network App at CCF</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Invoker Onboarding</p> </li> <li> <p>Repeat Onboard Invoker:</p> <ul> <li>Send POST to https://{CAPIF_HOSTNAME}/api-invoker-management/v1/onboardedInvokers</li> <li>Reference Request Body: invoker onboarding body</li> <li>\"onboardingInformation\"->\"apiInvokerPublicKey\": must contain public key generated by Invoker.</li> <li>Send in Authorization Header the Bearer access_token obtained previously (Authorization:Bearer ${access_token})</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Onboard request must accomplish:<ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li>Response to Second Onboard of Network App must accomplish:<ol> <li>403 Forbidden</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 403</li> <li>title with message \"Forbidden\"</li> <li>detail with message \"Invoker Already registered\".</li> <li>cause with message \"Identical invoker public key\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_invoker_management/#test-case-3-update-onboarded-network-app","title":"Test Case 3: Update Onboarded Network App","text":"<p>Test ID: capif_api_invoker_management-3</p> <p>Description:</p> <p>This test will try to update information of previous onboard Network App at CAPIF Core.</p> <p>Pre-Conditions:</p> <ul> <li>Network App was registered previously</li> <li>Network App was onboarded previously with {onboardingId}</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Invoker at CCF</li> <li>Onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Update Onboarding Information at CCF with a minor change on \"notificationDestination\"</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Invoker Onboarding</p> </li> <li> <p>Update information of previously onboarded Invoker:</p> <ul> <li>Send PUT to https://{CAPIF_HOSTNAME}/api-invoker-management/v1/onboardedInvokers/{onboardingId}</li> <li>Reference Request Body is: [put invoker onboarding body]</li> <li>\"notificationDestination\": \"http://host.docker.internal:8086/netapp_new_callback\",</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Onboard request must accomplish:<ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li>Response to Update Request (PUT) with minor change must contain:<ol> <li>200 OK response.</li> <li>notificationDestination on response must contain the new value</li> </ol> </li> </ol>"},{"location":"testing/testplan/api_invoker_management/#test-case-4-update-not-onboarded-network-app","title":"Test Case 4: Update Not Onboarded Network App","text":"<p>Test ID: capif_api_invoker_management-4</p> <p>Description:</p> <p>This test will try to update information of not onboarded Network App at CAPIF Core.</p> <p>Pre-Conditions:</p> <ul> <li>Network App was registered previously</li> <li>Network App was not onboarded previously</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Invoker at CCF</li> <li>Onboard Invoker at CCF</li> <li>Update Onboarding Information at CCF of not onboarded</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Invoker Onboarding</p> </li> <li> <p>Update information of not onboarded Invoker:</p> <ul> <li>Send PUT to https://{CAPIF_HOSTNAME}/api-invoker-management/v1/onboardedInvokers/{INVOKER_NOT_REGISTERED}</li> <li>Reference Request Body is: [put invoker onboarding body]</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Onboard request must accomplish:<ol> <li>201 Created</li> </ol> </li> <li>Response to Update Request (PUT) must contain:<ol> <li>404 Not Found</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Please provide an existing Network App ID\".</li> <li>cause with message \"Not exist Network App ID\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_invoker_management/#test-case-5-offboard-network-app","title":"Test Case 5: Offboard Network App","text":"<p>Test ID: capif_api_invoker_management-5</p> <p>Description:</p> <p>This test case will check that a Registered Network App can be deleted.</p> <p>Pre-Conditions:</p> <ul> <li>Network App was registered previously</li> <li>Network App was onboarded previously</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Invoker at CCF</li> <li>Onboard Invoker at CCF</li> <li>Offboard Invoker at CCF</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Invoker Onboarding</p> </li> <li> <p>Offboard:</p> <ul> <li>Send DELETE to https://{CAPIF_HOSTNAME}/api-invoker-management/v1/onboardedInvokers/{onboardingId}</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Onboard request must accomplish:<ol> <li>201 Created</li> </ol> </li> <li>Response to Offboard Request (DELETE) must contain:<ol> <li>204 No Content</li> </ol> </li> </ol>"},{"location":"testing/testplan/api_invoker_management/#test-case-6-offboard-not-previsouly-onboarded-network-app","title":"Test Case 6: Offboard Not previsouly Onboarded Network App","text":"<p>Test ID: capif_api_invoker_management-6</p> <p>Description:</p> <p>This test case will check that a Non-Registered Network App cannot be deleted</p> <p>Pre-Conditions:</p> <ul> <li>Network App was registered previously</li> <li>Network App was not onboarded previously</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Invoker at CCF</li> <li>Offboard Invoker at CCF</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Invoker Onboarding</p> </li> <li> <p>Offboard:</p> <ul> <li>Send DELETE to https://{CAPIF_HOSTNAME}/api-invoker-management/v1/onboardedInvokers/{INVOKER_NOT_REGISTERED}</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Offboard Request (DELETE) must contain:<ol> <li>404 Not Found</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Please provide an existing Network App ID\".</li> <li>cause with message \"Not exist Network App ID\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_invoker_management/#test-case-7-update-onboarded-network-app-certificate","title":"Test Case 7: Update Onboarded Network App Certificate","text":"<p>Test ID: capif_api_invoker_management-7</p> <p>Description:</p> <p>This test will try to update public key and get a new signed certificate by CAPIF Core.</p> <p>Pre-Conditions:</p> <ul> <li>Network App was registered previously</li> <li>Network App was onboarded previously with {onboardingId} and {public_key_1}</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Invoker at CCF</li> <li>Onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Update Onboarding Information at CCF with new public key</li> <li>Update Onboarding Information at CCF with minor change</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Invoker Onboarding with public_key_1.</p> </li> <li> <p>Create {public_key_2}</p> </li> <li> <p>Update information of previously onboarded Invoker:</p> <ul> <li>Send PUT to https://{CAPIF_HOSTNAME}/api-invoker-management/v1/onboardedInvokers/{onboardingId}</li> <li>Reference Request Body is: [put invoker onboarding body]</li> <li>[\"onboardingInformation\"][\"apiInvokerPublicKey\"]: {public_key_2},</li> <li>Store new certificate.</li> </ul> </li> <li> <p>Update information of previously onboarded Invoker Using new certificate:</p> <ul> <li>Send PUT to https://{CAPIF_HOSTNAME}/api-invoker-management/v1/onboardedInvokers/{onboardingId}</li> <li>Reference Request Body is: [put invoker onboarding body]</li> <li>\"notificationDestination\": \"http://host.docker.internal:8086/netapp_new_callback\",</li> <li>Use new Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Onboard request must accomplish:<ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li>Response to Update Request (PUT) with new public key:<ol> <li>200 OK response.</li> <li>apiInvokerCertificate with new certificate on response -> store to use.</li> </ol> </li> <li>Response to Update Request (PUT) with minor change must contain:<ol> <li>200 OK response.</li> <li>notificationDestination on response must contain the new value</li> </ol> </li> </ol>"},{"location":"testing/testplan/api_logging_service/","title":"Test Plan for CAPIF Api Logging Service","text":"<p>At this documentation you will have all information and related files and examples of test plan for this API.</p>"},{"location":"testing/testplan/api_logging_service/#test-case-1-creates-a-new-individual-capif-log-entry","title":"Test Case 1: Creates a new individual CAPIF Log Entry.","text":"<p>Test ID: capif_api_logging-1</p> <p>Description:</p> <p>This test case will check that a CAPIF AEF can create log entry to Logging Service</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF provider is pre-authorised (has valid aefId from CAPIF Authority)</li> <li>Service exist in CAPIF</li> <li>Invoker exist in CAPIF</li> </ul> <p>Execution Steps: 1. Register Provider and Invoker CCF 2. Publish Service 3. Create Log Entry</p> <p>Information of Test:</p> <ol> <li> <p>Perform provider onboarding and invoker onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Log Entry:</p> <ol> <li>Send POST to https://{CAPIF_HOSTNAME}/api-invocation-logs/v1/{aefId}/logs</li> <li>body log entry request body</li> <li>Use AEF Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Logging Service must accomplish:<ol> <li>201 Created</li> <li>Response Body must follow InvocationLog data structure with:<ul> <li>aefId</li> <li>apiInvokerId</li> <li>logs</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invocation-logs/v1/{aefId}/logs/{logId}</li> </ol> </li> </ol>"},{"location":"testing/testplan/api_logging_service/#test-case-2-creates-a-new-individual-capif-log-entry-with-invalid-aefid","title":"Test Case 2: Creates a new individual CAPIF Log Entry with Invalid aefId","text":"<p>Test ID: capif_api_logging-2</p> <p>Description:</p> <p>This test case will check that a CAPIF subscriber (AEF) cannot create Log Entry without valid aefId</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF provider is not pre-authorised (has not valid aefId from CAPIF Authority)</li> <li>Service exist in CAPIF</li> <li>Invoker exist in CAPIF</li> </ul> <p>Execution Steps: 1. Register Provider and Invoker CCF 2. Publish Service 3. Create Log Entry</p> <p>Information of Test:</p> <ol> <li> <p>Perform provider onboarding and invoker onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Log Entry:</p> <ol> <li>Send POST to https://{CAPIF_HOSTNAME}/api-invocation-logs/v1/{not-valid-aefId}/logs</li> <li>body log entry request body</li> <li>Use AEF Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Logging Service must accomplish:<ol> <li>404 Not Found</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Exposer not exist\".</li> <li>cause with message \"Exposer id not found\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_logging_service/#test-case-3-creates-a-new-individual-capif-log-entry-with-invalid-serviceapi","title":"Test Case 3: Creates a new individual CAPIF Log Entry with Invalid serviceAPI","text":"<p>Test ID: capif_api_logging-3</p> <p>Description:</p> <p>This test case will check that a CAPIF subscriber (AEF) cannot create Log Entry without valid aefId</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid aefId from CAPIF Authority)</li> </ul> <p>Execution Steps: 1. Register Provider and Invoker CCF 2. Publish Service 3. Create Log Entry</p> <p>Information of Test:</p> <ol> <li> <p>Perform provider onboarding and invoker onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Log Entry:</p> <ol> <li>Send POST to https://{CAPIF_HOSTNAME}/api-invocation-logs/v1/{aefId}/logs</li> <li>body [log entry request body with serviceAPI apiName apiId not valid]</li> <li>Use AEF Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Logging Service must accomplish:<ol> <li>404 Not Found</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Invoker not exist\".</li> <li>cause with message \"Invoker id not found\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_logging_service/#test-case-4-creates-a-new-individual-capif-log-entry-with-invalid-apiinvokerid","title":"Test Case 4: Creates a new individual CAPIF Log Entry with Invalid apiInvokerId","text":"<p>Test ID: capif_api_logging-4</p> <p>Description:</p> <p>This test case will check that a CAPIF subscriber (AEF) cannot create Log Entry without valid aefId</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid aefId from CAPIF Authority)</li> </ul> <p>Execution Steps: 1. Register Provider and Invoker CCF 2. Publish Service 3. Create Log Entry</p> <p>Information of Test:</p> <ol> <li> <p>Perform provider onboarding and invoker onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Log Entry:</p> <ol> <li>Send POST to https://{CAPIF_HOSTNAME}/api-invocation-logs/v1/{aefId}/logs</li> <li>body [log entry request body with invokerId not valid]</li> <li>Use AEF Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Onboard request must accomplish:</p> <ol> <li>201 Created response.</li> <li>body returned must accomplish APIProviderEnrolmentDetails data structure.</li> <li>For each apiProvFuncs, we must check:<ol> <li>apiProvFuncId is set</li> <li>apiProvCert under regInfo is set properly</li> </ol> </li> <li>Location Header must contain the new resource URL {apiRoot}/api-provider-management/v1/registrations/{registrationId}</li> </ol> </li> <li> <p>Response to Logging Service must accomplish:</p> <ol> <li>404 Not Found</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Invoker not exist\".</li> <li>cause with message \"Invoker id not found\".</li> </ul> </li> </ol> </li> <li> <p>Log Entry are not stored in CAPIF Database</p> </li> </ol>"},{"location":"testing/testplan/api_logging_service/#test-case-5-creates-a-new-individual-capif-log-entry-with-invalid-aefid-in-body","title":"Test Case 5: Creates a new individual CAPIF Log Entry with Invalid aefId in body","text":"<p>Test ID: capif_api_logging-5</p> <p>Description:</p> <p>This test case will check that a CAPIF subscriber (AEF) cannot create Log Entry without valid aefId in body</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF provider is pre-authorised (has valid apfId from CAPIF Authority)</li> <li>Service exist in CAPIF</li> <li>Invoker exist in CAPIF</li> </ul> <p>Execution Steps: 1. Register Provider and Invoker CCF 2. Publish Service 3. Create Log Entry</p> <p>Information of Test:</p> <ol> <li> <p>Perform provider onboarding and invoker onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Log Entry:</p> <ol> <li>Send POST to https://{CAPIF_HOSTNAME}/api-invocation-logs/v1/{aefId}/logs</li> <li>body [log entry request body with bad aefId] </li> <li>Use AEF Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Logging Service must accomplish:<ol> <li>401 Unauthorized</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"AEF id not matching in request and body\".</li> <li>cause with message \"Not identical AEF id\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_provider_management/","title":"Test Plan for CAPIF Api Provider Management","text":"<p>At this documentation you will have all information and related files and examples of test plan for this API.</p>"},{"location":"testing/testplan/api_provider_management/#test-case-1-register-api-provider","title":"Test Case 1: Register Api Provider","text":"<p>Test ID: capif_api_provider_management-1</p> <p>Description:</p> <p>This test case will check that Api Provider can be registered con CCF</p> <p>Pre-Conditions:</p> <ul> <li>Provider is pre-authorised (has valid certificate from CAPIF Authority)</li> </ul> <p>Execution Steps:</p> <ol> <li>Create private and public key for provider and each function to register.</li> <li>Register Provider.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Create public and private key at provider for provider itself and each function (apf, aef and amf)</p> </li> <li> <p>Retrieve access_token by User:</p> <ul> <li>Send GET to https://${CAPIF_REGISTER}:${CAPIF_REGISTER_PORT}/getauth</li> <li>Include basic Auth Header with Admin user/password</li> <li>Retrieve access_token and the urls needed for next requests from response body user_getauth_response_body_example</li> </ul> </li> <li> <p>Register Provider:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations</li> <li>body provider request body</li> <li>Authentication Bearer with access_token</li> <li>Store each cert in a file with according name.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Register Provider at Provider Management:<ol> <li>201 Created response.</li> <li>body returned must accomplish APIProviderEnrolmentDetails data structure.</li> <li>For each apiProvFuncs, we must check:<ol> <li>apiProvFuncId is set</li> <li>apiProvCert under regInfo is set properly</li> </ol> </li> <li>Location Header must contain the new resource URL {apiRoot}/api-provider-management/v1/registrations/{registrationId}</li> </ol> </li> </ol>"},{"location":"testing/testplan/api_provider_management/#test-case-2-register-api-provider-already-registered","title":"Test Case 2: Register Api Provider Already registered","text":"<p>Test ID: capif_api_provider_management-2</p> <p>Description:</p> <p>This test case will check that a Api Provider previously registered cannot be re-registered</p> <p>Pre-Conditions:</p> <ul> <li>Api Provider was registered previously and there is a {registerId} for his Api Provider in the DB</li> </ul> <p>Execution Steps:</p> <ol> <li>Create private and public key for provider and each function to register.</li> <li>Register Provider.</li> <li>Re-Register Provider.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Create public and private key at provider for provider itself and each function (apf, aef and amf)</p> </li> <li> <p>Retrieve access_token by User:</p> <ul> <li>Send GET to https://${CAPIF_REGISTER}:${CAPIF_REGISTER_PORT}/getauth</li> <li>Include basic Auth Header with Admin user/password</li> <li>Retrieve access_token and the urls needed for next requests from response body user_getauth_response_body_example</li> </ul> </li> <li> <p>Register Provider:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations</li> <li>body provider request body</li> <li>Authentication Bearer with access_token</li> <li>Store each cert in a file with according name.</li> </ul> </li> <li> <p>Re-Register Provider:</p> <ul> <li>Same regSec than Previous registration</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Re-Register Provider:<ol> <li>403 Forbidden response.</li> <li> <p>body returned must accomplish ProblemDetails data structure, with:</p> <ul> <li>status 403</li> <li>title with message \"Forbidden\"</li> <li>detail with message \"Provider already registered\".</li> <li>cause with message \"Identical provider reg sec\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_provider_management/#test-case-3-update-registered-api-provider","title":"Test Case 3: Update Registered Api Provider","text":"<p>Test ID: capif_api_provider_management-3</p> <p>Description:</p> <p>This test case will check that a Registered Api Provider can be updated</p> <p>Pre-Conditions:</p> <ul> <li>Api Provider was registered previously and there is a {registerId} for his Api Provider in the DB</li> </ul> <p>Execution Steps:</p> <ol> <li>Create private and public key for provider and each function to register.</li> <li>Register Provider</li> <li>Update Provider</li> </ol> <p>Information of Test:</p> <ol> <li>Create public and private key at provider for provider itself and each function (apf, aef and amf)</li> <li> <p>Retrieve access_token by User:</p> <ul> <li>Send GET to https://${CAPIF_REGISTER}:${CAPIF_REGISTER_PORT}/getauth</li> <li>Include basic Auth Header with Admin user/password</li> <li>Retrieve access_token and the urls needed for next requests from response body user_getauth_response_body_example</li> </ul> </li> <li> <p>Register Provider:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations</li> <li>body provider request body</li> <li>Authentication Bearer with access_token</li> <li>Get Resource URL from Location</li> </ul> </li> <li> <p>Update Provider:</p> <ul> <li>Send PUT to Resource URL returned at registration https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations/{registrationId}</li> <li>body provider request body with apiProvDomInfo set to ROBOT_TESTING_MOD</li> <li>Use AMF Certificate.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Register Provider:</p> <ol> <li>201 Created response.</li> <li>body returned must accomplish APIProviderEnrolmentDetails data structure.</li> <li>Location Header must contain the new resource URL {apiRoot}/api-provider-management/v1/registrations/{registrationId}</li> </ol> </li> <li> <p>Update Provider:</p> <ol> <li>200 OK response.</li> <li>body returned must accomplish APIProviderEnrolmentDetails data structure, with:<ul> <li>apiProvDomInfo set to ROBOT_TESTING_MOD</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_provider_management/#test-case-4-update-not-registered-api-provider","title":"Test Case 4: Update Not Registered Api Provider","text":"<p>Test ID: capif_api_provider_management-4</p> <p>Description:</p> <p>This test case will check that a Non-Registered Api Provider cannot be updated</p> <p>Pre-Conditions:</p> <ul> <li>Api Provider was not registered previously</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF</li> <li>Update Not Registered Provider</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Create public and private key at provider for provider itself and each function (apf, aef and amf)</p> </li> <li> <p>Retrieve access_token by User:</p> <ul> <li>Send GET to https://${CAPIF_REGISTER}:${CAPIF_REGISTER_PORT}/getauth</li> <li>Include basic Auth Header with Admin user/password</li> <li>Retrieve access_token and the urls needed for next requests from response body user_getauth_response_body_example</li> </ul> </li> <li> <p>Register Provider:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations</li> <li>body provider request body</li> <li>Authentication Bearer with access_token</li> <li>Store each cert in a file with according name.</li> </ul> </li> <li> <p>Update Not Registered Provider:</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations/{API_PROVIDER_NOT_REGISTERED}</li> <li>body provider request body</li> <li>Use AMF Certificate.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Update Not Registered Provider:<ol> <li>404 Not Found response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Not Exist Provider Enrolment Details\".</li> <li>cause with message \"Not found registrations to Send THIS api provider details\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_provider_management/#test-case-5-partially-update-registered-api-provider","title":"Test Case 5: Partially Update Registered Api Provider","text":"<p>Test ID: capif_api_provider_management-5</p> <p>Description:</p> <p>This test case will check that a Registered Api Provider can be partially updated</p> <p>Pre-Conditions:</p> <ul> <li>Api Provider was registered previously and there is a {registerId} for his Api Provider in the DB</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF</li> <li>Register Provider</li> <li>Partial update provider</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Create public and private key at provider for provider itself and each function (apf, aef and amf)</p> </li> <li> <p>Retrieve access_token by User:</p> <ul> <li>Send GET to https://${CAPIF_REGISTER}:${CAPIF_REGISTER_PORT}/getauth</li> <li>Include basic Auth Header with Admin user/password</li> <li>Retrieve access_token and the urls needed for next requests from response body user_getauth_response_body_example</li> </ul> </li> <li> <p>Register Provider:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations</li> <li>body provider request body</li> <li>Authentication Bearer with access_token</li> <li>Store each cert in a file with according name.</li> </ul> </li> <li> <p>Partial update provider:</p> <ul> <li>Send PATCH https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations/{registrationId}</li> <li>body provider request patch body</li> <li>Use AMF Certificate.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Partial update provider at Provider Management:<ol> <li>200 OK response.</li> <li>body returned must accomplish APIProviderEnrolmentDetails data structure, with:<ul> <li>apiProvDomInfo with \"ROBOT_TESTING_MOD\"</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_provider_management/#test-case-6-partially-update-not-registered-api-provider","title":"Test Case 6: Partially Update Not Registered Api Provider","text":"<p>Test ID: capif_api_provider_management-6</p> <p>Description:</p> <p>This test case will check that a Non-Registered Api Provider cannot be partially updated </p> <p>Pre-Conditions:</p> <ul> <li>Api Provider was not registered previously</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF</li> <li>Register Provider</li> <li>Partial update provider</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Create public and private key at provider for provider itself and each function (apf, aef and amf)</p> </li> <li> <p>Retrieve access_token by User:</p> <ul> <li>Send GET to https://${CAPIF_REGISTER}:${CAPIF_REGISTER_PORT}/getauth</li> <li>Include basic Auth Header with Admin user/password</li> <li>Retrieve access_token and the urls needed for next requests from response body user_getauth_response_body_example</li> </ul> </li> <li> <p>Register Provider:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations</li> <li>body provider request body</li> <li>Authentication Bearer with access_token</li> <li>Store each cert in a file with according name.</li> </ul> </li> <li> <p>Partial update Provider:</p> <ul> <li>Send PATCH https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations/{API_API_PROVIDER_NOT_REGISTERED}</li> <li>body provider request patch body</li> <li>Use AMF Certificate.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Partial update provider:<ol> <li>404 Not Found response.</li> <li> <p>body returned must accomplish ProblemDetails data structure, with:</p> <ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Not Exist Provider Enrolment Details\".</li> <li>cause with message \"Not found registrations to Send THIS api provider details\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_provider_management/#test-case-7-delete-registered-api-provider","title":"Test Case 7: Delete Registered Api Provider","text":"<p>Test ID: capif_api_provider_management-7</p> <p>Description:</p> <p>This test case will check that a Registered Api Provider can be deleted</p> <p>Pre-Conditions:</p> <ul> <li>Api Provider was registered previously</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF</li> <li>Register Provider</li> <li>Delete Provider</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Create public and private key at provider for provider itself and each function (apf, aef and amf)</p> </li> <li> <p>Retrieve access_token by User:</p> <ul> <li>Send GET to https://${CAPIF_REGISTER}:${CAPIF_REGISTER_PORT}/getauth</li> <li>Include basic Auth Header with Admin user/password</li> <li>Retrieve access_token and the urls needed for next requests from response body user_getauth_response_body_example</li> </ul> </li> <li> <p>Register Provider:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations</li> <li>body provider request body</li> <li>Authentication Bearer with access_token</li> <li>Store each cert in a file with according name.</li> </ul> </li> <li> <p>Delete registered provider:</p> <ul> <li>Send DELETE https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations/{registrationId}</li> <li>Use AMF Certificate.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Delete Provider:<ol> <li>204 No Content response.</li> </ol> </li> </ol>"},{"location":"testing/testplan/api_provider_management/#test-case-8-delete-not-registered-api-provider","title":"Test Case 8: Delete Not Registered Api Provider","text":"<p>Test ID: capif_api_provider_management-8</p> <p>Description:</p> <p>This test case will check that a Non-Registered Api Provider cannot be deleted</p> <p>Pre-Conditions:</p> <ul> <li>Api Provider was not registered previously</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF</li> <li>Delete Provider</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Create public and private key at provider for provider itself and each function (apf, aef and amf)</p> </li> <li> <p>Retrieve access_token by User:</p> <ul> <li>Send GET to https://${CAPIF_REGISTER}:${CAPIF_REGISTER_PORT}/getauth</li> <li>Include basic Auth Header with Admin user/password</li> <li>Retrieve access_token and the urls needed for next requests from response body user_getauth_response_body_example</li> </ul> </li> <li> <p>Register Provider:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations</li> <li>body provider request body</li> <li>Authentication Bearer with access_token</li> <li>Store each cert in a file with according name.</li> </ul> </li> <li> <p>Delete registered provider at Provider Management:</p> <ul> <li>Send DELETE https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations/{API_PROVIDER_NOT_REGISTERED}</li> <li>Use AMF Certificate.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Delete Provider:<ol> <li>404 Not Found response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Not Exist Provider Enrolment Details\".</li> <li>cause with message \"Not found registrations to Send THIS api provider details\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_publish_service/","title":"Test Plan for CAPIF Api Publish Service","text":"<p>At this documentation you will have all information and related files and examples of test plan for this API.</p>"},{"location":"testing/testplan/api_publish_service/#test-case-1-publish-api-by-authorised-api-publisher","title":"Test Case 1: Publish API by Authorised API Publisher","text":"<p>Test ID: capif_api_publish_service-1</p> <p>Description:</p> <p>This test case will check that an API Publisher can Publish an API</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid apfId from CAPIF Authority)</li> </ul> <p>Execution Steps:</p> <ol> <li> <p>Register Provider at CCF and store certificates.</p> </li> <li> <p>Publish Service API</p> </li> <li> <p>Retrieve {apiId} from body and Location header with new resource created from response</p> </li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> </li> <li> <p>Send POST to ccf_publish_url: https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</p> </li> <li>body service api description with apiName service_1</li> <li>Use APF Certificate</li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Publish request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiId</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId}</li> </ol> </li> <li> <p>Published Service API is stored in CAPIF Database</p> </li> </ol>"},{"location":"testing/testplan/api_publish_service/#test-case-2-publish-api-by-non-authorised-api-publisher","title":"Test Case 2: Publish API by NON Authorised API Publisher","text":"<p>Test ID: capif_api_publish_service-2</p> <p>Description:</p> <p>This test case will check that an API Publisher cannot Publish an API withot valid apfId </p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is NOT pre-authorised (has invalid apfId from CAPIF Authority)</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF and store certificates.</li> <li>Publish Service API with invalid APF ID</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API with invalid APF ID at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{APF_ID_NOT_VALID}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Publish request must accomplish:</p> <ol> <li>401 Unauthorized</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"Publisher not existing\".</li> <li>cause with message \"Publisher id not found\".</li> </ul> </li> </ol> </li> <li> <p>Service API is NOT stored in CAPIF Database</p> </li> </ol>"},{"location":"testing/testplan/api_publish_service/#test-case-3-retrieve-all-apis-published-by-authorised-apfid","title":"Test Case 3: Retrieve all APIs Published by Authorised apfId","text":"<p>Test ID: capif_api_publish_service-3</p> <p>Description:</p> <p>This test case will check that an API Publisher can Retrieve all API published</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid apfId from CAPIF Authority)</li> <li>At least 2 service APIs are published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF and store certificates.</li> <li>Publish Service API service_1</li> <li>Retrieve {apiId1} from body and Location header with new resource created from response</li> <li>Publish Service API service_2</li> <li>Retrieve {apiId2} from body and Location header with new resource created from response</li> <li>Retrieve All published APIs and check if both are present.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Get apiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Publish Other Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_2</li> <li>Get apiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Retrieve all published APIs:</p> <ul> <li>Send GET to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>Use APF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to service 1 Publish request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiId</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId1}</li> </ol> </li> <li> <p>Response to service 2 Publish request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiId</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId2}</li> </ol> </li> <li> <p>Published Service APIs are stored in CAPIF Database</p> </li> <li> <p>Response to Retrieve all published APIs:</p> <ol> <li>200 OK</li> <li>Response body must return an array of ServiceAPIDescription data.</li> <li>Array must contain all previously published APIs.</li> </ol> </li> </ol>"},{"location":"testing/testplan/api_publish_service/#test-case-4-retrieve-all-apis-published-by-non-authorised-apfid","title":"Test Case 4: Retrieve all APIs Published by NON Authorised apfId","text":"<p>Test ID: capif_api_publish_service-4</p> <p>Description:</p> <p>This test case will check that an API Publisher cannot Retrieve API published when apfId is not authorised </p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is NOT pre-authorised (has invalid apfId from CAPIF Authority)</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF and store certificates.</li> <li>Retrieve All published APIs</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Retrieve all published APIs:</p> <ul> <li>Send GET to https://{CAPIF_HOSTNAME}/published-apis/v1/{APF_ID_NOT_VALID}/service-apis</li> <li>Use APF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Publish request must accomplish:</p> <ol> <li>401 Non Authorized</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"Provider not existing\".</li> <li>cause with message \"Provider id not found\".</li> </ul> </li> </ol> </li> <li> <p>Service API is NOT stored in CAPIF Database</p> </li> </ol>"},{"location":"testing/testplan/api_publish_service/#test-case-5-retrieve-single-apis-published-by-authorised-apfid","title":"Test Case 5: Retrieve single APIs Published by Authorised apfId","text":"<p>Test ID: capif_api_publish_service-5</p> <p>Description:</p> <p>This test case will check that an API Publisher can Retrieve API published one by one</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid apfId from CAPIF Authority)</li> <li>At least 2 service APIs are published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF and store certificates.</li> <li>Publish Service API service_1.</li> <li>Retrieve {apiId1} from body and Location header with new resource created from response.</li> <li>Publish Service API service_2.</li> <li>Retrieve {apiId2} from body and Location header with new resource created from response.</li> <li>Retrieve service_1 API Detail.</li> <li>Retrieve service_2 API Detail.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Get apiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Publish Other Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_2</li> <li>Get apiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Retrieve service_1 published APIs detail:</p> <ul> <li>Send GET to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{apiId1}</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Retrieve service_2 published APIs detail:</p> <ul> <li>Send GET to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{apiId2}</li> <li>Use APF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to service 1 Publish request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiId</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId1}</li> </ol> </li> <li> <p>Response to service 2 Publish request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiId</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId2}</li> </ol> </li> <li> <p>Published Service APIs are stored in CAPIF Database</p> </li> <li> <p>Response to Retrieve service_1 published API using apiId1:</p> <ol> <li>200 OK</li> <li>Response body must return a ServiceAPIDescription data.</li> <li>Array must contain same information than service_1 published registration response.</li> </ol> </li> <li> <p>Response to Retrieve service_2 published API using apiId2:</p> <ol> <li>200 OK</li> <li>Response body must return a ServiceAPIDescription data.</li> <li>Array must contain same information than service_2 published registration response.</li> </ol> </li> </ol>"},{"location":"testing/testplan/api_publish_service/#test-case-6-retrieve-single-apis-non-published-by-authorised-apfid","title":"Test Case 6: Retrieve single APIs non Published by Authorised apfId","text":"<p>Test ID: capif_api_publish_service-6</p> <p>Description:</p> <p>This test case will check that an API Publisher try to get detail of not published api.</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid apfId from CAPIF Authority)</li> <li>No published api</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF and store certificates.</li> <li>Retrieve not published API Detail.</li> </ol> <p>Information of Test:</p> <ol> <li>Perform Provider Registration</li> <li>Retrieve not published APIs detail:<ul> <li>Send GET to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{SERVICE_API_ID_NOT_VALID}</li> <li>Use APF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Retrieve for NOT published API must accomplish:<ol> <li>404 Not Found</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Service API not found\".</li> <li>cause with message \"No Service with specific credentials exists\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_publish_service/#test-case-7-retrieve-single-apis-published-by-non-authorised-apfid","title":"Test Case 7: Retrieve single APIs Published by NON Authorised apfId","text":"<p>Test ID: capif_api_publish_service-7</p> <p>Description:</p> <p>This test case will check that an API Publisher cannot Retrieve detailed API published when apfId is not authorised </p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is NOT pre-authorised (has invalid apfId from CAPIF Authority)</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF and store certificates.</li> <li>Publish Service API at CCF</li> <li>Retrieve {apiId} from body and Location header with new resource created from response.</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Invoker Certificate</li> <li>Retrieve detailed published API acting as Invoker</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Get apiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Retrieve detailed published APIs:</p> <ul> <li>Send GET to https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/${apiId}</li> <li>Use Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Retrieve Detailed published API acting as Invoker must accomplish:</p> <ol> <li>401 Unauthorized</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"User not authorized\".</li> <li>cause with message \"Certificate not authorized\".</li> </ul> </li> </ol> </li> <li> <p>Service API is NOT stored in CAPIF Database</p> </li> </ol>"},{"location":"testing/testplan/api_publish_service/#test-case-8-update-api-published-by-authorised-apfid-with-valid-serviceapiid","title":"Test Case 8: Update API Published by Authorised apfId with valid serviceApiId","text":"<p>Test ID: capif_api_publish_service-8</p> <p>Description:</p> <p>This test case will check that an API Publisher can Update published API with a valid serviceApiId </p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid apfId from CAPIF Authority)</li> <li>A service APIs is published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF and store certificates.</li> <li>Publish Service API</li> <li>Retrieve {apiId} from body and Location header with new resource url created from response</li> <li>Update published Service API.</li> <li>Retrieve detail of Service API</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Get apiId</li> <li>get resource url from location Header.</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Update published API at CCF:</p> <ul> <li>Send PUT to resource URL https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{serivceApiId}</li> <li>body service api description with overrided apiName to service_1_modified</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Retrieve detail of service API:</p> <ul> <li>Send GET to resource URL https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{serivceApiId}</li> <li>check apiName is service_1_modified</li> <li>Use APF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Publish request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiId</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId}</li> </ol> </li> <li> <p>Response to Update Published Service API:</p> <ol> <li>200 OK</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiName service_1_modified</li> </ul> </li> </ol> </li> <li> <p>Response to Retrieve detail of Service API:</p> <ol> <li>200 OK</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiName service_1_modified.</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_publish_service/#test-case-9-update-apis-published-by-authorised-apfid-with-invalid-serviceapiid","title":"Test Case 9: Update APIs Published by Authorised apfId with invalid serviceApiId","text":"<p>Test ID: capif_api_publish_service-9</p> <p>Description:</p> <p>This test case will check that an API Publisher cannot Update published API with a invalid serviceApiId</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid apfId from CAPIF Authority)</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF and store certificates.</li> <li>Update published Service API.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Get apiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Update published API at CCF:</p> <ul> <li>Send PUT to resource URL https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{SERVICE_API_ID_NOT_VALID}</li> <li>body service api description with overrided apiName to service_1*_modified*</li> <li>Use APF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Publish request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiId</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId}</li> </ol> </li> <li> <p>Response to Update Published Service API:</p> <ol> <li>404 Not Found</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Service API not found\".</li> <li>cause with message \"Service API id not found\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_publish_service/#test-case-10-update-apis-published-by-non-authorised-apfid","title":"Test Case 10: Update APIs Published by NON Authorised apfId","text":"<p>Test ID: capif_api_publish_service-10</p> <p>Description:</p> <p>This test case will check that an API Publisher cannot Update API published when apfId is not authorised</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is NOT pre-authorised (has invalid apfId from CAPIF Authority)</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF and store certificates.</li> <li>Publish Service API at CCF</li> <li>Retrieve {apiId} from body and Location header with new resource created from response.</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Invoker Certificate</li> <li>Update published API at CCF as Invoker</li> <li>Retrieve detail of Service API as publisher</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Get apiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Update published API at CCF:</p> <ul> <li>Send PUT to resource URL https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{serviceApiId}</li> <li>body service api description with overrided apiName to service_1*_modified*</li> <li>Use Invoker Certificate</li> </ul> </li> <li> <p>Retrieve detail of service API:</p> <ul> <li>Send GET to resource URL https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{serivceApiId}</li> <li>check apiName is service_1</li> <li>Use APF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Update published API acting as Invoker must accomplish:</p> <ol> <li>401 Unauthorized</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"User not authorized\".</li> <li>cause with message \"Certificate not authorized\".</li> </ul> </li> </ol> </li> <li> <p>Response to Retrieve Detail of Service API:</p> <ol> <li>200 OK</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiName service_1.</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_publish_service/#test-case-11-delete-api-published-by-authorised-apfid-with-valid-serviceapiid","title":"Test Case 11: Delete API Published by Authorised apfId with valid serviceApiId","text":"<p>Test ID: capif_api_publish_service-11</p> <p>Description:</p> <p>This test case will check that an API Publisher can Delete published API with a valid serviceApiId</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid apfId from CAPIF Authority).</li> <li>A service APIs is published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF and store certificates.</li> <li>Publish Service API</li> <li>Retrieve {apiId} from body and Location header with new resource created from response</li> <li>Remove published API at CCF</li> <li>Try to retreive deleted service API from CCF</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Get apiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Remove published Service API at CCF:</p> <ul> <li>Send DELETE to resource URL https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{serviceApiId}</li> <li>Use APF Certificate</li> </ul> </li> <li>Retrieve detail of service API:<ul> <li>Send GET to resource URL https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{serivceApiId}</li> <li>Use APF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Publish request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiId</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId}</li> </ol> </li> <li> <p>Published Service API is stored in CAPIF Database</p> </li> <li> <p>Response to Remove published Service API at CCF:</p> <ol> <li>204 No Content</li> </ol> </li> <li> <p>Response to Retrieve for DELETED published API must accomplish:</p> <ol> <li>404 Not Found</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Service API not found\".</li> <li>cause with message \"No Service with specific credentials exists\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_publish_service/#test-case-12-delete-apis-published-by-authorised-apfid-with-invalid-serviceapiid","title":"Test Case 12: Delete APIs Published by Authorised apfId with invalid serviceApiId","text":"<p>Test ID: capif_api_publish_service-12</p> <p>Description:</p> <p>This test case will check that an API Publisher cannot Delete with invalid serviceApiId</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid apfId from CAPIF Authority).</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF and store certificates.</li> <li>Remove published API at CCF with invalid serviceId</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Remove published Service API at CCF with invalid serviceId:</p> <ul> <li>Send DELETE to resource URL https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{SERVICE_API_ID_NOT_VALID}</li> <li>Use APF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Remove published Service API at CCF:<ol> <li>404 Not Found</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Service API not found\".</li> <li>cause with message \"Service API id not found\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_publish_service/#test-case-13-delete-apis-published-by-non-authorised-apfid","title":"Test Case 13: Delete APIs Published by NON Authorised apfId","text":"<p>Test ID: capif_api_publish_service-12</p> <p>Description:</p> <p>This test case will check that an API Publisher cannot Delete API published when apfId is not authorised</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid apfId from CAPIF Authority).</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF and store certificates.</li> <li>Register Invoker and onboard Invoker at CCF</li> <li>Remove published API at CCF with invalid serviceId as Invoker</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Get apiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Remove published Service API at CCF with invalid serviceId as Invoker:</p> <ul> <li>Send DELETE to resource URL https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{SERVICE_API_ID_NOT_VALID}</li> <li>Use Invoker Certificate.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Remove published Service API at CCF:<ol> <li>401 Unauthorized</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"User not authorized\".</li> <li>cause with message \"Certificate not authorized\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/","title":"Test Plan for CAPIF Api Security Service","text":"<p>At this documentation you will have all information and related files and examples of test plan for this API.</p>"},{"location":"testing/testplan/api_security_service/#test-case-1-create-a-security-context-for-an-api-invoker","title":"Test Case 1: Create a security context for an API invoker","text":"<p>Test ID: capif_security_api-1</p> <p>Description:</p> <p>This test case will check that an API Invoker can create a Security context</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised (has valid apiInvokerID from CAPIF Authority)</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> </ol> <p>Information of Test:</p> <ol> <li>Perform Invoker Onboarding</li> <li>Create Security Context for this Invoker<ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Create security context:<ol> <li>201 Created response.</li> <li>body returned must accomplish ServiceSecurity data structure.</li> <li>Location Header must contain the new resource URL {apiRoot}/capif-security/v1/trustedInvokers/{apiInvokerId}</li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-2-create-a-security-context-for-an-api-invoker-with-provider-role","title":"Test Case 2: Create a security context for an API invoker with Provider role","text":"<p>Test ID:: capif_security_api-2</p> <p>Description:</p> <p>This test case will check that an Provider cannot create a Security context with valid apiInvokerId.</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised (has valid apiInvokerID), but user that create Security Context with Provider role</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Invoker at CCF</li> <li>Register Provider at CCF</li> <li>Create Security Context using Provider certificate</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Create Security Context for this Invoker but using Provider certificate.</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using AEF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Create security context using Provider certificate:</p> <ol> <li>401 Unauthorized response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"Role not authorized for this API route\".</li> <li>cause with message \"User role must be invoker\".</li> </ul> </li> </ol> </li> <li> <p>No context stored at DB</p> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-3-create-a-security-context-for-an-api-invoker-with-provider-entity-role-and-invalid-apiinvokerid","title":"Test Case 3: Create a security context for an API invoker with Provider entity role and invalid apiInvokerId","text":"<p>Test ID:: capif_security_api-3</p> <p>Description:</p> <p>This test case will check that an Provider cannot create a Security context with invalid apiInvokerID.</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised (has valid apiInvokerID), but user that create Security Context with Provider role</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF</li> <li>Create Security Context using Provider certificate</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Create Security Context for this not valid apiInvokerId and using Provider certificate.</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{API_INVOKER_NOT_VALID}</li> <li>body service security body</li> <li>Using AEF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Create security context using Provider certificate:<ol> <li>401 Unauthorized response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"Role not authorized for this API route\".</li> <li>cause with message \"User role must be invoker\".</li> </ul> </li> </ol> </li> <li>No context stored at DB</li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-4-create-a-security-context-for-an-api-invoker-with-invoker-entity-role-and-invalid-apiinvokerid","title":"Test Case 4: Create a security context for an API invoker with Invoker entity role and invalid apiInvokerId","text":"<p>Test ID:: capif_security_api-4</p> <p>Description:</p> <p>This test case will check that an Invoker cannot create a Security context with valid apiInvokerId.</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised (has valid apiInvokerID), but user that create Security Context with invalid apiInvokerId</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Invoker at CCF</li> <li>Create Security Context using Provider certificate</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Invoker Onboarding</p> </li> <li> <p>Create Security Context for this Invoker:</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{API_INVOKER_NOT_VALID}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Create security context using Provider certificate:</p> <ol> <li>404 Not Found response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Invoker not found\".</li> <li>cause with message \"API Invoker not exists or invalid ID\".</li> </ul> </li> </ol> </li> <li> <p>No context stored at DB</p> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-5-retrieve-the-security-context-of-an-api-invoker","title":"Test Case 5: Retrieve the Security Context of an API Invoker","text":"<p>Test ID:: capif_security_api-5</p> <p>Description:</p> <p>This test case will check that an provider can retrieve the Security context of an API Invoker</p> <p>Pre-Conditions:</p> <ul> <li>Provider is pre-authorised (has valid apfId from CAPIF Authority) and API Invoker has created a valid Security Context</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Invoker at CCF</li> <li>Register Provider at CCF</li> <li>Create Security Context using Provider certificate</li> <li>Retrieve Security Context by Provider</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Create Security Context for this Invoker.</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate</li> </ul> </li> <li> <p>Retrieve Security Context of Invoker by Provider:</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>Using AEF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Retrieve security context:<ol> <li>200 OK response.</li> <li>body returned must accomplish ServiceSecurity data structure.</li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-6-retrieve-the-security-context-of-an-api-invoker-with-invalid-apiinvokerid","title":"Test Case 6: Retrieve the Security Context of an API Invoker with invalid apiInvokerID","text":"<p>Test ID:: capif_security_api-6</p> <p>Description:</p> <p>This test case will check that an provider can retrieve the Security context of an API Invoker</p> <p>Pre-Conditions:</p> <ul> <li>Provider is pre-authorised (has valid apfId from CAPIF Authority) and API Invoker has created a valid Security Context</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF</li> <li>Create Security Context using Provider certificate</li> <li>Retrieve Security Context by Provider of invalid invoker</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Retrieve Security Context of invalid Invoker by Provider:</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/trustedInvokers/{API_INVOKER_NOT_VALID}</li> <li>Using AEF Certificate.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Retrieve security context:<ol> <li>404 Not Found response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Invoker not found\".</li> <li>cause with message \"API Invoker not exists or invalid ID\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-7-retrieve-the-security-context-of-an-api-invoker-with-invalid-apfid","title":"Test Case 7: Retrieve the Security Context of an API Invoker with invalid apfId","text":"<p>Test ID:: capif_security_api-7</p> <p>Description:</p> <p>This test case will check that an Provider cannot retrieve the Security context of an API Invoker without valid apfId</p> <p>Pre-Conditions:</p> <ul> <li>API Exposure Function is not pre-authorised (has invalid apfId)</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Retrieve Security Context as Provider.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate</li> </ul> </li> <li> <p>Retrieve Security Context as Invoker role:</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>Using Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Create security context:<ol> <li>401 Unauthorized response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"Role not authorized for this API route\".</li> <li>cause with message \"User role must be aef\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-8-delete-the-security-context-of-an-api-invoker","title":"Test Case 8: Delete the Security Context of an API Invoker","text":"<p>Test ID:: capif_security_api-8</p> <p>Description:</p> <p>This test case will check that an Provider can delete a Security context</p> <p>Pre-Conditions:</p> <ul> <li>Provider is pre-authorised (has valid apfId from CAPIF Authority) and API Invoker has created a valid Security Context</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Invoker at CCF</li> <li>Register Provider at CCF</li> <li>Create Security Context using Provider certificate</li> <li>Delete Security Context by Provider</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Create Security Context for this Invoker but using Provider certificate.</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using AEF Certificate</li> </ul> </li> <li> <p>Delete Security Context of Invoker by Provider:</p> <ul> <li>Send DELETE https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>Use AEF Certificate</li> </ul> </li> <li> <p>Retrieve Security Context of Invoker by Provider:</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>Using AEF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Delete security context:</p> <ol> <li>204 No Content response.</li> </ol> </li> <li> <p>Retrieve security context:</p> <ol> <li>404 Not Found response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Security context not found\".</li> <li>cause with message \"API Invoker not exists or invalid ID\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-9-delete-the-security-context-of-an-api-invoker-with-invoker-entity-role","title":"Test Case 9: Delete the Security Context of an API Invoker with Invoker entity role","text":"<p>Test ID:: capif_security_api-9</p> <p>Description:</p> <p>This test case will check that an Invoker cannot delete a Security context</p> <p>Pre-Conditions:</p> <ul> <li>Provider is pre-authorised (has valid apfId from CAPIF Authority) and API Invoker has created a valid Security Context</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF</li> <li>Create Security Context using Provider certificate</li> <li>Delete Security Context by Invoker</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Create Security Context for this Invoker:</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate</li> </ul> </li> <li> <p>Delete Security Context of Invoker:</p> <ul> <li>Send DELETE https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>Use Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Delete security context:<ol> <li>401 Unauthorized response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"Role not authorized for this API route\".</li> <li>cause with message \"User role must be aef\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-10-delete-the-security-context-of-an-api-invoker-with-invoker-entity-role-and-invalid-apiinvokerid","title":"Test Case 10: Delete the Security Context of an API Invoker with Invoker entity role and invalid apiInvokerID","text":"<p>Test ID:: capif_security_api-10</p> <p>Description:</p> <p>This test case will check that an Invoker cannot delete a Security context with invalid </p> <p>Pre-Conditions:</p> <ul> <li>Invoker is pre-authorised.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF</li> <li>Delete Security Context by invoker</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Invoker Onboarding</p> </li> <li> <p>Delete Security Context of Invoker:</p> <ul> <li>Send DELETE https://{CAPIF_HOSTNAME}/trustedInvokers/{API_INVOKER_NOT_VALID}</li> <li>Use Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Delete security context:<ol> <li>401 Unauthorized response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"Role not authorized for this API route\".</li> <li>cause with message \"User role must be aef\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-11-delete-the-security-context-of-an-api-invoker-with-invalid-apiinvokerid","title":"Test Case 11: Delete the Security Context of an API Invoker with invalid apiInvokerID","text":"<p>Test ID:: capif_security_api-11</p> <p>Description:</p> <p>This test case will check that an Provider cannot delete a Security context of invalid apiInvokerId</p> <p>Pre-Conditions:</p> <ul> <li>Provider is pre-authorised (has valid apfId from CAPIF Authority).</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF</li> <li>Delete Security Context by provider</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Delete Security Context of Invoker by Provider:</p> <ul> <li>Send DELETE https://{CAPIF_HOSTNAME}/trustedInvokers/{API_INVOKER_NOT_VALID}</li> <li>Use AEF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Retrieve security context:<ol> <li>404 Not Found response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Invoker not found\".</li> <li>cause with message \"API Invoker not exists or invalid ID\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-12-update-the-security-context-of-an-api-invoker","title":"Test Case 12: Update the Security Context of an API Invoker","text":"<p>Test ID:: capif_security_api-12</p> <p>Description:</p> <p>This test case will check that an API Invoker can update a Security context</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised (has valid apiInvokerID from CAPIF Authority) and Provider is also authorized</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Invoker at CCF</li> <li>Register Provider at CCF</li> <li>Create Security Context By Invoker</li> <li>Update Security Context By Invoker</li> <li>Retrieve Security Context By Provider</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Create Security Context for this Invoker:</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate.</li> </ul> </li> <li> <p>Update Security Context of Invoker:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}/update</li> <li>body service security body but with notification destination modified to http://robot.testing2</li> <li>Using Invoker Certificate.</li> </ul> </li> <li> <p>Retrieve Security Context of Invoker by Provider:</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>Using AEF Certificate.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Update security context:</p> <ol> <li>200 OK response.</li> <li>body returned must accomplish ServiceSecurity data structure.</li> </ol> </li> <li> <p>Retrieve security context:</p> <ol> <li>200 OK response.</li> <li>body returned must accomplish ServiceSecurity data structure.<ol> <li>Check is this returned object match with modified one.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-13-update-the-security-context-of-an-api-invoker-with-provider-entity-role","title":"Test Case 13: Update the Security Context of an API Invoker with Provider entity role","text":"<p>Test ID:: capif_security_api-13</p> <p>Description:</p> <p>This test case will check that an Provider cannot update a Security context</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised (has valid apiInvokerID from CAPIF Authority) and Provider is also authorized.</li> <li>Invoker has created the Security Context previously.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Invoker at CCF</li> <li>Register Provider at CCF</li> <li>Create Security Context</li> <li>Update Security Context as Provider</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Create Security Context for this Invoker:</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate.</li> </ul> </li> <li> <p>Update Security Context of Invoker by Provider:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}/update</li> <li>body service security body but with notification destination modified to http://robot.testing2</li> <li>Using AEF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Update security context:<ol> <li>401 Unauthorized response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"Role not authorized for this API route\".</li> <li>cause with message \"User role must be invoker\". </li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-14-update-the-security-context-of-an-api-invoker-with-aef-entity-role-and-invalid-apiinvokerid","title":"Test Case 14: Update the Security Context of an API Invoker with AEF entity role and invalid apiInvokerId","text":"<p>Test ID:: capif_security_api-14</p> <p>Description:</p> <p>This test case will check that an Provider cannot update a Security context of invalid apiInvokerId</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised (has valid apiInvokerID from CAPIF Authority) and Provider is also authorized.</li> <li>Invoker has created the Security Context previously.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF</li> <li>Update Security Context as Provider</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Update Security Context of Invoker by Provider:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/trustedInvokers/{API_INVOKER_NOT_VALID}/update</li> <li>body service security body</li> <li>Using AEF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Update security context:<ol> <li>401 Unauthorized response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"Role not authorized for this API route\".</li> <li>cause with message \"User role must be invoker\". </li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-15-update-the-security-context-of-an-api-invoker-with-invalid-apiinvokerid","title":"Test Case 15: Update the Security Context of an API Invoker with invalid apiInvokerID","text":"<p>Test ID:: capif_security_api-15</p> <p>Description:</p> <p>This test case will check that an API Invoker cannot update a Security context not valid apiInvokerId</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised (has valid apiInvokerID from CAPIF Authority)</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Invoker at CCF</li> <li>Update Security Context</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Update Security Context of Invoker:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/trustedInvokers/{API_INVOKER_NOT_VALID}/update</li> <li>body service security body</li> <li>Using Invoker Certificate.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Retrieve security context:<ol> <li>404 Not Found response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Invoker not found\".</li> <li>cause with message \"API Invoker not exists or invalid ID\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-16-revoke-the-authorization-of-the-api-invoker-for-apis","title":"Test Case 16: Revoke the authorization of the API invoker for APIs.","text":"<p>Test ID:: capif_security_api-16</p> <p>Description:</p> <p>This test case will check that a Provider can revoke the authorization for APIs</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised (has valid apiInvokerID from CAPIF Authority) and Provider is also authorized</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Invoker at CCF</li> <li>Register Provider at CCF</li> <li>Create Security Context by Invoker</li> <li>Revoke Security Context by Provider</li> <li>Retrieve Security Context by Provider</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Create Security Context By Invoker:</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate</li> </ul> </li> <li> <p>Revoke Authorization by Provider:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}/delete</li> <li>body security notification body</li> <li>Using AEF Certificate.</li> </ul> </li> <li> <p>Retrieve Security Context by Provider:</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>Using AEF Certificate.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Revoke Authorization:</p> <ol> <li>204 No Content response.</li> </ol> </li> <li> <p>Retrieve security context:</p> <ol> <li>404 Not Found response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Security context not found\".</li> <li>cause with message \"API Invoker has no security context\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-17-revoke-the-authorization-of-the-api-invoker-for-apis-without-valid-apfid","title":"Test Case 17: Revoke the authorization of the API invoker for APIs without valid apfID.","text":"<p>Test ID:: capif_security_api-17</p> <p>Description:</p> <p>This test case will check that an Invoker can't revoke the authorization for APIs</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised (has valid apiInvokerID from CAPIF Authority) and Provider is also authorized</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Invoker at CCF</li> <li>Register Provider at CCF</li> <li>Create Security Context</li> <li>Revoke Security Context by invoker</li> <li>Retrieve Security Context</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Create Security Context for this Invoker:</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate.</li> </ul> </li> <li> <p>Revoke Authorization by invoker:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}/delete</li> <li>body security notification body</li> <li>Using Invoker Certificate</li> </ul> </li> <li> <p>Retrieve Security Context of Invoker by Provider:</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>Using Provider Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Revoke Security Context by invoker:</p> <ol> <li>401 Unauthorized response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"Role not authorized for this API route\".</li> <li>cause with message \"User role must be provider\". </li> </ul> </li> </ol> </li> <li> <p>Retrieve security context:</p> <ol> <li>200 OK response.</li> <li>body returned must accomplish ServiceSecurity data structure.<ol> <li>Check is this returned object match with created one.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-18-revoke-the-authorization-of-the-api-invoker-for-apis-with-invalid-apiinvokerid","title":"Test Case 18: Revoke the authorization of the API invoker for APIs with invalid apiInvokerId.","text":"<p>Test ID:: capif_security_api-18</p> <p>Description:</p> <p>This test case will check that an API Exposure Function cannot revoke the authorization for APIs for invalid apiInvokerId</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised (has valid apiInvokerID from CAPIF Authority) and Provider is also authorized</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Invoker at CCF</li> <li>Register Provider at CCF</li> <li>Create Security Context</li> <li>Revoke Security Context by Provider</li> <li>Retrieve Security Context</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Create Security Context for this Invoker:</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate.</li> </ul> </li> <li> <p>Revoke Authorization by Provider:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/trustedInvokers/{API_INVOKER_NOT_VALID}/delete</li> <li>body security notification body</li> <li>Using AEF Certificate.</li> </ul> </li> <li> <p>Retrieve Security Context of Invoker by Provider:</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}?authenticationInfo=true&authorizationInfo=true</li> <li>This request will ask with parameter to retrieve authenticationInfo and authorizationInfo</li> <li>Using AEF Certificate.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Revoke Security Context by invoker:</p> <ol> <li>404 Not Found response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Invoker not found\".</li> <li>cause with message \"API Invoker not exists or invalid ID\".</li> </ul> </li> </ol> </li> <li> <p>Retrieve security context:</p> <ol> <li>200 OK response.</li> <li>body returned must accomplish ServiceSecurity data structure.<ol> <li>Check is this return one object that match with created one.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-19-retrieve-access-token","title":"Test Case 19: Retrieve access token","text":"<p>Test ID:: capif_security_api-19</p> <p>Description:</p> <p>This test case will check that an API Invoker can retrieve a security access token OAuth 2.0.</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised (has valid apiInvokerId)</li> <li>Service API of Provider is published</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API service_1 at CCF</li> <li>Register and onboard Invoker at CCF</li> <li>Discover Service APIs by Invoker.</li> <li>Create Security Context According to Service APIs discovered.</li> <li>Request Access Token</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Request Discover Published APIs not filtered:</p> <ul> <li>Send GET to ccf_discover_url https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}</li> <li>Param api-invoker-id is mandatory</li> <li>Using Invoker Certificate</li> </ul> </li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate.</li> <li>Create Security Information Body with one securityInfo for each aef present at each serviceAPIDescription present at Discover.</li> </ul> </li> <li> <p>Request Access Token by invoker:</p> <ul> <li>Sent POST https://{CAPIF_HOSTNAME}/securities/{securityId}/token:</li> <li>body access token req body and example example</li> <li>securityId is apiInvokerId.</li> <li>grant_type=client_credentials.</li> <li>Create Scope properly for request: 3gpp#{aef_id}:{api_name}</li> <li>Using Invoker Certificate.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Request of Access Token:<ol> <li>200 OK</li> <li>body must follow AccessTokenRsp with:<ol> <li>access_token present</li> <li>token_type=Bearer</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-20-retrieve-access-token-by-provider","title":"Test Case 20: Retrieve access token by Provider","text":"<p>Test ID:: capif_security_api-20</p> <p>Description:</p> <p>This test case will check that an API Exposure Function cannot revoke the authorization for APIs for invalid apiInvokerId</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised (has valid apiInvokerID from CAPIF Authority) and Provider is also authorized</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API service_1 at CCF</li> <li>Register and onboard Invoker at CCF</li> <li>Discover Service APIs by Invoker.</li> <li>Create Security Context According to Service APIs discovered.</li> <li>Request Access Token by Provider</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Request Discover Published APIs not filtered:</p> <ul> <li>Send GET to ccf_discover_url https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}</li> <li>Param api-invoker-id is mandatory</li> <li>Using Invoker Certificate</li> </ul> </li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate.</li> <li>Create Security Information Body with one securityInfo for each aef present at each serviceAPIDescription present at Discover.</li> </ul> </li> <li> <p>Request Access Token by provider:</p> <ul> <li>Sent POST https://{CAPIF_HOSTNAME}/securities/{securityId}/token:</li> <li>body access token req body</li> <li>securityId is apiInvokerId</li> <li>grant_type=client_credentials</li> <li>Using AEF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Request of Access Token:<ol> <li>401 Unauthorized response.</li> <li>body returned must accomplish AccessTokenErr data structure, with:<ul> <li>error unauthorized_client</li> <li>error_description=Role not authorized for this API route</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-21-retrieve-access-token-by-provider-with-invalid-apiinvokerid","title":"Test Case 21: Retrieve access token by Provider with invalid apiInvokerId","text":"<p>Test ID:: capif_security_api-21</p> <p>Description:</p> <p>This test case will check that an API Exposure Function cannot retrieve a security access token without valid apiInvokerId</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised and Provider is also authorized</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API service_1 at CCF</li> <li>Register and onboard Invoker at CCF</li> <li>Discover Service APIs by Invoker.</li> <li>Create Security Context According to Service APIs discovered.</li> <li>Request Access Token by Provider</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Request Discover Published APIs not filtered:</p> <ul> <li>Send GET to ccf_discover_url https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}</li> <li>Param api-invoker-id is mandatory</li> <li>Using Invoker Certificate</li> </ul> </li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate.</li> <li>Create Security Information Body with one securityInfo for each aef present at each serviceAPIDescription present at Discover.</li> </ul> </li> <li> <p>Request Access Token by provider:</p> <ul> <li>Sent POST https://{CAPIF_HOSTNAME}/securities/{API_INVOKER_NOT_VALID}/token.</li> <li>body access token req body</li> <li>securityId is apiInvokerId</li> <li>grant_type=client_credentials</li> <li>Using AEF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Request of Access Token:<ol> <li>401 Unauthorized response.</li> <li>body returned must accomplish AccessTokenErr data structure, with:<ul> <li>error unauthorized_client</li> <li>error_description=Role not authorized for this API route</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-22-retrieve-access-token-with-invalid-apiinvokerid","title":"Test Case 22: Retrieve access token with invalid apiInvokerId","text":"<p>Test ID:: capif_security_api-22</p> <p>Description:</p> <p>This test case will check that an API Invoker can't retrieve a security access token without valid apiInvokerId</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised (has valid apiInvokerId)</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API service_1 at CCF</li> <li>Register and onboard Invoker at CCF</li> <li>Discover Service APIs by Invoker.</li> <li>Create Security Context According to Service APIs discovered.</li> <li>Request Access Token by Invoker</li> </ol> <p>Information of Test:</p> <ol> <li>Perform Provider Registration and Invoker Onboarding</li> <li>Publish Service API at CCF:<ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li>Request Discover Published APIs not filtered:<ul> <li>Send GET to ccf_discover_url https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}</li> <li>Param api-invoker-id is mandatory</li> <li>Using Invoker Certificate</li> </ul> </li> <li>Create Security Context for this Invoker<ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate.</li> <li>Create Security Information Body with one securityInfo for each aef present at each serviceAPIDescription present at Discover.</li> </ul> </li> <li>Request Access Token by invoker:<ul> <li>Sent POST https://{CAPIF_HOSTNAME}/securities/{API_INVOKER_NOT_VALID}/token.</li> <li>body access token req body</li> <li>securityId is apiInvokerId</li> <li>grant_type=client_credentials</li> <li>Using Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Request of Access Token:<ol> <li>404 Not Found response.</li> <li>body returned must accomplish ProblemDetails29571 data structure, with:<ul> <li>status 404</li> <li>title Not Found</li> <li>detail Security context not found</li> <li>cause API Invoker has no security context</li> </ul> </li> </ol> </li> </ol> <p>NOTE: ProblemDetails29571 is the definition present for this request at swagger of ProblemDetails, and this is different from definition of ProblemDetails across other CAPIF Services</p>"},{"location":"testing/testplan/api_security_service/#test-case-23-retrieve-access-token-with-invalid-client_id","title":"Test Case 23: Retrieve access token with invalid client_id","text":"<p>Test ID:: capif_security_api-23</p> <p>Description:</p> <p>This test case will check that an API Exposure Function cannot retrieve a security access token without valid client_id at body</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised and Provider is also authorized</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API service_1 at CCF</li> <li>Register and onboard Invoker at CCF</li> <li>Discover Service APIs by Invoker.</li> <li>Create Security Context According to Service APIs discovered.</li> <li>Request Access Token by Invoker</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Request Discover Published APIs not filtered:</p> <ul> <li>Send GET to ccf_discover_url https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}</li> <li>Param api-invoker-id is mandatory</li> <li>Using Invoker Certificate</li> </ul> </li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate.</li> <li>Create Security Information Body with one securityInfo for each aef present at each serviceAPIDescription present at Discover.</li> </ul> </li> <li> <p>Request Access Token by invoker:</p> <ul> <li>Sent POST https://{CAPIF_HOSTNAME}/securities/{securityId}/token.</li> <li>body access token req body</li> <li>securityId is apiInvokerId</li> <li>grant_type=client_credentials</li> <li>client_id is not-valid </li> <li>Using Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Request of Access Token:<ol> <li>400 Bad Request response.</li> <li>body returned must accomplish AccessTokenErr data structure, with:<ul> <li>error invalid_client</li> <li>error_description=Client Id not found</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-24-retrieve-access-token-with-unsupported-grant_type","title":"Test Case 24: Retrieve access token with unsupported grant_type","text":"<p>Test ID:: capif_security_api-24</p> <p>Description:</p> <p>This test case will check that an API Exposure Function cannot retrieve a security access token with unsupported grant_type</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised and Provider is also authorized</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API service_1 at CCF</li> <li>Register and onboard Invoker at CCF</li> <li>Discover Service APIs by Invoker.</li> <li>Create Security Context According to Service APIs discovered.</li> <li>Request Access Token by Invoker</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Request Discover Published APIs not filtered:</p> <ul> <li>Send GET to ccf_discover_url https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}</li> <li>Param api-invoker-id is mandatory</li> <li>Using Invoker Certificate</li> </ul> </li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate.</li> <li>Create Security Information Body with one securityInfo for each aef present at each serviceAPIDescription present at Discover.</li> </ul> </li> <li> <p>Request Access Token by invoker:</p> <ul> <li>Sent POST https://{CAPIF_HOSTNAME}/securities/{securityId}/token.</li> <li>body access token req body</li> <li>securityId is apiInvokerId</li> <li>grant_type=not_valid</li> <li>Using Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Request of Access Token:<ol> <li>400 Bad Request response.</li> <li>body returned must accomplish AccessTokenErr data structure, with:<ul> <li>error unsupported_grant_type</li> <li>error_description=Invalid value for <code>grant_type</code> \\(${grant_type}\\), must be one of \\['client_credentials'\\] - 'grant_type'</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-25-retrieve-access-token-with-invalid-scope","title":"Test Case 25: Retrieve access token with invalid scope","text":"<p>Test ID:: capif_security_api-25</p> <p>Description:</p> <p>This test case will check that an API Exposure Function cannot retrieve a security access token with complete invalid scope</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised and Provider is also authorized</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API service_1 at CCF</li> <li>Register and onboard Invoker at CCF</li> <li>Discover Service APIs by Invoker.</li> <li>Create Security Context According to Service APIs discovered.</li> <li>Request Access Token by Invoker</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Request Discover Published APIs not filtered:</p> <ul> <li>Send GET to ccf_discover_url https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}</li> <li>Param api-invoker-id is mandatory</li> <li>Using Invoker Certificate</li> </ul> </li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate.</li> <li>Create Security Information Body with one securityInfo for each aef present at each serviceAPIDescription present at Discover.</li> </ul> </li> <li> <p>Request Access Token by invoker:</p> <ul> <li>Sent POST https://{CAPIF_HOSTNAME}/securities/{securityId}/token.</li> <li>body access token req body</li> <li>securityId is apiInvokerId</li> <li>grant_type=client_credentials</li> <li>scope=not-valid-scope</li> <li>Using Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Request of Access Token:<ol> <li>400 Bad Request response.</li> <li>body returned must accomplish AccessTokenErr data structure, with:<ul> <li>error invalid_scope</li> <li>error_description=The first characters must be '3gpp'</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-26-retrieve-access-token-with-invalid-aefid-at-scope","title":"Test Case 26: Retrieve access token with invalid aefid at scope","text":"<p>Test ID:: capif_security_api-26</p> <p>Description:</p> <p>This test case will check that an API Exposure Function cannot retrieve a security access token with invalid aefId at scope</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised and Provider is also authorized</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API service_1 at CCF</li> <li>Register and onboard Invoker at CCF</li> <li>Discover Service APIs by Invoker.</li> <li>Create Security Context According to Service APIs discovered.</li> <li>Request Access Token by Invoker</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Request Discover Published APIs not filtered:</p> <ul> <li>Send GET to ccf_discover_url https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}</li> <li>Param api-invoker-id is mandatory</li> <li>Using Invoker Certificate</li> </ul> </li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate.</li> <li>Create Security Information Body with one securityInfo for each aef present at each serviceAPIDescription present at Discover.</li> </ul> </li> <li> <p>Request Access Token by invoker:</p> <ul> <li>Sent POST https://{CAPIF_HOSTNAME}/securities/{securityId}/token.</li> <li>body access token req body</li> <li>securityId is apiInvokerId</li> <li>grant_type=client_credentials</li> <li>scope=3gpp#1234:*service_1*</li> <li>Using Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Request of Access Token:<ol> <li>400 Bad Request response.</li> <li>body returned must accomplish AccessTokenErr data structure, with:<ul> <li>error invalid_scope</li> <li>error_description=One of aef_id not belongs of your security context</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-27-retrieve-access-token-with-invalid-apiname-at-scope","title":"Test Case 27: Retrieve access token with invalid apiName at scope","text":"<p>Test ID:: capif_security_api-27</p> <p>Description:</p> <p>This test case will check that an API Exposure Function cannot retrieve a security access token with invalid apiName at scope</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised and Provider is also authorized</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API service_1 at CCF</li> <li>Register and onboard Invoker at CCF</li> <li>Discover Service APIs by Invoker.</li> <li>Create Security Context According to Service APIs discovered.</li> <li>Request Access Token by Invoker</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Request Discover Published APIs not filtered:</p> <ul> <li>Send GET to ccf_discover_url https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}</li> <li>Param api-invoker-id is mandatory</li> <li>Using Invoker Certificate</li> </ul> </li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate.</li> <li>Create Security Information Body with one securityInfo for each aef present at each serviceAPIDescription present at Discover.</li> </ul> </li> <li> <p>Request Access Token by invoker:</p> <ul> <li>Sent POST https://{CAPIF_HOSTNAME}/securities/{securityId}/token.</li> <li>body access token req body</li> <li>securityId is apiInvokerId</li> <li>grant_type=client_credentials</li> <li>scope=3gpp#{aef_id}:not-valid</li> <li>Using Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Request of Access Token:<ol> <li>400 Bad Request response.</li> <li>body returned must accomplish AccessTokenErr data structure, with:<ul> <li>error invalid_scope</li> <li>error_description=One of the api names does not exist or is not associated with the aef id provided</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/common_operations/","title":"Common Operations","text":""},{"location":"testing/testplan/common_operations/#register-new-user","title":"Register new user","text":"<p>In order to use OpenCAPIF we must add a new user. This new user can onboard/register any Invokers or Providers.</p> <p>That new user must be created by administrator of Register Service and with the credentials shared by administrator, the new user can get the access_token by requesting it to Register service.</p> <p>The steps to register a new user at Register Service are:</p>"},{"location":"testing/testplan/common_operations/#admin-create-user","title":"Admin create User","text":"<p>1) Login as Admin to get access_token:</p> <ul> <li>Send POST to https://${CAPIF_REGISTER}:${CAPIF_REGISTER_PORT}/login<ul> <li>Include basic Auth Header with Admin credentials</li> </ul> </li> <li>Get access_token and refresh_token from response</li> </ul> <p></p> <p>2) Create User:</p> <ul> <li>Send POST to https://${CAPIF_REGISTER}:${CAPIF_REGISTER_PORT}/createUser<ul> <li>Include Admin access_token in Authorization Bearer Header</li> <li>Body user_registration_body</li> </ul> </li> </ul> <p></p>"},{"location":"testing/testplan/common_operations/#user-retrieve-access-token-and-other-information","title":"User Retrieve access token and other information","text":"<p>1) Retrieve access_token by User:</p> <ul> <li>Send GET to https://${CAPIF_REGISTER}:${CAPIF_REGISTER_PORT}/getauth<ul> <li>Include basic Auth Header with User credentials</li> </ul> </li> <li>Retrieve access_token and the urls needed for next requests from response body user_getauth_response_body_example</li> </ul> <p></p>"},{"location":"testing/testplan/common_operations/#onboard-an-invoker","title":"Onboard an Invoker","text":""},{"location":"testing/testplan/common_operations/#steps-to-perform-operation","title":"Steps to perform operation","text":"<p>Preconditions: The administrator must have previously registered the User.</p> <ol> <li>Create public and private key at invoker</li> <li> <p>Retrieve access_token by User:</p> <ul> <li>Send GET to https://${CAPIF_REGISTER}:${CAPIF_REGISTER_PORT}/getauth</li> <li>Include basic Auth Header with Admin user/password</li> <li>Retrieve access_token and the urls needed for next requests from response body user_getauth_response_body_example</li> </ul> </li> <li> <p>Onboard Invoker: </p> <ul> <li>Send POST to https://{CAPIF_HOSTNAME}/api-invoker-management/v1/onboardedInvokers</li> <li>Reference Request Body: invoker onboarding body</li> <li>\"onboardingInformation\"->\"apiInvokerPublicKey\": must contain public key generated by Invoker.</li> <li>Send in Authorization Header the Bearer access_token obtained previously (Authorization:Bearer ${access_token})</li> </ul> </li> </ol>"},{"location":"testing/testplan/common_operations/#checks-to-ensure-onboarding","title":"Checks to ensure onboarding","text":"<ol> <li> <p>Response to Get Auth:</p> <ol> <li>200 OK</li> <li>access_token returned.</li> </ol> </li> <li> <p>Response to Onboard request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> </ol>"},{"location":"testing/testplan/common_operations/#example-flow","title":"Example Flow","text":""},{"location":"testing/testplan/common_operations/#register-a-provider","title":"Register a Provider","text":""},{"location":"testing/testplan/common_operations/#steps-to-perform-operation_1","title":"Steps to Perform operation","text":"<ol> <li>Create public and private key at provider for provider itself and each function (apf, aef and amf)</li> <li> <p>Retrieve access_token by User:</p> <ul> <li>Send GET to https://${CAPIF_REGISTER}:${CAPIF_REGISTER_PORT}/getauth</li> <li>Include basic Auth Header with Admin user/password</li> <li>Retrieve access_token and the urls needed for next requests from response body user_getauth_response_body_example</li> </ul> </li> <li> <p>Register Provider:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations</li> <li>body provider request body</li> <li>Send in Authorization Header the Bearer access_token obtained previously (Authorization:Bearer ${access_token})</li> <li>Store each cert in a file with according name.</li> </ul> </li> </ol>"},{"location":"testing/testplan/common_operations/#checks-to-ensure-provider-registration","title":"Checks to ensure provider registration","text":"<ol> <li> <p>Response to Register:</p> <ol> <li>201 Created</li> </ol> </li> <li> <p>Response to Get Auth:</p> <ol> <li>200 OK</li> <li>access_token returned.</li> </ol> </li> <li> <p>Register Provider at Provider Management:</p> <ol> <li>201 Created response.</li> <li>body returned must accomplish APIProviderEnrolmentDetails data structure.</li> <li>For each apiProvFuncs, we must check:<ol> <li>apiProvFuncId is set</li> <li>apiProvCert under regInfo is set properly</li> </ol> </li> <li>Location Header must contain the new resource URL {apiRoot}/api-provider-management/v1/registrations/{registrationId}</li> </ol> </li> </ol>"},{"location":"testing/testplan/common_operations/#example-flow_1","title":"Example Flow","text":""}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Home","text":"<p>Welcome to the ETSI TeraFlowSDN (TFS) Controller wiki!</p> <p>This wiki provides a walkthrough on how to prepare your environment for executing and contributing to the ETSI SDG TeraFlowSDN. Besides, it describes how to run some example experiments.</p>"},{"location":"#try-teraflowsdn-release-30","title":"Try TeraFlowSDN Release 3.0","text":"<p>The new release launched on April 24th, 2024 incorporates a number of new features, improvements, and bug resolutions. Try it by following the guides below, and feel free to give us your feedback. See the Release Notes.</p>"},{"location":"#requisites","title":"Requisites","text":"<p>The guides and walkthroughs below make some reasonable assumptions to simplify the deployment of the TFS controller, the execution of experiments and tests, and the development of new contributions. In particular, we assume:</p> <ul> <li>A physical server or virtual machine for running the TFS controller with the following minimum specifications (check section Configure your Machine for additional details):</li> <li>4 cores / vCPUs</li> <li>8 GB of RAM (10 GB of RAM if you want to develop)</li> <li>60 GB of disk (100 GB of disk if you want to develop)</li> <li>1 NIC card</li> <li>VSCode with the Remote SSH extension</li> <li>Working machine software:</li> <li>Ubuntu Server 22.04.4 LTS or Ubuntu Server 20.04.6 LTS</li> <li>MicroK8s v1.24.17</li> </ul> <p>Use the Wiki menu in the right side of this page to navigate through the various contents of this wiki.</p>"},{"location":"#guides-and-walkthroughs","title":"Guides and Walkthroughs","text":"<p>The following guides and walkthroughs are provided:</p> <ul> <li>1. Deployment Guide</li> <li>2. Development Guide</li> <li>3. Run Experiments</li> <li>4. Features and Bugs</li> <li>5. Supported SBIs and Network Elements</li> <li>6. Supported NBIs</li> <li>7. Supported Service Handlers</li> <li>8. Troubleshooting</li> </ul>"},{"location":"#tutorials-and-tfs-virtual-machine","title":"Tutorials and TFS Virtual Machine","text":"<p>This section provides access to the links and all the materials prepared for the tutorials and hackfests involving ETSI TeraFlowSDN.</p> <ul> <li>TFS Hackfest #3 (Castelldefels, 16-17 October 2023)</li> <li> <p>The link includes explanatory material on P4 for TeraFlowSDN, the set of guided walkthrough, and the details on the interactive sessions the participants addressed (and recordings), as well as a TFS Virtual Machine (Release 2.1).</p> </li> <li> <p>TFS Hackfest #2 (Madrid, 20-21 June 2023)</p> </li> <li> <p>The link includes explanatory material on gNMI and ContainerLab for TeraFlowSDN, the set of challenges the participants addressed (and recordings), as well as a TFS Virtual Machine (Pre-Release 2.1).</p> </li> <li> <p>OFC SC472 (San Diego, 6 March 2023)</p> </li> <li> <p>The link includes a tutorial-style slide deck, as well as a TFS Virtual Machine (Release 2).</p> </li> <li> <p>TFS Hackfest #1 (Amsterdam, 20 October 2022)</p> </li> <li>The link includes a tutorial-style slide deck (and recordings), as well as a TFS Virtual Machine (Pre-Release 2).</li> </ul>"},{"location":"#versions","title":"Versions","text":"<p>New versions of TeraFlowSDN are periodically released. Each release is properly tagged and a branch is kept for its future bug fixing, if needed.</p> <ul> <li>The branch master, points always to the latest stable version of the TeraFlowSDN controller.</li> <li>The branches release/X.Y.Z, point to the code for the different release versions indicated in branch name.</li> <li>Code in these branches can be considered stable, and no new features are planned.</li> <li>In case of bugs, point releases increasing revision number (Z) might be created.</li> <li>The main development branch is named as develop.</li> <li>Use with care! Might not be stable.</li> <li>The latest developments and contributions are added to this branch for testing and validation before reaching a release. </li> </ul> <p>To choose the appropriate branch, follow the steps described in 1.3. Deploy TeraFlowSDN > Checkout the Appropriate Git Branch</p>"},{"location":"#events","title":"Events","text":"<p>Find here after the list of past and future TFS Events:</p> <ul> <li>ETSI TeraFlowSDN Events </li> </ul>"},{"location":"#contact","title":"Contact","text":"<p>If your environment does not fit with the proposed assumptions and you experience issues preparing it to work with the ETSI TeraFlowSDN controller, contact the ETSI TeraFlowSDN SDG team through Slack</p>"},{"location":"FAQ/","title":"Frequently Asked Questions (FAQ)","text":""},{"location":"FAQ/#does-the-user-have-to-develop-the-3-elements-of-the-provider-aef-amf-and-apf","title":"Does the user have to develop the 3 elements of the provider (AEF, AMF and APF)?","text":"<p>No, you only have to make the request to the \"/onboarding\" endpoint. In it you must specify a CSR for the AEF, APF and AMF and you will receive the certificates for each of them in the response.</p>"},{"location":"FAQ/#there-is-one-party-that-publishes-the-api-and-another-that-exposes-it-what-is-the-difference","title":"There is one party that publishes the API and another that exposes it, what is the difference?","text":"<p>There are different services, the APF, intended for publishing the APIs, and the AEF, intended so that the invoker can call it. The APF is what connects to the Capif Core Function to publish the service and when the service is up, you need the AEF service so that invokers can connect to it.</p>"},{"location":"FAQ/#before-publishing-an-api-do-you-have-to-be-registered-in-capif","title":"Before publishing an API, do you have to be registered in CAPIF?","text":"<p>Yes, before publishing an API you must register using the POST /register endpoint.</p>"},{"location":"FAQ/#where-is-the-registration-done","title":"Where is the registration done?","text":"<p>Registration is done in a REST API outside of the CAPIF specification taht we have implemented.</p>"},{"location":"FAQ/#is-the-username-and-password-chosen-by-the-user-when-registering-or-is-it-assigned-when-requesting-registration-to-capif-public-instance","title":"Is the username and password chosen by the user when registering or is it assigned when requesting registration to CAPIF public instance?","text":"<p>When you make the request to the \"/endpoint\" of register, you will be returned a username and a password determined by CAPIF.</p>"},{"location":"FAQ/#what-is-a-csr","title":"What is a CSR?","text":"<p>A CSR is a Certificate Signing Request. It is a generated data block where the certificate is planned to be installed and contains key information such as public key, organization, and location, and is used to request a certificate from a certificate authority (CA). In CAPIF, 3 CSRs are necessary to register a provider, for AEF, APF and AMF.</p>"},{"location":"FAQ/#when-doing-the-register_provider-where-can-i-find-the-csrs-that-are-generated","title":"When doing the register_provider where can I find the CSRs that are generated?","text":"<p>When using the \"register_provider\" command, if you add the \"debug\" option, it shows you a json with the data used to register the provider. There we can find in the body a list of 3 elements corresponding to AEF, APF and AMF. IN each of them, the apiProbPubKey field corresponds to the CSR.</p>"},{"location":"FAQ/#how-to-use-the-example-client-capif_invoker_gui","title":"How to use the example client (CAPIF_INVOKER_GUI)?","text":"<p>First you have to make a \"./run.sh host:port\" indicating the address of the public CAPIF. Once the Docker containers are up, you have to do a \"./terminal_to_py_netapp.sh\" and then a \"python main.py\". At this point we will find ourselves in a console with some predefined commands to use the Client. If we press tab twice it will bring up the list of available commands.</p>"},{"location":"FAQ/#where-is-the-capif-public-instance-located","title":"Where is the CAPIF public instance located?","text":"<p>The CAPIF public instance can be found at the following URLs: - capif.mobilesandbox.cloud:37211 (HTTPS) - capif.mobilesandbox.cloud:37212 (HTTP)</p>"},{"location":"FAQ/#do-you-have-to-publish-3-apis-one-for-each-instance","title":"Do you have to publish 3 APIs? one for each instance?","text":"<p>No, you only have to publish a single API but each component is responsible for a specific service, whether publishing or exposing.</p>"},{"location":"FAQ/#once-the-api-is-published-is-it-always-active-or-do-you-have-to-republish-it-every-time-you-want-to-use-it","title":"Once the API is published, is it always active? Or do you have to republish it every time you want to use it?","text":"<p>It is better to unsubscribe the API every time you exit the application since otherwise it could be republished and it would be double.</p>"},{"location":"FAQ/#would-the-same-username-and-password-be-valid-for-different-invokers","title":"Would the same username and password be valid for different invokers?","text":"<p>Yes, a user can have multiple invokers at the same time, and as such, the username and password would be the same.</p>"},{"location":"FAQ/#what-is-the-notfication-destination-field-in-the-register_invoker-request","title":"What is the notfication destination field in the register_invoker request?","text":"<p>This is the callback URL used to notify events. CAPIF has an Event service to subscribe to that notifies actions such as a subscription to an API, a change in the state of an API...</p>"},{"location":"FAQ/#is-the-notification_destination-a-required-field-in-the-register_invoker","title":"Is the notification_destination a required field in the register_invoker","text":"<p>No, it is not mandatory, but if you do not enter it you will not receive any CAPIF events. For example, the APF may delete the API, you will not be notified that the API is no longer available.</p>"},{"location":"FAQ/#what-is-the-purpose-of-the-discover_service-function-in-the-invoker-client","title":"What is the purpose of the \"discover_service\" function in the invoker client?","text":"<p>The discover_service returns a json with all the services that exist exposed in CAPIF at that moment.</p>"},{"location":"FAQ/#what-is-the-purpose-of-the-get_security_auth-function-in-the-invoker-client","title":"What is the purpose of the \"get_security_auth\" function in the invoker client?","text":"<p>Sirve para pedir el token o para refrescarlo en caso de que haya caducado. You have to use that token to call the API from the invoker.</p>"},{"location":"FAQ/#what-is-the-purpose-of-the-register_security_context-function-in-the-invoker-client","title":"What is the purpose of the \"register_security_context\" function in the invoker client?","text":"<p>To consume the API it is necessary to have a Security Context registered with the data and the authentication method.</p>"},{"location":"FAQ/#is-a-user-the-same-as-an-exposer","title":"Is a user the same as an exposer?","text":"<p>No, a user registers in CAPIF and once done can have the role of invoker, provider or both.</p>"},{"location":"FAQ/#where-can-i-put-my-endpoint","title":"Where can I put my endpoint?","text":"<p>You have to set your endpoint when doing the \"publish_service\" functionality: <code>publish_service capif_ops/config_files/service_api_description_hello.json</code></p> <p>In the file \"service_api_description_hello.json\" you configure the service that is going to be exposed and by developing one to suit you, you expose your API.</p>"},{"location":"architecture/","title":"Architecture","text":""},{"location":"architecture/#architecture","title":"Architecture","text":"<p>The CAPIF architecture has three main components, Register Service, Vault and CCF, which are represented in the following image:</p> <p></p> <p>Each component is separated into different namespaces and all communications between them use Rest APIs.</p> <p>Apart from the communication between components, there are 2 other entities that can use them:</p> <ul> <li>Admin/superadmin: Responsible for managing users with the Register or carrying out special operations in the CCF.</li> <li>Users: They are those who want to use CAPIF, registering as a user in the Register and as Invoker or Provider in the CCF.</li> </ul>"},{"location":"architecture/#register-ns","title":"Register NS","text":"<p>This namespace belongs to the Register service, and we find 2 components:</p> <ul> <li>Register Service: It is responsible for managing all users who use CAPIF, in addition to providing the necessary information for its use.</li> <li>Register MONGO DATABASE: It is the Register database, in it we store all the information about registered users.</li> </ul>"},{"location":"architecture/#vault-ns","title":"Vault NS","text":"<p>This namespace belongs to Vault. </p> <p>This component is responsible for managing all CAPIF certificates, so other components such as the Register or the CCF communicate with it to create new certificates or request keys.</p>"},{"location":"architecture/#mon-ns","title":"Mon NS","text":"<p>This is the main namespace of CAPIF, since it contains all the CCF services in addition to other components:</p> <ul> <li>NGINX: Responsible for acting as a reverse proxy to distribute CAPIF requests to the different services, controlling whether or not they are authorized to access them.</li> <li>REDIS: Used for internal communication of services.</li> <li>CAPIF MONGO DATABASE: CAPIF database, where all information related to CAPIF services such as invokers, registered providers or published services is stored.</li> <li>HELPER: Service that simplifies integration with third parties such as external management portals.</li> </ul>"},{"location":"architecture/#new-architecture","title":"New Architecture","text":"<p>You can check the details of all these changes in the conversation on the OCF wiki.</p>"},{"location":"releasenotes/","title":"Releasenotes","text":""},{"location":"releasenotes/#release-100","title":"Release 1.0.0","text":""},{"location":"releasenotes/#new-features","title":"New Features","text":""},{"location":"releasenotes/#registration-flow-improved","title":"Registration Flow improved","text":"<ul> <li>Eliminated access from CAPIF to the Register user database when onboarding is performed.</li> <li>Isolation between CCF and Register services, interaction now is only by HTTPS requested between Register, CCF and Vault.</li> <li>Eliminated the \"role\" in user creation.<ul> <li>Now a user can be an invoker or a provider at the same time</li> </ul> </li> <li>Administrator User:<ul> <li>New entity in charge of registering and managing users of the register service.</li> </ul> </li> <li>UUID to identify users.<ul> <li>When you create a user, a uuid is associated with it</li> <li>The uuid will be contained in the token requested by the user and will be used to relate invokers and providers with users.</li> </ul> </li> <li>Endpoints changed and created:<ul> <li>Administrator endpoints:<ul> <li>/createUser: /register endpoint changed to createUser. Used to register new users.</li> <li>/deleteUser: /remove endpoint changed to this. Used to delete users and all the entities they had created.</li> <li>/login: Allows administrator to log in to obtain the necessary tokens for their requests.</li> <li>/refresh: Retrieve new access token token.</li> <li>/getUsers: Returns the list with all registered users.</li> </ul> </li> <li>Customer User:<ul> <li>/getauth now also returns the urls needed to use CAPIF, used by customer.</li> </ul> </li> </ul> </li> <li> <p>Security improvements:</p> <ul> <li>/login uses basic auth with administrator credentials.</li> <li>/getauth uses basic auth with customer user credentials.</li> <li>Other requests use the administrator access token obtained from login.</li> </ul> </li> <li> <p>Current fields on user creation by administrator:</p> </li> </ul> <pre><code>required_fields = {\n \"username\": str,\n \"password\": str,\n \"enterprise\": str,\n \"country\": str,\n \"email\": str,\n \"purpose\": str\n}\n\noptional_fields = {\n \"phone_number\": str,\n \"company_web\": str,\n \"description\": str\n}\n</code></pre> <ul> <li>Test plan has been updated with the new register flow. Please check OCF Registration Flow</li> <li>Video with explanation and demonstration of new register flow New Registration Demo</li> </ul>"},{"location":"releasenotes/#new-opencapif-architecture","title":"New OpenCAPIF architecture","text":"<ul> <li>New arquitecture with separated namespaces for Vault, CCF and Register components. Communication between them now are only allowed by using REST APIs.</li> <li> <p>New helper service inside CCF, it will simplify integration with third parties like external management portals.</p> </li> <li> <p>Helper endpoints:</p> <ul> <li>/getInvokers : Get the list of invokers from CAPIF</li> <li>/getProviders: Get the list of providers from CAPIF</li> <li>/getServices : Get the list of services published in CAPIF</li> <li>/getSecurityContext : Get the list of security contexts from CAPIF</li> <li>/getEvents : Get the list of events subscriptions from CAPIF</li> <li>/deleteEntities: Removes all entities registered by a user from the register</li> </ul> </li> <li> <p>Security in the helper</p> <ul> <li>To make requests to the helper you will need a superadmin certificate and password.</li> </ul> </li> </ul>"},{"location":"releasenotes/#events-api-upgrade","title":"Events API Upgrade","text":"<ul> <li>The event management at CCF is improved, EventNotification include Event Details with required information.</li> <li>Events updated:<ul> <li>SERVICE_API_AVAILABLE and SERVICE_API_UNAVAILABLE with apiIds</li> <li>SERVICE_API_UPDATE with serviceAPIDescriptions</li> <li>API_INVOKER_ONBOARDED, API_INVOKER_UPDATED, API_INVOKER_OFFBOARDED with apiInvokerIds.</li> </ul> </li> <li>Events Included:<ul> <li>SERVICE_API_INVOCATION_SUCCESS and SERVICE_API_INVOCATION_FAILURE with invocationLogs</li> </ul> </li> <li>Test plan include 7 new tests in order to check new events implemented and scenarios of each notification implemented, with a complete check of Event Notification.</li> <li>Test plan documentation includes the new event tests OCF Event test plan documentation.</li> </ul>"},{"location":"releasenotes/#inital-implementation-of-cicd","title":"Inital implementation of CI/CD","text":"<ul> <li>The inital implementation of CI/CD on gitlab was performed.</li> <li>Detailed information in the CICD Wiki.</li> <li>Implement initial CI/CD:<ul> <li>Description of the CI process.<ul> <li>In CI phase, created design, jobs and security checks when a branch is pushed.</li> <li>The CI has jobs as:<ul> <li>Linting code, unit test (if needed),</li> <li>Build and push artifacts (images) in Git OCI register</li> <li>Security checks,</li> <li>SCA, CVS, SAST</li> <li>The vulnerabilities are exposed in Merge Request panel to be solved.</li> </ul> </li> </ul> </li> <li>Description of the CD process:<ul> <li>Defined the environments to OCF.<ul> <li>Production env.</li> <li>Pre-production env.</li> <li>Validation env.</li> <li>Dev-1, dev-2\u2026 envs (ephemeral)</li> </ul> </li> <li>Defined the naming convention to OCF releases<ul> <li>Tag in prod: v0.0.1-release</li> <li>Tag non-prod: v0.0.1-rc</li> <li>Other tags: v0.0.1-test, v0.0.1-smt</li> </ul> </li> <li>Defined the jobs of CD<ul> <li>CD ensures the deployment in multiple envs. Therefore, the CD pipeline has deploy-ocf, delete-ocf (if needed) jobs</li> </ul> </li> </ul> </li> <li>ETSI HIVE Labs:<ul> <li>Designed, created and the Kuberntes OCF cluster is running to support OCFs deployments.</li> <li>Iterating with ETSI HIVE\u2019s support to solve computing issues.<ul> <li>CPU compatibilities with OCF services (MongoDB): Fixed</li> </ul> </li> </ul> </li> </ul> </li> </ul>"},{"location":"releasenotes/#documentation","title":"Documentation","text":""},{"location":"releasenotes/#improvements-on-documentation","title":"Improvements on documentation","text":"<ul> <li>Documentation stored in OCF Documentation Repository</li> <li>Continuous Integration included at repository for web documentation:<ul> <li>Develop version of documentation is automatically generated on each merge to develop branch.</li> <li>Tagged version from main create documentation with related tag as version.</li> </ul> </li> </ul>"},{"location":"releasenotes/#technical-debt-solved","title":"Technical Debt Solved","text":""},{"location":"releasenotes/#improved-testing-with-robot-in-order-to-cover","title":"Improved Testing with Robot in order to cover","text":"<ul> <li>Support of new Register flows.</li> <li>Allow different URLs for register, ccf and vault services.</li> <li>New Variables included to manage new architecture under test.</li> <li>Mock server developed to add the functionality of write tests involving notification from Service Under Test.</li> <li>Docker image improved generation and libraries upgraded to Robot Framework 7.</li> </ul>"},{"location":"releasenotes/#improved-security-on-db","title":"Improved security on DB","text":"<ul> <li>Credentials requested to access mongo databases.</li> <li>Credentials requested also by mongo-express.</li> </ul>"},{"location":"releasenotes/#scripts-upgraded","title":"Scripts upgraded","text":"<ul> <li>Docker compose version 2 used on them.</li> <li>New cleaning script developed.</li> <li>Scripts upgraded:<ul> <li>check_services_are_running.sh: Checks if all essential services (Vault, CCF and Register) are running.</li> <li>clean_capif_docker_services.sh: Shutdowns and removes all services essential services.</li> <li>clean_capif_temporary_files.sh: Removes temporaly files from local repository. </li> <li>run.sh: Launch Essential services locally using docker compose, also monitoring can be launched.</li> <li>run_capif_tests.sh: Launch Robot Framwork Tests.</li> <li>show_logs.sh: Show locally logs of Services running.</li> <li>run_mock_server.sh: Launch mock server locally on all interfaces. This axiliary server is only used by tagged mockserver tests on Robot Framework.</li> <li>clean_mock_server.sh: Remove mock server local deployment.</li> <li>deploy.sh: This script simplify the way to download capif repository.</li> </ul> </li> </ul>"},{"location":"releasenotes/#codebase-improvements","title":"Codebase Improvements","text":"<ul> <li>Documentation is now on splitted repository OCF Documentation Repository</li> <li>Test plan was moved to OCF Documentation Repository</li> <li>Obsolote data is removed.</li> <li>Repository Reorganization: Enhanced structure and maintainability with a better directory layout and clearer module separation.</li> <li>Code Quality Enhancements: Refactored code and fixed known issues</li> </ul>"},{"location":"releasenotes/#migration-to-gunicorn","title":"Migration to GUNICORN","text":"<ul> <li>Include production server on each microservice: Release 0 use Flask developer server, now we use GUNICORN.</li> </ul>"},{"location":"releasenotes/#release-00","title":"Release 0.0","text":"<p>The APIs included in Release 0.0 are:</p> <ul> <li>JWT Authentication APIs</li> <li>CAPIF Invoker Management API</li> <li>CAPIF Publish API</li> <li>CAPIF Discover API</li> <li>CAPIF Security API</li> <li>CAPIF Events API</li> <li>CAPIF Provider Management API</li> </ul> <p>This Release also includes a Robot Test Suite for all those services and a Postman Test Suite for simple testing.</p>"},{"location":"deployment_guide/deployment_guide/","title":"1. Deployment Guide","text":"<p>This section walks you through the process of deploying TeraFlowSDN on top of a machine running MicroK8s Kubernetes platform. The guide includes the details on configuring and installing the machine, installing and configuring MicroK8s, and deploying and reporting the status of the TeraFlowSDN controller.</p>"},{"location":"deployment_guide/deployment_guide/#11-configure-your-machine","title":"1.1. Configure your Machine","text":"<p>In this section, we describe how to configure a machine (physical or virtual) to be used as the deployment, execution, and development environment for the ETSI TeraFlowSDN controller. Choose your preferred environment below and follow the instructions provided.</p> <p>NOTE: If you already have a remote physical server fitting the requirements specified in this section feel free to use it instead of deploying a local VM. Check 1.1.1. Physical Server for further details.</p> <p>Virtualization platforms tested are:</p> <ul> <li>Physical Server</li> <li>Oracle Virtual Box</li> <li>VMWare Fusion</li> <li>OpenStack</li> <li>Vagrant Box</li> </ul>"},{"location":"deployment_guide/deployment_guide/#111-physical-server","title":"1.1.1. Physical ServerServer SpecificationsClusterized DeploymentNetworkingOperating SystemUpgrade the Ubuntu distribution","text":"<p>This section describes how to configure a physical server for running ETSI TeraFlowSDN(TFS) controller.</p> <p>Minimum Server Specifications for development and basic deployment</p> <ul> <li>CPU: 4 cores</li> <li>RAM: 8 GB</li> <li>Disk: 60 GB</li> <li>1 GbE NIC</li> </ul> <p>Recommended Server Specifications for development and basic deployment</p> <ul> <li>CPU: 6 cores</li> <li>RAM: 12 GB</li> <li>Disk: 80 GB</li> <li>1 GbE NIC</li> </ul> <p>Server Specifications for best development and deployment experience</p> <ul> <li>CPU: 8 cores</li> <li>RAM: 32 GB</li> <li>Disk: 120 GB</li> <li>1 GbE NIC</li> </ul> <p>NOTE: the specifications listed above are provided as a reference. They depend also on the CPU clock frequency, the RAM memory, the disk technology and speed, etc.</p> <p>For development purposes, it is recommended to run the VSCode IDE (or the IDE of your choice) in a more powerful server, for instance, the recommended server specifications for development and basic deployment.</p> <p>Given that TeraFlowSDN follows a micro-services architecture, for the deployment, it might be better to use many clusterized servers with many slower cores than a single server with few highly performant cores.</p> <p>You might consider creating a cluster of machines each featuring, at least, the minimum server specifications. That solution brings you scalability in the future.</p> <p>No explicit indications are given in terms of networking besides that servers need access to the Internet for downloading dependencies, binaries, and packages while building and deploying the TeraFlowSDN components.</p> <p>Besides that, the network requirements are essentially the same than that required for running a classical Kubernetes environment. To facilitate the deployment, we extensively use MicroK8s, thus the network requirements are, essentially, the same demanded by MicroK8s, especially, if you consider creating a Kubernetes cluster.</p> <p>As a reference, the other deployment solutions based on VMs assume the VM is connected to a virtual network configured with the IP range <code>10.0.2.0/24</code> and have the gateway at IP <code>10.0.2.1</code>. The VMs have the IP address <code>10.0.2.10</code>.</p> <p>The minimum required ports to be accessible are: - 22/SSH : for management purposes - 80/HTTP : for the TeraFlowSDN WebUI and Grafana dashboard - 8081/HTTPS : for the CockroachDB WebUI</p> <p>Other ports might be required if you consider to deploy addons such as Kubernetes observability, etc. The details on these ports are left appart given they might vary depending on the Kubernetes environment you use.</p> <p>The recommended Operating System for deploying TeraFlowSDN is Ubuntu Server 22.04 LTS or Ubuntu Server 20.04 LTS. Other version might work, but we have not tested them. We strongly recommend using Long Term Support (LTS) versions as they provide better stability.</p> <p>Below we provide some installation guidelines: - Installation Language: English - Autodetect your keyboard - If asked, select \"Ubuntu Server\" (do not select \"Ubuntu Server (minimized)\"). - Configure static network specifications (adapt them based on your particular setup):</p> Interface IPv4 Method Subnet Address Gateway Name servers Search domains enp0s3 Manual 10.0.2.0/24 10.0.2.10 10.0.2.1 8.8.8.8,8.8.4.4 <ul> <li>Leave proxy and mirror addresses as they are</li> <li>Let the installer self-upgrade (if asked).</li> <li>Use an entire disk for the installation</li> <li>Disable setup of the disk as LVM group</li> <li>Double check that NO swap space is allocated in the partition table. Kubernetes does not work properly with SWAP.</li> <li>Configure your user and system names:</li> <li>User name: <code>TeraFlowSDN</code></li> <li>Server's name: <code>tfs-vm</code></li> <li>Username: <code>tfs</code></li> <li>Password: <code>tfs123</code></li> <li>Install Open SSH Server</li> <li>Import SSH keys, if any.</li> <li>Featured Server Snaps</li> <li>Do not install featured server snaps. It will be done manually later to illustrate how to uninstall and reinstall them in case of trouble with.</li> <li>Let the system install and upgrade the packages.</li> <li>This operation might take some minutes depending on how old is the Optical Drive ISO image you use and your Internet connection speed.</li> <li>Restart the VM when the installation is completed.</li> </ul> <pre><code>sudo apt-get update -y\nsudo apt-get dist-upgrade -y\n</code></pre> <ul> <li>If asked to restart services, restart the default ones proposed.</li> <li>Restart the VM when the installation is completed.</li> </ul>"},{"location":"deployment_guide/deployment_guide/#112-oracle-virtual-box","title":"1.1.2. Oracle Virtual BoxCreate a NAT Network in VirtualBoxCreate VM in VirtualBox:Install Ubuntu 22.04 LTS Operating System","text":"<p>This section describes how to configure a VM for running ETSI TeraFlowSDN(TFS) controller using Oracle VirtualBox. It has been tested with VirtualBox up to version 6.1.40 r154048.</p> <p>In \"Oracle VM VirtualBox Manager\", Menu \"File > Preferences... > Network\", create a NAT network with the following specifications:</p> Name CIDR DHCP IPv6 TFS-NAT-Net 10.0.2.0/24 Disabled Disabled <p>Within the newly created \"TFS-NAT-Net\" NAT network, configure the following IPv4 forwarding rules:</p> Name Protocol Host IP Host Port Guest IP Guest Port SSH TCP 127.0.0.1 2200 10.0.2.10 22 HTTP TCP 127.0.0.1 8080 10.0.2.10 80 <p>Note: IP address 10.0.2.10 is the one that will be assigned to the VM.</p> <ul> <li>Name: TFS-VM</li> <li>Type/Version: Linux / Ubuntu (64-bit)</li> <li>CPU (*): 4 vCPUs @ 100% execution capacity</li> <li>RAM: 8 GB</li> <li>Disk: 60 GB, Virtual Disk Image (VDI), Dynamically allocated</li> <li>Optical Drive ISO Image: \"ubuntu-22.04.X-live-server-amd64.iso\"</li> <li>Download the latest Long Term Support (LTS) version of the Ubuntu Server image from Ubuntu 22.04 LTS, e.g., \"ubuntu-22.04.X-live-server-amd64.iso\".</li> <li>Note: use Ubuntu Server image instead of Ubuntu Desktop to create a lightweight VM.</li> <li>Network Adapter 1 (*): enabled, attached to NAT Network \"TFS-NAT-Net\"</li> <li>Minor adjustments (*):</li> <li>Audio: disabled</li> <li>Boot order: disable \"Floppy\"</li> </ul> <p>Note: (*) settings to be editing after the VM is created.</p> <p>In \"Oracle VM VirtualBox Manager\", start the VM in normal mode, and follow the installation procedure. Below we provide some installation guidelines: - Installation Language: English - Autodetect your keyboard - If asked, select \"Ubuntu Server\" (do not select \"Ubuntu Server (minimized)\"). - Configure static network specifications:</p> Interface IPv4 Method Subnet Address Gateway Name servers Search domains enp0s3 Manual 10.0.2.0/24 10.0.2.10 10.0.2.1 8.8.8.8,8.8.4.4 <ul> <li>Leave proxy and mirror addresses as they are</li> <li>Let the installer self-upgrade (if asked).</li> <li>Use an entire disk for the installation</li> <li>Disable setup of the disk as LVM group</li> <li>Double check that NO swap space is allocated in the partition table. Kubernetes does not work properly with SWAP.</li> <li>Configure your user and system names:</li> <li>User name: TeraFlowSDN</li> <li>Server's name: tfs-vm</li> <li>Username: tfs</li> <li>Password: tfs123</li> <li>Install Open SSH Server</li> <li>Import SSH keys, if any.</li> <li>Featured Server Snaps</li> <li>Do not install featured server snaps. It will be done manually later to illustrate how to uninstall and reinstall them in case of trouble with.</li> <li>Let the system install and upgrade the packages.</li> <li>This operation might take some minutes depending on how old is the Optical Drive ISO image you use and your Internet connection speed.</li> <li>Restart the VM when the installation is completed.</li> </ul> <p>Upgrade the Ubuntu distribution</p> <pre><code>sudo apt-get update -y\nsudo apt-get dist-upgrade -y\n</code></pre> <ul> <li>If asked to restart services, restart the default ones proposed.</li> <li>Restart the VM when the installation is completed.</li> </ul> <p>Install VirtualBox Guest Additions On VirtualBox Manager, open the VM main screen. If you are running the VM in headless mode, right click over the VM in the VirtualBox Manager window and click \"Show\". If a dialog informing about how to leave the interface of the VM is shown, confirm pressing \"Switch\" button. The interface of the VM should appear.</p> <p>Click menu \"Device > Insert Guest Additions CD image...\"</p> <p>On the VM terminal, type:</p> <pre><code>sudo apt-get install -y linux-headers-$(uname -r) build-essential dkms\n # This command might take some minutes depending on your VM specs and your Internet access speed.\nsudo mount /dev/cdrom /mnt/\ncd /mnt/\nsudo ./VBoxLinuxAdditions.run\n # This command might take some minutes depending on your VM specs.\nsudo reboot\n</code></pre>"},{"location":"deployment_guide/deployment_guide/#113-vmware-fusion","title":"1.1.3. VMWare FusionCreate VM in VMWare Fusion:Install Ubuntu 22.04.1 LTS Operating SystemUpgrade the Ubuntu distribution","text":"<p>This section describes how to configure a VM for running ETSI TeraFlowSDN(TFS) controller using VMWare Fusion. It has been tested with VMWare Fusion version 12 and 13.</p> <p>In \"VMWare Fusion\" manager, create a new network from the \"Settings/Network\" menu.</p> <ul> <li>Unlock to make changes</li> <li>Press the + icon and create a new network</li> <li>Change the name to TFS-NAT-Net</li> <li>Check \"Allow virtual machines on this network to connect to external network (NAT)\"</li> <li>Do not check \"Enable IPv6\"</li> <li>Add port forwarding for HTTP and SSH</li> <li>Uncheck \"Provide address on this network via DHCP\"</li> </ul> <p>Create a new VM an Ubuntu 22.04.1 ISO:</p> <ul> <li>Display Name: TeraFlowSDN</li> <li>Username: tfs</li> <li>Password: tfs123</li> </ul> <p>On the next screen press \"Customize Settings\", save the VM and in \"Settings\" change: - Change to use 4 CPUs - Change to access 8 GB of RAM - Change disk to size 60 GB - Change the network interface to use the previously created TFS-NAT-Net</p> <p>Run the VM to start the installation.</p> <p>The installation will be automatic, without any configuration required.</p> <ul> <li>Configure the guest IP, gateway and DNS:</li> </ul> <p>Using the Network Settings for the wired connection, set the IP to 10.0.2.10, the mask to 255.255.255.0, the gateway to 10.0.2.2 and the DNS to 10.0.2.2.</p> <ul> <li>Disable and remove swap file:</li> </ul> <p>$ sudo swapoff -a $ sudo rm /swapfile</p> <p>Then you can remove or comment the /swapfile entry in /etc/fstab</p> <ul> <li>Install Open SSH Server</li> <li> <p>Import SSH keys, if any.</p> </li> <li> <p>Restart the VM when the installation is completed.</p> </li> </ul> <pre><code>sudo apt-get update -y\nsudo apt-get dist-upgrade -y\n</code></pre>"},{"location":"deployment_guide/deployment_guide/#114-openstack","title":"1.1.4. OpenStackCreate a Security Group in OpenStack <p> In OpenStack, go to Project - Network - Security Groups - Create Security Group with name TFS</p> <p>Add the following rules:</p> Direction Ether Type IP Protocol Port Range Remote IP Prefix Ingress IPv4 TCP 22 (SSH) 0.0.0.0/0 Ingress IPv4 TCP 2200 0.0.0.0/0 Ingress IPv4 TCP 8080 0.0.0.0/0 Ingress IPv4 TCP 80 0.0.0.0/0 Egress IPv4 Any Any 0.0.0.0/0 Egress IPv6 Any Any ::/0 <p>Note: The IP address will be assigned depending on the network you have configured inside OpenStack. This IP will have to be modified in TeraFlow configuration files which by default use IP 10.0.2.10</p> Create a flavour <p></p> <p>From dashboard (Horizon)</p> <p>Go to Admin - Compute - Flavors and press Create Flavor</p> <ul> <li>Name: TFS</li> <li>VCPUs: 4</li> <li>RAM (MB): 8192</li> <li>Root Disk (GB): 60</li> </ul> <p>From CLI</p> <pre><code> openstack flavor create TFS --id auto --ram 8192 --disk 60 --vcpus 8\n</code></pre> Create an instance in OpenStack: <p></p> <ul> <li>Instance name: TFS-VM</li> <li>Origin: [Ubuntu-22.04 cloud image] (https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img)</li> <li>Create new volume: No</li> <li>Flavor: TFS</li> <li>Networks: extnet </li> <li>Security Groups: TFS</li> <li>Configuration: Include the following cloud-config</li> </ul> <pre><code>#cloud-config\n# Modifies the password for the VM instance\nusername: ubuntu\npassword: <your-password>\nchpasswd: { expire: False }\nssh_pwauth: True\n</code></pre> Upgrade the Ubuntu distribution <p></p> <pre><code>sudo apt-get update -y\nsudo apt-get dist-upgrade -y\n</code></pre> <ul> <li>If asked to restart services, restart the default ones proposed.</li> <li>Restart the VM when the installation is completed.</li> </ul>","text":"<p>This section describes how to configure a VM for running ETSI TeraFlowSDN(TFS) controller using OpenStack. It has been tested with OpenStack Kolla up to Yoga version. </p>"},{"location":"deployment_guide/deployment_guide/#115-vagrant-box","title":"1.1.5. Vagrant Box <p>","text":""},{"location":"deployment_guide/deployment_guide/#12-install-microk8s","title":"1.2. Install MicroK8s","text":"<p>This section describes how to deploy the MicroK8s Kubernetes platform and configure it to be used with ETSI TeraFlowSDN controller. Besides, Docker is installed to build docker images for the ETSI TeraFlowSDN controller.</p> <p>The steps described in this section might take some minutes depending on your internet connection speed and the resources assigned to your VM, or the specifications of your physical server.</p> <p>To facilitate work, these steps are easier to be executed through an SSH connection, for instance using tools like PuTTY or MobaXterm.</p> Upgrade the Ubuntu distribution <p> Skip this step if you already did it during the creation of the VM.</p> <pre><code>sudo apt-get update -y\nsudo apt-get dist-upgrade -y\n</code></pre> Install prerequisites <p></p> <pre><code>sudo apt-get install -y ca-certificates curl gnupg lsb-release snapd jq\n</code></pre> Install Docker CE <p> Install Docker CE and Docker BuildX plugin</p> <pre><code>sudo apt-get install -y docker.io docker-buildx\n</code></pre> <p>NOTE: Starting from Docker v23, Build architecture has been updated and <code>docker build</code> command entered into deprecation process in favor of the new <code>docker buildx build</code> command. Package <code>docker-buildx</code> provides the new <code>docker buildx build</code> command.</p> <p>Add key \"insecure-registries\" with the private repository to the daemon configuration. It is done in two commands since sometimes read from and write to same file might cause trouble.</p> <pre><code>if [ -s /etc/docker/daemon.json ]; then cat /etc/docker/daemon.json; else echo '{}'; fi \\\n | jq 'if has(\"insecure-registries\") then . else .+ {\"insecure-registries\": []} end' -- \\\n | jq '.\"insecure-registries\" |= (.+ [\"localhost:32000\"] | unique)' -- \\\n | tee tmp.daemon.json\nsudo mv tmp.daemon.json /etc/docker/daemon.json\nsudo chown root:root /etc/docker/daemon.json\nsudo chmod 600 /etc/docker/daemon.json\n</code></pre> <p>Restart the Docker daemon</p> <pre><code>sudo systemctl restart docker\n</code></pre> Install MicroK8s <p></p> <p>Important: Some TeraFlowSDN dependencies need to be executed on top of MicroK8s/Kubernetes v1.24. It is not guaranteed (by now) to run on newer versions.</p> <pre><code># Install MicroK8s\nsudo snap install microk8s --classic --channel=1.24/stable\n\n# Create alias for command \"microk8s.kubectl\" to be usable as \"kubectl\"\nsudo snap alias microk8s.kubectl kubectl\n</code></pre> <p>It is important to make sure that <code>ufw</code> will not interfere with the internal pod-to-pod and pod-to-Internet traffic. To do so, first check the status. If <code>ufw</code> is active, use the following command to enable the communication.</p> <pre><code>\n# Verify status of ufw firewall\nsudo ufw status\n\n# If ufw is active, install following rules to enable access pod-to-pod and pod-to-internet\nsudo ufw allow in on cni0 && sudo ufw allow out on cni0\nsudo ufw default allow routed\n</code></pre> <p>NOTE: MicroK8s can be used to compose a Highly Available Kubernetes cluster enabling you to construct an environment combining the CPU, RAM and storage resources of multiple machines. If you are interested in this procedure, review the official instructions in How to build a highly available Kubernetes cluster with MicroK8s, in particular, the step Create a MicroK8s multi-node cluster.</p> <p>References:</p> <ul> <li>The lightweight Kubernetes > Install MicroK8s</li> <li>Install a local Kubernetes with MicroK8s</li> <li>How to build a highly available Kubernetes cluster with MicroK8s</li> </ul> Add user to the docker and microk8s groups <p></p> <p>It is important that your user has the permission to run <code>docker</code> and <code>microk8s</code> in the terminal. To allow this, you need to add your user to the <code>docker</code> and <code>microk8s</code> groups with the following commands:</p> <pre><code>sudo usermod -a -G docker $USER\nsudo usermod -a -G microk8s $USER\nsudo chown -f -R $USER $HOME/.kube\nsudo reboot\n</code></pre> <p>In case that you get trouble executing the following commands, might due to the .kube folder is not automatically provisioned into your home folder, you may follow the steps below:</p> <pre><code>mkdir -p $HOME/.kube\nsudo chown -f -R $USER $HOME/.kube\nmicrok8s config > $HOME/.kube/config\nsudo reboot\n</code></pre> Check status of Kubernetes and addons <p> To retrieve the status of Kubernetes once, run the following command:</p> <pre><code>microk8s.status --wait-ready\n</code></pre> <p>To retrieve the status of Kubernetes periodically (e.g., every 1 second), run the following command:</p> <pre><code>watch -n 1 microk8s.status --wait-ready\n</code></pre> Check all resources in Kubernetes <p> To retrieve the status of the Kubernetes resources once, run the following command:</p> <pre><code>kubectl get all --all-namespaces\n</code></pre> <p>To retrieve the status of the Kubernetes resources periodically (e.g., every 1 second), run the following command:</p> <pre><code>watch -n 1 kubectl get all --all-namespaces\n</code></pre> Enable addons <p></p> <p>First, we need to enable the community plugins (maintained by third parties):</p> <pre><code>microk8s.enable community\n</code></pre> <p>The Addons to be enabled are:</p> <ul> <li><code>dns</code>: enables resolving the pods and services by name</li> <li><code>helm3</code>: required to install NATS</li> <li><code>hostpath-storage</code>: enables providing storage for the pods (required by <code>registry</code>)</li> <li><code>ingress</code>: deploys an ingress controller to expose the microservices outside Kubernetes</li> <li><code>registry</code>: deploys a private registry for the TFS controller images</li> <li><code>linkerd</code>: deploys the linkerd service mesh used for load balancing among replicas</li> <li><code>prometheus</code>: set of tools that enable TFS observability through per-component instrumentation</li> <li><code>metrics-server</code>: deploys the Kubernetes metrics server for API access to service metrics</li> </ul> <pre><code>microk8s.enable dns helm3 hostpath-storage ingress registry prometheus metrics-server linkerd\n</code></pre> <p>Important: Enabling some of the addons might take few minutes. Do not proceed with next steps until the addons are ready. Otherwise, the deployment might fail. To confirm everything is up and running:</p> <ol> <li>Periodically Check the status of Kubernetes until you see the addons [dns, ha-cluster, helm3, hostpath-storage, ingress, linkerd, metrics-server, prometheus, registry, storage] in the enabled block.</li> <li>Periodically Check Kubernetes resources until all pods are Ready and Running.</li> <li>If it takes too long for the Pods to be ready, we observed that rebooting the machine may help.</li> </ol> <p>Then, create aliases to make the commands easier to access:</p> <pre><code>sudo snap alias microk8s.helm3 helm3\nsudo snap alias microk8s.linkerd linkerd\n</code></pre> <p>To validate that <code>linkerd</code> is working correctly, run:</p> <pre><code>linkerd check\n</code></pre> <p>To validate that the <code>metrics-server</code> is working correctly, run:</p> <pre><code>kubectl top pods --all-namespaces\n</code></pre> <p>and you should see a screen similar to the <code>top</code> command in Linux, showing the columns namespace, pod name, CPU (cores), and MEMORY (bytes).</p> <p>In case pods are not starting, check information from pods logs. For example, linkerd is sensitive for proper /etc/resolv.conf syntax.</p> <pre><code>kubectl logs <podname> --namespace <namespace>\n</code></pre> <p>If the command shows an error message, also restarting the machine might help.</p> Stop, Restart, and Redeploy <p> Find below some additional commands you might need while you work with MicroK8s:</p> <pre><code>microk8s.stop # stop MicroK8s cluster (for instance, before power off your computer)\nmicrok8s.start # start MicroK8s cluster\nmicrok8s.reset # reset infrastructure to a clean state\n</code></pre> <p>If the following commands does not work to recover the MicroK8s cluster, you can redeploy it.</p> <p>If you want to keep MicroK8s configuration, use:</p> <pre><code>sudo snap remove microk8s\n</code></pre> <p>If you need to completely drop MicroK8s and its complete configuration, use:</p> <pre><code>sudo snap remove microk8s --purge\nsudo apt-get remove --purge docker.io docker-buildx\n</code></pre> <p>IMPORTANT: After uninstalling MicroK8s, it is convenient to reboot the computer (the VM if you work on a VM, or the physical computer if you use a physical computer). Otherwise, there are system configurations that are not correctly cleaned. Especially in what port forwarding and firewall rules matters.</p> <p>After the reboot, redeploy as it is described in this section.</p>"},{"location":"deployment_guide/deployment_guide/#13-deploy-teraflowsdn","title":"1.3. Deploy TeraFlowSDN","text":"<p>This section describes how to deploy TeraFlowSDN controller on top of MicroK8s using the environment configured in the previous sections.</p> Install prerequisites <p></p> <pre><code>sudo apt-get install -y git curl jq\n</code></pre> Clone the Git repository of the TeraFlowSDN controller <p> Clone from ETSI-hosted GitLab code repository:</p> <pre><code>mkdir ~/tfs-ctrl\ngit clone https://labs.etsi.org/rep/tfs/controller.git ~/tfs-ctrl\n</code></pre> <p>Important: The original H2020-TeraFlow project hosted on GitLab.com has been archieved and will not receive further contributions/updates. Please, clone from ETSI-hosted GitLab code repository.</p> Checkout the appropriate Git branch <p> TeraFlowSDN controller versions can be found in the appropriate release tags and/or branches as described in Home > Versions.</p> <p>By default the branch master is checked out and points to the latest stable version of the TeraFlowSDN controller, while branch develop contains the latest developments and contributions under test and validation.</p> <p>To switch to the appropriate branch run the following command, changing <code>develop</code> by the name of the branch you want to deploy:</p> <pre><code>cd ~/tfs-ctrl\ngit checkout develop\n</code></pre> Prepare a deployment script with the deployment settings <p> Create a new deployment script, e.g., <code>my_deploy.sh</code>, adding the appropriate settings as follows. This section provides just an overview of the available settings. An example <code>my_deploy.sh</code> script is provided in the root folder of the project for your convenience with full description of all the settings.</p> <p>Note: The example <code>my_deploy.sh</code> script provides reasonable settings for deploying a functional and complete enough TeraFlowSDN controller, and a brief description of their meaning. To see extended descriptions, check scripts in the <code>deploy</code> folder.</p> <pre><code>cd ~/tfs-ctrl\ntee my_deploy.sh >/dev/null << EOF\n# ----- TeraFlowSDN ------------------------------------------------------------\nexport TFS_REGISTRY_IMAGES=\"http://localhost:32000/tfs/\"\nexport TFS_COMPONENTS=\"context device ztp monitoring pathcomp service slice nbi webui load_generator\"\nexport TFS_IMAGE_TAG=\"dev\"\nexport TFS_K8S_NAMESPACE=\"tfs\"\nexport TFS_EXTRA_MANIFESTS=\"manifests/nginx_ingress_http.yaml\"\nexport TFS_GRAFANA_PASSWORD=\"admin123+\"\nexport TFS_SKIP_BUILD=\"\"\n\n# ----- CockroachDB ------------------------------------------------------------\nexport CRDB_NAMESPACE=\"crdb\"\nexport CRDB_EXT_PORT_SQL=\"26257\"\nexport CRDB_EXT_PORT_HTTP=\"8081\"\nexport CRDB_USERNAME=\"tfs\"\nexport CRDB_PASSWORD=\"tfs123\"\nexport CRDB_DATABASE=\"tfs\"\nexport CRDB_DEPLOY_MODE=\"single\"\nexport CRDB_DROP_DATABASE_IF_EXISTS=\"YES\"\nexport CRDB_REDEPLOY=\"\"\n\n# ----- NATS -------------------------------------------------------------------\nexport NATS_NAMESPACE=\"nats\"\nexport NATS_EXT_PORT_CLIENT=\"4222\"\nexport NATS_EXT_PORT_HTTP=\"8222\"\nexport NATS_REDEPLOY=\"\"\n\n# ----- QuestDB ----------------------------------------------------------------\nexport QDB_NAMESPACE=\"qdb\"\nexport QDB_EXT_PORT_SQL=\"8812\"\nexport QDB_EXT_PORT_ILP=\"9009\"\nexport QDB_EXT_PORT_HTTP=\"9000\"\nexport QDB_USERNAME=\"admin\"\nexport QDB_PASSWORD=\"quest\"\nexport QDB_TABLE_MONITORING_KPIS=\"tfs_monitoring_kpis\"\nexport QDB_TABLE_SLICE_GROUPS=\"tfs_slice_groups\"\nexport QDB_DROP_TABLES_IF_EXIST=\"YES\"\nexport QDB_REDEPLOY=\"\"\n\nEOF\n</code></pre> <p>The settings are organized in 4 sections: - Section <code>TeraFlowSDN</code>: - <code>TFS_REGISTRY_IMAGE</code> enables to specify the private Docker registry to be used, by default, we assume to use the Docker respository enabled in MicroK8s. - <code>TFS_COMPONENTS</code> specifies the components their Docker image will be rebuilt, uploaded to the private Docker registry, and deployed in Kubernetes. - <code>TFS_IMAGE_TAG</code> defines the tag to be used for Docker images being rebuilt and uploaded to the private Docker registry. - <code>TFS_K8S_NAMESPACE</code> specifies the name of the Kubernetes namespace to be used for deploying the TFS components. - <code>TFS_EXTRA_MANIFESTS</code> enables to provide additional manifests to be applied into the Kubernetes environment during the deployment. Typical use case is to deploy ingress controllers, service monitors for Prometheus, etc. - <code>TFS_GRAFANA_PASSWORD</code> lets you specify the password you want to use for the <code>admin</code> user of the Grafana instance being deployed and linked to the Monitoring component. - <code>TFS_SKIP_BUILD</code>, if set to <code>YES</code>, prevents rebuilding the Docker images. That means, the deploy script will redeploy existing Docker images without rebuilding/updating them.</p> <ul> <li>Section <code>CockroachDB</code>: enables to configure the deployment of the backend CockroachDB database.</li> <li> <p>Check example script <code>my_deploy.sh</code> for further details.</p> </li> <li> <p>Section <code>NATS</code>: enables to configure the deployment of the backend NATS message broker.</p> </li> <li> <p>Check example script <code>my_deploy.sh</code> for further details.</p> </li> <li> <p>Section <code>QuestDB</code>: enables to configure the deployment of the backend QuestDB timeseries database.</p> </li> <li>Check example script <code>my_deploy.sh</code> for further details.</li> </ul> Confirm that MicroK8s is running <p></p> <p>Run the following command:</p> <pre><code>microk8s status\n</code></pre> <p>If it is reported <code>microk8s is not running, try microk8s start</code>, run the following command to start MicroK8s:</p> <pre><code>microk8s start\n</code></pre> <p>Confirm everything is up and running:</p> <ol> <li>Periodically Check the status of Kubernetes until you see the addons [dns, ha-cluster, helm3, hostpath-storage, ingress, registry, storage] in the enabled block.</li> <li>Periodically Check Kubernetes resources until all pods are Ready and Running.</li> </ol> Deploy TFS controller <p> First, source the deployment settings defined in the previous section. This way, you do not need to specify the environment variables in each and every command you execute to operate the TFS controller. Be aware to re-source the file if you open new terminal sessions. Then, run the following command to deploy TeraFlowSDN controller on top of the MicroK8s Kubernetes platform.</p> <pre><code>cd ~/tfs-ctrl\nsource my_deploy.sh\n./deploy/all.sh\n</code></pre> <p>The script performs the following steps:</p> <ul> <li>Executes script <code>./deploy/crdb.sh</code> to automate deployment of CockroachDB database used by Context component.</li> <li>The script automatically checks if CockroachDB is already deployed.</li> <li>If there are settings instructing to drop the database and/or redeploy CockroachDB, it does the appropriate actions to honor them as defined in previous section.</li> <li>Executes script <code>./deploy/nats.sh</code> to automate deployment of NATS message broker used by Context component.</li> <li>The script automatically checks if NATS is already deployed.</li> <li>If there are settings instructing to redeploy the message broker, it does the appropriate actions to honor them as defined in previous section.</li> <li>Executes script <code>./deploy/qdb.sh</code> to automate deployment of QuestDB timeseries database used by Monitoring component.</li> <li>The script automatically checks if QuestDB is already deployed.</li> <li>If there are settings instructing to redeploy the timeseries database, it does the appropriate actions to honor them as defined in previous section.</li> <li>Executes script <code>./deploy/tfs.sh</code> to automate deployment of TeraFlowSDN.</li> <li>Creates the namespace defined in <code>TFS_K8S_NAMESPACE</code></li> <li>Creates secrets for CockroachDB, NATS, and QuestDB to be used by Context and Monitoring components.</li> <li>Builds the Docker images for the components defined in <code>TFS_COMPONENTS</code></li> <li>Tags the Docker images with the value of <code>TFS_IMAGE_TAG</code></li> <li>Pushes the Docker images to the repository defined in <code>TFS_REGISTRY_IMAGE</code></li> <li>Deploys the components defined in <code>TFS_COMPONENTS</code></li> <li>Creates the file <code>tfs_runtime_env_vars.sh</code> with the environment variables for the components defined in <code>TFS_COMPONENTS</code> defining their local host addresses and their port numbers.</li> <li>Applies extra manifests defined in <code>TFS_EXTRA_MANIFESTS</code> such as:<ul> <li>Creating an ingress controller listening at port 80 for HTTP connections to enable external access to the TeraFlowSDN WebUI, Grafana Dashboards, and Compute NBI interfaces.</li> <li>Deploying service monitors to enable monitoring the performance of the components, device drivers and service handlers.</li> </ul> </li> <li>Initialize and configure the Grafana dashboards (if Monitoring component is deployed)</li> <li>Report a summary of the deployment</li> <li>See Show Deployment and Logs</li> </ul>"},{"location":"deployment_guide/deployment_guide/#14-webui-and-grafana-dashboards","title":"1.4. WebUI and Grafana Dashboards","text":"<p>This section describes how to get access to the TeraFlowSDN controller WebUI and the monitoring Grafana dashboards.</p> Access the TeraFlowSDN WebUI <p> If you followed the installation steps based on MicroK8s, you got an ingress controller installed that exposes on TCP port 80.</p> <p>Besides, the ingress controller defines the following reverse proxy paths (on your local machine):</p> <ul> <li><code>http://127.0.0.1/webui</code>: points to the WebUI of TeraFlowSDN.</li> <li><code>http://127.0.0.1/grafana</code>: points to the Grafana dashboards. This endpoint brings access to the monitoring dashboards of TeraFlowSDN. The credentials for the <code>admin</code>user are those defined in the <code>my_deploy.sh</code> script, in the <code>TFS_GRAFANA_PASSWORD</code> variable.</li> <li><code>http://127.0.0.1/restconf</code>: points to the Compute component NBI based on RestCONF. This endpoint enables connecting external software, such as ETSI OpenSourceMANO NFV Orchestrator, to TeraFlowSDN.</li> </ul> <p>Note: In the creation of the VM, a forward from host TCP port 8080 to VM's TCP port 80 is configured, so the WebUIs and REST APIs of TeraFlowSDN should be exposed on the endpoint <code>127.0.0.1:8080</code> of your local machine instead of <code>127.0.0.1:80</code>.</p>"},{"location":"deployment_guide/deployment_guide/#15-show-deployment-and-logs","title":"1.5. Show Deployment and Logs","text":"<p>This section presents some helper scripts to inspect the status of the deployment and the logs of the components. These scripts are particularly helpful for troubleshooting during execution of experiments, development, and debugging.</p> Report the deployment of the TFS controller <p></p> <p>The summary report given at the end of the Deploy TFS controller procedure can be generated manually at any time by running the following command. You can avoid sourcing <code>my_deploy.sh</code> if it has been already done.</p> <pre><code>cd ~/tfs-ctrl\nsource my_deploy.sh\n./deploy/show.sh\n</code></pre> <p>Use this script to validate that all the pods, deployments, replica sets, ingress controller, etc. are ready and have the appropriate state, e.g., running for Pods, and the services are deployed and have appropriate IP addresses and port numbers.</p> Report the log of a specific TFS controller component <p></p> <p>A number of scripts are pre-created in the <code>scripts</code> folder to facilitate the inspection of the component logs. For instance, to dump the log of the Context component, run the following command. You can avoid sourcing <code>my_deploy.sh</code> if it has been already done.</p> <pre><code>source my_deploy.sh\n./scripts/show_logs_context.sh\n</code></pre>"},{"location":"development_guide/development_guide/","title":"2. Development Guide","text":""},{"location":"development_guide/development_guide/#21-configure-environment","title":"2.1. Configure Environment","text":""},{"location":"development_guide/development_guide/#211-python","title":"2.1.1. PythonUpgrade the Ubuntu distribution <p>Skip this step if you already did it during the installation of your machine.</p> <pre><code>sudo apt-get update -y\nsudo apt-get dist-upgrade -y\n</code></pre> Install PyEnv dependencies <p></p> <pre><code>sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget \\\n curl llvm git libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev\n</code></pre> Install PyEnv <p></p> <p>We recommend installing PyEnv through PyEnv Installer. Below you can find the instructions, but we refer you to the link for updated instructions.</p> <pre><code>curl https://pyenv.run | bash\n# When finished, edit ~/.bash_profile // ~/.profile // ~/.bashrc as the installer proposes.\n# In general, it means to append the following lines to ~/.bashrc:\nexport PYENV_ROOT=\"$HOME/.pyenv\"\ncommand -v pyenv >/dev/null || export PATH=\"$PYENV_ROOT/bin:$PATH\"\neval \"$(pyenv init -)\"\neval \"$(pyenv virtualenv-init -)\"\n</code></pre> <p>In case .bashrc is not linked properly to your profile, you may need to append the following line into your local .profile file:</p> <pre><code># Open ~/.profile and append this line:\n+source \"$HOME\"/.bashrc\n</code></pre> Restart the machine <p> Restart the machine for all the changes to take effect.</p> <pre><code>sudo reboot\n</code></pre> Install Python 3.9 over PyEnv <p></p> <p>ETSI TeraFlowSDN uses Python 3.9 by default. You should install the latest stable update of Python 3.9, i.e., avoid \"-dev\" versions. To find the latest version available in PyEnv, you can run the following command:</p> <pre><code>pyenv install --list | grep \" 3.9\"\n</code></pre> <p>At the time of writing, this command will output the following list:</p> <pre><code> 3.9.0\n 3.9-dev\n 3.9.1\n 3.9.2\n 3.9.4\n 3.9.5\n 3.9.6\n 3.9.7\n 3.9.8\n 3.9.9\n 3.9.10\n 3.9.11\n 3.9.12\n 3.9.13\n 3.9.14 \n 3.9.15\n 3.9.16 ** always select the latest version **\n</code></pre> <p>Therefore, the latest stable version is Python 3.9.16. To install this version, you should run:</p> <pre><code>pyenv install 3.9.16\n # This command might take some minutes depending on your Internet connection speed \n # and the performance of your machine.\n</code></pre> Create the Virtual Environment for TeraFlowSDN <p> The following commands create a virtual environment named as <code>tfs</code> using Python 3.9 and associate that environment with the current folder, i.e., <code>~/tfs-ctrl</code>. That way, when you are in that folder, the associated virtual environment will be used, thus inheriting the Python interpreter, i.e., Python 3.9, and the Python packages installed on it.</p> <pre><code>cd ~/tfs-ctrl\npyenv virtualenv 3.9.16 tfs\npyenv local 3.9.16/envs/tfs\n</code></pre> <p>After completing these commands, you should see in your prompt that now you're within the virtual environment <code>3.9.16/envs/tfs</code> on folder <code>~/tfs-ctrl</code>:</p> <pre><code>(3.9.16/envs/tfs) tfs@tfs-vm:~/tfs-ctrl$\n</code></pre> <p>In case that the correct pyenv does not get automatically activated when you change to the tfs-ctrl/ folder, then execute the following command:</p> <pre><code>cd ~/tfs-ctrl\npyenv activate 3.9.16/envs/tfs\n</code></pre> Install the basic Python packages within the virtual environment <p> From within the <code>3.9.16/envs/tfs</code> environment on folder <code>~/tfs-ctrl</code>, run the following commands to install the basic Python packages required to work with TeraFlowSDN.</p> <pre><code>cd ~/tfs-ctrl\n./install_requirements.sh\n</code></pre> <p>Some dependencies require to re-load the session, so log-out and log-in again.</p> Generate the Python code from the gRPC Proto messages and services <p></p> <p>The components, e.g., microservices, of the TeraFlowSDN controller, in general, use a gRPC-based open API to interoperate. All the protocol definitions can be found in sub-folder <code>proto</code> within the root project folder. For additional details on gRPC, visit the official web-page gRPC.</p> <p>In order to interact with the components, (re-)generate the Python code from gRPC definitions running the following command:</p> <pre><code>cd ~/tfs-ctrl\nproto/generate_code_python.sh\n</code></pre>","text":"<p>This section describes how to configure the Python environment to run experiments and develop code for the ETSI TeraFlowSDN controller. In particular, we use PyEnv to install the appropriate version of Python and manage the virtual environments.</p>"},{"location":"development_guide/development_guide/#212-java-quarkus","title":"2.1.2. Java (Quarkus) <p>This section describe the steps needed to create a development environment for TFS components implemented in Java. Currently, ZTP and Policy components have been developed in Java (version 11) and use the Quarkus framework, which enables kubernetes-native development.</p> Install JDK <p> To begin, make sure that you have java installed and in the correct version</p> <pre><code>java --version\n</code></pre> <p>If you don't have java installed you will get an error like the following:</p> <pre><code>Command 'java' not found, but can be installed with:\n\nsudo apt install default-jre # version 2:1.11-72build1, or\nsudo apt install openjdk-11-jre-headless # version 11.0.14+9-0ubuntu2\nsudo apt install openjdk-17-jre-headless # version 17.0.2+8-1\nsudo apt install openjdk-18-jre-headless # version 18~36ea-1\nsudo apt install openjdk-8-jre-headless # version 8u312-b07-0ubuntu1\n</code></pre> <p>In which case you should use the following command to install the correct version:</p> <pre><code>sudo apt install openjdk-11-jre-headless\n</code></pre> <p>Else you should get something like the following:</p> <pre><code>openjdk 11.0.18 2023-01-17\nOpenJDK Runtime Environment (build 11.0.18+10-post-Ubuntu-0ubuntu120.04.1)\nOpenJDK 64-Bit Server VM (build 11.0.18+10-post-Ubuntu-0ubuntu120.04.1, mixed mode, sharing)\n</code></pre> Compiling and testing existing components <p> In the root directory of the existing Java components you will find an executable maven wrapper named <code>mvnw</code>. You could use this executable, which is already configured in pair with the components, instead of your local maven installation. So for example if you want to compile the project you would run the following:</p> <pre><code>./mvnw compile\n</code></pre> VS Code Quarkus plugin <p> In case you are using VS Code for development, we suggest to install the official Quarkus extension. The extension should be able to automatically find the current open project and integrate with the above <code>mvnw</code> maven wrapper, making it easier to control the maven lifecycle. Make sure that you open the specific component directory (i.e., <code>src/ztp</code> or <code>src/policy</code>) and not the general controller one (i.e., <code>src</code>.</p> New Java TFS component <p></p> <p>Sample Project</p> <p>If you want to create a new TFS component written in Java you could generate a new Quarkus project based on the following project:</p> <p>TFS Sample Quarkus Project</p> <p>In that way, you should have most of the libraries you would need to integrate with the rest of the TFS Components. Feel free however to add or remove libraries depending on your needs.</p> <p>Initial setup</p> <p>If you used the sample project above, you should have a project with a basic structure. However there are some steps that you should take before starting development.</p> <p>First make sure that you copy the protobuff files, that are found in the root directory of the TFS SDN controller, to the <code>new-component/src/main/proto</code> directory.</p> <p>Next you should create the following files:</p> <ul> <li><code>new-component/.gitlab-ci.yml</code></li> <li><code>new-component/Dockerfile</code></li> <li><code>new-component/src/resources/application.yaml</code></li> </ul> <p>We suggest to copy the respective files from existing components (Automation and Policy) and change them according to your needs.</p>","text":""},{"location":"development_guide/development_guide/#213-java-maven","title":"2.1.3. Java (Maven) <p>Page under construction</p>","text":""},{"location":"development_guide/development_guide/#214-rust","title":"2.1.4. Rust <p>Page under construction</p>","text":""},{"location":"development_guide/development_guide/#215-erlang","title":"2.1.5. Erlang <p>This section describes how to configure the Erlang environment to run experiments and develop code for the ETSI TeraFlowSDN controller.</p> <p>First we need to install Erlang. There is multiple way, for development we will be using ASDF, a tool that allows the installation of multiple version of Erlang at the same time, and switch from one version to the other at will.</p> <ul> <li>First, install any missing dependencies:</li> </ul> <pre><code>sudo apt install curl git autoconf libncurses-dev build-essential m4 libssl-dev \n</code></pre> <ul> <li>Download ASDF tool to the local account:</li> </ul> <pre><code>git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.10.2\n</code></pre> <ul> <li>Make ASDF activate on login by adding these lines at the end of the <code>~/.bashrc</code> file:</li> </ul> <pre><code>. $HOME/.asdf/asdf.sh\n. $HOME/.asdf/completions/asdf.bash\n</code></pre> <ul> <li>Logout and log back in to activate ASDF.</li> </ul> <p>ASDF supports multiple tools by installing there corresponding plugins.</p> <ul> <li>Install ASDF plugin for Erlang:</li> </ul> <pre><code>asdf plugin add erlang https://github.com/asdf-vm/asdf-erlang.git\n</code></pre> <ul> <li>Install a version of Erlang:</li> </ul> <pre><code>asdf install erlang 24.3.4.2\n</code></pre> <ul> <li>Activate Erlang locally for TFS controller. This will create a local file called <code>.tool-versions</code> defining which version of the tools to use when running under the current directory:</li> </ul> <pre><code>cd tfs-ctrl/\nasdf local erlang 24.3.4.2\n</code></pre> <p>Erlang projects uses a build tool called rebar3. It is used to manager project dependenecies, compile a project and generate project releases.</p> <ul> <li>Install rebar3 localy from source:</li> </ul> <pre><code>cd ~\ngit clone https://github.com/erlang/rebar3.git\ncd rebar3\nasdf local erlang 24.3.4.2\n./bootstrap\n./rebar3 local install\n</code></pre> <ul> <li>Update <code>~/.bashrc</code> to use rebar3 by adding this line at the end:</li> </ul> <pre><code>export PATH=$HOME/.cache/rebar3/bin:$PATH\n</code></pre> <ul> <li>Logout and log back in.</li> </ul>","text":""},{"location":"development_guide/development_guide/#216-kotlin","title":"2.1.6. Kotlin <p>This section describes the steps needed to establish a development environment for TFS (TeraFlowSDN) components implemented in Kotlin. Currently, the <code>Gateway</code> component stands as the sole component developed in Kotlin.</p> Install Kotlin <p> To begin, make sure that you have kotlin installed and its current version:</p> <pre><code>kotlin -version\n</code></pre> <p>If you don't have kotlin installed you will get an error like the following:</p> <pre><code>Command 'kotlin' not found, but can be installed with:\nsudo snap install --classic kotlin\n</code></pre> <p>In which case you should use the following command to install the correct version:</p> <pre><code> sudo snap install --classic kotlin\n</code></pre> <p>Currently, the recommended version is 1.6.21, which uses Java Runtime Environment (JRE) version 11.</p> Compiling and testing existing components <p> To compile a Kotlin project using Gradle, similarly to using the Maven wrapper (mvnw) for Java projects, you can use the Gradle wrapper (gradlew) within the root directory of your Kotlin component, specifically the gateway directory.</p> <p>Navigate to the gateway directory within your Kotlin project. Ensure that it contains the gradlew script along with the gradle directory. Then, create a directory named <code>proto</code> and move all the files with extension <code>.proto</code> in this way:</p> <pre><code>mkdir proto\ncp ../../../proto/*.proto ./proto \n</code></pre> <p>For building the application, open a terminal or command prompt, navigate to the gateway directory, and run the following command:</p> <pre><code>./gradlew build\n</code></pre> <p>The following program runs the gateway application:</p> <pre><code>./gradlew runServer \n</code></pre> New Kotlin TFS component <p></p> <p>Sample Project</p> <p>If you want to create a new TFS component written in Kotlin you could generate a Kotlin project using <code>gradle</code>. The recommended version is 7.1. Follow the following Gradle guide for its installation. For building the prokect follow this link instead.</p> <p>From inside the new project directory, run the init task using the following command in a terminal: <code>gradle init</code>. </p> <p>The output will look like this:</p> <pre><code>$ gradle init\n\nSelect type of project to generate:\n 1: basic\n 2: application\n 3: library\n 4: Gradle plugin\nEnter selection (default: basic) [1..4] 2\n\nSelect implementation language:\n 1: C++\n 2: Groovy\n 3: Java\n 4: Kotlin\n 5: Scala\n 6: Swift\nEnter selection (default: Java) [1..6] 4\n\nSelect build script DSL:\n 1: Groovy\n 2: Kotlin\nEnter selection (default: Groovy) [1..2] 1\n\nProject name (default: demo):\nSource package (default: demo):\n\n\nBUILD SUCCESSFUL\n2 actionable tasks: 2 executed\n</code></pre> <p>Initial setup</p> <p>The <code>gradle init</code> command generates the new project. </p> <p>First, ensure the protobuf files are copied from the root directory of the TFS SDN controller. Run the following command in the directory of the new project:</p> <pre><code>mkdir proto \ncp TFS/project/root/path/proto/*.proto ./proto/\n</code></pre> <p>The file <code>build.gradle.ktl</code> is fundamental as it manages dependencies. Adjust it for adding external libraries. </p> <p>Next you should create the following files:</p> <ol> <li><code>new-component/.gitlab-ci.yml</code></li> <li><code>new-component/Dockerfile</code></li> </ol> <p>We recommend leveraging the structures and configurations found in the files of existing components for inspiration.</p> <p>Docker Container This project operates with Docker containers. Ensure the production of the container version for your component. To generate the container version of the project, modify the 'new-component/Dockerfile.' Execute the following command from the project's root directory:</p> <pre><code>docker build -t new-image -f new-component/Dockerfile ./\n</code></pre>","text":""},{"location":"development_guide/development_guide/#22-configure-vscode","title":"2.2. Configure VScode","text":"Install VSCode and the required extensions <p>If not already done, install VSCode and the \"Remote SSH\" extension on your local machine, not in the VM.</p> <p>Note: \"Python\" extension is not required here. It will be installed later on the VSCode server running on the VM.</p> Configure the \"Remote SSH\" extension <p></p> <ul> <li>Go to left icon \"Remote Explorer\"</li> <li>Click the \"gear\" icon next to \"SSH TARGETS\" on top of \"Remote Explorer\" bar</li> <li>Choose to edit \"<...>/.ssh/config\" file (or equivalent)</li> <li>Add the following entry (assuming previous port forwarding configuration):</li> </ul> <pre><code>Host TFS-VM\n HostName 127.0.0.1\n Port 2200\n ForwardX11 no\n User tfs\n</code></pre> <ul> <li>Save the file</li> <li>An entry \"TFS-VM\" should appear on \"SSH TARGETS\".</li> </ul> Connect VSCode to the VM through \"Remote SSH\" extension <p></p> <ul> <li>Right-click on \"TFS-VM\"</li> <li>Select \"Connect to Host in Current Window\"</li> <li>Reply to the questions asked</li> <li>Platform of the remote host \"TFS-VM\": Linux</li> <li>\"TFS-VM\" has fingerprint \"\". Do you want to continue?: Continue <li>Type tfs user's password: tfs123</li> <li>You should be now connected to the TFS-VM.</li> <p>Note: if you get a connection error message, the reason might be due to wrong SSH server fingerprint. Edit file \"<...>/.ssh/known_hosts\" on your local user account, check if there is a line starting with \"[127.0.0.1]:2200\" (assuming previous port forwarding configuration), remove the entire line, save the file, and retry connection.</p> Add SSH key to prevent typing the password every time <p> This step creates an SSH key in the VM and installs it on the VSCode to prevent having to type the password every time.</p> <ul> <li>In VSCode (connected to the VM), click menu \"Terminal > New Terminal\"</li> <li>Run the following commands on the VM's terminal through VSCode</li> </ul> <pre><code>ssh-keygen -t rsa -b 4096 -f ~/.ssh/tfs-vm.key\n # leave password empty\nssh-copy-id -i ~/.ssh/tfs-vm.key.pub tfs@10.0.2.10\n # tfs@10.0.2.10's password: <type tfs user's password: tfs123>\nrm .ssh/known_hosts \n</code></pre> <ul> <li>In VSCode, click left \"Explorer\" panel to expand, if not expanded, and click \"Open Folder\" button.</li> <li>Choose \"/home/tfs/\"</li> <li>Type tfs user's password when asked</li> <li>Trust authors of the \"/home/tfs [SSH: TFS-VM]\" folder when asked</li> <li>Right click on the file \"tfs-vm.key\" in the file explorer</li> <li>Select \"Download...\" option</li> <li>Download the file into your user's accout \".ssh\" folder</li> <li> <p>Delete files \"tfs-vm.key\" and \"tfs-vm.key.pub\" on the TFS-VM.</p> </li> <li> <p>In VSCode, click left \"Remote Explorer\" panel to expand</p> </li> <li>Click the \"gear\" icon next to \"SSH TARGETS\" on top of \"Remote Explorer\" bar</li> <li>Choose to edit \"<...>/.ssh/config\" file (or equivalent)</li> <li>Find entry \"Host TFS-VM\" and update it as follows:</li> </ul> <pre><code>Host TFS-VM\n HostName 127.0.0.1\n Port 2200\n ForwardX11 no\n User tfs\n IdentityFile \"<path to the downloaded identity private key file>\"\n</code></pre> <ul> <li>Save the file</li> <li>From now, VSCode will use the identity file to connect to the TFS-VM instead of the user's password.</li> </ul> Install VSCode Python Extension (in VSCode server) <p> This step installs Python extensions in VSCode server running in the VM.</p> <ul> <li>In VSCode (connected to the VM), click left button \"Extensions\"</li> <li>Search \"Python\" extension in the extension Marketplace.</li> <li> <p>Install official \"Python\" extension released by Microsoft.</p> <ul> <li>By default, since you're connected to the VM, it will be installed in the VSCode server running in the VM.</li> </ul> </li> <li> <p>In VSCode (connected to the VM), click left button \"Explorer\"</p> </li> <li>Click \"Ctrl+Alt+P\" and type \"Python: Select Interpreter\". Select option \"Python: 3.9.13 64-bit ('tfs')\"</li> </ul> Define environment variables for VSCode <p> The source code in the TFS controller project is hosted in folder <code>src/</code>. To help VSCode find the Python modules and packages, add the following file into your working space root folder:</p> <pre><code>echo \"PYTHONPATH=./src\" >> ~/tfs-ctrl/.env\n</code></pre>"},{"location":"development_guide/development_guide/#23-develop-a-component-wip","title":"2.3. Develop A Component (WIP)","text":"<p>Page under construction</p>"},{"location":"testing/postman/","title":"Postman","text":"<p>In this section we can use Postman to publish an API as a provider and use it as an invoker.</p>"},{"location":"testing/postman/#requisites","title":"Requisites","text":"<ul> <li>We will need to have Node.js installed since we will use a small script to create the CSRs of the certificates.</li> <li>An instance of CAPIF (If it is not local, certain variables would have to be modified both in the Node.js script and in the Postman environment variables).</li> </ul>"},{"location":"testing/postman/#first-steps","title":"First steps","text":"<ol> <li>Install the Node dependencies package.json to run the script with:</li> </ol> <pre><code>npm i\n</code></pre> <ol> <li>Run the script.js with the following command:</li> </ol> <pre><code>node script.js\n</code></pre> <ol> <li>Import Postman collection and environment variables (CAPIF.postman_collection.json and CAPIF.postman_environment.json)</li> <li>Select CAPIF Environment before start testing.</li> </ol>"},{"location":"testing/postman/#remote-capif","title":"Remote CAPIF","text":"<p>If the CAPIF is not local, the host and port of both the CAPIF and the register would have to be specified in the variables, and the CAPIF_HOSTNAME in the script, necessary to obtain the server certificate.</p> <p>Enviroments in Postman</p> <pre><code>CAPIF_HOSTNAME capifcore\nCAPIF_PORT 8080\nREGISTER_HOSTNAME register\nREGISTER_PORT 8084\n</code></pre> <p>Const in script.js</p> <pre><code>CAPIF_HOSTNAME capifcore\n</code></pre>"},{"location":"testing/postman/#capif-flows","title":"CAPIF Flows","text":"<p>Once the first steps have been taken, we can now use Postman requests. These requests are numbered in the order that must be followed to obtain everything necessary from CAPIF.</p>"},{"location":"testing/postman/#creation-of-user-by-admin","title":"Creation of User by Admin","text":"<p>The first step would be for an administrator to create a user with which a provider and an invoker will be created. To do this, the admin must log in to obtain the token needed in admin requests.</p>"},{"location":"testing/postman/#01-login_admin","title":"01-Login_admin","text":""},{"location":"testing/postman/#02-creation-of-user","title":"02-Creation of User","text":""},{"location":"testing/postman/#publication-of-an-api","title":"Publication of an API","text":"<p>The next step is to register a provider using the user created by the administrator in order to publish an API.</p>"},{"location":"testing/postman/#03-getauth_provider","title":"03-getauth_provider","text":""},{"location":"testing/postman/#04-onboard_provider","title":"04-onboard_provider","text":"<p>At this point we move on to using certificate authentication in CAPIF. In Postman it is necessary to add the certificates manually and using more than one certificate for the same host as we do in CAPIF complicates things. For this reason, we use the script to overwrite a certificate and a key when it is necessary to have a specific one.</p> <p>To configure go to settings in Postman and open the certificates section. </p> <ul> <li>Here, activate the CA certificates option and add the ca_cert.pem file found in the Responses folder.</li> <li>Adds a client certificate specifying the CAPIF host being used and the files client_cert.crt and client_key.key in the Responses folder.</li> </ul> <p>Once this is done, the node script will be in charge of changing the certificate that is necessary in each request.</p>"},{"location":"testing/postman/#05-publish_api","title":"05-publish_api","text":"<p>Once the api is published, we can start it. In this case we have a test one created in python called hello_api.py that can be executed with the following command:</p> <pre><code>python3 hello_api.py\n</code></pre> <p>The API publication interface is set to localhost with port 8088, so the service must be set up locally. If you wanted to build it on another site, you would have to change the interface description in the body of publish_api.</p> <p>With this the provider part would be finished.</p>"},{"location":"testing/postman/#calling-the-api","title":"Calling the API","text":"<p>Finally, we will create an invoker with the user given by the administrator to be able to use the published api.</p>"},{"location":"testing/postman/#06-getauth_invoker","title":"06-getauth_invoker","text":""},{"location":"testing/postman/#07-onboard_invoker","title":"07-onboard_invoker","text":"<p>At this point we move on to using certificate authentication in CAPIF. If you did not configure the provider's certificates, you would have to do it now.</p>"},{"location":"testing/postman/#08-discover","title":"08-discover","text":""},{"location":"testing/postman/#09-security_context","title":"09-security_context","text":""},{"location":"testing/postman/#10-get_token","title":"10-get_token","text":""},{"location":"testing/postman/#11-call_service","title":"11-call_service","text":"<p>With this, we would have made the API call and finished the flow.</p>"},{"location":"testing/postman/#other-requests","title":"Other requests","text":"<p>Other requests that we have added are the following:</p> <ul> <li>offboard_provider Performs offboarding of the provider, thereby eliminating the published APIs.</li> <li>offboard_invoker Offboards the invoker, also eliminating access to the APIs of that invoker.</li> <li>remove_user Delete the user.</li> <li>refresh_admin_token Return a new access token to the admin.</li> </ul>"},{"location":"testing/postman/#notes","title":"Notes","text":"<ul> <li>This process is designed to teach how requests are made in Postman and the flow that should be followed to publish and use an API.</li> <li>It is possible that if external CAPIFs are used (Public CAPIF) the test data may already be used or the API already registered.</li> <li>It is necessary to have the Node service running to make the certificate change for the requests, otherwise it will not work.</li> <li>We are working on adding more requests to the Postman collection.</li> <li>This collection is a testing guide and is recommended for testing purposes only.</li> </ul>"},{"location":"testing/robotframework/","title":"Robot Framework","text":""},{"location":"testing/robotframework/#steps-to-test","title":"Steps to Test","text":"<p>To run any test locally you will need docker and docker-compose installed in order run services and execute test plan. Steps will be:</p> <ul> <li> <p>Run All Services: See section Run All CAPIF Services</p> </li> <li> <p>Run desired tests: At this point we have 2 options:</p> </li> <li> <p>Using helper script: Script Test Execution</p> </li> <li>Build robot docker image and execute manually robot docker: Manual Build And Test Execution</li> </ul>"},{"location":"testing/robotframework/#script-test-execution","title":"Script Test Execution","text":"<p>This script will build robot docker image if it's need and execute tests selected by \"include\" option. Just go to service folder, execute and follow steps.</p> <pre><code>./run_capif_tests.sh --include <TAG>\n</code></pre> <p>Results will be stored at /results <p>Please check parameters (include) under Test Execution at Manual Build And Test Execution.</p>"},{"location":"testing/robotframework/#mock-server","title":"Mock Server","text":"<p>Some tests on Test Plans require mockserver. That mock server must be deployed and reachable by Robot Framework and CCF under test.</p> <p>To run Mock Server locally you can just execute the next script:</p> <pre><code>cd services\n./run_mock_server.sh\n\nor\n./run.sh -s\n</code></pre> <p>If you want to launch only tests that not needed mockserver, just add \"--exclude mockserver\" parameter to robot execution:</p> <pre><code>./run_capif_tests.sh --include <TAG> --exclude mockserver\n</code></pre> <p>After run tests the Mock Server can be removed from local deployment:</p> <pre><code>./clean_mock_server.sh\n\nor\n./clean_capif_docker_services.sh -s\n</code></pre>"},{"location":"testing/robotframework/#manual-build-and-test-execution","title":"Manual Build And Test Execution","text":"<ul> <li>Build Robot docker image:</li> </ul> <pre><code>cd tools/robot\ndocker build . -t capif-robot-test:latest\n</code></pre> <ul> <li>Tests Execution:</li> </ul> <p>Execute all tests locally:</p> <pre><code><PATH_TO_REPOSITORY>=path in local machine to repository cloned.\n<PATH_RESULT_FOLDER>=path to a folder on local machine to store results of Robot Framework execution.\n<CAPIF_HOSTNAME>=Is the hostname set when run.sh is executed, by default it is capifcore.\n<CAPIF_HTTP_PORT>=This is the port to reach when robot framework want to reach CAPIF deployment using http, this should be set to port without TLS set on Nginx, 8080 by default.\n<CAPIF_HTTPS_PORT>=This is the port to be used when we want to use https connection, this should be set to port with TLS set on Nginx, 443 by default\n<CAPIF_REGISTER>=This is the hostname of register service deployed. By default it is register.\n<CAPIF_REGISTER_PORT>=This is the port to be used to reach register service deployed. By default it is 8084.\n<CAPIF_VAULT>=This is the hostname of vault service. By default it is vault.\n<CAPIF_VAULT_PORT>=This is the port to be used to reach vault service. By default it is 8200.\n<CAPIF_VAULT_TOKEN>=Vault token to be used on request through vault. By default it is \"read-ca-token\".\n<MOCK_SERVER_URL>=Setup Mock server url to be used in notifications at tests marked with mockserver tag. By default it is not set.\n\nTo execute all tests run :\ndocker run -ti --rm --network=\"host\" \\\n --add-host host.docker.internal:host-gateway \\\n --add-host vault:host-gateway \\\n --add-host register:host-gateway \\\n --add-host mock-server:host-gateway \\\n -v <PATH_TO_REPOSITORY>/tests:/opt/robot-tests/tests \\\n -v <PATH_RESULT_FOLDER>:/opt/robot-tests/results capif-robot-test:latest \\\n --variable CAPIF_HOSTNAME:$CAPIF_HOSTNAME \\\n --variable CAPIF_HTTP_PORT:$CAPIF_HTTP_PORT \\\n --variable CAPIF_HTTPS_PORT:$CAPIF_HTTPS_PORT \\\n --variable CAPIF_REGISTER:$CAPIF_REGISTER \\\n --variable CAPIF_REGISTER_PORT:$CAPIF_REGISTER_PORT \\\n --variable CAPIF_VAULT:$CAPIF_VAULT \\\n --variable CAPIF_VAULT_PORT:$CAPIF_VAULT_PORT \\\n --variable CAPIF_VAULT_TOKEN:$CAPIF_VAULT_TOKEN \\\n --variable MOCK_SERVER_URL:$MOCK_SERVER_URL \\\n --include all\n</code></pre> <p>Execute specific tests locally:</p> <pre><code>To run more specific tests, for example, only one functionality:\n<TAG>=Select one from list:\n \"capif_api_acl\",\n \"capif_api_auditing_service\",\n \"capif_api_discover_service\",\n \"capif_api_events\",\n \"capif_api_invoker_management\",\n \"capif_api_logging_service\",\n \"capif_api_provider_management\",\n \"capif_api_publish_service\",\n \"capif_security_api\n\nAnd Run:\ndocker run -ti --rm --network=\"host\" \\\n --add-host host.docker.internal:host-gateway \\\n --add-host vault:host-gateway \\\n --add-host register:host-gateway \\\n --add-host mock-server:host-gateway \\\n -v <PATH_TO_REPOSITORY>/tests:/opt/robot-tests/tests \\\n -v <PATH_RESULT_FOLDER>:/opt/robot-tests/results capif-robot-test:latest \\\n --variable CAPIF_HOSTNAME:$CAPIF_HOSTNAME \\\n --variable CAPIF_HTTP_PORT:$CAPIF_HTTP_PORT \\\n --variable CAPIF_HTTPS_PORT:$CAPIF_HTTPS_PORT \\\n --variable CAPIF_REGISTER:$CAPIF_REGISTER \\\n --variable CAPIF_REGISTER_PORT:$CAPIF_REGISTER_PORT \\\n --variable CAPIF_VAULT:$CAPIF_VAULT \\\n --variable CAPIF_VAULT_PORT:$CAPIF_VAULT_PORT \\\n --variable CAPIF_VAULT_TOKEN:$CAPIF_VAULT_TOKEN \\\n --variable MOCK_SERVER_URL:$MOCK_SERVER_URL \\\n --include <TAG>\n</code></pre>"},{"location":"testing/robotframework/#test-result-review","title":"Test result review","text":"<p>In order to Review results after tests, you can check general report at /report.html or if you need more detailed information /log.html, example: <ul> <li> <p>Report: </p> </li> <li> <p>Detailed information: </p> </li> </ul> <p>NOTE: If you need more detail at Robot Framework Logs you can set log level option just adding to command --loglevel DEBUG</p>"},{"location":"testing/testplan/","title":"Test Plan Index","text":"<p>List of Common API Services implemented:</p> <ul> <li>Common Operations</li> <li>Api Invoker Management</li> <li>Api Provider Management</li> <li>Api Publish Service</li> <li>Api Discover Service</li> <li>Api Events Service</li> <li>Api Security Service</li> <li>Api Logging Service</li> <li>Api Auditing Service</li> <li>Api Access Control Policy</li> </ul>"},{"location":"testing/testplan/api_access_control_policy/","title":"Test Plan for CAPIF Api Access Control Policy","text":"<p>At this documentation you will have all information and related files and examples of test plan for this API.</p>"},{"location":"testing/testplan/api_access_control_policy/#test-case-1-retrieve-acl","title":"Test Case 1: Retrieve ACL","text":"<p>Test ID: capif_api_acl-1</p> <p>Description:</p> <p>This test case will check that an API Provider can retrieve ACL from CAPIF</p> <p>Pre-Conditions:</p> <ul> <li>API Provider had a Service API Published on CAPIF</li> <li>API Invoker had a Security Context for Service API published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Provider at CCF.</li> <li>Publish a provider API with name service_1</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Provider Get ACL information.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform Invoker Onboarding store apiInvokerId</p> </li> <li>Discover published APIs</li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li> <p>Provider Retrieve ACL</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId}?aef-id=${aef_id}</li> <li>Use serviceApiId and aefId</li> <li>Use AEF Provider Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>ACL Response:<ol> <li>200 OK Response.</li> <li>body returned must accomplish AccessControlPolicyList data structure.</li> <li>apiInvokerPolicies must:<ol> <li>contain only one object.</li> <li>apiInvokerId must match apiInvokerId registered previously.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_access_control_policy/#test-case-2-retrieve-acl-with-2-service-apis-published","title":"Test Case 2: Retrieve ACL with 2 Service APIs published","text":"<p>Test ID: capif_api_acl-2</p> <p>Description:</p> <p>This test case will check that an API Provider can retrieve ACL from CAPIF for 2 different serviceApis published.</p> <p>Pre-Conditions:</p> <ul> <li>API Provider had two Service API Published on CAPIF</li> <li>API Invoker had a Security Context for both Service APIs published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Provider at CCF.</li> <li>Publish a provider API with name service_1 and service_2</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Provider Get ACL information for service_1.</li> <li>Provider Get ACL information for service_2.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_2</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform Invoker Onboarding store apiInvokerId</p> </li> <li>Discover published APIs</li> <li> <p>Create Security Context for this Invoker for both published APIs</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li> <p>Provider Retrieve ACL for serviceApiId1</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId1}?aef-id=${aef_id}</li> <li>Use serviceApiId and aefId</li> <li>Use AEF Provider Certificate</li> </ul> </li> <li> <p>Provider Retrieve ACL for serviceApiId2</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId2}?aef-id=${aef_id}</li> <li>Use serviceApiId and aefId</li> <li>Use AEF Provider Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>ACL Response:<ol> <li>200 OK Response.</li> <li>body returned must accomplish AccessControlPolicyList data structure.</li> <li>apiInvokerPolicies must:<ol> <li>contain one object.</li> <li>apiInvokerId must match apiInvokerId registered previously.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_access_control_policy/#test-case-3-retrieve-acl-with-security-context-created-by-two-different-invokers","title":"Test Case 3: Retrieve ACL with security context created by two different Invokers","text":"<p>Test ID: capif_api_acl-3</p> <p>Description:</p> <p>This test case will check that an API Provider can retrieve ACL from CAPIF containing 2 objects.</p> <p>Pre-Conditions:</p> <ul> <li>API Provider had a Service API Published on CAPIF</li> <li>Two API Invokers had a Security Context for same Service API published by provider.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Provider at CCF.</li> <li>Publish a provider API with name service_1 and service_2</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Provider Get ACL information.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform Invoker Onboarding store apiInvokerId</p> </li> <li>Discover published APIs</li> <li> <p>Create Security Context for this Invoker for both published APIs</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li> <p>Repeat previous 3 steps in order to have a new Invoker.</p> </li> <li> <p>Provider Retrieve ACL for serviceApiId</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId1}?aef-id=${aef_id}</li> <li>Use serviceApiId and aefId</li> <li>Use AEF Provider Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>ACL Response:<ol> <li>200 OK Response.</li> <li>body returned must accomplish AccessControlPolicyList data structure.</li> <li>apiInvokerPolicies must:<ol> <li>Contain two objects.</li> <li>One object must match with apiInvokerId1 and the other one with apiInvokerId2 an registered previously.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_access_control_policy/#test-case-4-retrieve-acl-filtered-by-api-invoker-id","title":"Test Case 4: Retrieve ACL filtered by api-invoker-id","text":"<p>Test ID: capif_api_acl-4</p> <p>Description:</p> <p>This test case will check that an API Provider can retrieve ACL filtering by apiInvokerId from CAPIF containing 1 objects.</p> <p>Pre-Conditions:</p> <ul> <li>API Provider had a Service API Published on CAPIF</li> <li>Two API Invokers had a Security Context for same Service API published by provider.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Provider at CCF.</li> <li>Publish a provider API with name service_1 and service_2</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Provider Get ACL information with query parameter indicating first api-invoker-id.</li> <li>Provider Get ACL information with query parameter indicating second api-invoker-id.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform Invoker Onboarding store apiInvokerId</p> </li> <li>Discover published APIs</li> <li> <p>Create Security Context for this Invoker for both published APIs</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li> <p>Repeat previous 3 steps in order to have a new Invoker.</p> </li> <li> <p>Provider Retrieve ACL for serviceApiId1</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId}?aef-id=${aef_id}&api-invoker-id={apiInvokerId1}</li> <li>Use serviceApiId, aefId and apiInvokerId1</li> <li>Use AEF Provider Certificate</li> </ul> </li> <li> <p>Provider Retrieve ACL for serviceApiId2</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId}?aef-id=${aef_id}&api-invoker-id={apiInvokerId2}</li> <li>Use serviceApiId, aefId and apiInvokerId2</li> <li>Use AEF Provider Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>ACL Response:</p> <ol> <li>200 OK Response.</li> <li>body returned must accomplish AccessControlPolicyList data structure.</li> <li>apiInvokerPolicies must:<ol> <li>Contain one objects.</li> <li>Object must match with apiInvokerId1.</li> </ol> </li> </ol> </li> <li> <p>ACL Response:</p> <ol> <li>200 OK Response.</li> <li>body returned must accomplish AccessControlPolicyList data structure.</li> <li>apiInvokerPolicies must:<ol> <li>Contain one objects.</li> <li>Object must match with apiInvokerId2.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_access_control_policy/#test-case-5-retrieve-acl-filtered-by-supported-features","title":"Test Case 5: Retrieve ACL filtered by supported-features","text":"<p>Test ID: capif_api_acl-5</p> <p>Description:</p> <p>CURRENTLY NOT SUPPORTED FEATURE</p> <p>This test case will check that an API Provider can retrieve ACL filtering by supportedFeatures from CAPIF containing 1 objects.</p> <p>Pre-Conditions:</p> <ul> <li>API Provider had a Service API Published on CAPIF</li> <li>Two API Invokers had a Security Context for same Service API published by provider.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Provider at CCF.</li> <li>Publish a provider API with name service_1 and service_2</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Provider Get ACL information with query parameter indicating first supported-features.</li> <li>Provider Get ACL information with query parameter indicating second supported-features.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform Invoker Onboarding store apiInvokerId</p> </li> <li>Discover published APIs</li> <li> <p>Create Security Context for this Invoker for both published APIs</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li> <p>Repeat previous 3 steps in order to have a new Invoker.</p> </li> <li> <p>Provider Retrieve ACL for serviceApiId</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId1}?aef-id=${aef_id}&supported-features={apiInvokerId1}</li> <li>Use serviceApiId, aefId and apiInvokerId1</li> <li>Use AEF Provider Certificate</li> </ul> </li> <li> <p>Provider Retrieve ACL for serviceApiId</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId1}?aef-id=${aef_id}&supported-features={apiInvokerId2}</li> <li>Use serviceApiId, aefId and apiInvokerId2</li> <li>Use AEF Provider Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>ACL Response:</p> <ol> <li>200 OK Response.</li> <li>body returned must accomplish AccessControlPolicyList data structure.</li> <li>apiInvokerPolicies must:<ol> <li>Contain one objects.</li> <li>Object must match with supportedFeatures1.</li> </ol> </li> </ol> </li> <li> <p>ACL Response:</p> <ol> <li>200 OK Response.</li> <li>body returned must accomplish AccessControlPolicyList data structure.</li> <li>apiInvokerPolicies must:<ol> <li>Contain one objects.</li> <li>Object must match with supportedFeatures1.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_access_control_policy/#test-case-6-retrieve-acl-with-aef-id-not-valid","title":"Test Case 6: Retrieve ACL with aef-id not valid","text":"<p>Test ID: capif_api_acl-6</p> <p>Description:</p> <p>This test case will check that an API Provider can't retrieve ACL from CAPIF if aef-id is not valid</p> <p>Pre-Conditions:</p> <ul> <li>API Provider had a Service API Published on CAPIF</li> <li>API Invoker had a Security Context for Service API published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Provider at CCF.</li> <li>Publish a provider API with name service_1</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Provider Get ACL information.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform Invoker Onboarding store apiInvokerId</p> </li> <li>Discover published APIs</li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li> <p>Provider Retrieve ACL</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId}?aef-id=${AEF_ID_NOT_VALID}</li> <li>Use serviceApiId and AEF_ID_NOT_VALID</li> <li>Use AEF Provider Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>ACL Response:<ol> <li>404 Not Found Response.</li> <li>body returned must accomplish Problem Details data structure.</li> <li>apiInvokerPolicies must:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"No ACLs found for the requested service: {service_api_id}, aef_id: {aef_id}, invoker: {api_invoker_id} and supportedFeatures: {supported_features}\".</li> <li>cause with message \"Wrong id\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_access_control_policy/#test-case-7-retrieve-acl-with-service-id-not-valid","title":"Test Case 7: Retrieve ACL with service-id not valid","text":"<p>Test ID: capif_api_acl-7</p> <p>Description:</p> <p>This test case will check that an API Provider can't retrieve ACL from CAPIF if service-api-id is not valid</p> <p>Pre-Conditions:</p> <ul> <li>API Provider had a Service API Published on CAPIF</li> <li>API Invoker had a Security Context for Service API published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Provider at CCF.</li> <li>Publish a provider API with name service_1</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Provider Get ACL information.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform Invoker Onboarding store apiInvokerId</p> </li> <li>Discover published APIs</li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li> <p>Provider Retrieve ACL</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${NOT_VALID_SERVICE_API_ID}?aef-id=${aef_id}</li> <li>Use NOT_VALID_SERVICE_API_ID and aef_id</li> <li>Use AEF Provider Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>ACL Response:<ol> <li>404 Not Found Response.</li> <li>body returned must accomplish Problem Details data structure.</li> <li>apiInvokerPolicies must:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"No ACLs found for the requested service: {service_api_id}, aef_id: {aef_id}, invoker: {api_invoker_id} and supportedFeatures: {supported_features}\".</li> <li>cause with message \"Wrong id\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_access_control_policy/#test-case-8-retrieve-acl-with-service-api-id-and-aef-id-not-valid","title":"Test Case 8: Retrieve ACL with service-api-id and aef-id not valid","text":"<p>Test ID: capif_api_acl-8</p> <p>Description:</p> <p>This test case will check that an API Provider can't retrieve ACL from CAPIF if service-api-id and aef-id are not valid</p> <p>Pre-Conditions:</p> <ul> <li>API Provider had a Service API Published on CAPIF</li> <li>API Invoker had a Security Context for Service API published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Provider at CCF.</li> <li>Publish a provider API with name service_1</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Provider Get ACL information.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform Invoker Onboarding store apiInvokerId</p> </li> <li>Discover published APIs</li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li> <p>Provider Retrieve ACL</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${NOT_VALID_SERVICE_API_ID}?aef-id=${AEF_ID_NOT_VALID}</li> <li>Use NOT_VALID_SERVICE_API_ID and aef_id</li> <li>Use AEF Provider Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>ACL Response:<ol> <li>404 Not Found Response.</li> <li>body returned must accomplish Problem Details data structure.</li> <li>apiInvokerPolicies must:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"No ACLs found for the requested service: {NOT_VALID_SERVICE_API_ID}, aef_id: {AEF_ID_NOT_VALID}, invoker: {api_invoker_id} and supportedFeatures: {supported_features}\".</li> <li>cause with message \"Wrong id\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_access_control_policy/#test-case-9-retrieve-acl-without-securitycontext-created-previously-by-invoker","title":"Test Case 9: Retrieve ACL without SecurityContext created previously by Invoker","text":"<p>Test ID: capif_api_acl-9</p> <p>Description:</p> <p>This test case will check that an API Provider can't retrieve ACL if no invoker had requested Security Context to CAPIF</p> <p>Pre-Conditions:</p> <ul> <li>API Provider had a Service API Published on CAPIF</li> <li>API Invoker created but no Security Context for Service API published had been requested.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Provider at CCF.</li> <li>Publish a provider API with name service_1</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Provider Get ACL information.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform Invoker Onboarding store apiInvokerId</p> </li> <li> <p>Discover published APIs</p> </li> <li> <p>Provider Retrieve ACL</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId}?aef-id=${aef_id}</li> <li>Use serviceApiId and aefId</li> <li>Use AEF Provider Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>ACL Response:<ol> <li>404 Not Found Response.</li> <li>body returned must accomplish Problem Details data structure.</li> <li>apiInvokerPolicies must:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"No ACLs found for the requested service: {NOT_VALID_SERVICE_API_ID}, aef_id: {AEF_ID_NOT_VALID}, invoker: {api_invoker_id} and supportedFeatures: {supported_features}\".</li> <li>cause with message \"Wrong id\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_access_control_policy/#test-case-10-retrieve-acl-filtered-by-api-invoker-id-not-present","title":"Test Case 10: Retrieve ACL filtered by api-invoker-id not present","text":"<p>Test ID: capif_api_acl-10</p> <p>Description:</p> <p>This test case will check that an API Provider get not found response if filter by not valid api-invoker-id doesn't match any registered ACL.</p> <p>Pre-Conditions:</p> <ul> <li>API Provider had a Service API Published on CAPIF</li> <li>API Invoker had a Security Context for Service API published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Provider at CCF.</li> <li>Publish a provider API with name service_1</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Provider Get ACL information.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform Invoker Onboarding store apiInvokerId</p> </li> <li>Discover published APIs</li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li> <p>Provider Retrieve ACL</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId}?aef-id=${aef_id}&api-invoker-id={NOT_VALID_API_INVOKER_ID}</li> <li>Use serviceApiId, aefId and NOT_VALID_API_INVOKER_ID</li> <li>Use AEF Provider Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>ACL Response:<ol> <li>404 Not Found Response.</li> <li>body returned must accomplish Problem Details data structure.</li> <li>apiInvokerPolicies must:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"No ACLs found for the requested service: {NOT_VALID_SERVICE_API_ID}, aef_id: {AEF_ID_NOT_VALID}, invoker: {api_invoker_id} and supportedFeatures: {supported_features}\".</li> <li>cause with message \"Wrong id\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_access_control_policy/#test-case-11-retrieve-acl-with-apf-certificate","title":"Test Case 11: Retrieve ACL with APF Certificate","text":"<p>Test ID: capif_api_acl-11</p> <p>Description:</p> <p>This test case will check that an API Provider can't retrieve ACL from CAPIF using APF Certificate</p> <p>Pre-Conditions:</p> <ul> <li>API Provider had a Service API Published on CAPIF</li> <li>API Invoker had a Security Context for Service API published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Provider at CCF.</li> <li>Publish a provider API with name service_1</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Provider Get ACL information.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform Invoker Onboarding store apiInvokerId</p> </li> <li>Discover published APIs</li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li> <p>Provider Retrieve ACL</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId}?aef-id=${aef_id}</li> <li>Use serviceApiId and aefId</li> <li>Use APF Provider Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Logging Service must accomplish:<ol> <li>401 Unauthorized</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"Role not authorized for this API route\".</li> <li>cause with message \"Certificate not authorized\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_access_control_policy/#test-case-12-retrieve-acl-with-amf-certificate","title":"Test Case 12: Retrieve ACL with AMF Certificate","text":"<p>Test ID: capif_api_acl-12</p> <p>Description:</p> <p>This test case will check that an API Provider can't retrieve ACL from CAPIF using AMF Certificate</p> <p>Pre-Conditions:</p> <ul> <li>API Provider had a Service API Published on CAPIF</li> <li>API Invoker had a Security Context for Service API published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Provider at CCF.</li> <li>Publish a provider API with name service_1</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Provider Get ACL information.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform Invoker Onboarding store apiInvokerId</p> </li> <li>Discover published APIs</li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li> <p>Provider Retrieve ACL</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId}?aef-id=${aef_id}</li> <li>Use serviceApiId and aefId</li> <li>Use AMF Provider Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Logging Service must accomplish:<ol> <li>401 Unauthorized</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"Role not authorized for this API route\".</li> <li>cause with message \"Certificate not authorized\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_access_control_policy/#test-case-13-retrieve-acl-with-invoker-certificate","title":"Test Case 13: Retrieve ACL with Invoker Certificate","text":"<p>Test ID: capif_api_acl-13</p> <p>Description:</p> <p>This test case will check that an API Provider can't retrieve ACL from CAPIF using Invoker Certificate</p> <p>Pre-Conditions:</p> <ul> <li>API Provider had a Service API Published on CAPIF</li> <li>API Invoker had a Security Context for Service API published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Provider at CCF.</li> <li>Publish a provider API with name service_1</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Provider Get ACL information.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform Invoker Onboarding store apiInvokerId</p> </li> <li>Discover published APIs</li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li> <p>Provider Retrieve ACL</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId}?aef-id=${aef_id}</li> <li>Use serviceApiId and aefId</li> <li>Use Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Logging Service must accomplish:<ol> <li>401 Unauthorized</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"Role not authorized for this API route\".</li> <li>cause with message \"Certificate not authorized\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_access_control_policy/#test-case-14-no-acl-for-invoker-after-be-removed","title":"Test Case 14: No ACL for invoker after be removed","text":"<p>Test ID: capif_api_acl-14</p> <p>Description:</p> <p>This test case will check that ACLs are removed after invoker is removed.</p> <p>Pre-Conditions:</p> <ul> <li>API Provider had a Service API Published on CAPIF</li> <li>API Invoker had a Security Context for Service API published and ACL is present</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Provider at CCF.</li> <li>Publish a provider API with name service_1</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Provider Get ACL information of invoker.</li> <li>Remove Invoker from CAPIF.</li> <li>Provider Get ACL information of invoker.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform Invoker Onboarding store apiInvokerId</p> </li> <li>Discover published APIs</li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li> <p>Provider Retrieve ACL</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId}?aef-id=${aef_id}&api-invoker-id={api-invoker-id}</li> <li>Use serviceApiId, aefId and api-invoker-id</li> <li>Use AEF Provider Certificate</li> </ul> </li> <li>Remove Invoker from CAPIF</li> <li>Provider Retrieve ACL<ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId}?aef-id=${aef_id}&api-invoker-id={api-invoker-id}</li> <li>Use serviceApiId, aefId and api-invoker-id</li> <li>Use AEF Provider Certificate</li> </ul> </li> </ol> <p>Expected Result: 1. ACL Response: 1. 200 OK Response. 2. body returned must accomplish AccessControlPolicyList data structure. 3. apiInvokerPolicies must: 1. contain only one object. 2. apiInvokerId must match apiInvokerId registered previously.</p> <ol> <li>ACL Response:<ol> <li>404 Not Found Response.</li> <li>body returned must accomplish Problem Details data structure.</li> <li>apiInvokerPolicies must:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"No ACLs found for the requested service: {NOT_VALID_SERVICE_API_ID}, aef_id: {AEF_ID_NOT_VALID}, invoker: None and supportedFeatures: None\".</li> <li>cause with message \"Wrong id\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_auditing_service/","title":"Test Plan for CAPIF Api Auditing Service","text":"<p>At this documentation you will have all information and related files and examples of test plan for this API.</p>"},{"location":"testing/testplan/api_auditing_service/#test-case-1-get-capif-log-entry","title":"Test Case 1: Get CAPIF Log Entry.","text":"<p>Test ID: capif_api_auditing-1</p> <p>Description:</p> <p>This test case will check that a CAPIF AMF can get log entry to Logging Service</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF provider is pre-authorised (has valid AMF cert from CAPIF Authority)</li> <li>Service exist in CAPIF</li> <li>Invoker exist in CAPIF</li> <li>Log Entry exist in CAPIF</li> </ul> <p>Execution Steps: 1. Register Provider and Invoker CCF 2. Publish Service 3. Create Log Entry 4. Get Log Entry</p> <p>Information of Test:</p> <ol> <li> <p>Perform provider onboarding, invoker onboarding </p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Create Log Entry:</p> <ul> <li>Send POST to https://{CAPIF_HOSTNAME}/api-invocation-logs/v1/{aefId}/logs</li> <li>body log entry request body</li> <li>Use AEF Certificate</li> </ul> </li> <li> <p>Get Log:</p> <ol> <li>Send GET to https://{CAPIF_HOSTNAME}/logs/v1/apiInvocationLogs?aef-id={aefId}&api-invoker-id={api-invoker-id}</li> <li>Use AMF Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Logging Service must accomplish:<ol> <li>200 OK</li> <li>Response Body must follow InvocationLog data structure with:<ul> <li>aefId</li> <li>apiInvokerId</li> <li>logs</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_auditing_service/#test-case-2-get-capif-log-entry-with-no-log-entry-in-capif","title":"Test Case 2: Get CAPIF Log Entry With no Log entry in CAPIF.","text":"<p>Test ID: capif_api_auditing-2</p> <p>Description:</p> <p>This test case will check that a CAPIF AEF can create log entry to Logging Service</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF provider is pre-authorised (has valid AMF cert from CAPIF Authority)</li> <li>Service exist in CAPIF</li> <li>Invoker exist in CAPIF</li> </ul> <p>Execution Steps: 1. Register Provider and Invoker CCF 2. Publish Service 3. Get Log Entry</p> <p>Information of Test:</p> <ol> <li> <p>Perform provider onboarding, invoker onboarding </p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Get Log:</p> <ol> <li>Send GET to https://{CAPIF_HOSTNAME}/logs/v1/apiInvocationLogs?aef-id={aefId}&api-invoker-id={api-invoker-id}</li> <li>Use AMF Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Logging Service must accomplish:<ol> <li>404 Not Found</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>title with message \"Not Found Log Entry in CAPIF\".</li> <li>cause with message \"Not Exist Logs with the filters applied\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_auditing_service/#test-case-3-get-capif-log-entry-without-aef-id-and-api-invoker-id","title":"Test Case 3: Get CAPIF Log Entry without aef-id and api-invoker-id.","text":"<p>Test ID: capif_api_auditing-3</p> <p>Description:</p> <p>This test case will check that a CAPIF AEF can create log entry to Logging Service</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF provider is no pre-authorised (has no valid AMF cert from CAPIF Authority)</li> <li>Service exist in CAPIF</li> <li>Invoker exist in CAPIF</li> <li>Log Entry exist in CAPIF</li> </ul> <p>Execution Steps: 1. Register Provider and Invoker CCF 2. Publish Service 3. Create Log Entry 4. Get Log Entry</p> <p>Information of Test:</p> <ol> <li> <p>Perform provider onboarding, invoker onboarding </p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Create Log Entry:</p> <ul> <li>Send POST to https://{CAPIF_HOSTNAME}/api-invocation-logs/v1/{aefId}/logs</li> <li>body log entry request body</li> <li>Use AEF Certificate</li> </ul> </li> <li> <p>Get Log:</p> <ol> <li>Send GET to https://{CAPIF_HOSTNAME}/logs/v1/apiInvocationLogs</li> <li>Use AMF Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Logging Service must accomplish:<ol> <li>400 Bad Request</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 400</li> <li>title with message \"Bad Request\"</li> <li>detail with message \"aef_id and api_invoker_id parameters are mandatory\".</li> <li>cause with message \"Mandatory parameters missing\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_auditing_service/#test-case-4-get-capif-log-entry-with-filtter-api-version","title":"Test Case 4: Get CAPIF Log Entry with filtter api-version.","text":"<p>Test ID: capif_api_auditing-4</p> <p>Description:</p> <p>This test case will check that a CAPIF AMF can get log entry to Logging Service</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF provider is pre-authorised (has valid AMF cert from CAPIF Authority)</li> <li>Service exist in CAPIF</li> <li>Invoker exist in CAPIF</li> <li>Log Entry exist in CAPIF</li> </ul> <p>Execution Steps: 1. Register Provider and Invoker CCF 2. Publish Service 3. Create Log Entry 4. Get Log Entry</p> <p>Information of Test:</p> <ol> <li> <p>Perform provider onboarding, invoker onboarding </p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Create Log Entry:</p> <ul> <li>Send POST to https://{CAPIF_HOSTNAME}/api-invocation-logs/v1/{aefId}/logs</li> <li>body log entry request body</li> <li>Use AEF Certificate</li> </ul> </li> <li> <p>Get Log:</p> <ol> <li>Send GET to https://{CAPIF_HOSTNAME}/logs/v1/apiInvocationLogs?aef-id={aefId}&api-invoker-id={api-invoker-id}&api-version={v1}</li> <li>Use AMF Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Logging Service must accomplish:<ol> <li>200 OK</li> <li>Response Body must follow InvocationLog data structure with:<ul> <li>aefId</li> <li>apiInvokerId</li> <li>logs</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_auditing_service/#test-case-5-get-capif-log-entry-with-filter-api-version-but-not-exist-in-log-entry","title":"Test Case 5: Get CAPIF Log Entry with filter api-version but not exist in log entry.","text":"<p>Test ID: capif_api_auditing-4</p> <p>Description:</p> <p>This test case will check that a CAPIF AMF can get log entry to Logging Service</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF provider is pre-authorised (has valid AMF cert from CAPIF Authority)</li> <li>Service exist in CAPIF</li> <li>Invoker exist in CAPIF</li> <li>Log Entry exist in CAPIF</li> </ul> <p>Execution Steps: 1. Register Provider and Invoker CCF 2. Publish Service 3. Create Log Entry 4. Get Log Entry</p> <p>Information of Test:</p> <ol> <li> <p>Perform provider onboarding, invoker onboarding </p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Create Log Entry:</p> <ul> <li>Send POST to https://{CAPIF_HOSTNAME}/api-invocation-logs/v1/{aefId}/logs</li> <li>body log entry request body</li> <li>Use AEF Certificate</li> </ul> </li> <li> <p>Get Log:</p> <ol> <li>Send GET to https://{CAPIF_HOSTNAME}/logs/v1/apiInvocationLogs?aef-id={aefId}&api-invoker-id={api-invoker-id}&api-version={v58}</li> <li>Use AMF Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Logging Service must accomplish:<ol> <li>404 Not Found</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>detail with message \"Parameters do not match any log entry\"</li> <li>cause with message \"No logs found\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_discover_service/","title":"Test Plan for CAPIF Discover Service","text":"<p>At this documentation you will have all information and related files and examples of test plan for this API.</p>"},{"location":"testing/testplan/api_discover_service/#test-case-1-discover-published-service-apis-by-authorised-api-invoker","title":"Test Case 1: Discover Published service APIs by Authorised API Invoker","text":"<p>Test ID: capif_api_discover_service-1</p> <p>Description:</p> <p>This test case will check if Network App (Invoker) can discover published service APIs.</p> <p>Pre-Conditions:</p> <ul> <li>Service APIs are published.</li> <li>Network App was registered previously</li> <li>Network App was onboarded previously with {onboardingId}</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API at CCF</li> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Discover Service APIs by Invoker</li> </ol> <p>Information of Test:</p> <ol> <li>Perform Provider Registration and Invoker Onboarding</li> <li>Publish Service API at CCF:<ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li>Request Discover Published APIs:<ul> <li>Send GET to https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}</li> <li>Param api-invoker-id is mandatory</li> <li>Use Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Publish request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiId</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId}</li> </ol> </li> <li> <p>Response to Onboard request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li>Response to Discover Request By Invoker:<ol> <li>200 OK response.</li> <li>Response body must follow DiscoveredAPIs data structure:<ul> <li>Check if DiscoveredAPIs contains the API Published previously</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_discover_service/#test-case-2-discover-published-service-apis-by-non-authorised-api-invoker","title":"Test Case 2: Discover Published service APIs by Non Authorised API Invoker","text":"<p>Test ID: capif_api_discover_service-2</p> <p>Description:</p> <p>This test case will check that an API Publisher can't discover published APIs because is not authorized.</p> <p>Pre-Conditions:</p> <ul> <li>Service APIs are published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API at CCF</li> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Discover Service APIs by no invoker entity</li> </ol> <p>Information of Test:</p> <ol> <li>Perform Provider Registration and Invoker Onboarding</li> <li>Publish Service API at CCF:<ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li>Request Discover Published APIs by no invoker entity:<ul> <li>Send GET to https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}</li> <li>Param api-invoker-id is mandatory</li> <li>Use not Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Publish request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiId</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId}</li> </ol> </li> <li> <p>Response to Onboard request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li> <p>Response to Discover Request By no invoker entity:</p> <ol> <li>401 Unauthorized</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"User not authorized\".</li> <li>cause with message \"Certificate not authorized\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_discover_service/#test-case-3-discover-published-service-apis-by-not-registered-api-invoker","title":"Test Case 3: Discover Published service APIs by not registered API Invoker","text":"<p>Test ID: capif_api_discover_service-3</p> <p>Description:</p> <p>This test case will check that a not registered invoker is forbidden to discover published APIs.</p> <p>Pre-Conditions:</p> <ul> <li>Service APIs are published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API at CCF</li> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Discover Service APIs by Publisher</li> </ol> <p>Information of Test:</p> <ol> <li>Perform Provider Registration and Invoker Onboarding</li> <li>Publish Service API at CCF:<ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li>Request Discover Published APIs with not valid apiInvoker:<ul> <li>Send GET to https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={INVOKER_NOT_REGISTERED}</li> <li>Param api-invoker-id is mandatory</li> <li>Using Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Publish request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiId</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId}</li> </ol> </li> <li> <p>Response to Onboard request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li> <p>Response to Discover Request By Invoker:</p> <ol> <li>404 Not Found</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"API Invoker does not exist\".</li> <li>cause with message \"API Invoker id not found\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_discover_service/#test-case-4-discover-published-service-apis-by-registered-api-invoker-with-1-result-filtered","title":"Test Case 4: Discover Published service APIs by registered API Invoker with 1 result filtered","text":"<p>Test ID: capif_api_discover_service-4</p> <p>Description:</p> <p>This test case will check if Network App (Invoker) can discover published service APIs.</p> <p>Pre-Conditions:</p> <ul> <li>At least 2 Service APIs are published.</li> <li>Network App was registered previously</li> <li>Network App was onboarded previously with {onboardingId}</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API service_1 and service_2 at CCF</li> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Discover Service APIs by Invoker.</li> <li>Discover filtered by api-name service_1 Service APIs by Invoker</li> </ol> <p>Information of Test:</p> <ol> <li>Perform Provider Registration and Invoker Onboarding</li> <li>Publish Service API at CCF:<ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li>Publish Service API at CCF:<ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_2</li> <li>Use APF Certificate</li> </ul> </li> <li>Request Discover Published APIs filtering by api-name:<ul> <li>Send GET to ccf_discover_url https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}&api-name=service_1**</li> <li>Param api-invoker-id is mandatory</li> <li>Using Invoker Certificate</li> <li>filter by api-name service_1</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Publish request must accomplish:<ol> <li>201 Created</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiId</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId}</li> </ol> </li> <li>Response to Onboard request must accomplish:<ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li>Response to Discover Request By Invoker:<ol> <li>200 OK response.</li> <li>Response body must follow DiscoveredAPIs data structure:<ul> <li>Check if DiscoveredAPIs contains previously registered Service APIs published.</li> </ul> </li> </ol> </li> <li>Response to Discover Request By Invoker:<ol> <li>200 OK response.</li> <li>Response body must follow DiscoveredAPIs data structure:<ul> <li>Check if DiscoveredAPIs contains only Service API published with api-name service_1</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_discover_service/#test-case-5-discover-published-service-apis-by-registered-api-invoker-filtered-with-no-match","title":"Test Case 5: Discover Published service APIs by registered API Invoker filtered with no match","text":"<p>Test ID: capif_api_discover_service-5</p> <p>Description:</p> <p>This test case will check if Network App (Invoker) can discover published service APIs.</p> <p>Pre-Conditions:</p> <ul> <li>At least 2 Service APIs are published.</li> <li>Network App was registered previously</li> <li>Network App was onboarded previously with {onboardingId}</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API service_1 and service_2 at CCF</li> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Discover Service APIs by Invoker.</li> <li>Discover filtered by api-name not published Service APIs by Invoker</li> </ol> <p>Information of Test:</p> <ol> <li>Perform Provider Registration and Invoker Onboarding</li> <li>Publish Service API at CCF:<ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li>Publish Service API at CCF:<ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_2</li> <li>Use APF Certificate</li> </ul> </li> <li>Request Discover Published APIs filtering by api-name not published:<ul> <li>Send GET to ccf_discover_url https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}&api-name=NOT_VALID_NAME</li> <li>Param api-invoker-id is mandatory</li> <li>Using Invoker Certificate</li> <li>filter by api-name NOT_VALID_NAME</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Publish request must accomplish:<ol> <li>201 Created</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiId</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId}</li> </ol> </li> <li>Response to Onboard request must accomplish:<ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li>Response to Discover Request By Invoker:<ol> <li>200 OK response.</li> <li>Response body must follow DiscoveredAPIs data structure:<ul> <li>Check if DiscoveredAPIs contains previously registered Service APIs published.</li> </ul> </li> </ol> </li> <li>Response to Discover Request By Invoker:<ol> <li>404 Not Found response.</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"API Invoker {api_invoker_id} has no API Published that accomplish filter conditions\".</li> <li>cause with message \"No API Published accomplish filter conditions\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_discover_service/#test-case-6-discover-published-service-apis-by-registered-api-invoker-not-filtered","title":"Test Case 6: Discover Published service APIs by registered API Invoker not filtered","text":"<p>Test ID: capif_api_discover_service-6</p> <p>Description:</p> <p>This test case will check if Network App (Invoker) can discover published service APIs.</p> <p>Pre-Conditions:</p> <ul> <li>2 Service APIs are published.</li> <li>Network App was registered previously</li> <li>Network App was onboarded previously with {onboardingId}</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API service_1 and service_2 at CCF</li> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Discover Service APIs by Invoker.</li> <li>Discover without filter by Invoker</li> </ol> <p>Information of Test:</p> <ol> <li>Perform Provider Registration and Invoker Onboarding</li> <li>Publish Service API at CCF:<ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li>Publish Service API at CCF:<ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_2</li> <li>Use APF Certificate</li> </ul> </li> <li>Request Discover Published APIs not filtered:<ul> <li>Send GET to ccf_discover_url https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}</li> <li>Param api-invoker-id is mandatory</li> <li>Using Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Publish request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiId</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId}</li> </ol> </li> <li> <p>Response to Onboard request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li> <p>Response to Discover Request By Invoker:</p> <ol> <li>200 OK response.</li> <li>Response body must follow DiscoveredAPIs data structure:<ul> <li>Check if DiscoveredAPIs contains the 2 previously registered Service APIs published.</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_events_service/","title":"Test Plan for CAPIF Api Events Service","text":"<p>At this documentation you will have all information and related files and examples of test plan for this API.</p>"},{"location":"testing/testplan/api_events_service/#test-case-1-creates-a-new-individual-capif-event-subscription","title":"Test Case 1: Creates a new individual CAPIF Event Subscription.","text":"<p>Test ID: capif_api_events-1</p> <p>Description:</p> <p>This test case will check that a CAPIF subscriber (Invoker or Publisher) can Subscribe to Events</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid InvokerId or apfId from CAPIF Authority)</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Subscribe to Events</li> <li>Retrieve {subscriberId} and {subscriptionId} from Location Header</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Invoker Onboarding</p> </li> <li> <p>Event Subscription:</p> <ol> <li>Send POST to https://{CAPIF_HOSTNAME}/capif-events/v1/{subscriberId}/subscriptions</li> <li>body event subscription request body</li> <li>Use Invoker Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Onboard request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li> <p>Response to Event Subscription must accomplish:</p> <ol> <li>201 Created</li> <li>The URI of the created resource shall be returned in the \"Location\" HTTP header, following this structure: {apiRoot}/capif-events/{apiVersion}/{subscriberId}/subscriptions/{subscriptionId}</li> <li>Response Body must follow EventSubscription data structure.</li> </ol> </li> <li> <p>Event Subscriptions are stored in CAPIF Database</p> </li> </ol>"},{"location":"testing/testplan/api_events_service/#test-case-2-creates-a-new-individual-capif-event-subscription-with-invalid-subscriberid","title":"Test Case 2: Creates a new individual CAPIF Event Subscription with Invalid SubscriberId","text":"<p>Test ID: capif_api_events-2</p> <p>Description:</p> <p>This test case will check that a CAPIF subscriber (Invoker or Publisher) cannot Subscribe to Events without valid SubcriberId</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is not pre-authorised (has invalid InvokerId or apfId)</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Subscribe to Events</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Invoker Onboarding</p> </li> <li> <p>Event Subscription:</p> <ol> <li>Send POST to https://{CAPIF_HOSTNAME}/capif-events/v1/{SUBSCRIBER_NOT_REGISTERED}/subscriptions</li> <li>body event subscription request body</li> <li>Use Invoker Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Onboard request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li> <p>Response to Event Subscription must accomplish:</p> <ol> <li>404 Not Found</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Invoker or APF or AEF or AMF Not found\".</li> <li>cause with message \"Subscriber Not Found\".</li> </ul> </li> </ol> </li> <li> <p>Event Subscriptions are not stored in CAPIF Database</p> </li> </ol>"},{"location":"testing/testplan/api_events_service/#test-case-3-deletes-an-individual-capif-event-subscription","title":"Test Case 3: Deletes an individual CAPIF Event Subscription","text":"<p>Test ID: capif_api_events-3</p> <p>Description:</p> <p>This test case will check that a CAPIF subscriber (Invoker or Publisher) can Delete an Event Subscription</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid InvokerId or apfId from CAPIF Authority)</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Subscribe to Events</li> <li>Retrieve {subscriberId} and {subscriptionId} from Location Header</li> <li>Remove Event Subscription</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Invoker Onboarding</p> </li> <li> <p>Event Subscription:</p> <ol> <li>Send POST to https://{CAPIF_HOSTNAME}/capif-events/v1/{subscriberId}/subscriptions</li> <li>body event subscription request body</li> <li>Use Invoker Certificate</li> </ol> </li> <li> <p>Remove Event Subscription:</p> <ol> <li>Send DELETE to https://{CAPIF_HOSTNAME}/capif-events/v1/{subscriberId}/subscriptions</li> <li>Use Invoker Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Onboard request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li> <p>Response to Event Subscription must accomplish:</p> <ol> <li>201 Created</li> <li>The URI of the created resource shall be returned in the \"Location\" HTTP header, following this structure: {apiRoot}/capif-events/{apiVersion}/{subscriberId}/subscriptions/{subscriptionId}</li> <li>Response Body must follow EventSubscription data structure.</li> </ol> </li> <li> <p>Event Subscriptions are stored in CAPIF Database</p> </li> <li> <p>Remove Event Subscription:</p> <ol> <li>204 No Content</li> </ol> </li> <li> <p>Event Subscription is not present at CAPIF Database.</p> </li> </ol>"},{"location":"testing/testplan/api_events_service/#test-case-4-deletes-an-individual-capif-event-subscription-with-invalid-subscriberid","title":"Test Case 4: Deletes an individual CAPIF Event Subscription with invalid SubscriberId","text":"<p>Test ID: capif_api_events-4</p> <p>Description:</p> <p>This test case will check that a CAPIF subscriber (Invoker or Publisher) cannot Delete to Events without valid SubcriberId</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid InvokerId or apfId).</li> <li>CAPIF subscriber is subscribed to Events.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Subscribe to Events</li> <li>Retrieve Location Header with subscriptionId.</li> <li>Remove Event Subscribed with not valid Subscriber.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Invoker Onboarding</p> </li> <li> <p>Event Subscription:</p> <ol> <li>Send POST to https://{CAPIF_HOSTNAME}/capif-events/v1/{subscriberId}/subscriptions</li> <li>body event subscription request body</li> <li>Use Invoker Certificate</li> </ol> </li> <li> <p>Remove Event Subcription with not valid subscriber:</p> <ol> <li>Send DELETE to https://{CAPIF_HOSTNAME}/capif-events/v1/{SUBSCRIBER_ID_NOT_VALID}/subscriptions/{subcriptionId}</li> <li>Use Invoker Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Onboard request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li> <p>Response to Event Subscription must accomplish:</p> <ol> <li>201 Created</li> <li>The URI of the created resource shall be returned in the \"Location\" HTTP header, following this structure: {apiRoot}/capif-events/{apiVersion}/{subscriberId}/subscriptions/{subscriptionId}</li> <li>Response Body must follow EventSubscription data structure.</li> </ol> </li> <li> <p>Event Subscriptions are stored in CAPIF Database</p> </li> <li> <p>Error Response Body must accomplish with ProblemDetails data structure with:</p> <ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Invoker or APF or AEF or AMF Not found\".</li> <li>cause with message \"Subscriber Not Found\".</li> </ul> </li> </ol>"},{"location":"testing/testplan/api_events_service/#test-case-5-deletes-an-individual-capif-event-subscription-with-invalid-subscriptionid","title":"Test Case 5: Deletes an individual CAPIF Event Subscription with invalid SubscriptionId","text":"<p>Test ID: capif_api_events-5</p> <p>Description:</p> <p>This test case will check that a CAPIF subscriber (Invoker or Publisher) cannot Delete an Event Subscription without valid SubscriptionId</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has invalid InvokerId or apfId).</li> <li>CAPIF subscriber is subscribed to Events.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Subscribe to Events</li> <li>Retrieve Location Header with subscriptionId.</li> <li>Remove Event Subscribed with not valid Subscriber.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Invoker Onboarding</p> </li> <li> <p>Event Subscription:</p> <ol> <li>Send POST to https://{CAPIF_HOSTNAME}/capif-events/v1/{subscriberId}/subscriptions</li> <li>body event subscription request body</li> <li>Use Invoker Certificate</li> </ol> </li> <li> <p>Remove Event Subcription with not valid subscriber:</p> <ol> <li>Send DELETE to to https://{CAPIF_HOSTNAME}/capif-events/v1/{subcriberId}/subscriptions/{SUBSCRIPTION_ID_NOT_VALID}</li> <li>Use Invoker Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Onboard request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li> <p>Response to Event Subscription must accomplish:</p> <ol> <li>201 Created</li> <li>The URI of the created resource shall be returned in the \"Location\" HTTP header, following this structure: {apiRoot}/capif-events/{apiVersion}/{subscriberId}/subscriptions/{subscriptionId}</li> <li>Response Body must follow EventSubscription data structure.</li> </ol> </li> <li> <p>Event Subscriptions are stored in CAPIF Database</p> </li> <li>Remove Event Subscription with not valid subscriber:<ol> <li>404 Not Found</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>detail with message \"Service API not existing\".</li> <li>cause with message \"Event API subscription id not found\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_events_service/#test-case-6-invoker-receives-service-api-invocation-events","title":"Test Case 6: Invoker receives Service API Invocation events","text":"<p>Test ID: capif_api_events-6, mockserver</p> <p>Description:</p> <p>This test case will check that a CAPIF Invoker subscribed to SERVICE_API_INVOCATION_SUCCESS and SERVICE_API_INVOCATION_FAILURE, receive the notification when AEF Send TO logging service result of invocations to their APIs.</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid InvokerId or apfId from CAPIF Authority)</li> <li>CAPIF provider is correctly registered and published APIs.</li> <li>API Provider had a Service API Published on CAPIF</li> <li>Mock Server is up and running to receive requests.</li> <li>Mock Server is clean.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register provider and publish one API at CCF</li> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Discover published APIs and extract apiIds and apiNames</li> <li>Subscribe to SERVICE_API_INVOCATION_SUCCESS and SERVICE_API_INVOCATION_FAILURE event filtering by aefId.</li> <li>Retrieve {subscriberId} and {subscriptionId} from Location Header</li> <li>Emulate Success and Failure on API invocation of provider by Invoker, using Invocation Logs API.</li> </ol> <p>Information of Test:</p> <ol> <li>Perform provider registration</li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform invoker onboarding</p> </li> <li> <p>Discover published APIs:</p> <ul> <li>Get Api Ids And Api Names from response.</li> </ul> </li> <li> <p>Event Subscription to SERVICE_API_INVOCATION_SUCCESS and SERVICE_API_INVOCATION_FAILURE of provider previously registered:</p> <ol> <li>Send POST to https://{CAPIF_HOSTNAME}/capif-events/v1/{subscriberId}/subscriptions</li> <li>body event subscription request body with:<ol> <li>events: ['SERVICE_API_INVOCATION_SUCCESS','SERVICE_API_INVOCATION_FAILURE']</li> <li>eventFilter: only receive events from provider's aefId.</li> </ol> </li> <li>Use Invoker Certificate</li> </ol> </li> <li> <p>Create Log Entry emulating provider receive Success and Failure api invocation from invoker:</p> <ol> <li>Send POST to https://{CAPIF_HOSTNAME}/api-invocation-logs/v1/{aefId}/logs</li> <li>body log entry request body with:<ol> <li>aefId from provider published.</li> <li>apiInvokerId from invoker onboarded.</li> <li>apiId of published API</li> <li>apiName of published API</li> <li>200 and 400 results in two logs.</li> </ol> </li> <li>Use AEF Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Event Subscription must accomplish:<ol> <li>201 Created</li> <li>The URI of the created resource shall be returned in the \"Location\" HTTP header, following this structure: {apiRoot}/capif-events/{apiVersion}/{subscriberId}/subscriptions/{subscriptionId}</li> <li>Response Body must follow EventSubscription data structure.</li> </ol> </li> <li>Response to creation of log entry on CCF must accomplish:<ol> <li>201 Created</li> <li>The URI of the created resource shall be returned in the \"Location\" HTTP header, following this structure: {apiRoot}/api-invocation-logs/{apiVersion}/{aefId}/subscriptions/{logId}</li> </ol> </li> <li>Mock Server received messages must accomplish:<ol> <li>Two Events have been received.</li> <li>Validate received events follow EventNotification data structure, with invocationLog in eventDetail parameter.<ol> <li>One should be SERVICE_API_INVOCATION_SUCCESS related with 200 result at Log.</li> <li>The other one must be SERVICE_API_INVOCATION_FAILURE related with 400 result at Log.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_events_service/#test-case-7-invoker-subscribe-to-service-api-available-and-unavailable-events","title":"Test Case 7: Invoker subscribe to Service API Available and Unavailable events","text":"<p>Test ID: capif_api_events-7, mockserver</p> <p>Description:</p> <p>This test case will check that a CAPIF Invoker subscribed to SERVICE_API_AVAILABLE and SERVICE_API_UNAVAILABLE, receive the notification when AEF publish and remove it. </p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid InvokerId or apfId from CAPIF Authority)</li> <li>CAPIF provider is correctly registered and published APIs.</li> <li>Mock Server is up and running to receive requests.</li> <li>Mock Server is clean.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register provider and publish one API at CCF</li> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Discover published APIs and extract apiIds and apiNames</li> <li>Subscribe to SERVICE_API_AVAILABLE and SERVICE_API_UNAVAILABLE event filtering by aefId.</li> <li>Retrieve {subscriberId} and {subscriptionId} from Location Header</li> <li>Provider publish new API.</li> <li>Provider remove published API.</li> </ol> <p>Information of Test:</p> <ol> <li>Perform provider registration</li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Perform invoker onboarding</p> </li> <li> <p>Discover published APIs:</p> <ul> <li>Get Api Ids And Api Names from response.</li> </ul> </li> <li> <p>Event Subscription to SERVICE_API_AVAILABLE and SERVICE_API_UNAVAILABLE of provider previously registered:</p> <ol> <li>Send POST to https://{CAPIF_HOSTNAME}/capif-events/v1/{subscriberId}/subscriptions</li> <li>body event subscription request body with:<ol> <li>events: ['SERVICE_API_AVAILABLE','SERVICE_API_UNAVAILABLE']</li> <li>eventFilter: only receive events from provider's aefId.</li> </ol> </li> <li>Use Invoker Certificate</li> </ol> </li> <li> <p>Publish new Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_2</li> <li>Store serviceApiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Remove published Service API at CCF:</p> <ul> <li>Send DELETE to resource URL https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{SERVICE_API_ID}</li> <li>Use APF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Event Subscription must accomplish:</p> <ol> <li>201 Created</li> <li>The URI of the created resource shall be returned in the \"Location\" HTTP header, following this structure: {apiRoot}/capif-events/{apiVersion}/{subscriberId}/subscriptions/{subscriptionId}</li> <li>Response Body must follow EventSubscription data structure.</li> </ol> </li> <li> <p>Mock Server received messages must accomplish:</p> <ol> <li>Two Events have been received.</li> <li>Validate received events follow EventNotification data structure, with apiIds in eventDetail parameter.<ol> <li>One should be SERVICE_API_AVAILABLE apiId of service_2 published API.</li> <li>The other one must be SERVICE_API_UNAVAILABLE apiId of service_1 published API.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_events_service/#test-case-8-invoker-subscribe-to-service-api-update","title":"Test Case 8: Invoker subscribe to Service API Update","text":"<p>Test ID: capif_api_events-8, mockserver</p> <p>Description:</p> <p>This test case will check that a CAPIF Invoker subscribed to SERVICE_API_UPDATE, receive the notification when AEF Update some information on API Published.</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid InvokerId or apfId from CAPIF Authority)</li> <li>CAPIF provider is correctly registered and published APIs.</li> <li>API Provider had a Service API Published on CAPIF</li> <li>Mock Server is up and running to receive requests.</li> <li>Mock Server is clean.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider and publish one API at CCF</li> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Discover published APIs and extract apiIds and apiNames</li> <li>Subscribe to SERVICE_API_UPDATE event filtering by aefId.</li> <li>Retrieve {subscriberId} and {subscriptionId} from Location Header at event subscription</li> <li>Provider update information of Service API Published.</li> </ol> <p>Information of Test:</p> <ol> <li>Check and Clean Mock Server</li> <li>Perform provider registration</li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> <li>Store serviceApiId</li> </ul> </li> <li> <p>Perform invoker onboarding</p> </li> <li> <p>Discover published APIs:</p> <ul> <li>Get Api Ids And Api Names from response.</li> </ul> </li> <li> <p>Event Subscription to SERVICE_API_UPDATE of provider previously registered:</p> <ol> <li>Send POST to https://{CAPIF_HOSTNAME}/capif-events/v1/{subscriberId}/subscriptions</li> <li>body event subscription request body with:<ol> <li>events: ['SERVICE_API_UPDATE']</li> <li>eventFilter: only receive events from provider's aefId.</li> </ol> </li> <li>Use Invoker Certificate</li> </ol> </li> <li> <p>Update published API at CCF:</p> <ul> <li>Send PUT to resource URL https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{serivceApiId}</li> <li>body [service api description] with overrided apiName to service_1_modified**</li> <li>Use APF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Event Subscription must accomplish:<ol> <li>201 Created</li> <li>The URI of the created resource shall be returned in the \"Location\" HTTP header, following this structure: {apiRoot}/capif-events/{apiVersion}/{subscriberId}/subscriptions/{subscriptionId}</li> <li>Response Body must follow EventSubscription data structure.</li> </ol> </li> <li>Response to Update Published Service API:<ol> <li>200 OK</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiName service_1_modified**</li> </ul> </li> </ol> </li> <li>Mock Server received messages must accomplish:<ol> <li>One Event has been received.</li> <li>Validate received events follow EventNotification data structure, with serviceAPIDescriptions in eventDetail parameter.<ol> <li>Event should be SERVICE_API_UPDATE with eventDetail with modified apiName.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_events_service/#test-case-9-provider-subscribe-to-api-invoker-events","title":"Test Case 9: Provider subscribe to API Invoker events","text":"<p>Test ID: capif_api_events-9, mockserver</p> <p>Description:</p> <p>This test case will check that a CAPIF Provider subscribed to API Invoker events (API_INVOKER_ONBOARDED, API_INVOKER_UPDATED and API_INVOKER_OFFBOARDED), receive the notifications when Invoker is onboarded, updated and removed respectively.</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid InvokerId or apfId from CAPIF Authority)</li> <li>CAPIF provider is correctly registered.</li> <li>Mock Server is up and running to receive requests.</li> <li>Mock Server is clean.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF</li> <li>Subscribe Provider to API_INVOKER_ONBOARDED, API_INVOKER_UPDATED and API_INVOKER_OFFBOARDED events.</li> <li>Register Invoker and Onboard Invoker at CCF</li> <li>Update Onboarding Information at CCF with a minor change on \"notificationDestination\"</li> <li>Offboard Invoker</li> </ol> <p>Information of Test:</p> <ol> <li>Check and Clean Mock Server</li> <li>Perform provider registration</li> <li>Event Subscription to API_INVOKER_ONBOARDED, API_INVOKER_UPDATED and API_INVOKER_OFFBOARDED events:<ol> <li>Send POST to https://{CAPIF_HOSTNAME}/capif-events/v1/{subscriberId}/subscriptions</li> <li>body event subscription request body with:<ol> <li>events: ['API_INVOKER_ONBOARDED', 'API_INVOKER_UPDATED', 'API_INVOKER_OFFBOARDED']</li> </ol> </li> <li>Use Provider AMF Certificate</li> </ol> </li> <li>Perform invoker onboarding</li> <li>Update information of previously onboarded Invoker:<ul> <li>Send PUT to https://{CAPIF_HOSTNAME}/api-invoker-management/v1/onboardedInvokers/{onboardingId}</li> <li>Reference Request Body is: [put invoker onboarding body]</li> <li>\"notificationDestination\": \"http://host.docker.internal:8086/netapp_new_callback\",</li> </ul> </li> <li>Offboard:<ul> <li>Send DELETE to https://{CAPIF_HOSTNAME}/api-invoker-management/v1/onboardedInvokers/{onboardingId}</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Event Subscription must accomplish:<ol> <li>201 Created</li> <li>The URI of the created resource shall be returned in the \"Location\" HTTP header, following this structure: {apiRoot}/capif-events/{apiVersion}/{subscriberId}/subscriptions/{subscriptionId}</li> <li>Response Body must follow EventSubscription data structure.</li> </ol> </li> <li>Response to Onboard request must accomplish:<ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li>Response to Update Request (PUT) with minor change must contain:<ol> <li>200 OK response.</li> <li>notificationDestination on response must contain the new value</li> </ol> </li> <li>Response to Offboard Request (DELETE) must contain:<ol> <li>204 No Content</li> </ol> </li> <li>Mock Server received messages must accomplish:<ol> <li>Three Events have been received.</li> <li>Validate received events follow EventNotification data structure, with apiInvokerIds in eventDetail parameter.<ol> <li>One Event should be API_INVOKER_ONBOARDED with eventDetail with modified apiInvokerId.</li> <li>One Event should be API_INVOKER_UPDATED with eventDetail with modified apiInvokerId.</li> <li>One Event should be API_INVOKER_OFFBOARDED with eventDetail with modified apiInvokerId.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_events_service/#test-case-10-provider-subscribed-to-acl-update-event","title":"Test Case 10: Provider subscribed to ACL update event","text":"<p>Test ID: capif_api_events-10, mockserver</p> <p>Description:</p> <p>This test case will check that a CAPIF Provider subscribed to ACCESS_CONTROL_POLICY_UPDATE receive a notification when ACL Changes.</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid InvokerId or apfId from CAPIF Authority)</li> <li>CAPIF provider is correctly registered.</li> <li>API Provider had one Service API Published on CAPIF</li> <li>API Invoker had a Security Context for the Service API published by provider.</li> <li>Mock Server is up and running to receive requests.</li> <li>Mock Server is clean.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF.</li> <li>Publish a provider API with name service_1.</li> <li>Register Invoker and Onboard Invoker at CCF.</li> <li>Subscribe Provider to ACCESS_CONTROL_POLICY_UPDATE event.</li> <li>Discover APIs filtered by aef_id</li> <li>Create Security Context for Invoker.</li> <li>Provider Retrieve ACL</li> </ol> <p>Information of Test:</p> <ol> <li>Check and Clean Mock Server</li> <li>Perform provider registration</li> <li>Perform invoker onboarding</li> <li>Event Subscription to ACCESS_CONTROL_POLICY_UPDATE event:<ol> <li>Send POST to https://{CAPIF_HOSTNAME}/capif-events/v1/{subscriberId}/subscriptions</li> <li>body event subscription request body with:<ol> <li>events: ['ACCESS_CONTROL_POLICY_UPDATE']</li> <li>eventFilters: apiInvokerIds array with apiInvokerId of invoker</li> </ol> </li> <li>Use Provider AMF Certificate</li> </ol> </li> <li>Discover published APIs</li> <li>Create Security Context for Invoker<ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li>Provider Retrieve ACL<ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId}?aef-id=${aef_id}</li> <li>Use serviceApiId and aefId</li> <li>Use AEF Provider Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Event Subscription must accomplish:<ol> <li>201 Created</li> <li>The URI of the created resource shall be returned in the \"Location\" HTTP header, following this structure: {apiRoot}/capif-events/{apiVersion}/{subscriberId}/subscriptions/{subscriptionId}</li> <li>Response Body must follow EventSubscription data structure.</li> </ol> </li> <li>Create security context:<ol> <li>201 Created response.</li> <li>body returned must accomplish ServiceSecurity data structure.</li> <li>Location Header must contain the new resource URL {apiRoot}/capif-security/v1/trustedInvokers/{apiInvokerId}</li> </ol> </li> <li>ACL Response:<ol> <li>200 OK Response.</li> <li>body returned must accomplish AccessControlPolicyList data structure.</li> <li>apiInvokerPolicies must:<ol> <li>contain only one object.</li> <li>apiInvokerId must match apiInvokerId registered previously.</li> </ol> </li> </ol> </li> <li>Mock Server received messages must accomplish:<ol> <li>One Event has been received.</li> <li>Validate received event follow EventNotification data structure, with accCtrlPolListExt in eventDetail parameter.<ol> <li>One Event should be ACCESS_CONTROL_POLICY_UPDATE with eventDetail with accCtrlPolListExt including the apiId and apiInvokerPolicies.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_events_service/#test-case-11-provider-receives-an-acl-unavailable-event-when-invoker-remove-security-context","title":"Test Case 11: Provider receives an ACL unavailable event when invoker remove Security Context.","text":"<p>Test ID: capif_api_events-11, mockserver</p> <p>Description:</p> <p>This test case will check that a CAPIF Invoker subscribed to ACCESS_CONTROL_POLICY_UNAVAILABLE will receive the notification when AEF remove Security Context created previously.</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid InvokerId or apfId from CAPIF Authority)</li> <li>CAPIF provider is correctly registered.</li> <li>API Provider had one Service API Published on CAPIF</li> <li>Mock Server is up and running to receive requests.</li> <li>Mock Server is clean.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF.</li> <li>Publish a provider API with name service_1.</li> <li>Register Invoker and Onboard Invoker at CCF.</li> <li>Subscribe Invoker to ACCESS_CONTROL_POLICY_UNAVAILABLE event.</li> <li>Discover APIs filtered by aef_id</li> <li>Create Security Context for Invoker.</li> <li>Provider Retrieve ACL.</li> <li>Remove Security Context for Invoker.</li> </ol> <p>Information of Test:</p> <ol> <li>Check and Clean Mock Server</li> <li>Perform provider registration</li> <li>Perform invoker onboarding</li> <li>Event Subscription to ACCESS_CONTROL_POLICY_UNAVAILABLE event:<ol> <li>Send POST to https://{CAPIF_HOSTNAME}/capif-events/v1/{subscriberId}/subscriptions</li> <li>body event subscription request body with:<ol> <li>events: ['ACCESS_CONTROL_POLICY_UNAVAILABLE']</li> <li>eventFilters: apiInvokerIds array with apiInvokerId of invoker</li> </ol> </li> <li>Use Invoker Certificate</li> </ol> </li> <li>Discover published APIs</li> <li>Create Security Context for Invoker<ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li>Provider Retrieve ACL<ul> <li>Send GET https://{CAPIF_HOSTNAME}/access-control-policy/v1/accessControlPolicyList/${serviceApiId}?aef-id=${aef_id}</li> <li>Use serviceApiId and aefId</li> <li>Use AEF Provider Certificate</li> </ul> </li> <li>Delete Security Context of Invoker by Provider:<ul> <li>Send DELETE https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>Use AEF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Event Subscription must accomplish:<ol> <li>201 Created</li> <li>The URI of the created resource shall be returned in the \"Location\" HTTP header, following this structure: {apiRoot}/capif-events/{apiVersion}/{subscriberId}/subscriptions/{subscriptionId}</li> <li>Response Body must follow EventSubscription data structure.</li> </ol> </li> <li>Create security context:<ol> <li>201 Created response.</li> <li>body returned must accomplish ServiceSecurity data structure.</li> <li>Location Header must contain the new resource URL {apiRoot}/capif-security/v1/trustedInvokers/{apiInvokerId}</li> </ol> </li> <li>ACL Response:<ol> <li>200 OK Response.</li> <li>body returned must accomplish AccessControlPolicyList data structure.</li> <li>apiInvokerPolicies must:<ol> <li>contain only one object.</li> <li>apiInvokerId must match apiInvokerId registered previously.</li> </ol> </li> </ol> </li> <li>Delete security context:<ol> <li>204 No Content response.</li> </ol> </li> <li>Mock Server received messages must accomplish:<ol> <li>One Event has been received.</li> <li>Validate received event follow EventNotification data structure, without eventDetail parameter.<ol> <li>One Event should be ACCESS_CONTROL_POLICY_UNAVAILABLE without eventDetail.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_events_service/#test-case-12-invoker-receives-an-invoker-authorization-revoked-and-acl-unavailable-event-when-provider-revoke-invoker-authorization","title":"Test Case 12: Invoker receives an Invoker Authorization Revoked and ACL unavailable event when Provider revoke Invoker Authorization.","text":"<p>Test ID: capif_api_events-12, mockserver</p> <p>Description:</p> <p>This test case will check that a CAPIF Invoker subscribed to API_INVOKER_AUTHORIZATION_REVOKED and ACCESS_CONTROL_POLICY_UNAVAILABLE receive both notification when AEF revoke invoker's authorization.</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid InvokerId or apfId from CAPIF Authority)</li> <li>CAPIF provider is correctly registered.</li> <li>API Provider had one Service API Published on CAPIF</li> <li>Mock Server is up and running to receive requests.</li> <li>Mock Server is clean.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF.</li> <li>Publish a provider API with name service_1.</li> <li>Register Invoker and Onboard Invoker at CCF.</li> <li>Subscribe Invoker to ACCESS_CONTROL_POLICY_UNAVAILABLE and API_INVOKER_AUTHORIZATION_REVOKED events.</li> <li>Discover APIs filtered by aef_id</li> <li>Create Security Context for Invoker.</li> <li>Revoke Authorization by Provider.</li> </ol> <p>Information of Test:</p> <ol> <li>Check and Clean Mock Server</li> <li>Perform provider registration</li> <li>Perform invoker onboarding</li> <li>Event Subscription to ACCESS_CONTROL_POLICY_UNAVAILABLE and API_INVOKER_AUTHORIZATION_REVOKED event:<ol> <li>Send POST to https://{CAPIF_HOSTNAME}/capif-events/v1/{subscriberId}/subscriptions</li> <li>body event subscription request body with:<ol> <li>events: ['ACCESS_CONTROL_POLICY_UNAVAILABLE','API_INVOKER_AUTHORIZATION_REVOKED']</li> <li>eventFilters: apiInvokerIds array with apiInvokerId of invoker</li> </ol> </li> <li>Use Invoker Certificate</li> </ol> </li> <li>Discover published APIs</li> <li>Create Security Context for Invoker<ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> <li>Revoke Authorization by Provider:<ul> <li>Send POST https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}/delete</li> <li>body security notification body</li> <li>Using AEF Certificate.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Event Subscription must accomplish:<ol> <li>201 Created</li> <li>The URI of the created resource shall be returned in the \"Location\" HTTP header, following this structure: {apiRoot}/capif-events/{apiVersion}/{subscriberId}/subscriptions/{subscriptionId}</li> <li>Response Body must follow EventSubscription data structure.</li> </ol> </li> <li>Create security context:<ol> <li>201 Created response.</li> <li>body returned must accomplish ServiceSecurity data structure.</li> <li>Location Header must contain the new resource URL {apiRoot}/capif-security/v1/trustedInvokers/{apiInvokerId}</li> </ol> </li> <li>Revoke Authorization:<ol> <li>204 No Content response.</li> </ol> </li> <li>Mock Server received messages must accomplish:<ol> <li>Two Events has been received.</li> <li>Validate received event follow EventNotification data structure, without eventDetail parameter.<ol> <li>One Event should be ACCESS_CONTROL_POLICY_UNAVAILABLE without eventDetail.</li> <li>One Event should be API_INVOKER_AUTHORIZATION_REVOKED without eventDetail.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_invoker_management/","title":"Test Plan for CAPIF Api Invoker Management","text":"<p>At this documentation you will have all information and related files and examples of test plan for this API.</p>"},{"location":"testing/testplan/api_invoker_management/#test-case-1-onboard-network-app","title":"Test Case 1: Onboard Network App","text":"<p>Test ID: capif_api_invoker_management-1</p> <p>Description:</p> <p>This test will try to register new Network App at CAPIF Core.</p> <p>Pre-Conditions:</p> <ul> <li>Network App was not registered previously</li> <li>Network App was not onboarded previously</li> <li>Preconditions: The administrator must have previously registered the User.</li> </ul> <p>Execution Steps:</p> <ol> <li>Retrieve access_token by User from register</li> <li>Onboard Invoker at CCF</li> <li>Store signed Certificate</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Create public and private key at invoker</p> </li> <li> <p>Retrieve access_token by User:</p> <ul> <li>Send GET to https://${CAPIF_REGISTER}:${CAPIF_REGISTER_PORT}/getauth</li> <li>Include basic Auth Header with Admin user/password</li> <li>Retrieve access_token and the urls needed for next requests from response body user_getauth_response_body_example</li> </ul> </li> <li> <p>Onboard Invoker:</p> <ul> <li>Send POST to https://{CAPIF_HOSTNAME}/api-invoker-management/v1/onboardedInvokers</li> <li>Reference Request Body: invoker onboarding body</li> <li>\"onboardingInformation\"->\"apiInvokerPublicKey\": must contain public key generated by Invoker.</li> <li>Send in Authorization Header the Bearer access_token obtained previously (Authorization:Bearer ${access_token})</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Onboard request must accomplish:<ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> </ol>"},{"location":"testing/testplan/api_invoker_management/#test-case-2-onboard-network-app-already-onboarded","title":"Test Case 2: Onboard Network App Already onboarded","text":"<p>Test ID: capif_api_invoker_management-2</p> <p>Description:</p> <p>This test will check second onboard of same Network App is not allowed.</p> <p>Pre-Conditions:</p> <ul> <li>Network App was registered previously</li> <li>Network App was onboarded previously</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Network App at CCF</li> <li>Onboard Network App at CCF</li> <li>Store signed Certificate at Network App</li> <li>Onboard Again the Network App at CCF</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Invoker Onboarding</p> </li> <li> <p>Repeat Onboard Invoker:</p> <ul> <li>Send POST to https://{CAPIF_HOSTNAME}/api-invoker-management/v1/onboardedInvokers</li> <li>Reference Request Body: invoker onboarding body</li> <li>\"onboardingInformation\"->\"apiInvokerPublicKey\": must contain public key generated by Invoker.</li> <li>Send in Authorization Header the Bearer access_token obtained previously (Authorization:Bearer ${access_token})</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Onboard request must accomplish:<ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li>Response to Second Onboard of Network App must accomplish:<ol> <li>403 Forbidden</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 403</li> <li>title with message \"Forbidden\"</li> <li>detail with message \"Invoker Already registered\".</li> <li>cause with message \"Identical invoker public key\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_invoker_management/#test-case-3-update-onboarded-network-app","title":"Test Case 3: Update Onboarded Network App","text":"<p>Test ID: capif_api_invoker_management-3</p> <p>Description:</p> <p>This test will try to update information of previous onboard Network App at CAPIF Core.</p> <p>Pre-Conditions:</p> <ul> <li>Network App was registered previously</li> <li>Network App was onboarded previously with {onboardingId}</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Invoker at CCF</li> <li>Onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Update Onboarding Information at CCF with a minor change on \"notificationDestination\"</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Invoker Onboarding</p> </li> <li> <p>Update information of previously onboarded Invoker:</p> <ul> <li>Send PUT to https://{CAPIF_HOSTNAME}/api-invoker-management/v1/onboardedInvokers/{onboardingId}</li> <li>Reference Request Body is: [put invoker onboarding body]</li> <li>\"notificationDestination\": \"http://host.docker.internal:8086/netapp_new_callback\",</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Onboard request must accomplish:<ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li>Response to Update Request (PUT) with minor change must contain:<ol> <li>200 OK response.</li> <li>notificationDestination on response must contain the new value</li> </ol> </li> </ol>"},{"location":"testing/testplan/api_invoker_management/#test-case-4-update-not-onboarded-network-app","title":"Test Case 4: Update Not Onboarded Network App","text":"<p>Test ID: capif_api_invoker_management-4</p> <p>Description:</p> <p>This test will try to update information of not onboarded Network App at CAPIF Core.</p> <p>Pre-Conditions:</p> <ul> <li>Network App was registered previously</li> <li>Network App was not onboarded previously</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Invoker at CCF</li> <li>Onboard Invoker at CCF</li> <li>Update Onboarding Information at CCF of not onboarded</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Invoker Onboarding</p> </li> <li> <p>Update information of not onboarded Invoker:</p> <ul> <li>Send PUT to https://{CAPIF_HOSTNAME}/api-invoker-management/v1/onboardedInvokers/{INVOKER_NOT_REGISTERED}</li> <li>Reference Request Body is: [put invoker onboarding body]</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Onboard request must accomplish:<ol> <li>201 Created</li> </ol> </li> <li>Response to Update Request (PUT) must contain:<ol> <li>404 Not Found</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Please provide an existing Network App ID\".</li> <li>cause with message \"Not exist Network App ID\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_invoker_management/#test-case-5-offboard-network-app","title":"Test Case 5: Offboard Network App","text":"<p>Test ID: capif_api_invoker_management-5</p> <p>Description:</p> <p>This test case will check that a Registered Network App can be deleted.</p> <p>Pre-Conditions:</p> <ul> <li>Network App was registered previously</li> <li>Network App was onboarded previously</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Invoker at CCF</li> <li>Onboard Invoker at CCF</li> <li>Offboard Invoker at CCF</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Invoker Onboarding</p> </li> <li> <p>Offboard:</p> <ul> <li>Send DELETE to https://{CAPIF_HOSTNAME}/api-invoker-management/v1/onboardedInvokers/{onboardingId}</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Onboard request must accomplish:<ol> <li>201 Created</li> </ol> </li> <li>Response to Offboard Request (DELETE) must contain:<ol> <li>204 No Content</li> </ol> </li> </ol>"},{"location":"testing/testplan/api_invoker_management/#test-case-6-offboard-not-previsouly-onboarded-network-app","title":"Test Case 6: Offboard Not previsouly Onboarded Network App","text":"<p>Test ID: capif_api_invoker_management-6</p> <p>Description:</p> <p>This test case will check that a Non-Registered Network App cannot be deleted</p> <p>Pre-Conditions:</p> <ul> <li>Network App was registered previously</li> <li>Network App was not onboarded previously</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Invoker at CCF</li> <li>Offboard Invoker at CCF</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Invoker Onboarding</p> </li> <li> <p>Offboard:</p> <ul> <li>Send DELETE to https://{CAPIF_HOSTNAME}/api-invoker-management/v1/onboardedInvokers/{INVOKER_NOT_REGISTERED}</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Offboard Request (DELETE) must contain:<ol> <li>404 Not Found</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Please provide an existing Network App ID\".</li> <li>cause with message \"Not exist Network App ID\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_invoker_management/#test-case-7-update-onboarded-network-app-certificate","title":"Test Case 7: Update Onboarded Network App Certificate","text":"<p>Test ID: capif_api_invoker_management-7</p> <p>Description:</p> <p>This test will try to update public key and get a new signed certificate by CAPIF Core.</p> <p>Pre-Conditions:</p> <ul> <li>Network App was registered previously</li> <li>Network App was onboarded previously with {onboardingId} and {public_key_1}</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Invoker at CCF</li> <li>Onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Update Onboarding Information at CCF with new public key</li> <li>Update Onboarding Information at CCF with minor change</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Invoker Onboarding with public_key_1.</p> </li> <li> <p>Create {public_key_2}</p> </li> <li> <p>Update information of previously onboarded Invoker:</p> <ul> <li>Send PUT to https://{CAPIF_HOSTNAME}/api-invoker-management/v1/onboardedInvokers/{onboardingId}</li> <li>Reference Request Body is: [put invoker onboarding body]</li> <li>[\"onboardingInformation\"][\"apiInvokerPublicKey\"]: {public_key_2},</li> <li>Store new certificate.</li> </ul> </li> <li> <p>Update information of previously onboarded Invoker Using new certificate:</p> <ul> <li>Send PUT to https://{CAPIF_HOSTNAME}/api-invoker-management/v1/onboardedInvokers/{onboardingId}</li> <li>Reference Request Body is: [put invoker onboarding body]</li> <li>\"notificationDestination\": \"http://host.docker.internal:8086/netapp_new_callback\",</li> <li>Use new Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Onboard request must accomplish:<ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> <li>Response to Update Request (PUT) with new public key:<ol> <li>200 OK response.</li> <li>apiInvokerCertificate with new certificate on response -> store to use.</li> </ol> </li> <li>Response to Update Request (PUT) with minor change must contain:<ol> <li>200 OK response.</li> <li>notificationDestination on response must contain the new value</li> </ol> </li> </ol>"},{"location":"testing/testplan/api_logging_service/","title":"Test Plan for CAPIF Api Logging Service","text":"<p>At this documentation you will have all information and related files and examples of test plan for this API.</p>"},{"location":"testing/testplan/api_logging_service/#test-case-1-creates-a-new-individual-capif-log-entry","title":"Test Case 1: Creates a new individual CAPIF Log Entry.","text":"<p>Test ID: capif_api_logging-1</p> <p>Description:</p> <p>This test case will check that a CAPIF AEF can create log entry to Logging Service</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF provider is pre-authorised (has valid aefId from CAPIF Authority)</li> <li>Service exist in CAPIF</li> <li>Invoker exist in CAPIF</li> </ul> <p>Execution Steps: 1. Register Provider and Invoker CCF 2. Publish Service 3. Create Log Entry</p> <p>Information of Test:</p> <ol> <li> <p>Perform provider onboarding and invoker onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Log Entry:</p> <ol> <li>Send POST to https://{CAPIF_HOSTNAME}/api-invocation-logs/v1/{aefId}/logs</li> <li>body log entry request body</li> <li>Use AEF Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Logging Service must accomplish:<ol> <li>201 Created</li> <li>Response Body must follow InvocationLog data structure with:<ul> <li>aefId</li> <li>apiInvokerId</li> <li>logs</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invocation-logs/v1/{aefId}/logs/{logId}</li> </ol> </li> </ol>"},{"location":"testing/testplan/api_logging_service/#test-case-2-creates-a-new-individual-capif-log-entry-with-invalid-aefid","title":"Test Case 2: Creates a new individual CAPIF Log Entry with Invalid aefId","text":"<p>Test ID: capif_api_logging-2</p> <p>Description:</p> <p>This test case will check that a CAPIF subscriber (AEF) cannot create Log Entry without valid aefId</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF provider is not pre-authorised (has not valid aefId from CAPIF Authority)</li> <li>Service exist in CAPIF</li> <li>Invoker exist in CAPIF</li> </ul> <p>Execution Steps: 1. Register Provider and Invoker CCF 2. Publish Service 3. Create Log Entry</p> <p>Information of Test:</p> <ol> <li> <p>Perform provider onboarding and invoker onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Log Entry:</p> <ol> <li>Send POST to https://{CAPIF_HOSTNAME}/api-invocation-logs/v1/{not-valid-aefId}/logs</li> <li>body log entry request body</li> <li>Use AEF Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Logging Service must accomplish:<ol> <li>404 Not Found</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Exposer not exist\".</li> <li>cause with message \"Exposer id not found\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_logging_service/#test-case-3-creates-a-new-individual-capif-log-entry-with-invalid-serviceapi","title":"Test Case 3: Creates a new individual CAPIF Log Entry with Invalid serviceAPI","text":"<p>Test ID: capif_api_logging-3</p> <p>Description:</p> <p>This test case will check that a CAPIF subscriber (AEF) cannot create Log Entry without valid aefId</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid aefId from CAPIF Authority)</li> </ul> <p>Execution Steps: 1. Register Provider and Invoker CCF 2. Publish Service 3. Create Log Entry</p> <p>Information of Test:</p> <ol> <li> <p>Perform provider onboarding and invoker onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Log Entry:</p> <ol> <li>Send POST to https://{CAPIF_HOSTNAME}/api-invocation-logs/v1/{aefId}/logs</li> <li>body [log entry request body with serviceAPI apiName apiId not valid]</li> <li>Use AEF Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Logging Service must accomplish:<ol> <li>404 Not Found</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Invoker not exist\".</li> <li>cause with message \"Invoker id not found\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_logging_service/#test-case-4-creates-a-new-individual-capif-log-entry-with-invalid-apiinvokerid","title":"Test Case 4: Creates a new individual CAPIF Log Entry with Invalid apiInvokerId","text":"<p>Test ID: capif_api_logging-4</p> <p>Description:</p> <p>This test case will check that a CAPIF subscriber (AEF) cannot create Log Entry without valid aefId</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid aefId from CAPIF Authority)</li> </ul> <p>Execution Steps: 1. Register Provider and Invoker CCF 2. Publish Service 3. Create Log Entry</p> <p>Information of Test:</p> <ol> <li> <p>Perform provider onboarding and invoker onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Log Entry:</p> <ol> <li>Send POST to https://{CAPIF_HOSTNAME}/api-invocation-logs/v1/{aefId}/logs</li> <li>body [log entry request body with invokerId not valid]</li> <li>Use AEF Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Onboard request must accomplish:</p> <ol> <li>201 Created response.</li> <li>body returned must accomplish APIProviderEnrolmentDetails data structure.</li> <li>For each apiProvFuncs, we must check:<ol> <li>apiProvFuncId is set</li> <li>apiProvCert under regInfo is set properly</li> </ol> </li> <li>Location Header must contain the new resource URL {apiRoot}/api-provider-management/v1/registrations/{registrationId}</li> </ol> </li> <li> <p>Response to Logging Service must accomplish:</p> <ol> <li>404 Not Found</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Invoker not exist\".</li> <li>cause with message \"Invoker id not found\".</li> </ul> </li> </ol> </li> <li> <p>Log Entry are not stored in CAPIF Database</p> </li> </ol>"},{"location":"testing/testplan/api_logging_service/#test-case-5-creates-a-new-individual-capif-log-entry-with-invalid-aefid-in-body","title":"Test Case 5: Creates a new individual CAPIF Log Entry with Invalid aefId in body","text":"<p>Test ID: capif_api_logging-5</p> <p>Description:</p> <p>This test case will check that a CAPIF subscriber (AEF) cannot create Log Entry without valid aefId in body</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF provider is pre-authorised (has valid apfId from CAPIF Authority)</li> <li>Service exist in CAPIF</li> <li>Invoker exist in CAPIF</li> </ul> <p>Execution Steps: 1. Register Provider and Invoker CCF 2. Publish Service 3. Create Log Entry</p> <p>Information of Test:</p> <ol> <li> <p>Perform provider onboarding and invoker onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Log Entry:</p> <ol> <li>Send POST to https://{CAPIF_HOSTNAME}/api-invocation-logs/v1/{aefId}/logs</li> <li>body [log entry request body with bad aefId] </li> <li>Use AEF Certificate</li> </ol> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Logging Service must accomplish:<ol> <li>401 Unauthorized</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"AEF id not matching in request and body\".</li> <li>cause with message \"Not identical AEF id\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_provider_management/","title":"Test Plan for CAPIF Api Provider Management","text":"<p>At this documentation you will have all information and related files and examples of test plan for this API.</p>"},{"location":"testing/testplan/api_provider_management/#test-case-1-register-api-provider","title":"Test Case 1: Register Api Provider","text":"<p>Test ID: capif_api_provider_management-1</p> <p>Description:</p> <p>This test case will check that Api Provider can be registered con CCF</p> <p>Pre-Conditions:</p> <ul> <li>Provider is pre-authorised (has valid certificate from CAPIF Authority)</li> </ul> <p>Execution Steps:</p> <ol> <li>Create private and public key for provider and each function to register.</li> <li>Register Provider.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Create public and private key at provider for provider itself and each function (apf, aef and amf)</p> </li> <li> <p>Retrieve access_token by User:</p> <ul> <li>Send GET to https://${CAPIF_REGISTER}:${CAPIF_REGISTER_PORT}/getauth</li> <li>Include basic Auth Header with Admin user/password</li> <li>Retrieve access_token and the urls needed for next requests from response body user_getauth_response_body_example</li> </ul> </li> <li> <p>Register Provider:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations</li> <li>body provider request body</li> <li>Authentication Bearer with access_token</li> <li>Store each cert in a file with according name.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Register Provider at Provider Management:<ol> <li>201 Created response.</li> <li>body returned must accomplish APIProviderEnrolmentDetails data structure.</li> <li>For each apiProvFuncs, we must check:<ol> <li>apiProvFuncId is set</li> <li>apiProvCert under regInfo is set properly</li> </ol> </li> <li>Location Header must contain the new resource URL {apiRoot}/api-provider-management/v1/registrations/{registrationId}</li> </ol> </li> </ol>"},{"location":"testing/testplan/api_provider_management/#test-case-2-register-api-provider-already-registered","title":"Test Case 2: Register Api Provider Already registered","text":"<p>Test ID: capif_api_provider_management-2</p> <p>Description:</p> <p>This test case will check that a Api Provider previously registered cannot be re-registered</p> <p>Pre-Conditions:</p> <ul> <li>Api Provider was registered previously and there is a {registerId} for his Api Provider in the DB</li> </ul> <p>Execution Steps:</p> <ol> <li>Create private and public key for provider and each function to register.</li> <li>Register Provider.</li> <li>Re-Register Provider.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Create public and private key at provider for provider itself and each function (apf, aef and amf)</p> </li> <li> <p>Retrieve access_token by User:</p> <ul> <li>Send GET to https://${CAPIF_REGISTER}:${CAPIF_REGISTER_PORT}/getauth</li> <li>Include basic Auth Header with Admin user/password</li> <li>Retrieve access_token and the urls needed for next requests from response body user_getauth_response_body_example</li> </ul> </li> <li> <p>Register Provider:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations</li> <li>body provider request body</li> <li>Authentication Bearer with access_token</li> <li>Store each cert in a file with according name.</li> </ul> </li> <li> <p>Re-Register Provider:</p> <ul> <li>Same regSec than Previous registration</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Re-Register Provider:<ol> <li>403 Forbidden response.</li> <li> <p>body returned must accomplish ProblemDetails data structure, with:</p> <ul> <li>status 403</li> <li>title with message \"Forbidden\"</li> <li>detail with message \"Provider already registered\".</li> <li>cause with message \"Identical provider reg sec\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_provider_management/#test-case-3-update-registered-api-provider","title":"Test Case 3: Update Registered Api Provider","text":"<p>Test ID: capif_api_provider_management-3</p> <p>Description:</p> <p>This test case will check that a Registered Api Provider can be updated</p> <p>Pre-Conditions:</p> <ul> <li>Api Provider was registered previously and there is a {registerId} for his Api Provider in the DB</li> </ul> <p>Execution Steps:</p> <ol> <li>Create private and public key for provider and each function to register.</li> <li>Register Provider</li> <li>Update Provider</li> </ol> <p>Information of Test:</p> <ol> <li>Create public and private key at provider for provider itself and each function (apf, aef and amf)</li> <li> <p>Retrieve access_token by User:</p> <ul> <li>Send GET to https://${CAPIF_REGISTER}:${CAPIF_REGISTER_PORT}/getauth</li> <li>Include basic Auth Header with Admin user/password</li> <li>Retrieve access_token and the urls needed for next requests from response body user_getauth_response_body_example</li> </ul> </li> <li> <p>Register Provider:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations</li> <li>body provider request body</li> <li>Authentication Bearer with access_token</li> <li>Get Resource URL from Location</li> </ul> </li> <li> <p>Update Provider:</p> <ul> <li>Send PUT to Resource URL returned at registration https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations/{registrationId}</li> <li>body provider request body with apiProvDomInfo set to ROBOT_TESTING_MOD</li> <li>Use AMF Certificate.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Register Provider:</p> <ol> <li>201 Created response.</li> <li>body returned must accomplish APIProviderEnrolmentDetails data structure.</li> <li>Location Header must contain the new resource URL {apiRoot}/api-provider-management/v1/registrations/{registrationId}</li> </ol> </li> <li> <p>Update Provider:</p> <ol> <li>200 OK response.</li> <li>body returned must accomplish APIProviderEnrolmentDetails data structure, with:<ul> <li>apiProvDomInfo set to ROBOT_TESTING_MOD</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_provider_management/#test-case-4-update-not-registered-api-provider","title":"Test Case 4: Update Not Registered Api Provider","text":"<p>Test ID: capif_api_provider_management-4</p> <p>Description:</p> <p>This test case will check that a Non-Registered Api Provider cannot be updated</p> <p>Pre-Conditions:</p> <ul> <li>Api Provider was not registered previously</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF</li> <li>Update Not Registered Provider</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Create public and private key at provider for provider itself and each function (apf, aef and amf)</p> </li> <li> <p>Retrieve access_token by User:</p> <ul> <li>Send GET to https://${CAPIF_REGISTER}:${CAPIF_REGISTER_PORT}/getauth</li> <li>Include basic Auth Header with Admin user/password</li> <li>Retrieve access_token and the urls needed for next requests from response body user_getauth_response_body_example</li> </ul> </li> <li> <p>Register Provider:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations</li> <li>body provider request body</li> <li>Authentication Bearer with access_token</li> <li>Store each cert in a file with according name.</li> </ul> </li> <li> <p>Update Not Registered Provider:</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations/{API_PROVIDER_NOT_REGISTERED}</li> <li>body provider request body</li> <li>Use AMF Certificate.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Update Not Registered Provider:<ol> <li>404 Not Found response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Not Exist Provider Enrolment Details\".</li> <li>cause with message \"Not found registrations to Send THIS api provider details\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_provider_management/#test-case-5-partially-update-registered-api-provider","title":"Test Case 5: Partially Update Registered Api Provider","text":"<p>Test ID: capif_api_provider_management-5</p> <p>Description:</p> <p>This test case will check that a Registered Api Provider can be partially updated</p> <p>Pre-Conditions:</p> <ul> <li>Api Provider was registered previously and there is a {registerId} for his Api Provider in the DB</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF</li> <li>Register Provider</li> <li>Partial update provider</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Create public and private key at provider for provider itself and each function (apf, aef and amf)</p> </li> <li> <p>Retrieve access_token by User:</p> <ul> <li>Send GET to https://${CAPIF_REGISTER}:${CAPIF_REGISTER_PORT}/getauth</li> <li>Include basic Auth Header with Admin user/password</li> <li>Retrieve access_token and the urls needed for next requests from response body user_getauth_response_body_example</li> </ul> </li> <li> <p>Register Provider:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations</li> <li>body provider request body</li> <li>Authentication Bearer with access_token</li> <li>Store each cert in a file with according name.</li> </ul> </li> <li> <p>Partial update provider:</p> <ul> <li>Send PATCH https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations/{registrationId}</li> <li>body provider request patch body</li> <li>Use AMF Certificate.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Partial update provider at Provider Management:<ol> <li>200 OK response.</li> <li>body returned must accomplish APIProviderEnrolmentDetails data structure, with:<ul> <li>apiProvDomInfo with \"ROBOT_TESTING_MOD\"</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_provider_management/#test-case-6-partially-update-not-registered-api-provider","title":"Test Case 6: Partially Update Not Registered Api Provider","text":"<p>Test ID: capif_api_provider_management-6</p> <p>Description:</p> <p>This test case will check that a Non-Registered Api Provider cannot be partially updated </p> <p>Pre-Conditions:</p> <ul> <li>Api Provider was not registered previously</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF</li> <li>Register Provider</li> <li>Partial update provider</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Create public and private key at provider for provider itself and each function (apf, aef and amf)</p> </li> <li> <p>Retrieve access_token by User:</p> <ul> <li>Send GET to https://${CAPIF_REGISTER}:${CAPIF_REGISTER_PORT}/getauth</li> <li>Include basic Auth Header with Admin user/password</li> <li>Retrieve access_token and the urls needed for next requests from response body user_getauth_response_body_example</li> </ul> </li> <li> <p>Register Provider:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations</li> <li>body provider request body</li> <li>Authentication Bearer with access_token</li> <li>Store each cert in a file with according name.</li> </ul> </li> <li> <p>Partial update Provider:</p> <ul> <li>Send PATCH https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations/{API_API_PROVIDER_NOT_REGISTERED}</li> <li>body provider request patch body</li> <li>Use AMF Certificate.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Partial update provider:<ol> <li>404 Not Found response.</li> <li> <p>body returned must accomplish ProblemDetails data structure, with:</p> <ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Not Exist Provider Enrolment Details\".</li> <li>cause with message \"Not found registrations to Send THIS api provider details\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_provider_management/#test-case-7-delete-registered-api-provider","title":"Test Case 7: Delete Registered Api Provider","text":"<p>Test ID: capif_api_provider_management-7</p> <p>Description:</p> <p>This test case will check that a Registered Api Provider can be deleted</p> <p>Pre-Conditions:</p> <ul> <li>Api Provider was registered previously</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF</li> <li>Register Provider</li> <li>Delete Provider</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Create public and private key at provider for provider itself and each function (apf, aef and amf)</p> </li> <li> <p>Retrieve access_token by User:</p> <ul> <li>Send GET to https://${CAPIF_REGISTER}:${CAPIF_REGISTER_PORT}/getauth</li> <li>Include basic Auth Header with Admin user/password</li> <li>Retrieve access_token and the urls needed for next requests from response body user_getauth_response_body_example</li> </ul> </li> <li> <p>Register Provider:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations</li> <li>body provider request body</li> <li>Authentication Bearer with access_token</li> <li>Store each cert in a file with according name.</li> </ul> </li> <li> <p>Delete registered provider:</p> <ul> <li>Send DELETE https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations/{registrationId}</li> <li>Use AMF Certificate.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Delete Provider:<ol> <li>204 No Content response.</li> </ol> </li> </ol>"},{"location":"testing/testplan/api_provider_management/#test-case-8-delete-not-registered-api-provider","title":"Test Case 8: Delete Not Registered Api Provider","text":"<p>Test ID: capif_api_provider_management-8</p> <p>Description:</p> <p>This test case will check that a Non-Registered Api Provider cannot be deleted</p> <p>Pre-Conditions:</p> <ul> <li>Api Provider was not registered previously</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF</li> <li>Delete Provider</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Create public and private key at provider for provider itself and each function (apf, aef and amf)</p> </li> <li> <p>Retrieve access_token by User:</p> <ul> <li>Send GET to https://${CAPIF_REGISTER}:${CAPIF_REGISTER_PORT}/getauth</li> <li>Include basic Auth Header with Admin user/password</li> <li>Retrieve access_token and the urls needed for next requests from response body user_getauth_response_body_example</li> </ul> </li> <li> <p>Register Provider:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations</li> <li>body provider request body</li> <li>Authentication Bearer with access_token</li> <li>Store each cert in a file with according name.</li> </ul> </li> <li> <p>Delete registered provider at Provider Management:</p> <ul> <li>Send DELETE https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations/{API_PROVIDER_NOT_REGISTERED}</li> <li>Use AMF Certificate.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Delete Provider:<ol> <li>404 Not Found response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Not Exist Provider Enrolment Details\".</li> <li>cause with message \"Not found registrations to Send THIS api provider details\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_publish_service/","title":"Test Plan for CAPIF Api Publish Service","text":"<p>At this documentation you will have all information and related files and examples of test plan for this API.</p>"},{"location":"testing/testplan/api_publish_service/#test-case-1-publish-api-by-authorised-api-publisher","title":"Test Case 1: Publish API by Authorised API Publisher","text":"<p>Test ID: capif_api_publish_service-1</p> <p>Description:</p> <p>This test case will check that an API Publisher can Publish an API</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid apfId from CAPIF Authority)</li> </ul> <p>Execution Steps:</p> <ol> <li> <p>Register Provider at CCF and store certificates.</p> </li> <li> <p>Publish Service API</p> </li> <li> <p>Retrieve {apiId} from body and Location header with new resource created from response</p> </li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> </li> <li> <p>Send POST to ccf_publish_url: https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</p> </li> <li>body service api description with apiName service_1</li> <li>Use APF Certificate</li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Publish request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiId</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId}</li> </ol> </li> <li> <p>Published Service API is stored in CAPIF Database</p> </li> </ol>"},{"location":"testing/testplan/api_publish_service/#test-case-2-publish-api-by-non-authorised-api-publisher","title":"Test Case 2: Publish API by NON Authorised API Publisher","text":"<p>Test ID: capif_api_publish_service-2</p> <p>Description:</p> <p>This test case will check that an API Publisher cannot Publish an API withot valid apfId </p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is NOT pre-authorised (has invalid apfId from CAPIF Authority)</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF and store certificates.</li> <li>Publish Service API with invalid APF ID</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API with invalid APF ID at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{APF_ID_NOT_VALID}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Publish request must accomplish:</p> <ol> <li>401 Unauthorized</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"Publisher not existing\".</li> <li>cause with message \"Publisher id not found\".</li> </ul> </li> </ol> </li> <li> <p>Service API is NOT stored in CAPIF Database</p> </li> </ol>"},{"location":"testing/testplan/api_publish_service/#test-case-3-retrieve-all-apis-published-by-authorised-apfid","title":"Test Case 3: Retrieve all APIs Published by Authorised apfId","text":"<p>Test ID: capif_api_publish_service-3</p> <p>Description:</p> <p>This test case will check that an API Publisher can Retrieve all API published</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid apfId from CAPIF Authority)</li> <li>At least 2 service APIs are published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF and store certificates.</li> <li>Publish Service API service_1</li> <li>Retrieve {apiId1} from body and Location header with new resource created from response</li> <li>Publish Service API service_2</li> <li>Retrieve {apiId2} from body and Location header with new resource created from response</li> <li>Retrieve All published APIs and check if both are present.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Get apiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Publish Other Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_2</li> <li>Get apiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Retrieve all published APIs:</p> <ul> <li>Send GET to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>Use APF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to service 1 Publish request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiId</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId1}</li> </ol> </li> <li> <p>Response to service 2 Publish request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiId</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId2}</li> </ol> </li> <li> <p>Published Service APIs are stored in CAPIF Database</p> </li> <li> <p>Response to Retrieve all published APIs:</p> <ol> <li>200 OK</li> <li>Response body must return an array of ServiceAPIDescription data.</li> <li>Array must contain all previously published APIs.</li> </ol> </li> </ol>"},{"location":"testing/testplan/api_publish_service/#test-case-4-retrieve-all-apis-published-by-non-authorised-apfid","title":"Test Case 4: Retrieve all APIs Published by NON Authorised apfId","text":"<p>Test ID: capif_api_publish_service-4</p> <p>Description:</p> <p>This test case will check that an API Publisher cannot Retrieve API published when apfId is not authorised </p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is NOT pre-authorised (has invalid apfId from CAPIF Authority)</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF and store certificates.</li> <li>Retrieve All published APIs</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Retrieve all published APIs:</p> <ul> <li>Send GET to https://{CAPIF_HOSTNAME}/published-apis/v1/{APF_ID_NOT_VALID}/service-apis</li> <li>Use APF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Publish request must accomplish:</p> <ol> <li>401 Non Authorized</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"Provider not existing\".</li> <li>cause with message \"Provider id not found\".</li> </ul> </li> </ol> </li> <li> <p>Service API is NOT stored in CAPIF Database</p> </li> </ol>"},{"location":"testing/testplan/api_publish_service/#test-case-5-retrieve-single-apis-published-by-authorised-apfid","title":"Test Case 5: Retrieve single APIs Published by Authorised apfId","text":"<p>Test ID: capif_api_publish_service-5</p> <p>Description:</p> <p>This test case will check that an API Publisher can Retrieve API published one by one</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid apfId from CAPIF Authority)</li> <li>At least 2 service APIs are published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF and store certificates.</li> <li>Publish Service API service_1.</li> <li>Retrieve {apiId1} from body and Location header with new resource created from response.</li> <li>Publish Service API service_2.</li> <li>Retrieve {apiId2} from body and Location header with new resource created from response.</li> <li>Retrieve service_1 API Detail.</li> <li>Retrieve service_2 API Detail.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Get apiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Publish Other Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_2</li> <li>Get apiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Retrieve service_1 published APIs detail:</p> <ul> <li>Send GET to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{apiId1}</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Retrieve service_2 published APIs detail:</p> <ul> <li>Send GET to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{apiId2}</li> <li>Use APF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to service 1 Publish request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiId</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId1}</li> </ol> </li> <li> <p>Response to service 2 Publish request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiId</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId2}</li> </ol> </li> <li> <p>Published Service APIs are stored in CAPIF Database</p> </li> <li> <p>Response to Retrieve service_1 published API using apiId1:</p> <ol> <li>200 OK</li> <li>Response body must return a ServiceAPIDescription data.</li> <li>Array must contain same information than service_1 published registration response.</li> </ol> </li> <li> <p>Response to Retrieve service_2 published API using apiId2:</p> <ol> <li>200 OK</li> <li>Response body must return a ServiceAPIDescription data.</li> <li>Array must contain same information than service_2 published registration response.</li> </ol> </li> </ol>"},{"location":"testing/testplan/api_publish_service/#test-case-6-retrieve-single-apis-non-published-by-authorised-apfid","title":"Test Case 6: Retrieve single APIs non Published by Authorised apfId","text":"<p>Test ID: capif_api_publish_service-6</p> <p>Description:</p> <p>This test case will check that an API Publisher try to get detail of not published api.</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid apfId from CAPIF Authority)</li> <li>No published api</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF and store certificates.</li> <li>Retrieve not published API Detail.</li> </ol> <p>Information of Test:</p> <ol> <li>Perform Provider Registration</li> <li>Retrieve not published APIs detail:<ul> <li>Send GET to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{SERVICE_API_ID_NOT_VALID}</li> <li>Use APF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Retrieve for NOT published API must accomplish:<ol> <li>404 Not Found</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Service API not found\".</li> <li>cause with message \"No Service with specific credentials exists\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_publish_service/#test-case-7-retrieve-single-apis-published-by-non-authorised-apfid","title":"Test Case 7: Retrieve single APIs Published by NON Authorised apfId","text":"<p>Test ID: capif_api_publish_service-7</p> <p>Description:</p> <p>This test case will check that an API Publisher cannot Retrieve detailed API published when apfId is not authorised </p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is NOT pre-authorised (has invalid apfId from CAPIF Authority)</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF and store certificates.</li> <li>Publish Service API at CCF</li> <li>Retrieve {apiId} from body and Location header with new resource created from response.</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Invoker Certificate</li> <li>Retrieve detailed published API acting as Invoker</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Get apiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Retrieve detailed published APIs:</p> <ul> <li>Send GET to https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/${apiId}</li> <li>Use Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Retrieve Detailed published API acting as Invoker must accomplish:</p> <ol> <li>401 Unauthorized</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"User not authorized\".</li> <li>cause with message \"Certificate not authorized\".</li> </ul> </li> </ol> </li> <li> <p>Service API is NOT stored in CAPIF Database</p> </li> </ol>"},{"location":"testing/testplan/api_publish_service/#test-case-8-update-api-published-by-authorised-apfid-with-valid-serviceapiid","title":"Test Case 8: Update API Published by Authorised apfId with valid serviceApiId","text":"<p>Test ID: capif_api_publish_service-8</p> <p>Description:</p> <p>This test case will check that an API Publisher can Update published API with a valid serviceApiId </p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid apfId from CAPIF Authority)</li> <li>A service APIs is published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF and store certificates.</li> <li>Publish Service API</li> <li>Retrieve {apiId} from body and Location header with new resource url created from response</li> <li>Update published Service API.</li> <li>Retrieve detail of Service API</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Get apiId</li> <li>get resource url from location Header.</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Update published API at CCF:</p> <ul> <li>Send PUT to resource URL https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{serivceApiId}</li> <li>body service api description with overrided apiName to service_1_modified</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Retrieve detail of service API:</p> <ul> <li>Send GET to resource URL https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{serivceApiId}</li> <li>check apiName is service_1_modified</li> <li>Use APF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Publish request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiId</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId}</li> </ol> </li> <li> <p>Response to Update Published Service API:</p> <ol> <li>200 OK</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiName service_1_modified</li> </ul> </li> </ol> </li> <li> <p>Response to Retrieve detail of Service API:</p> <ol> <li>200 OK</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiName service_1_modified.</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_publish_service/#test-case-9-update-apis-published-by-authorised-apfid-with-invalid-serviceapiid","title":"Test Case 9: Update APIs Published by Authorised apfId with invalid serviceApiId","text":"<p>Test ID: capif_api_publish_service-9</p> <p>Description:</p> <p>This test case will check that an API Publisher cannot Update published API with a invalid serviceApiId</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid apfId from CAPIF Authority)</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF and store certificates.</li> <li>Update published Service API.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Get apiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Update published API at CCF:</p> <ul> <li>Send PUT to resource URL https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{SERVICE_API_ID_NOT_VALID}</li> <li>body service api description with overrided apiName to service_1*_modified*</li> <li>Use APF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Publish request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiId</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId}</li> </ol> </li> <li> <p>Response to Update Published Service API:</p> <ol> <li>404 Not Found</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Service API not found\".</li> <li>cause with message \"Service API id not found\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_publish_service/#test-case-10-update-apis-published-by-non-authorised-apfid","title":"Test Case 10: Update APIs Published by NON Authorised apfId","text":"<p>Test ID: capif_api_publish_service-10</p> <p>Description:</p> <p>This test case will check that an API Publisher cannot Update API published when apfId is not authorised</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is NOT pre-authorised (has invalid apfId from CAPIF Authority)</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF and store certificates.</li> <li>Publish Service API at CCF</li> <li>Retrieve {apiId} from body and Location header with new resource created from response.</li> <li>Register and onboard Invoker at CCF</li> <li>Store signed Invoker Certificate</li> <li>Update published API at CCF as Invoker</li> <li>Retrieve detail of Service API as publisher</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Get apiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Update published API at CCF:</p> <ul> <li>Send PUT to resource URL https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{serviceApiId}</li> <li>body service api description with overrided apiName to service_1*_modified*</li> <li>Use Invoker Certificate</li> </ul> </li> <li> <p>Retrieve detail of service API:</p> <ul> <li>Send GET to resource URL https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{serivceApiId}</li> <li>check apiName is service_1</li> <li>Use APF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Update published API acting as Invoker must accomplish:</p> <ol> <li>401 Unauthorized</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"User not authorized\".</li> <li>cause with message \"Certificate not authorized\".</li> </ul> </li> </ol> </li> <li> <p>Response to Retrieve Detail of Service API:</p> <ol> <li>200 OK</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiName service_1.</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_publish_service/#test-case-11-delete-api-published-by-authorised-apfid-with-valid-serviceapiid","title":"Test Case 11: Delete API Published by Authorised apfId with valid serviceApiId","text":"<p>Test ID: capif_api_publish_service-11</p> <p>Description:</p> <p>This test case will check that an API Publisher can Delete published API with a valid serviceApiId</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid apfId from CAPIF Authority).</li> <li>A service APIs is published.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF and store certificates.</li> <li>Publish Service API</li> <li>Retrieve {apiId} from body and Location header with new resource created from response</li> <li>Remove published API at CCF</li> <li>Try to retreive deleted service API from CCF</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Get apiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Remove published Service API at CCF:</p> <ul> <li>Send DELETE to resource URL https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{serviceApiId}</li> <li>Use APF Certificate</li> </ul> </li> <li>Retrieve detail of service API:<ul> <li>Send GET to resource URL https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{serivceApiId}</li> <li>Use APF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Response to Publish request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow ServiceAPIDescription data structure with:<ul> <li>apiId</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/published-apis/v1/{apfId}/service-apis/{serviceApiId}</li> </ol> </li> <li> <p>Published Service API is stored in CAPIF Database</p> </li> <li> <p>Response to Remove published Service API at CCF:</p> <ol> <li>204 No Content</li> </ol> </li> <li> <p>Response to Retrieve for DELETED published API must accomplish:</p> <ol> <li>404 Not Found</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Service API not found\".</li> <li>cause with message \"No Service with specific credentials exists\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_publish_service/#test-case-12-delete-apis-published-by-authorised-apfid-with-invalid-serviceapiid","title":"Test Case 12: Delete APIs Published by Authorised apfId with invalid serviceApiId","text":"<p>Test ID: capif_api_publish_service-12</p> <p>Description:</p> <p>This test case will check that an API Publisher cannot Delete with invalid serviceApiId</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid apfId from CAPIF Authority).</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF and store certificates.</li> <li>Remove published API at CCF with invalid serviceId</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Remove published Service API at CCF with invalid serviceId:</p> <ul> <li>Send DELETE to resource URL https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{SERVICE_API_ID_NOT_VALID}</li> <li>Use APF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Remove published Service API at CCF:<ol> <li>404 Not Found</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Service API not found\".</li> <li>cause with message \"Service API id not found\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_publish_service/#test-case-13-delete-apis-published-by-non-authorised-apfid","title":"Test Case 13: Delete APIs Published by NON Authorised apfId","text":"<p>Test ID: capif_api_publish_service-12</p> <p>Description:</p> <p>This test case will check that an API Publisher cannot Delete API published when apfId is not authorised</p> <p>Pre-Conditions:</p> <ul> <li>CAPIF subscriber is pre-authorised (has valid apfId from CAPIF Authority).</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF and store certificates.</li> <li>Register Invoker and onboard Invoker at CCF</li> <li>Remove published API at CCF with invalid serviceId as Invoker</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body service api description with apiName service_1</li> <li>Get apiId</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Remove published Service API at CCF with invalid serviceId as Invoker:</p> <ul> <li>Send DELETE to resource URL https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis/{SERVICE_API_ID_NOT_VALID}</li> <li>Use Invoker Certificate.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Remove published Service API at CCF:<ol> <li>401 Unauthorized</li> <li>Error Response Body must accomplish with ProblemDetails data structure with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"User not authorized\".</li> <li>cause with message \"Certificate not authorized\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/","title":"Test Plan for CAPIF Api Security Service","text":"<p>At this documentation you will have all information and related files and examples of test plan for this API.</p>"},{"location":"testing/testplan/api_security_service/#test-case-1-create-a-security-context-for-an-api-invoker","title":"Test Case 1: Create a security context for an API invoker","text":"<p>Test ID: capif_security_api-1</p> <p>Description:</p> <p>This test case will check that an API Invoker can create a Security context</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised (has valid apiInvokerID from CAPIF Authority)</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> </ol> <p>Information of Test:</p> <ol> <li>Perform Invoker Onboarding</li> <li>Create Security Context for this Invoker<ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Create security context:<ol> <li>201 Created response.</li> <li>body returned must accomplish ServiceSecurity data structure.</li> <li>Location Header must contain the new resource URL {apiRoot}/capif-security/v1/trustedInvokers/{apiInvokerId}</li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-2-create-a-security-context-for-an-api-invoker-with-provider-role","title":"Test Case 2: Create a security context for an API invoker with Provider role","text":"<p>Test ID:: capif_security_api-2</p> <p>Description:</p> <p>This test case will check that an Provider cannot create a Security context with valid apiInvokerId.</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised (has valid apiInvokerID), but user that create Security Context with Provider role</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Invoker at CCF</li> <li>Register Provider at CCF</li> <li>Create Security Context using Provider certificate</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Create Security Context for this Invoker but using Provider certificate.</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using AEF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Create security context using Provider certificate:</p> <ol> <li>401 Unauthorized response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"Role not authorized for this API route\".</li> <li>cause with message \"User role must be invoker\".</li> </ul> </li> </ol> </li> <li> <p>No context stored at DB</p> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-3-create-a-security-context-for-an-api-invoker-with-provider-entity-role-and-invalid-apiinvokerid","title":"Test Case 3: Create a security context for an API invoker with Provider entity role and invalid apiInvokerId","text":"<p>Test ID:: capif_security_api-3</p> <p>Description:</p> <p>This test case will check that an Provider cannot create a Security context with invalid apiInvokerID.</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised (has valid apiInvokerID), but user that create Security Context with Provider role</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF</li> <li>Create Security Context using Provider certificate</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Create Security Context for this not valid apiInvokerId and using Provider certificate.</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{API_INVOKER_NOT_VALID}</li> <li>body service security body</li> <li>Using AEF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Create security context using Provider certificate:<ol> <li>401 Unauthorized response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"Role not authorized for this API route\".</li> <li>cause with message \"User role must be invoker\".</li> </ul> </li> </ol> </li> <li>No context stored at DB</li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-4-create-a-security-context-for-an-api-invoker-with-invoker-entity-role-and-invalid-apiinvokerid","title":"Test Case 4: Create a security context for an API invoker with Invoker entity role and invalid apiInvokerId","text":"<p>Test ID:: capif_security_api-4</p> <p>Description:</p> <p>This test case will check that an Invoker cannot create a Security context with valid apiInvokerId.</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised (has valid apiInvokerID), but user that create Security Context with invalid apiInvokerId</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Invoker at CCF</li> <li>Create Security Context using Provider certificate</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Invoker Onboarding</p> </li> <li> <p>Create Security Context for this Invoker:</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{API_INVOKER_NOT_VALID}</li> <li>body service security body</li> <li>Use Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Create security context using Provider certificate:</p> <ol> <li>404 Not Found response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Invoker not found\".</li> <li>cause with message \"API Invoker not exists or invalid ID\".</li> </ul> </li> </ol> </li> <li> <p>No context stored at DB</p> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-5-retrieve-the-security-context-of-an-api-invoker","title":"Test Case 5: Retrieve the Security Context of an API Invoker","text":"<p>Test ID:: capif_security_api-5</p> <p>Description:</p> <p>This test case will check that an provider can retrieve the Security context of an API Invoker</p> <p>Pre-Conditions:</p> <ul> <li>Provider is pre-authorised (has valid apfId from CAPIF Authority) and API Invoker has created a valid Security Context</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Invoker at CCF</li> <li>Register Provider at CCF</li> <li>Create Security Context using Provider certificate</li> <li>Retrieve Security Context by Provider</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Create Security Context for this Invoker.</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate</li> </ul> </li> <li> <p>Retrieve Security Context of Invoker by Provider:</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>Using AEF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Retrieve security context:<ol> <li>200 OK response.</li> <li>body returned must accomplish ServiceSecurity data structure.</li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-6-retrieve-the-security-context-of-an-api-invoker-with-invalid-apiinvokerid","title":"Test Case 6: Retrieve the Security Context of an API Invoker with invalid apiInvokerID","text":"<p>Test ID:: capif_security_api-6</p> <p>Description:</p> <p>This test case will check that an provider can retrieve the Security context of an API Invoker</p> <p>Pre-Conditions:</p> <ul> <li>Provider is pre-authorised (has valid apfId from CAPIF Authority) and API Invoker has created a valid Security Context</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF</li> <li>Create Security Context using Provider certificate</li> <li>Retrieve Security Context by Provider of invalid invoker</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Retrieve Security Context of invalid Invoker by Provider:</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/trustedInvokers/{API_INVOKER_NOT_VALID}</li> <li>Using AEF Certificate.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Retrieve security context:<ol> <li>404 Not Found response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Invoker not found\".</li> <li>cause with message \"API Invoker not exists or invalid ID\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-7-retrieve-the-security-context-of-an-api-invoker-with-invalid-apfid","title":"Test Case 7: Retrieve the Security Context of an API Invoker with invalid apfId","text":"<p>Test ID:: capif_security_api-7</p> <p>Description:</p> <p>This test case will check that an Provider cannot retrieve the Security context of an API Invoker without valid apfId</p> <p>Pre-Conditions:</p> <ul> <li>API Exposure Function is not pre-authorised (has invalid apfId)</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Invoker at CCF</li> <li>Store signed Certificate</li> <li>Create Security Context</li> <li>Retrieve Security Context as Provider.</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate</li> </ul> </li> <li> <p>Retrieve Security Context as Invoker role:</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>Using Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Create security context:<ol> <li>401 Unauthorized response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"Role not authorized for this API route\".</li> <li>cause with message \"User role must be aef\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-8-delete-the-security-context-of-an-api-invoker","title":"Test Case 8: Delete the Security Context of an API Invoker","text":"<p>Test ID:: capif_security_api-8</p> <p>Description:</p> <p>This test case will check that an Provider can delete a Security context</p> <p>Pre-Conditions:</p> <ul> <li>Provider is pre-authorised (has valid apfId from CAPIF Authority) and API Invoker has created a valid Security Context</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Invoker at CCF</li> <li>Register Provider at CCF</li> <li>Create Security Context using Provider certificate</li> <li>Delete Security Context by Provider</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Create Security Context for this Invoker but using Provider certificate.</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using AEF Certificate</li> </ul> </li> <li> <p>Delete Security Context of Invoker by Provider:</p> <ul> <li>Send DELETE https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>Use AEF Certificate</li> </ul> </li> <li> <p>Retrieve Security Context of Invoker by Provider:</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>Using AEF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Delete security context:</p> <ol> <li>204 No Content response.</li> </ol> </li> <li> <p>Retrieve security context:</p> <ol> <li>404 Not Found response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Security context not found\".</li> <li>cause with message \"API Invoker not exists or invalid ID\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-9-delete-the-security-context-of-an-api-invoker-with-invoker-entity-role","title":"Test Case 9: Delete the Security Context of an API Invoker with Invoker entity role","text":"<p>Test ID:: capif_security_api-9</p> <p>Description:</p> <p>This test case will check that an Invoker cannot delete a Security context</p> <p>Pre-Conditions:</p> <ul> <li>Provider is pre-authorised (has valid apfId from CAPIF Authority) and API Invoker has created a valid Security Context</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF</li> <li>Create Security Context using Provider certificate</li> <li>Delete Security Context by Invoker</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Create Security Context for this Invoker:</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate</li> </ul> </li> <li> <p>Delete Security Context of Invoker:</p> <ul> <li>Send DELETE https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>Use Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Delete security context:<ol> <li>401 Unauthorized response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"Role not authorized for this API route\".</li> <li>cause with message \"User role must be aef\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-10-delete-the-security-context-of-an-api-invoker-with-invoker-entity-role-and-invalid-apiinvokerid","title":"Test Case 10: Delete the Security Context of an API Invoker with Invoker entity role and invalid apiInvokerID","text":"<p>Test ID:: capif_security_api-10</p> <p>Description:</p> <p>This test case will check that an Invoker cannot delete a Security context with invalid </p> <p>Pre-Conditions:</p> <ul> <li>Invoker is pre-authorised.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF</li> <li>Delete Security Context by invoker</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Invoker Onboarding</p> </li> <li> <p>Delete Security Context of Invoker:</p> <ul> <li>Send DELETE https://{CAPIF_HOSTNAME}/trustedInvokers/{API_INVOKER_NOT_VALID}</li> <li>Use Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Delete security context:<ol> <li>401 Unauthorized response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"Role not authorized for this API route\".</li> <li>cause with message \"User role must be aef\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-11-delete-the-security-context-of-an-api-invoker-with-invalid-apiinvokerid","title":"Test Case 11: Delete the Security Context of an API Invoker with invalid apiInvokerID","text":"<p>Test ID:: capif_security_api-11</p> <p>Description:</p> <p>This test case will check that an Provider cannot delete a Security context of invalid apiInvokerId</p> <p>Pre-Conditions:</p> <ul> <li>Provider is pre-authorised (has valid apfId from CAPIF Authority).</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF</li> <li>Delete Security Context by provider</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Delete Security Context of Invoker by Provider:</p> <ul> <li>Send DELETE https://{CAPIF_HOSTNAME}/trustedInvokers/{API_INVOKER_NOT_VALID}</li> <li>Use AEF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Retrieve security context:<ol> <li>404 Not Found response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Invoker not found\".</li> <li>cause with message \"API Invoker not exists or invalid ID\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-12-update-the-security-context-of-an-api-invoker","title":"Test Case 12: Update the Security Context of an API Invoker","text":"<p>Test ID:: capif_security_api-12</p> <p>Description:</p> <p>This test case will check that an API Invoker can update a Security context</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised (has valid apiInvokerID from CAPIF Authority) and Provider is also authorized</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Invoker at CCF</li> <li>Register Provider at CCF</li> <li>Create Security Context By Invoker</li> <li>Update Security Context By Invoker</li> <li>Retrieve Security Context By Provider</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Create Security Context for this Invoker:</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate.</li> </ul> </li> <li> <p>Update Security Context of Invoker:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}/update</li> <li>body service security body but with notification destination modified to http://robot.testing2</li> <li>Using Invoker Certificate.</li> </ul> </li> <li> <p>Retrieve Security Context of Invoker by Provider:</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>Using AEF Certificate.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Update security context:</p> <ol> <li>200 OK response.</li> <li>body returned must accomplish ServiceSecurity data structure.</li> </ol> </li> <li> <p>Retrieve security context:</p> <ol> <li>200 OK response.</li> <li>body returned must accomplish ServiceSecurity data structure.<ol> <li>Check is this returned object match with modified one.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-13-update-the-security-context-of-an-api-invoker-with-provider-entity-role","title":"Test Case 13: Update the Security Context of an API Invoker with Provider entity role","text":"<p>Test ID:: capif_security_api-13</p> <p>Description:</p> <p>This test case will check that an Provider cannot update a Security context</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised (has valid apiInvokerID from CAPIF Authority) and Provider is also authorized.</li> <li>Invoker has created the Security Context previously.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Invoker at CCF</li> <li>Register Provider at CCF</li> <li>Create Security Context</li> <li>Update Security Context as Provider</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Create Security Context for this Invoker:</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate.</li> </ul> </li> <li> <p>Update Security Context of Invoker by Provider:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}/update</li> <li>body service security body but with notification destination modified to http://robot.testing2</li> <li>Using AEF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Update security context:<ol> <li>401 Unauthorized response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"Role not authorized for this API route\".</li> <li>cause with message \"User role must be invoker\". </li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-14-update-the-security-context-of-an-api-invoker-with-aef-entity-role-and-invalid-apiinvokerid","title":"Test Case 14: Update the Security Context of an API Invoker with AEF entity role and invalid apiInvokerId","text":"<p>Test ID:: capif_security_api-14</p> <p>Description:</p> <p>This test case will check that an Provider cannot update a Security context of invalid apiInvokerId</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised (has valid apiInvokerID from CAPIF Authority) and Provider is also authorized.</li> <li>Invoker has created the Security Context previously.</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF</li> <li>Update Security Context as Provider</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration</p> </li> <li> <p>Update Security Context of Invoker by Provider:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/trustedInvokers/{API_INVOKER_NOT_VALID}/update</li> <li>body service security body</li> <li>Using AEF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Update security context:<ol> <li>401 Unauthorized response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"Role not authorized for this API route\".</li> <li>cause with message \"User role must be invoker\". </li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-15-update-the-security-context-of-an-api-invoker-with-invalid-apiinvokerid","title":"Test Case 15: Update the Security Context of an API Invoker with invalid apiInvokerID","text":"<p>Test ID:: capif_security_api-15</p> <p>Description:</p> <p>This test case will check that an API Invoker cannot update a Security context not valid apiInvokerId</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised (has valid apiInvokerID from CAPIF Authority)</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Invoker at CCF</li> <li>Update Security Context</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Update Security Context of Invoker:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/trustedInvokers/{API_INVOKER_NOT_VALID}/update</li> <li>body service security body</li> <li>Using Invoker Certificate.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Retrieve security context:<ol> <li>404 Not Found response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Invoker not found\".</li> <li>cause with message \"API Invoker not exists or invalid ID\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-16-revoke-the-authorization-of-the-api-invoker-for-apis","title":"Test Case 16: Revoke the authorization of the API invoker for APIs.","text":"<p>Test ID:: capif_security_api-16</p> <p>Description:</p> <p>This test case will check that a Provider can revoke the authorization for APIs</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised (has valid apiInvokerID from CAPIF Authority) and Provider is also authorized</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Invoker at CCF</li> <li>Register Provider at CCF</li> <li>Create Security Context by Invoker</li> <li>Revoke Security Context by Provider</li> <li>Retrieve Security Context by Provider</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Create Security Context By Invoker:</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate</li> </ul> </li> <li> <p>Revoke Authorization by Provider:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}/delete</li> <li>body security notification body</li> <li>Using AEF Certificate.</li> </ul> </li> <li> <p>Retrieve Security Context by Provider:</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>Using AEF Certificate.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Revoke Authorization:</p> <ol> <li>204 No Content response.</li> </ol> </li> <li> <p>Retrieve security context:</p> <ol> <li>404 Not Found response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Security context not found\".</li> <li>cause with message \"API Invoker has no security context\".</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-17-revoke-the-authorization-of-the-api-invoker-for-apis-without-valid-apfid","title":"Test Case 17: Revoke the authorization of the API invoker for APIs without valid apfID.","text":"<p>Test ID:: capif_security_api-17</p> <p>Description:</p> <p>This test case will check that an Invoker can't revoke the authorization for APIs</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised (has valid apiInvokerID from CAPIF Authority) and Provider is also authorized</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Invoker at CCF</li> <li>Register Provider at CCF</li> <li>Create Security Context</li> <li>Revoke Security Context by invoker</li> <li>Retrieve Security Context</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Create Security Context for this Invoker:</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate.</li> </ul> </li> <li> <p>Revoke Authorization by invoker:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}/delete</li> <li>body security notification body</li> <li>Using Invoker Certificate</li> </ul> </li> <li> <p>Retrieve Security Context of Invoker by Provider:</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>Using Provider Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Revoke Security Context by invoker:</p> <ol> <li>401 Unauthorized response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 401</li> <li>title with message \"Unauthorized\"</li> <li>detail with message \"Role not authorized for this API route\".</li> <li>cause with message \"User role must be provider\". </li> </ul> </li> </ol> </li> <li> <p>Retrieve security context:</p> <ol> <li>200 OK response.</li> <li>body returned must accomplish ServiceSecurity data structure.<ol> <li>Check is this returned object match with created one.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-18-revoke-the-authorization-of-the-api-invoker-for-apis-with-invalid-apiinvokerid","title":"Test Case 18: Revoke the authorization of the API invoker for APIs with invalid apiInvokerId.","text":"<p>Test ID:: capif_security_api-18</p> <p>Description:</p> <p>This test case will check that an API Exposure Function cannot revoke the authorization for APIs for invalid apiInvokerId</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised (has valid apiInvokerID from CAPIF Authority) and Provider is also authorized</li> </ul> <p>Execution Steps:</p> <ol> <li>Register and onboard Invoker at CCF</li> <li>Register Provider at CCF</li> <li>Create Security Context</li> <li>Revoke Security Context by Provider</li> <li>Retrieve Security Context</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Create Security Context for this Invoker:</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate.</li> </ul> </li> <li> <p>Revoke Authorization by Provider:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/trustedInvokers/{API_INVOKER_NOT_VALID}/delete</li> <li>body security notification body</li> <li>Using AEF Certificate.</li> </ul> </li> <li> <p>Retrieve Security Context of Invoker by Provider:</p> <ul> <li>Send GET https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}?authenticationInfo=true&authorizationInfo=true</li> <li>This request will ask with parameter to retrieve authenticationInfo and authorizationInfo</li> <li>Using AEF Certificate.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li> <p>Revoke Security Context by invoker:</p> <ol> <li>404 Not Found response.</li> <li>body returned must accomplish ProblemDetails data structure, with:<ul> <li>status 404</li> <li>title with message \"Not Found\"</li> <li>detail with message \"Invoker not found\".</li> <li>cause with message \"API Invoker not exists or invalid ID\".</li> </ul> </li> </ol> </li> <li> <p>Retrieve security context:</p> <ol> <li>200 OK response.</li> <li>body returned must accomplish ServiceSecurity data structure.<ol> <li>Check is this return one object that match with created one.</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-19-retrieve-access-token","title":"Test Case 19: Retrieve access token","text":"<p>Test ID:: capif_security_api-19</p> <p>Description:</p> <p>This test case will check that an API Invoker can retrieve a security access token OAuth 2.0.</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised (has valid apiInvokerId)</li> <li>Service API of Provider is published</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API service_1 at CCF</li> <li>Register and onboard Invoker at CCF</li> <li>Discover Service APIs by Invoker.</li> <li>Create Security Context According to Service APIs discovered.</li> <li>Request Access Token</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Request Discover Published APIs not filtered:</p> <ul> <li>Send GET to ccf_discover_url https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}</li> <li>Param api-invoker-id is mandatory</li> <li>Using Invoker Certificate</li> </ul> </li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate.</li> <li>Create Security Information Body with one securityInfo for each aef present at each serviceAPIDescription present at Discover.</li> </ul> </li> <li> <p>Request Access Token by invoker:</p> <ul> <li>Sent POST https://{CAPIF_HOSTNAME}/securities/{securityId}/token:</li> <li>body access token req body and example example</li> <li>securityId is apiInvokerId.</li> <li>grant_type=client_credentials.</li> <li>Create Scope properly for request: 3gpp#{aef_id}:{api_name}</li> <li>Using Invoker Certificate.</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Request of Access Token:<ol> <li>200 OK</li> <li>body must follow AccessTokenRsp with:<ol> <li>access_token present</li> <li>token_type=Bearer</li> </ol> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-20-retrieve-access-token-by-provider","title":"Test Case 20: Retrieve access token by Provider","text":"<p>Test ID:: capif_security_api-20</p> <p>Description:</p> <p>This test case will check that an API Exposure Function cannot revoke the authorization for APIs for invalid apiInvokerId</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised (has valid apiInvokerID from CAPIF Authority) and Provider is also authorized</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API service_1 at CCF</li> <li>Register and onboard Invoker at CCF</li> <li>Discover Service APIs by Invoker.</li> <li>Create Security Context According to Service APIs discovered.</li> <li>Request Access Token by Provider</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Request Discover Published APIs not filtered:</p> <ul> <li>Send GET to ccf_discover_url https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}</li> <li>Param api-invoker-id is mandatory</li> <li>Using Invoker Certificate</li> </ul> </li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate.</li> <li>Create Security Information Body with one securityInfo for each aef present at each serviceAPIDescription present at Discover.</li> </ul> </li> <li> <p>Request Access Token by provider:</p> <ul> <li>Sent POST https://{CAPIF_HOSTNAME}/securities/{securityId}/token:</li> <li>body access token req body</li> <li>securityId is apiInvokerId</li> <li>grant_type=client_credentials</li> <li>Using AEF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Request of Access Token:<ol> <li>401 Unauthorized response.</li> <li>body returned must accomplish AccessTokenErr data structure, with:<ul> <li>error unauthorized_client</li> <li>error_description=Role not authorized for this API route</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-21-retrieve-access-token-by-provider-with-invalid-apiinvokerid","title":"Test Case 21: Retrieve access token by Provider with invalid apiInvokerId","text":"<p>Test ID:: capif_security_api-21</p> <p>Description:</p> <p>This test case will check that an API Exposure Function cannot retrieve a security access token without valid apiInvokerId</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised and Provider is also authorized</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API service_1 at CCF</li> <li>Register and onboard Invoker at CCF</li> <li>Discover Service APIs by Invoker.</li> <li>Create Security Context According to Service APIs discovered.</li> <li>Request Access Token by Provider</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Request Discover Published APIs not filtered:</p> <ul> <li>Send GET to ccf_discover_url https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}</li> <li>Param api-invoker-id is mandatory</li> <li>Using Invoker Certificate</li> </ul> </li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate.</li> <li>Create Security Information Body with one securityInfo for each aef present at each serviceAPIDescription present at Discover.</li> </ul> </li> <li> <p>Request Access Token by provider:</p> <ul> <li>Sent POST https://{CAPIF_HOSTNAME}/securities/{API_INVOKER_NOT_VALID}/token.</li> <li>body access token req body</li> <li>securityId is apiInvokerId</li> <li>grant_type=client_credentials</li> <li>Using AEF Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Request of Access Token:<ol> <li>401 Unauthorized response.</li> <li>body returned must accomplish AccessTokenErr data structure, with:<ul> <li>error unauthorized_client</li> <li>error_description=Role not authorized for this API route</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-22-retrieve-access-token-with-invalid-apiinvokerid","title":"Test Case 22: Retrieve access token with invalid apiInvokerId","text":"<p>Test ID:: capif_security_api-22</p> <p>Description:</p> <p>This test case will check that an API Invoker can't retrieve a security access token without valid apiInvokerId</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised (has valid apiInvokerId)</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API service_1 at CCF</li> <li>Register and onboard Invoker at CCF</li> <li>Discover Service APIs by Invoker.</li> <li>Create Security Context According to Service APIs discovered.</li> <li>Request Access Token by Invoker</li> </ol> <p>Information of Test:</p> <ol> <li>Perform Provider Registration and Invoker Onboarding</li> <li>Publish Service API at CCF:<ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li>Request Discover Published APIs not filtered:<ul> <li>Send GET to ccf_discover_url https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}</li> <li>Param api-invoker-id is mandatory</li> <li>Using Invoker Certificate</li> </ul> </li> <li>Create Security Context for this Invoker<ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate.</li> <li>Create Security Information Body with one securityInfo for each aef present at each serviceAPIDescription present at Discover.</li> </ul> </li> <li>Request Access Token by invoker:<ul> <li>Sent POST https://{CAPIF_HOSTNAME}/securities/{API_INVOKER_NOT_VALID}/token.</li> <li>body access token req body</li> <li>securityId is apiInvokerId</li> <li>grant_type=client_credentials</li> <li>Using Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Request of Access Token:<ol> <li>404 Not Found response.</li> <li>body returned must accomplish ProblemDetails29571 data structure, with:<ul> <li>status 404</li> <li>title Not Found</li> <li>detail Security context not found</li> <li>cause API Invoker has no security context</li> </ul> </li> </ol> </li> </ol> <p>NOTE: ProblemDetails29571 is the definition present for this request at swagger of ProblemDetails, and this is different from definition of ProblemDetails across other CAPIF Services</p>"},{"location":"testing/testplan/api_security_service/#test-case-23-retrieve-access-token-with-invalid-client_id","title":"Test Case 23: Retrieve access token with invalid client_id","text":"<p>Test ID:: capif_security_api-23</p> <p>Description:</p> <p>This test case will check that an API Exposure Function cannot retrieve a security access token without valid client_id at body</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised and Provider is also authorized</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API service_1 at CCF</li> <li>Register and onboard Invoker at CCF</li> <li>Discover Service APIs by Invoker.</li> <li>Create Security Context According to Service APIs discovered.</li> <li>Request Access Token by Invoker</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Request Discover Published APIs not filtered:</p> <ul> <li>Send GET to ccf_discover_url https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}</li> <li>Param api-invoker-id is mandatory</li> <li>Using Invoker Certificate</li> </ul> </li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate.</li> <li>Create Security Information Body with one securityInfo for each aef present at each serviceAPIDescription present at Discover.</li> </ul> </li> <li> <p>Request Access Token by invoker:</p> <ul> <li>Sent POST https://{CAPIF_HOSTNAME}/securities/{securityId}/token.</li> <li>body access token req body</li> <li>securityId is apiInvokerId</li> <li>grant_type=client_credentials</li> <li>client_id is not-valid </li> <li>Using Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Request of Access Token:<ol> <li>400 Bad Request response.</li> <li>body returned must accomplish AccessTokenErr data structure, with:<ul> <li>error invalid_client</li> <li>error_description=Client Id not found</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-24-retrieve-access-token-with-unsupported-grant_type","title":"Test Case 24: Retrieve access token with unsupported grant_type","text":"<p>Test ID:: capif_security_api-24</p> <p>Description:</p> <p>This test case will check that an API Exposure Function cannot retrieve a security access token with unsupported grant_type</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised and Provider is also authorized</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API service_1 at CCF</li> <li>Register and onboard Invoker at CCF</li> <li>Discover Service APIs by Invoker.</li> <li>Create Security Context According to Service APIs discovered.</li> <li>Request Access Token by Invoker</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Request Discover Published APIs not filtered:</p> <ul> <li>Send GET to ccf_discover_url https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}</li> <li>Param api-invoker-id is mandatory</li> <li>Using Invoker Certificate</li> </ul> </li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate.</li> <li>Create Security Information Body with one securityInfo for each aef present at each serviceAPIDescription present at Discover.</li> </ul> </li> <li> <p>Request Access Token by invoker:</p> <ul> <li>Sent POST https://{CAPIF_HOSTNAME}/securities/{securityId}/token.</li> <li>body access token req body</li> <li>securityId is apiInvokerId</li> <li>grant_type=not_valid</li> <li>Using Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Request of Access Token:<ol> <li>400 Bad Request response.</li> <li>body returned must accomplish AccessTokenErr data structure, with:<ul> <li>error unsupported_grant_type</li> <li>error_description=Invalid value for <code>grant_type</code> \\(${grant_type}\\), must be one of \\['client_credentials'\\] - 'grant_type'</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-25-retrieve-access-token-with-invalid-scope","title":"Test Case 25: Retrieve access token with invalid scope","text":"<p>Test ID:: capif_security_api-25</p> <p>Description:</p> <p>This test case will check that an API Exposure Function cannot retrieve a security access token with complete invalid scope</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised and Provider is also authorized</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API service_1 at CCF</li> <li>Register and onboard Invoker at CCF</li> <li>Discover Service APIs by Invoker.</li> <li>Create Security Context According to Service APIs discovered.</li> <li>Request Access Token by Invoker</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Request Discover Published APIs not filtered:</p> <ul> <li>Send GET to ccf_discover_url https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}</li> <li>Param api-invoker-id is mandatory</li> <li>Using Invoker Certificate</li> </ul> </li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate.</li> <li>Create Security Information Body with one securityInfo for each aef present at each serviceAPIDescription present at Discover.</li> </ul> </li> <li> <p>Request Access Token by invoker:</p> <ul> <li>Sent POST https://{CAPIF_HOSTNAME}/securities/{securityId}/token.</li> <li>body access token req body</li> <li>securityId is apiInvokerId</li> <li>grant_type=client_credentials</li> <li>scope=not-valid-scope</li> <li>Using Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Request of Access Token:<ol> <li>400 Bad Request response.</li> <li>body returned must accomplish AccessTokenErr data structure, with:<ul> <li>error invalid_scope</li> <li>error_description=The first characters must be '3gpp'</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-26-retrieve-access-token-with-invalid-aefid-at-scope","title":"Test Case 26: Retrieve access token with invalid aefid at scope","text":"<p>Test ID:: capif_security_api-26</p> <p>Description:</p> <p>This test case will check that an API Exposure Function cannot retrieve a security access token with invalid aefId at scope</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised and Provider is also authorized</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API service_1 at CCF</li> <li>Register and onboard Invoker at CCF</li> <li>Discover Service APIs by Invoker.</li> <li>Create Security Context According to Service APIs discovered.</li> <li>Request Access Token by Invoker</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Request Discover Published APIs not filtered:</p> <ul> <li>Send GET to ccf_discover_url https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}</li> <li>Param api-invoker-id is mandatory</li> <li>Using Invoker Certificate</li> </ul> </li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate.</li> <li>Create Security Information Body with one securityInfo for each aef present at each serviceAPIDescription present at Discover.</li> </ul> </li> <li> <p>Request Access Token by invoker:</p> <ul> <li>Sent POST https://{CAPIF_HOSTNAME}/securities/{securityId}/token.</li> <li>body access token req body</li> <li>securityId is apiInvokerId</li> <li>grant_type=client_credentials</li> <li>scope=3gpp#1234:*service_1*</li> <li>Using Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Request of Access Token:<ol> <li>400 Bad Request response.</li> <li>body returned must accomplish AccessTokenErr data structure, with:<ul> <li>error invalid_scope</li> <li>error_description=One of aef_id not belongs of your security context</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/api_security_service/#test-case-27-retrieve-access-token-with-invalid-apiname-at-scope","title":"Test Case 27: Retrieve access token with invalid apiName at scope","text":"<p>Test ID:: capif_security_api-27</p> <p>Description:</p> <p>This test case will check that an API Exposure Function cannot retrieve a security access token with invalid apiName at scope</p> <p>Pre-Conditions:</p> <ul> <li>API Invoker is pre-authorised and Provider is also authorized</li> </ul> <p>Execution Steps:</p> <ol> <li>Register Provider at CCF, store certificates and Publish Service API service_1 at CCF</li> <li>Register and onboard Invoker at CCF</li> <li>Discover Service APIs by Invoker.</li> <li>Create Security Context According to Service APIs discovered.</li> <li>Request Access Token by Invoker</li> </ol> <p>Information of Test:</p> <ol> <li> <p>Perform Provider Registration and Invoker Onboarding</p> </li> <li> <p>Publish Service API at CCF:</p> <ul> <li>Send POST to ccf_publish_url https://{CAPIF_HOSTNAME}/published-apis/v1/{apfId}/service-apis</li> <li>body [service api description] with apiName service_1</li> <li>Use APF Certificate</li> </ul> </li> <li> <p>Request Discover Published APIs not filtered:</p> <ul> <li>Send GET to ccf_discover_url https://{CAPIF_HOSTNAME}/service-apis/v1/allServiceAPIs?api-invoker-id={apiInvokerId}</li> <li>Param api-invoker-id is mandatory</li> <li>Using Invoker Certificate</li> </ul> </li> <li> <p>Create Security Context for this Invoker</p> <ul> <li>Send PUT https://{CAPIF_HOSTNAME}/trustedInvokers/{apiInvokerId}</li> <li>body service security body</li> <li>Using Invoker Certificate.</li> <li>Create Security Information Body with one securityInfo for each aef present at each serviceAPIDescription present at Discover.</li> </ul> </li> <li> <p>Request Access Token by invoker:</p> <ul> <li>Sent POST https://{CAPIF_HOSTNAME}/securities/{securityId}/token.</li> <li>body access token req body</li> <li>securityId is apiInvokerId</li> <li>grant_type=client_credentials</li> <li>scope=3gpp#{aef_id}:not-valid</li> <li>Using Invoker Certificate</li> </ul> </li> </ol> <p>Expected Result:</p> <ol> <li>Response to Request of Access Token:<ol> <li>400 Bad Request response.</li> <li>body returned must accomplish AccessTokenErr data structure, with:<ul> <li>error invalid_scope</li> <li>error_description=One of the api names does not exist or is not associated with the aef id provided</li> </ul> </li> </ol> </li> </ol>"},{"location":"testing/testplan/common_operations/","title":"Common Operations","text":""},{"location":"testing/testplan/common_operations/#register-new-user","title":"Register new user","text":"<p>In order to use OpenCAPIF we must add a new user. This new user can onboard/register any Invokers or Providers.</p> <p>That new user must be created by administrator of Register Service and with the credentials shared by administrator, the new user can get the access_token by requesting it to Register service.</p> <p>The steps to register a new user at Register Service are:</p>"},{"location":"testing/testplan/common_operations/#admin-create-user","title":"Admin create User","text":"<p>1) Login as Admin to get access_token:</p> <ul> <li>Send POST to https://${CAPIF_REGISTER}:${CAPIF_REGISTER_PORT}/login<ul> <li>Include basic Auth Header with Admin credentials</li> </ul> </li> <li>Get access_token and refresh_token from response</li> </ul> <p></p> <p>2) Create User:</p> <ul> <li>Send POST to https://${CAPIF_REGISTER}:${CAPIF_REGISTER_PORT}/createUser<ul> <li>Include Admin access_token in Authorization Bearer Header</li> <li>Body user_registration_body</li> </ul> </li> </ul> <p></p>"},{"location":"testing/testplan/common_operations/#user-retrieve-access-token-and-other-information","title":"User Retrieve access token and other information","text":"<p>1) Retrieve access_token by User:</p> <ul> <li>Send GET to https://${CAPIF_REGISTER}:${CAPIF_REGISTER_PORT}/getauth<ul> <li>Include basic Auth Header with User credentials</li> </ul> </li> <li>Retrieve access_token and the urls needed for next requests from response body user_getauth_response_body_example</li> </ul> <p></p>"},{"location":"testing/testplan/common_operations/#onboard-an-invoker","title":"Onboard an Invoker","text":""},{"location":"testing/testplan/common_operations/#steps-to-perform-operation","title":"Steps to perform operation","text":"<p>Preconditions: The administrator must have previously registered the User.</p> <ol> <li>Create public and private key at invoker</li> <li> <p>Retrieve access_token by User:</p> <ul> <li>Send GET to https://${CAPIF_REGISTER}:${CAPIF_REGISTER_PORT}/getauth</li> <li>Include basic Auth Header with Admin user/password</li> <li>Retrieve access_token and the urls needed for next requests from response body user_getauth_response_body_example</li> </ul> </li> <li> <p>Onboard Invoker: </p> <ul> <li>Send POST to https://{CAPIF_HOSTNAME}/api-invoker-management/v1/onboardedInvokers</li> <li>Reference Request Body: invoker onboarding body</li> <li>\"onboardingInformation\"->\"apiInvokerPublicKey\": must contain public key generated by Invoker.</li> <li>Send in Authorization Header the Bearer access_token obtained previously (Authorization:Bearer ${access_token})</li> </ul> </li> </ol>"},{"location":"testing/testplan/common_operations/#checks-to-ensure-onboarding","title":"Checks to ensure onboarding","text":"<ol> <li> <p>Response to Get Auth:</p> <ol> <li>200 OK</li> <li>access_token returned.</li> </ol> </li> <li> <p>Response to Onboard request must accomplish:</p> <ol> <li>201 Created</li> <li>Response Body must follow APIInvokerEnrolmentDetails data structure with:<ul> <li>apiInvokerId</li> <li>onboardingInformation->apiInvokerCertificate must contain the public key signed.</li> </ul> </li> <li>Response Header Location must be received with URI to new resource created, following this structure: {apiRoot}/api-invoker-management/{apiVersion}/onboardedInvokers/{onboardingId}</li> </ol> </li> </ol>"},{"location":"testing/testplan/common_operations/#example-flow","title":"Example Flow","text":""},{"location":"testing/testplan/common_operations/#register-a-provider","title":"Register a Provider","text":""},{"location":"testing/testplan/common_operations/#steps-to-perform-operation_1","title":"Steps to Perform operation","text":"<ol> <li>Create public and private key at provider for provider itself and each function (apf, aef and amf)</li> <li> <p>Retrieve access_token by User:</p> <ul> <li>Send GET to https://${CAPIF_REGISTER}:${CAPIF_REGISTER_PORT}/getauth</li> <li>Include basic Auth Header with Admin user/password</li> <li>Retrieve access_token and the urls needed for next requests from response body user_getauth_response_body_example</li> </ul> </li> <li> <p>Register Provider:</p> <ul> <li>Send POST https://{CAPIF_HOSTNAME}/api-provider-management/v1/registrations</li> <li>body provider request body</li> <li>Send in Authorization Header the Bearer access_token obtained previously (Authorization:Bearer ${access_token})</li> <li>Store each cert in a file with according name.</li> </ul> </li> </ol>"},{"location":"testing/testplan/common_operations/#checks-to-ensure-provider-registration","title":"Checks to ensure provider registration","text":"<ol> <li> <p>Response to Register:</p> <ol> <li>201 Created</li> </ol> </li> <li> <p>Response to Get Auth:</p> <ol> <li>200 OK</li> <li>access_token returned.</li> </ol> </li> <li> <p>Register Provider at Provider Management:</p> <ol> <li>201 Created response.</li> <li>body returned must accomplish APIProviderEnrolmentDetails data structure.</li> <li>For each apiProvFuncs, we must check:<ol> <li>apiProvFuncId is set</li> <li>apiProvCert under regInfo is set properly</li> </ol> </li> <li>Location Header must contain the new resource URL {apiRoot}/api-provider-management/v1/registrations/{registrationId}</li> </ol> </li> </ol>"},{"location":"testing/testplan/common_operations/#example-flow_1","title":"Example Flow","text":""}]} \ No newline at end of file diff --git a/public/develop/sitemap.xml b/public/develop/sitemap.xml index c42e738..313e9c1 100644 --- a/public/develop/sitemap.xml +++ b/public/develop/sitemap.xml @@ -20,62 +20,10 @@ <loc>https://tfs.etsi.org/develop/deployment_guide/deployment_guide/</loc> <lastmod>2024-10-21</lastmod> </url> - <url> - <loc>https://tfs.etsi.org/develop/deployment_guide/configure_your_machine/configure_your_machine/</loc> - <lastmod>2024-10-21</lastmod> - </url> - <url> - <loc>https://tfs.etsi.org/develop/deployment_guide/configure_your_machine/openstack/</loc> - <lastmod>2024-10-21</lastmod> - </url> - <url> - <loc>https://tfs.etsi.org/develop/deployment_guide/configure_your_machine/oracle_virtual_box/</loc> - <lastmod>2024-10-21</lastmod> - </url> - <url> - <loc>https://tfs.etsi.org/develop/deployment_guide/configure_your_machine/physical_server/</loc> - <lastmod>2024-10-21</lastmod> - </url> - <url> - <loc>https://tfs.etsi.org/develop/deployment_guide/configure_your_machine/vagrant_box/</loc> - <lastmod>2024-10-21</lastmod> - </url> - <url> - <loc>https://tfs.etsi.org/develop/deployment_guide/configure_your_machine/vm_ware_fusion/</loc> - <lastmod>2024-10-21</lastmod> - </url> - <url> - <loc>https://tfs.etsi.org/develop/deployment_guide/deploy_TeraFlowSDN/deploy_TeraFlowSDN/</loc> - <lastmod>2024-10-21</lastmod> - </url> - <url> - <loc>https://tfs.etsi.org/develop/deployment_guide/install_micro_k8s/install_micro_k8s/</loc> - <lastmod>2024-10-21</lastmod> - </url> - <url> - <loc>https://tfs.etsi.org/develop/deployment_guide/show_deployment_and_logs/show_deployment_and_logs/</loc> - <lastmod>2024-10-21</lastmod> - </url> - <url> - <loc>https://tfs.etsi.org/develop/deployment_guide/webUI_and_grafana_dashboards/webUI_and_grafana_dashboards/</loc> - <lastmod>2024-10-21</lastmod> - </url> <url> <loc>https://tfs.etsi.org/develop/development_guide/development_guide/</loc> <lastmod>2024-10-21</lastmod> </url> - <url> - <loc>https://tfs.etsi.org/develop/development_guide/configure_environment/configure_environment/</loc> - <lastmod>2024-10-21</lastmod> - </url> - <url> - <loc>https://tfs.etsi.org/develop/development_guide/configure_environment/java_quarkus/</loc> - <lastmod>2024-10-21</lastmod> - </url> - <url> - <loc>https://tfs.etsi.org/develop/development_guide/configure_environment/python/</loc> - <lastmod>2024-10-21</lastmod> - </url> <url> <loc>https://tfs.etsi.org/develop/testing/postman/</loc> <lastmod>2024-10-21</lastmod> diff --git a/public/develop/sitemap.xml.gz b/public/develop/sitemap.xml.gz index 220d8a488d72bb2564a9009975c9befeaa3afaf0..1a21b4456f7e7f056b86ea788dd04f61edd8a60e 100644 GIT binary patch delta 368 zcmV-$0gwK#1pWe$7k^egZ-X!p-SaCDdoYPQv=t%hlD$$pBgb5b72~sf2AY50gG5n3 zrm7OLmxJfyy{9v_uh@RHCh5VGM!QK@S)L|f71r7|oAmu{w|q>u<)Y}kAqWX4TiT?@ z5Ztp6!!Tr|1GLgnhQ1M`j{HL63W_{?O3OvUV<fmdO`|ZV%72lCm?j)3gFt$ssG$dg zP84EH`TB*V&|+P#^Yz1Wl`q#TPPt+i331c-v)b<Eb!J8B)sd^DLg!&-X%7Y@fyDqc zvvdv4;JF1Gs;1L5{08RsGsSO)ej@Wa;x!4p_k=?xl=e>Q9`_gyUbZlxKi$d17@fIW z4Q}$%=}IaEL}`^m8$6oIq0#Cbg|V*IBU%yoUMq;fQ>{rM-zhP9;yD{ACP&)#c;X`Q zE|(3A2TlyG3^q+<zmxOW^FbV2rChf+nvOA5ia>Q<hjT2R6t*qe3LSVExWW8KyD<fB OLCa61fTCow3IG7739wiI delta 547 zcmV+;0^I%n0<Q#+7k`(*Zrd;nhVOlf!1u&SutPT_DFzGyb{R0NJqwJ?*ji*!6J@)8 z`_XREb!#$U7!b=B*}r7+10_+^=I*h!vlasza@%aRSY|VHnhN8}ZT4`#pWkM8yPHiD zEMuI>V8`36iqU__^RDX_Y$Dd+c|oDfSy%GG`LmcW7w@y(&3{au!NAko_-ric-C%{q zOg!=eBb(7gfh}6{`6eHRy#50?)>Q1)%k{hYYB^u8WXQAj<RX9Z@z37&AHQDNBLrPZ zlyqzYUfFd(i@@k8B462cf!<PIql>C+Oo4BOiFq`+qbX%hR8LJ%HOMTvi*lN<<k4{i zeM*%tfVQYw6Mtd@RvqXuQBYs?Y_uRU21${LQnpYAkU{Cjv8`1HA|9LJlu0AysCx{s zx72<6^yQp1F{BxGu(hf-I*>Zu@)>1fM6Re)uT*e_vQ+Zrj){RgJUo0JX=KA3!GS7( zs{=tO`0t(91|Qqsmh7L()I`5_Iyy<@<c7WrYMQLyp??MSqk(X0I8j93$Li|&Qi{ST z#eeQe48m02105(H1Ju}2I86jGwBAk@gBSPUjRLKaS;<0)fvoamjqZ~GYYH={W07Pu zrodDf)+7~MN=(w{BBw-TTuUb$$}|ThPLQh4Qc0yyCbpb>pjNVUYLW8I!5XeoiWH-6 lf{A@9OdOi(nw*jwaeydykN-I7$A&TPegZclO6@Zf006~)4eI~^ -- GitLab