From 961c0c61fa7260bab7d1f5788ffdc8b5c41276ef Mon Sep 17 00:00:00 2001 From: Dimitrios <dimit.giannopoulos@upnet.gr> Date: Sat, 6 Jul 2024 07:55:56 +0000 Subject: [PATCH] Deployed 5a5bd8f to develop in public with MkDocs 1.6.0 and mike 2.1.2 --- public/develop/404.html | 2 +- .../OpenSlice_deployment_examples/index.html | 2 +- public/develop/alarms_actions/index.html | 2 +- .../CRIDGE/CRIDGEforDevelopers/index.html | 4 +- .../architecture/architecture/index.html | 2 +- .../architecture/centrallog/index.html | 2 +- .../index.html | 2 +- .../develop/architecture/issuemgt/index.html | 2 +- .../architecture/messagebus/index.html | 2 +- public/develop/architecture/nfvapi/index.html | 2 +- public/develop/architecture/oauth/index.html | 2 +- public/develop/architecture/osom/index.html | 2 +- public/develop/architecture/tmfapi/index.html | 2 +- public/develop/catalogs/index.html | 2 +- public/develop/config_intro/index.html | 2 +- .../contributing/developing/index.html | 2 +- .../develop/contributing/wishlist/index.html | 2 +- public/develop/deployment/index.html | 2 +- public/develop/deploymentCompose/index.html | 2 +- public/develop/deploymentK8s/index.html | 2 +- public/develop/etsi_osl/index.html | 2 +- public/develop/history/index.html | 2 +- public/develop/index.html | 22 +- public/develop/lcm/index.html | 2 +- public/develop/naas/exposed_apis/index.html | 2 +- public/develop/naas/gst_to_gsma/img01.png | Bin 0 -> 376002 bytes public/develop/naas/gst_to_tmf/index.html | 2886 +++++++++++++++++ public/develop/naas/introduction/index.html | 4 +- public/develop/naas/lcm_intro/index.html | 6 +- .../develop/naas/lcm_rules_intro/index.html | 2 +- public/develop/naas/nfv/intro/index.html | 2 +- .../develop/naas/nfv/nfvcatalogs/index.html | 2 +- .../develop/naas/nfv/nfvservices/index.html | 2 +- .../develop/naas/resource_catalog/index.html | 8 +- .../naas/resource_inventory/index.html | 2 +- public/develop/naas/resource_spec/index.html | 2 +- .../develop/naas/service_catalog/index.html | 12 +- .../develop/naas/service_inventory/index.html | 18 +- .../develop/naas/service_ordering/index.html | 56 +- public/develop/naas/service_spec/index.html | 12 +- public/develop/naas/so_intro/index.html | 77 +- .../index.html | 2 +- .../so_servicespec_to_services_nfv/index.html | 2 +- public/develop/nfvoconfig/index.html | 2 +- .../ole_keycloak_management/index.html | 2 +- public/develop/portals_intro/index.html | 2 +- .../role_keycloak_management/index.html | 2 +- public/develop/search/search_index.json | 2 +- .../index.html | 2 +- .../develop/service_design/intro/index.html | 12 +- .../ExposingKubernetesResources/index.html | 4 +- .../index.html | 2 +- .../kubernetes/helm/design_helmaas/index.html | 2 +- .../kubernetes/intro/index.html | 2 +- .../nfv/design_nfv_services/index.html | 2 +- .../develop/service_design_intro/index.html | 2 +- public/develop/service_inventory/index.html | 2 +- .../ordering_services/index.html | 2 +- public/develop/sitemap.xml | 117 +- public/develop/sitemap.xml.gz | Bin 744 -> 755 bytes public/develop/terminology/index.html | 2 +- public/develop/under_construction/index.html | 2 +- 62 files changed, 3169 insertions(+), 161 deletions(-) create mode 100644 public/develop/naas/gst_to_gsma/img01.png create mode 100644 public/develop/naas/gst_to_tmf/index.html diff --git a/public/develop/404.html b/public/develop/404.html index 9ab26814..1bf979f0 100644 --- a/public/develop/404.html +++ b/public/develop/404.html @@ -903,7 +903,7 @@ <li class="md-nav__item"> - <a href="/develop/./naas/gst_to_tmf.md" class="md-nav__link"> + <a href="/develop/naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/OpenSlice_deployment_examples/index.html b/public/develop/OpenSlice_deployment_examples/index.html index a603a14c..5ff33244 100644 --- a/public/develop/OpenSlice_deployment_examples/index.html +++ b/public/develop/OpenSlice_deployment_examples/index.html @@ -1028,7 +1028,7 @@ <li class="md-nav__item"> - <a href="../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/alarms_actions/index.html b/public/develop/alarms_actions/index.html index 238d6b6c..043f0029 100644 --- a/public/develop/alarms_actions/index.html +++ b/public/develop/alarms_actions/index.html @@ -910,7 +910,7 @@ <li class="md-nav__item"> - <a href="../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/architecture/CRIDGE/CRIDGEforDevelopers/index.html b/public/develop/architecture/CRIDGE/CRIDGEforDevelopers/index.html index 7f71925a..63045962 100644 --- a/public/develop/architecture/CRIDGE/CRIDGEforDevelopers/index.html +++ b/public/develop/architecture/CRIDGE/CRIDGEforDevelopers/index.html @@ -914,7 +914,7 @@ <li class="md-nav__item"> - <a href="../../../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../../../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> @@ -2917,7 +2917,7 @@ These scenarios may include service bundles that involve multiple systems, such <li>It sends to the message bus the current resource for creation or update to the TMF service inventory</li> </ul> <hr /> -<h2 id="whats-next">What's next?</h2> +<h2 id="probe-further">Probe further</h2> <ul> <li>See examples of exposing operators via OpenSlice:<ul> <li><a href="../../../service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/">Exposing Kubernetes Operators as a Service : Offering "Calculator as a Service" through OpenSlice</a></li> diff --git a/public/develop/architecture/architecture/index.html b/public/develop/architecture/architecture/index.html index cb880ff3..70450f72 100644 --- a/public/develop/architecture/architecture/index.html +++ b/public/develop/architecture/architecture/index.html @@ -914,7 +914,7 @@ <li class="md-nav__item"> - <a href="../../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/architecture/centrallog/index.html b/public/develop/architecture/centrallog/index.html index 53c80727..316a7e46 100644 --- a/public/develop/architecture/centrallog/index.html +++ b/public/develop/architecture/centrallog/index.html @@ -914,7 +914,7 @@ <li class="md-nav__item"> - <a href="../../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/architecture/consumingServicesFromExternalPartners/index.html b/public/develop/architecture/consumingServicesFromExternalPartners/index.html index b42ca428..85f15968 100644 --- a/public/develop/architecture/consumingServicesFromExternalPartners/index.html +++ b/public/develop/architecture/consumingServicesFromExternalPartners/index.html @@ -969,7 +969,7 @@ <li class="md-nav__item"> - <a href="../../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/architecture/issuemgt/index.html b/public/develop/architecture/issuemgt/index.html index 3477f698..cb2a4a09 100644 --- a/public/develop/architecture/issuemgt/index.html +++ b/public/develop/architecture/issuemgt/index.html @@ -914,7 +914,7 @@ <li class="md-nav__item"> - <a href="../../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/architecture/messagebus/index.html b/public/develop/architecture/messagebus/index.html index b716d9f1..325eaf33 100644 --- a/public/develop/architecture/messagebus/index.html +++ b/public/develop/architecture/messagebus/index.html @@ -914,7 +914,7 @@ <li class="md-nav__item"> - <a href="../../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/architecture/nfvapi/index.html b/public/develop/architecture/nfvapi/index.html index e41b9cba..b0643361 100644 --- a/public/develop/architecture/nfvapi/index.html +++ b/public/develop/architecture/nfvapi/index.html @@ -914,7 +914,7 @@ <li class="md-nav__item"> - <a href="../../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/architecture/oauth/index.html b/public/develop/architecture/oauth/index.html index 4d262a15..86975efc 100644 --- a/public/develop/architecture/oauth/index.html +++ b/public/develop/architecture/oauth/index.html @@ -914,7 +914,7 @@ <li class="md-nav__item"> - <a href="../../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/architecture/osom/index.html b/public/develop/architecture/osom/index.html index c91ee597..37930ff2 100644 --- a/public/develop/architecture/osom/index.html +++ b/public/develop/architecture/osom/index.html @@ -914,7 +914,7 @@ <li class="md-nav__item"> - <a href="../../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/architecture/tmfapi/index.html b/public/develop/architecture/tmfapi/index.html index 4bfe5ccb..2a3ca15c 100644 --- a/public/develop/architecture/tmfapi/index.html +++ b/public/develop/architecture/tmfapi/index.html @@ -914,7 +914,7 @@ <li class="md-nav__item"> - <a href="../../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/catalogs/index.html b/public/develop/catalogs/index.html index 7f2ae646..d8b21a90 100644 --- a/public/develop/catalogs/index.html +++ b/public/develop/catalogs/index.html @@ -910,7 +910,7 @@ <li class="md-nav__item"> - <a href="../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/config_intro/index.html b/public/develop/config_intro/index.html index cf6a4827..61f125f3 100644 --- a/public/develop/config_intro/index.html +++ b/public/develop/config_intro/index.html @@ -967,7 +967,7 @@ <li class="md-nav__item"> - <a href="../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/contributing/developing/index.html b/public/develop/contributing/developing/index.html index 11b714ac..81c248ed 100644 --- a/public/develop/contributing/developing/index.html +++ b/public/develop/contributing/developing/index.html @@ -914,7 +914,7 @@ <li class="md-nav__item"> - <a href="../../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/contributing/wishlist/index.html b/public/develop/contributing/wishlist/index.html index 3e565634..772859d6 100644 --- a/public/develop/contributing/wishlist/index.html +++ b/public/develop/contributing/wishlist/index.html @@ -910,7 +910,7 @@ <li class="md-nav__item"> - <a href="../../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/deployment/index.html b/public/develop/deployment/index.html index 95592dd6..8f27bb8f 100644 --- a/public/develop/deployment/index.html +++ b/public/develop/deployment/index.html @@ -967,7 +967,7 @@ <li class="md-nav__item"> - <a href="../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/deploymentCompose/index.html b/public/develop/deploymentCompose/index.html index 2200844a..e9a1ed05 100644 --- a/public/develop/deploymentCompose/index.html +++ b/public/develop/deploymentCompose/index.html @@ -1273,7 +1273,7 @@ <li class="md-nav__item"> - <a href="../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/deploymentK8s/index.html b/public/develop/deploymentK8s/index.html index e6fb0439..49340c4b 100644 --- a/public/develop/deploymentK8s/index.html +++ b/public/develop/deploymentK8s/index.html @@ -967,7 +967,7 @@ <li class="md-nav__item"> - <a href="../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/etsi_osl/index.html b/public/develop/etsi_osl/index.html index 5d31f5d5..d4907455 100644 --- a/public/develop/etsi_osl/index.html +++ b/public/develop/etsi_osl/index.html @@ -926,7 +926,7 @@ <li class="md-nav__item"> - <a href="../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/history/index.html b/public/develop/history/index.html index f4aefe69..c1fda89d 100644 --- a/public/develop/history/index.html +++ b/public/develop/history/index.html @@ -970,7 +970,7 @@ <li class="md-nav__item"> - <a href="../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/index.html b/public/develop/index.html index ac2dd9bb..b2f2bb1e 100644 --- a/public/develop/index.html +++ b/public/develop/index.html @@ -368,9 +368,9 @@ </li> <li class="md-nav__item"> - <a href="#whats-next" class="md-nav__link"> + <a href="#probe-further" class="md-nav__link"> <span class="md-ellipsis"> - What's next + Probe further </span> </a> @@ -1019,7 +1019,7 @@ <li class="md-nav__item"> - <a href="naas/gst_to_tmf.md" class="md-nav__link"> + <a href="naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> @@ -2780,9 +2780,9 @@ </li> <li class="md-nav__item"> - <a href="#whats-next" class="md-nav__link"> + <a href="#probe-further" class="md-nav__link"> <span class="md-ellipsis"> - What's next + Probe further </span> </a> @@ -2863,11 +2863,13 @@ There are various portals offering UI friendly access to users acting as Service <li>OpenSlice NFV Services onboarding: <a href="http://portal.openslice.io/nfvportal">http://portal.openslice.io/nfvportal</a><blockquote></blockquote> </li> </ul> -<h1 id="whats-next">What's next</h1> -<p>Installing OpenSlice. See the <a href="deployment/">Deployment</a> of OpenSlice</p> -<p>Lear more on <a href="naas/introduction/">how OpenSlice supports Network as a Service(NaaS)</a></p> -<p>Who is implementing OpenSlice? See <a href="https://osl.etsi.org/">OSL ETSI SDG</a></p> -<p>How OpenSlice works? See the <a href="architecture/architecture/">Architecture</a> of OpenSlice</p> +<h1 id="probe-further">Probe further</h1> +<ul> +<li>Installing OpenSlice. See the <a href="deployment/">Deployment</a> of OpenSlice</li> +<li>Learn more on [how OpenSlice supports Network as a Service(NaaS)](./naas/introduction</li> +<li>Who is implementing OpenSlice? See <a href="https://osl.etsi.org/">OSL ETSI SDG</a></li> +<li>How OpenSlice works? See the <a href="architecture/architecture/">Architecture</a> of OpenSlice</li> +</ul> diff --git a/public/develop/lcm/index.html b/public/develop/lcm/index.html index ed70563a..53b62e30 100644 --- a/public/develop/lcm/index.html +++ b/public/develop/lcm/index.html @@ -910,7 +910,7 @@ <li class="md-nav__item"> - <a href="../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/naas/exposed_apis/index.html b/public/develop/naas/exposed_apis/index.html index 5104d15a..242bee3b 100644 --- a/public/develop/naas/exposed_apis/index.html +++ b/public/develop/naas/exposed_apis/index.html @@ -911,7 +911,7 @@ <li class="md-nav__item"> - <a href="../gst_to_tmf.md" class="md-nav__link"> + <a href="../gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/naas/gst_to_gsma/img01.png b/public/develop/naas/gst_to_gsma/img01.png new file mode 100644 index 0000000000000000000000000000000000000000..f72c1855e08903dfcca60a213b88a106775b8130 GIT binary patch literal 376002 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%0A2KFCrMWs&;`h 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 literal 0 HcmV?d00001 diff --git a/public/develop/naas/gst_to_tmf/index.html b/public/develop/naas/gst_to_tmf/index.html new file mode 100644 index 00000000..3aa6f8c8 --- /dev/null +++ b/public/develop/naas/gst_to_tmf/index.html @@ -0,0 +1,2886 @@ + +<!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 OSL Documentation page"> + + + <meta name="author" content="OpenSlice by ETSI"> + + + <link rel="canonical" href="https://osl.etsi.org/develop/naas/gst_to_tmf/"> + + + <link rel="prev" href="../service_inventory/"> + + + <link rel="next" href="../resource_catalog/"> + + + <link rel="icon" href="../../images/favicon.png"> + <meta name="generator" content="mkdocs-1.6.0, mkdocs-material-9.5.28"> + + + + <title>GSMA GST to TMF Service - ETSI SDG OSL Documentation</title> + + + + <link rel="stylesheet" href="../../assets/stylesheets/main.6543a935.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> + + + + <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="cyan" data-md-color-accent="blue"> + + + <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="#generic-slice-template-as-a-service-specification" 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 OSL Documentation" class="md-header__button md-logo" aria-label="ETSI SDG OSL Documentation" data-md-component="logo"> + + <img src="../../images/logo_osl.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 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></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 OSL Documentation + </span> + </div> + <div class="md-header__topic" data-md-component="header-topic"> + <span class="md-ellipsis"> + + GSMA GST to TMF Service + + </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.516 6.516 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 5Z"/></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.516 6.516 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 5Z"/></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 11h12Z"/></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 12 19 6.41Z"/></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/osl" 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.5.2 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.81-2.9-.295-5.7.083-8.4 1.11-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.09 18.09 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.3 4.7 0 9.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-82z"/></svg> + </div> + <div class="md-source__repository"> + OSL 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" aria-label="Navigation" data-md-level="0"> + <label class="md-nav__title" for="__drawer"> + <a href="../.." title="ETSI SDG OSL Documentation" class="md-nav__button md-logo" aria-label="ETSI SDG OSL Documentation" data-md-component="logo"> + + <img src="../../images/logo_osl.png" alt="logo"> + + </a> + ETSI SDG OSL Documentation + </label> + + <div class="md-nav__source"> + <a href="https://labs.etsi.org/rep/osl" 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.5.2 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.81-2.9-.295-5.7.083-8.4 1.11-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.09 18.09 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.3 4.7 0 9.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-82z"/></svg> + </div> + <div class="md-source__repository"> + OSL GitLab + </div> +</a> + </div> + + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + + + + + <li class="md-nav__item md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_1" > + + + <label class="md-nav__link" for="__nav_1" id="__nav_1_label" tabindex="0"> + + + <span class="md-ellipsis"> + Overview + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_1_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_1"> + <span class="md-nav__icon md-icon"></span> + Overview + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../.." class="md-nav__link"> + + + <span class="md-ellipsis"> + Introduction + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../OpenSlice_deployment_examples/" class="md-nav__link"> + + + <span class="md-ellipsis"> + OpenSlice deployment examples + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../history/" class="md-nav__link"> + + + <span class="md-ellipsis"> + History + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../etsi_osl/" class="md-nav__link"> + + + <span class="md-ellipsis"> + ETSI OSL + </span> + + + </a> + </li> + + + + + </ul> + </nav> + + </li> + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" > + + + <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0"> + + + <span class="md-ellipsis"> + Getting Started + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_2"> + <span class="md-nav__icon md-icon"></span> + Getting Started + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + + + + + <li class="md-nav__item md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_1" > + + + <label class="md-nav__link" for="__nav_2_1" id="__nav_2_1_label" tabindex="0"> + + + <span class="md-ellipsis"> + Deployment + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_1_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_2_1"> + <span class="md-nav__icon md-icon"></span> + Deployment + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../../deployment/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Introduction + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../deploymentCompose/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Docker Compose + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../deploymentK8s/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Kubernetes + </span> + + + </a> + </li> + + + + + </ul> + </nav> + + </li> + + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_2" > + + + <label class="md-nav__link" for="__nav_2_2" id="__nav_2_2_label" tabindex="0"> + + + <span class="md-ellipsis"> + Portals + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_2_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_2_2"> + <span class="md-nav__icon md-icon"></span> + Portals + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../../portals_intro/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Introduction + </span> + + + </a> + </li> + + + + + </ul> + </nav> + + </li> + + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_3" > + + + <label class="md-nav__link" for="__nav_2_3" id="__nav_2_3_label" tabindex="0"> + + + <span class="md-ellipsis"> + Configuration/Management + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_3_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_2_3"> + <span class="md-nav__icon md-icon"></span> + Configuration/Management + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../../config_intro/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Introduction + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../role_keycloak_management/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Role/Keycloak management + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../nfvoconfig/" class="md-nav__link"> + + + <span class="md-ellipsis"> + NFV Orchestrator Configuration + </span> + + + </a> + </li> + + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_3_4" > + + + <label class="md-nav__link" for="__nav_2_3_4" id="__nav_2_3_4_label" tabindex="0"> + + + <span class="md-ellipsis"> + Advanced topics + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_3_4_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_2_3_4"> + <span class="md-nav__icon md-icon"></span> + Advanced topics + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../../architecture/consumingServicesFromExternalPartners/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Consuming Services From External OSS + </span> + + + </a> + </li> + + + + + </ul> + </nav> + + </li> + + + + + </ul> + </nav> + + </li> + + + + + </ul> + </nav> + + </li> + + + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--active md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked> + + + <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0"> + + + <span class="md-ellipsis"> + NaaS + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true"> + <label class="md-nav__title" for="__nav_3"> + <span class="md-nav__icon md-icon"></span> + NaaS + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../introduction/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Introduction + </span> + + + </a> + </li> + + + + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--active md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_2" checked> + + + <label class="md-nav__link" for="__nav_3_2" id="__nav_3_2_label" tabindex="0"> + + + <span class="md-ellipsis"> + Services + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_2_label" aria-expanded="true"> + <label class="md-nav__title" for="__nav_3_2"> + <span class="md-nav__icon md-icon"></span> + Services + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../service_catalog/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Service Catalogs + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../service_spec/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Service Specification + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../service_ordering/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Service Ordering + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../service_inventory/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Service Inventory + </span> + + + </a> + </li> + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--active"> + + <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc"> + + + + + + <label class="md-nav__link md-nav__link--active" for="__toc"> + + + <span class="md-ellipsis"> + GSMA GST to TMF Service + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <a href="./" class="md-nav__link md-nav__link--active"> + + + <span class="md-ellipsis"> + GSMA GST to TMF Service + </span> + + + </a> + + + +<nav class="md-nav md-nav--secondary" aria-label="Table of contents"> + + + + + + + <label class="md-nav__title" for="__toc"> + <span class="md-nav__icon md-icon"></span> + Table of contents + </label> + <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> + + <li class="md-nav__item"> + <a href="#intended-audience-service-designers" class="md-nav__link"> + <span class="md-ellipsis"> + Intended Audience: Service Designers + </span> + </a> + +</li> + + <li class="md-nav__item"> + <a href="#probe-further" class="md-nav__link"> + <span class="md-ellipsis"> + Probe further + </span> + </a> + +</li> + + </ul> + +</nav> + + </li> + + + + + </ul> + </nav> + + </li> + + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_3" > + + + <label class="md-nav__link" for="__nav_3_3" id="__nav_3_3_label" tabindex="0"> + + + <span class="md-ellipsis"> + Resources + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_3_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_3_3"> + <span class="md-nav__icon md-icon"></span> + Resources + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../resource_catalog/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Resources Catalogs + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../resource_spec/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Resources Specification + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../resource_inventory/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Resources Inventory + </span> + + + </a> + </li> + + + + + </ul> + </nav> + + </li> + + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_4" > + + + <label class="md-nav__link" for="__nav_3_4" id="__nav_3_4_label" tabindex="0"> + + + <span class="md-ellipsis"> + Service orchestration + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_4_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_3_4"> + <span class="md-nav__icon md-icon"></span> + Service orchestration + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../so_intro/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Introduction + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../lcm_intro/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Service Lifecycle management + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../lcm_rules_intro/" class="md-nav__link"> + + + <span class="md-ellipsis"> + LCM Rules Introduction + </span> + + + </a> + </li> + + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_4_4" > + + + <label class="md-nav__link" for="__nav_3_4_4" id="__nav_3_4_4_label" tabindex="0"> + + + <span class="md-ellipsis"> + From Service order to services/resources + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_3_4_4_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_3_4_4"> + <span class="md-nav__icon md-icon"></span> + From Service order to services/resources + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../so_servicespec_to_services_kubernetes/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Exposing Kubernetes services + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../so_servicespec_to_services_nfv/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Exposing NFV Services + </span> + + + </a> + </li> + + + + + </ul> + </nav> + + </li> + + + + + </ul> + </nav> + + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../exposed_apis/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Supported TMFORUM exposed APIs + </span> + + + </a> + </li> + + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_6" > + + + <label class="md-nav__link" for="__nav_3_6" id="__nav_3_6_label" tabindex="0"> + + + <span class="md-ellipsis"> + NFV support + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_6_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_3_6"> + <span class="md-nav__icon md-icon"></span> + NFV support + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../nfv/intro/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Introduction + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../nfv/nfvservices/" class="md-nav__link"> + + + <span class="md-ellipsis"> + NFV Services + </span> + + + </a> + </li> + + + + + </ul> + </nav> + + </li> + + + + + </ul> + </nav> + + </li> + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" > + + + <label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0"> + + + <span class="md-ellipsis"> + Service design + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_4"> + <span class="md-nav__icon md-icon"></span> + Service design + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../../service_design/intro/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Introduction + </span> + + + </a> + </li> + + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_2" > + + + <label class="md-nav__link" for="__nav_4_2" id="__nav_4_2_label" tabindex="0"> + + + <span class="md-ellipsis"> + Support for Kubernetes + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_2_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_4_2"> + <span class="md-nav__icon md-icon"></span> + Support for Kubernetes + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../../service_design/kubernetes/intro/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Introduction + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../service_design/kubernetes/ExposingKubernetesResources/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Exposing Kubernetes Resources + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../service_design/kubernetes/helm/design_helmaas/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Design Helm as a Service + </span> + + + </a> + </li> + + + + + </ul> + </nav> + + </li> + + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_3" > + + + <label class="md-nav__link" for="__nav_4_3" id="__nav_4_3_label" tabindex="0"> + + + <span class="md-ellipsis"> + Support for NFV + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_3_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_4_3"> + <span class="md-nav__icon md-icon"></span> + Support for NFV + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../../service_design/nfv/design_nfv_services/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Design NFV Services + </span> + + + </a> + </li> + + + + + </ul> + </nav> + + </li> + + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_4" > + + + <label class="md-nav__link" for="__nav_4_4" id="__nav_4_4_label" tabindex="0"> + + + <span class="md-ellipsis"> + LCM Rules + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_4_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_4_4"> + <span class="md-nav__icon md-icon"></span> + LCM Rules + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../../service_design/lcmrules/intro.md" class="md-nav__link"> + + + <span class="md-ellipsis"> + Introduction + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../service_design/lcmrules/specification.md" class="md-nav__link"> + + + <span class="md-ellipsis"> + Specification + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../service_design/lcmrules/examples.md" class="md-nav__link"> + + + <span class="md-ellipsis"> + Typical Examples + </span> + + + </a> + </li> + + + + + </ul> + </nav> + + </li> + + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_5" > + + + <label class="md-nav__link" for="__nav_4_5" id="__nav_4_5_label" tabindex="0"> + + + <span class="md-ellipsis"> + Service Specification Examples + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_5_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_4_5"> + <span class="md-nav__icon md-icon"></span> + Service Specification Examples + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../../service_design/examples/open5gs_nfv.md" class="md-nav__link"> + + + <span class="md-ellipsis"> + Open5GS (NFV approach) + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../service_design/examples/open5gs_kubernetes.md" class="md-nav__link"> + + + <span class="md-ellipsis"> + Open5GS (Kubernetes approach) + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Exposing CRDs_aaS_Example_Calculator + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../service_design/kubernetes/helm/HELM_Installation_aaS_Jenkins_Example/" class="md-nav__link"> + + + <span class="md-ellipsis"> + HELM Installation aaS Jenkins Example + </span> + + + </a> + </li> + + + + + </ul> + </nav> + + </li> + + + + + </ul> + </nav> + + </li> + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" > + + + <label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0"> + + + <span class="md-ellipsis"> + Service Ordering + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_5"> + <span class="md-nav__icon md-icon"></span> + Service Ordering + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../../service_ordering/ordering_services/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Ordering Services from catalogs + </span> + + + </a> + </li> + + + + + </ul> + </nav> + + </li> + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" > + + + <label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0"> + + + <span class="md-ellipsis"> + Testing services + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_6"> + <span class="md-nav__icon md-icon"></span> + Testing services + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../../testing_services/test_spec.md" class="md-nav__link"> + + + <span class="md-ellipsis"> + Testing Specification + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../testing_services/test_catalogs.md" class="md-nav__link"> + + + <span class="md-ellipsis"> + Testing Catalogs + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../testing_services/test_inventory.md" class="md-nav__link"> + + + <span class="md-ellipsis"> + Testing Inventory + </span> + + + </a> + </li> + + + + + </ul> + </nav> + + </li> + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_7" > + + + <label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0"> + + + <span class="md-ellipsis"> + Service as a Product + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_7"> + <span class="md-nav__icon md-icon"></span> + Service as a Product + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../../product_model/product_spec.md" class="md-nav__link"> + + + <span class="md-ellipsis"> + Product Specification + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../product_model/product_catalogs.md" class="md-nav__link"> + + + <span class="md-ellipsis"> + Product Catalogs + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../product_model/product_inventory.md" class="md-nav__link"> + + + <span class="md-ellipsis"> + Product Inventory + </span> + + + </a> + </li> + + + + + </ul> + </nav> + + </li> + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_8" > + + + <label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="0"> + + + <span class="md-ellipsis"> + Assurance services + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_8"> + <span class="md-nav__icon md-icon"></span> + Assurance services + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../../assurance_services/intro.md" class="md-nav__link"> + + + <span class="md-ellipsis"> + Introduction + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../assurance_services/alarms_actions.md" class="md-nav__link"> + + + <span class="md-ellipsis"> + Alarms and Actions + </span> + + + </a> + </li> + + + + + </ul> + </nav> + + </li> + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_9" > + + + <label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="0"> + + + <span class="md-ellipsis"> + Design & Architecture + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_9"> + <span class="md-nav__icon md-icon"></span> + Design & Architecture + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../../architecture/architecture/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Architecture + </span> + + + </a> + </li> + + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_9_2" > + + + <label class="md-nav__link" for="__nav_9_2" id="__nav_9_2_label" tabindex="0"> + + + <span class="md-ellipsis"> + Cloud native support + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_9_2_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_9_2"> + <span class="md-nav__icon md-icon"></span> + Cloud native support + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../../architecture/CRIDGE_cloud_native_intro.md" class="md-nav__link"> + + + <span class="md-ellipsis"> + Introduction + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../architecture/CRIDGE/CRIDGEforDevelopers/" class="md-nav__link"> + + + <span class="md-ellipsis"> + CRIDGE for Developers + </span> + + + </a> + </li> + + + + + </ul> + </nav> + + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../architecture/messagebus/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Message bus + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../architecture/osom/" class="md-nav__link"> + + + <span class="md-ellipsis"> + OSOM + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../architecture/oauth/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Authentication + </span> + + + </a> + </li> + + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_9_6" > + + + <label class="md-nav__link" for="__nav_9_6" id="__nav_9_6_label" tabindex="0"> + + + <span class="md-ellipsis"> + APIs + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_9_6_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_9_6"> + <span class="md-nav__icon md-icon"></span> + APIs + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../../architecture/tmfapi/" class="md-nav__link"> + + + <span class="md-ellipsis"> + TMF API + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../architecture/nfvapi/" class="md-nav__link"> + + + <span class="md-ellipsis"> + NFV API + </span> + + + </a> + </li> + + + + + </ul> + </nav> + + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../architecture/issuemgt/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Issue management + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../architecture/centrallog/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Central logging + </span> + + + </a> + </li> + + + + + </ul> + </nav> + + </li> + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_10" > + + + <label class="md-nav__link" for="__nav_10" id="__nav_10_label" tabindex="0"> + + + <span class="md-ellipsis"> + Contributing to OSL + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_10_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_10"> + <span class="md-nav__icon md-icon"></span> + Contributing to OSL + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../../contributing/developing/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Developing + </span> + + + </a> + </li> + + + + + </ul> + </nav> + + </li> + + + + + + + + + + <li class="md-nav__item"> + <a href="../../terminology/" class="md-nav__link"> + + + <span class="md-ellipsis"> + Terminology + </span> + + + </a> + </li> + + + + </ul> +</nav> + </div> + </div> + </div> + + + + <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" > + <div class="md-sidebar__scrollwrap"> + <div class="md-sidebar__inner"> + + +<nav class="md-nav md-nav--secondary" aria-label="Table of contents"> + + + + + + + <label class="md-nav__title" for="__toc"> + <span class="md-nav__icon md-icon"></span> + Table of contents + </label> + <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> + + <li class="md-nav__item"> + <a href="#intended-audience-service-designers" class="md-nav__link"> + <span class="md-ellipsis"> + Intended Audience: Service Designers + </span> + </a> + +</li> + + <li class="md-nav__item"> + <a href="#probe-further" class="md-nav__link"> + <span class="md-ellipsis"> + Probe further + </span> + </a> + +</li> + + </ul> + +</nav> + </div> + </div> + </div> + + + + <div class="md-content" data-md-component="content"> + <article class="md-content__inner md-typeset"> + + + + +<h1 id="generic-slice-template-as-a-service-specification">Generic Slice Template as a Service Specification</h1> +<h2 id="intended-audience-service-designers">Intended Audience: Service Designers</h2> +<p>GSMA Generic Slice Template (GST) Defines customer-oriented service requirements, E.g. Availability, Area of service, delay tolerance, etc. and attempts to narrow down the gap between (network) service customers and vendors</p> +<p>Moreove it Proposes standardized Network Slice Templates (NESTs) to target specific use cases</p> +<p>In OpenSlice we made an effort and translated the GST to a Service Specification model. So Service Designers can use it as a template to design a new Service.</p> +<p>The image illustrates the relationship between the GSMA Generic Slice Template (GST), TM Forum Service Specification, and how they are utilized within OpenSlice to offer network services.</p> +<p><a href="../gst_to_gsma/img01.png"><img alt="gst_to_gsma" src="../gst_to_gsma/img01.png" /></a></p> +<p>The GST to TM Forum via OpenSlice:</p> +<pre><code> * GST Attributes List: A comprehensive list of service attributes, such as availability, delay tolerance, downlink throughput, energy efficiency, isolation level, mission-critical support, and many others. + * TMF Service Specification: Demonstrates the transformation of GST attributes into a TM Forum service specification, showing JSON code snippets that define service parameters. + * Offered Service based on GST: Represents the final offered service, an example of a GST-based service shown as an entry in a catalog, ready to be consumed by customers. +</code></pre> +<p>What was our flow:</p> +<pre><code>* Started with defining service requirements and attributes using GST. +* Translated these GST attributes into a formal TM Forum service specification. +* Service Offering in OpenSlice: The service specification is then used to create and offer a specific network service within OpenSlice, available for customer selection and deployment. +</code></pre> +<h2 id="probe-further">Probe further</h2> +<p>See v9 of the GST model in GSMA <a href="https://www.gsma.com/newsroom/wp-content/uploads//NG.116-v9.0-1.pdf">here</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 8v12Z"/></svg> + Back to top +</button> + + </main> + + <footer class="md-footer"> + + + + <nav class="md-footer__inner md-grid" aria-label="Footer" > + + + <a href="../service_inventory/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Service Inventory"> + <div class="md-footer__button md-icon"> + + <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 11h12Z"/></svg> + </div> + <div class="md-footer__title"> + <span class="md-footer__direction"> + Previous + </span> + <div class="md-ellipsis"> + Service Inventory + </div> + </div> + </a> + + + + <a href="../resource_catalog/" class="md-footer__link md-footer__link--next" aria-label="Next: Resources Catalogs"> + <div class="md-footer__title"> + <span class="md-footer__direction"> + Next + </span> + <div class="md-ellipsis"> + Resources Catalogs + </div> + </div> + <div class="md-footer__button md-icon"> + + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4Z"/></svg> + </div> + </a> + + </nav> + + + <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 © 2024 ETSI OSL + </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://osl.etsi.org/" target="_blank" rel="noopener" title="osl.etsi.org" class="md-social__link"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.5.2 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.3c-2.2-20.4-3.3-41.8-3.3-64s1.2-43.6 3.3-64h185.4c2.2 20.4 3.3 41.8 3.3 64zm28.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-64zm112.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.7zm-209 0H18.6c30-74.1 93.6-130.9 172-151.6-25.5 34.2-45.3 87.7-55.3 151.6zM8.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-64zm186.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.6h116.7zm358.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.6z"/></svg> + </a> + + + + + + + + + <a href="https://labs.etsi.org/rep/osl" 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.5.2 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.81-2.9-.295-5.7.083-8.4 1.11-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.09 18.09 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.3 4.7 0 9.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-82z"/></svg> + </a> + + + + + + + + + <a href="https://www.linkedin.com/company/openslice/" 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.5.2 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.3zM135.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.5zm282.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.9V416z"/></svg> + </a> + + + + + + + + + <a href="https://twitter.com/OpensliceOSS" 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.5.2 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.9L389.2 48zm-24.8 373.8h39.1L151.1 88h-42l255.3 333.8z"/></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"], "search": "../../assets/javascripts/workers/search.b8dbb3d2.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.fe8b6f2b.min.js"></script> + + + </body> +</html> \ No newline at end of file diff --git a/public/develop/naas/introduction/index.html b/public/develop/naas/introduction/index.html index c929ed35..65811696 100644 --- a/public/develop/naas/introduction/index.html +++ b/public/develop/naas/introduction/index.html @@ -926,7 +926,7 @@ <li class="md-nav__item"> - <a href="../gst_to_tmf.md" class="md-nav__link"> + <a href="../gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> @@ -2647,7 +2647,7 @@ <h1 id="openslice-and-naas">OpenSlice and NaaS</h1> <p>OpenSlice makes extensive use of TMFORUM's models and APIs. Therefore if one is familiar with TMF APIs the terminology and ideas are the same.</p> <p>To deliver NaaS we need to incorporate various APIs (see TMF909 API Suite Specification for NaaS). OpenSlice implements various TMF APIs to deliver NaaS and support the lifecycle functions required to manage the network capabilities exposed as Network as a Service and managed by operational domains.</p> -<h2 id="whats-next">What's next</h2> +<h2 id="probe-further">Probe further</h2> <ul> <li>For a complete list of supported APIs, see <a href="../exposed_apis/">Supported APIs</a></li> <li>Check the defined user roles of OpenSlice in our <a href="../../terminology/">Terminology</a></li> diff --git a/public/develop/naas/lcm_intro/index.html b/public/develop/naas/lcm_intro/index.html index c56d5d3c..9ed4b4a8 100644 --- a/public/develop/naas/lcm_intro/index.html +++ b/public/develop/naas/lcm_intro/index.html @@ -911,7 +911,7 @@ <li class="md-nav__item"> - <a href="../gst_to_tmf.md" class="md-nav__link"> + <a href="../gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> @@ -2630,7 +2630,9 @@ <h1>Service Lifecycle management</h1> - +<ul> +<li>Lifecycle Management: The orchestration framework handles updates, scaling, and any necessary modifications throughout the service lifecycle.</li> +</ul> diff --git a/public/develop/naas/lcm_rules_intro/index.html b/public/develop/naas/lcm_rules_intro/index.html index 4a0b5b4c..9addf4e2 100644 --- a/public/develop/naas/lcm_rules_intro/index.html +++ b/public/develop/naas/lcm_rules_intro/index.html @@ -911,7 +911,7 @@ <li class="md-nav__item"> - <a href="../gst_to_tmf.md" class="md-nav__link"> + <a href="../gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/naas/nfv/intro/index.html b/public/develop/naas/nfv/intro/index.html index b6a6973e..1cdb4a1a 100644 --- a/public/develop/naas/nfv/intro/index.html +++ b/public/develop/naas/nfv/intro/index.html @@ -911,7 +911,7 @@ <li class="md-nav__item"> - <a href="../../gst_to_tmf.md" class="md-nav__link"> + <a href="../../gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/naas/nfv/nfvcatalogs/index.html b/public/develop/naas/nfv/nfvcatalogs/index.html index 42652fc4..d53a9f6e 100644 --- a/public/develop/naas/nfv/nfvcatalogs/index.html +++ b/public/develop/naas/nfv/nfvcatalogs/index.html @@ -905,7 +905,7 @@ <li class="md-nav__item"> - <a href="../../gst_to_tmf.md" class="md-nav__link"> + <a href="../../gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/naas/nfv/nfvservices/index.html b/public/develop/naas/nfv/nfvservices/index.html index 6f345973..60637004 100644 --- a/public/develop/naas/nfv/nfvservices/index.html +++ b/public/develop/naas/nfv/nfvservices/index.html @@ -916,7 +916,7 @@ <li class="md-nav__item"> - <a href="../../gst_to_tmf.md" class="md-nav__link"> + <a href="../../gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/naas/resource_catalog/index.html b/public/develop/naas/resource_catalog/index.html index 6f22aabd..7ceb877e 100644 --- a/public/develop/naas/resource_catalog/index.html +++ b/public/develop/naas/resource_catalog/index.html @@ -15,7 +15,7 @@ <link rel="canonical" href="https://osl.etsi.org/develop/naas/resource_catalog/"> - <link rel="prev" href="../service_inventory/"> + <link rel="prev" href="../gst_to_tmf/"> <link rel="next" href="../resource_spec/"> @@ -916,7 +916,7 @@ <li class="md-nav__item"> - <a href="../gst_to_tmf.md" class="md-nav__link"> + <a href="../gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> @@ -2676,7 +2676,7 @@ <nav class="md-footer__inner md-grid" aria-label="Footer" > - <a href="../service_inventory/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Service Inventory"> + <a href="../gst_to_tmf/" class="md-footer__link md-footer__link--prev" aria-label="Previous: GSMA GST to TMF Service"> <div class="md-footer__button md-icon"> <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 11h12Z"/></svg> @@ -2686,7 +2686,7 @@ Previous </span> <div class="md-ellipsis"> - Service Inventory + GSMA GST to TMF Service </div> </div> </a> diff --git a/public/develop/naas/resource_inventory/index.html b/public/develop/naas/resource_inventory/index.html index c4188eb9..5ffcd73e 100644 --- a/public/develop/naas/resource_inventory/index.html +++ b/public/develop/naas/resource_inventory/index.html @@ -911,7 +911,7 @@ <li class="md-nav__item"> - <a href="../gst_to_tmf.md" class="md-nav__link"> + <a href="../gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/naas/resource_spec/index.html b/public/develop/naas/resource_spec/index.html index 16750af1..3f5f0a48 100644 --- a/public/develop/naas/resource_spec/index.html +++ b/public/develop/naas/resource_spec/index.html @@ -911,7 +911,7 @@ <li class="md-nav__item"> - <a href="../gst_to_tmf.md" class="md-nav__link"> + <a href="../gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/naas/service_catalog/index.html b/public/develop/naas/service_catalog/index.html index 7340f8a4..d54aab5e 100644 --- a/public/develop/naas/service_catalog/index.html +++ b/public/develop/naas/service_catalog/index.html @@ -916,9 +916,9 @@ </li> <li class="md-nav__item"> - <a href="#whats-next" class="md-nav__link"> + <a href="#probe-further" class="md-nav__link"> <span class="md-ellipsis"> - What's next + Probe further </span> </a> @@ -1003,7 +1003,7 @@ <li class="md-nav__item"> - <a href="../gst_to_tmf.md" class="md-nav__link"> + <a href="../gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> @@ -2742,9 +2742,9 @@ </li> <li class="md-nav__item"> - <a href="#whats-next" class="md-nav__link"> + <a href="#probe-further" class="md-nav__link"> <span class="md-ellipsis"> - What's next + Probe further </span> </a> @@ -2795,7 +2795,7 @@ endpoint examples: <li>Service Catalog Integration: Add to Service Catalog the XXXX service with all relevant details.</li> <li>Service Delivery/Order: Provision Service by Using the orchestration system to provision and configure the XXXX service based on customer orders.</li> </ul> -<h2 id="whats-next">What's next</h2> +<h2 id="probe-further">Probe further</h2> <ul> <li>Read the model of Service Catalogs in TMF <a href="https://www.tmforum.org/resources/specification/tmf633-service-catalog-api-user-guide-v4-0-0/">TMF633 Service Catalog API User Guide v4.0.0</a></li> <li>Check a demo of the API <a href="http://portal.openslice.io/tmf-api/swagger-ui/index.html?urls.primaryName=tmf-api-633-ServiceCatalogManagement-v4.0.0">here</a></li> diff --git a/public/develop/naas/service_inventory/index.html b/public/develop/naas/service_inventory/index.html index 59ec3e22..35ab7845 100644 --- a/public/develop/naas/service_inventory/index.html +++ b/public/develop/naas/service_inventory/index.html @@ -18,7 +18,7 @@ <link rel="prev" href="../service_ordering/"> - <link rel="next" href="../resource_catalog/"> + <link rel="next" href="../gst_to_tmf/"> <link rel="icon" href="../../images/favicon.png"> @@ -970,9 +970,9 @@ </li> <li class="md-nav__item"> - <a href="#whats-next" class="md-nav__link"> + <a href="#probe-further" class="md-nav__link"> <span class="md-ellipsis"> - What's next + Probe further </span> </a> @@ -994,7 +994,7 @@ <li class="md-nav__item"> - <a href="../gst_to_tmf.md" class="md-nav__link"> + <a href="../gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> @@ -2724,9 +2724,9 @@ </li> <li class="md-nav__item"> - <a href="#whats-next" class="md-nav__link"> + <a href="#probe-further" class="md-nav__link"> <span class="md-ellipsis"> - What's next + Probe further </span> </a> @@ -2761,7 +2761,7 @@ </code></pre> <p>endpoint examples:</p> <p>/serviceInventory/v4/service List or find Service objects</p> -<h2 id="whats-next">What's next</h2> +<h2 id="probe-further">Probe further</h2> <ul> <li>See <a href="../../service_ordering/ordering_services/">Ordering Services from catalogs</a></li> <li>See <a href="../../service_design/intro/">Service Design</a></li> @@ -2818,13 +2818,13 @@ - <a href="../resource_catalog/" class="md-footer__link md-footer__link--next" aria-label="Next: Resources Catalogs"> + <a href="../gst_to_tmf/" class="md-footer__link md-footer__link--next" aria-label="Next: GSMA GST to TMF Service"> <div class="md-footer__title"> <span class="md-footer__direction"> Next </span> <div class="md-ellipsis"> - Resources Catalogs + GSMA GST to TMF Service </div> </div> <div class="md-footer__button md-icon"> diff --git a/public/develop/naas/service_ordering/index.html b/public/develop/naas/service_ordering/index.html index a8f0e592..8bb7247d 100644 --- a/public/develop/naas/service_ordering/index.html +++ b/public/develop/naas/service_ordering/index.html @@ -931,9 +931,27 @@ </li> <li class="md-nav__item"> - <a href="#whats-next" class="md-nav__link"> + <a href="#ui-management" class="md-nav__link"> <span class="md-ellipsis"> - What's next + UI management + </span> + </a> + +</li> + + <li class="md-nav__item"> + <a href="#api-exposed" class="md-nav__link"> + <span class="md-ellipsis"> + API exposed + </span> + </a> + +</li> + + <li class="md-nav__item"> + <a href="#probe-further" class="md-nav__link"> + <span class="md-ellipsis"> + Probe further </span> </a> @@ -976,7 +994,7 @@ <li class="md-nav__item"> - <a href="../gst_to_tmf.md" class="md-nav__link"> + <a href="../gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> @@ -2688,9 +2706,27 @@ </li> <li class="md-nav__item"> - <a href="#whats-next" class="md-nav__link"> + <a href="#ui-management" class="md-nav__link"> + <span class="md-ellipsis"> + UI management + </span> + </a> + +</li> + + <li class="md-nav__item"> + <a href="#api-exposed" class="md-nav__link"> + <span class="md-ellipsis"> + API exposed + </span> + </a> + +</li> + + <li class="md-nav__item"> + <a href="#probe-further" class="md-nav__link"> <span class="md-ellipsis"> - What's next + Probe further </span> </a> @@ -2721,7 +2757,15 @@ <p>Ongoing monitoring and other actions can be performed by the Life Cycle management rules</p> <p><i><strong><em>Future developments</em></strong>: In future releases it might be possible the ongoing monitoring and support provided to ensure continuous performance and reliability. The service could undergoe a series of tests to ensure it meets the specified performance metrics and SLAs before delivering</i></p> -<h2 id="whats-next">What's next</h2> +<h2 id="ui-management">UI management</h2> +<p>Through the menu and dedicated forms the administrator can manage the Service Orders. Various examples in this document will guide you to the usage and the management of the Service Orders.</p> +<h2 id="api-exposed">API exposed</h2> +<p>When installing OpenSlice the API endpoints can be browsed at: </p> +<pre><code>[YOURDOMAIN]/tmf-api/swagger-ui/index.html?urls.primaryName=tmf-api-641-ServiceOrdering-v4.0.0 +</code></pre> +<p>endpoint examples:</p> +<p>/serviceOrdering/v4/serviceOrder List or find ServiceOrder objects</p> +<h2 id="probe-further">Probe further</h2> <ul> <li>See <a href="../../service_ordering/ordering_services/">Ordering Services from catalogs</a></li> <li>See <a href="../../service_design/intro/">Service Design</a></li> diff --git a/public/develop/naas/service_spec/index.html b/public/develop/naas/service_spec/index.html index 92beec83..09aaaf7f 100644 --- a/public/develop/naas/service_spec/index.html +++ b/public/develop/naas/service_spec/index.html @@ -964,9 +964,9 @@ </li> <li class="md-nav__item"> - <a href="#whats-next" class="md-nav__link"> + <a href="#probe-further" class="md-nav__link"> <span class="md-ellipsis"> - What's next + Probe further </span> </a> @@ -1030,7 +1030,7 @@ <li class="md-nav__item"> - <a href="../gst_to_tmf.md" class="md-nav__link"> + <a href="../gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> @@ -2796,9 +2796,9 @@ </li> <li class="md-nav__item"> - <a href="#whats-next" class="md-nav__link"> + <a href="#probe-further" class="md-nav__link"> <span class="md-ellipsis"> - What's next + Probe further </span> </a> @@ -2863,7 +2863,7 @@ <ul> <li>Service Definition: Create a service specification template for the XXXX service, including specifications for bandwidth, network features, and performance metrics.</li> </ul> -<h2 id="whats-next">What's next</h2> +<h2 id="probe-further">Probe further</h2> <ul> <li>Read the model of Service Catalogs in TMF <a href="https://www.tmforum.org/resources/specification/tmf633-service-catalog-api-user-guide-v4-0-0/">TMF633 Service Catalog API User Guide v4.0.0</a></li> <li>Check a demo of the API <a href="http://portal.openslice.io/tmf-api/swagger-ui/index.html?urls.primaryName=tmf-api-633-ServiceCatalogManagement-v4.0.0">here</a></li> diff --git a/public/develop/naas/so_intro/index.html b/public/develop/naas/so_intro/index.html index c9343c2e..ed000f00 100644 --- a/public/develop/naas/so_intro/index.html +++ b/public/develop/naas/so_intro/index.html @@ -75,6 +75,11 @@ <label class="md-overlay" for="__drawer"></label> <div data-md-component="skip"> + + <a href="#service-orchestration" class="md-skip"> + Skip to content + </a> + </div> <div data-md-component="announce"> @@ -911,7 +916,7 @@ <li class="md-nav__item"> - <a href="../gst_to_tmf.md" class="md-nav__link"> + <a href="../gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> @@ -1089,6 +1094,19 @@ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc"> + + + + <label class="md-nav__link md-nav__link--active" for="__toc"> + + + <span class="md-ellipsis"> + Introduction + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> <a href="./" class="md-nav__link md-nav__link--active"> @@ -1100,6 +1118,34 @@ </a> + + +<nav class="md-nav md-nav--secondary" aria-label="Table of contents"> + + + + + + + <label class="md-nav__title" for="__toc"> + <span class="md-nav__icon md-icon"></span> + Table of contents + </label> + <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> + + <li class="md-nav__item"> + <a href="#intended-audience-service-designers" class="md-nav__link"> + <span class="md-ellipsis"> + Intended Audience: Service Designers + </span> + </a> + +</li> + + </ul> + +</nav> + </li> @@ -2614,6 +2660,25 @@ + + + + <label class="md-nav__title" for="__toc"> + <span class="md-nav__icon md-icon"></span> + Table of contents + </label> + <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> + + <li class="md-nav__item"> + <a href="#intended-audience-service-designers" class="md-nav__link"> + <span class="md-ellipsis"> + Intended Audience: Service Designers + </span> + </a> + +</li> + + </ul> </nav> </div> @@ -2628,9 +2693,13 @@ - <h1>Introduction</h1> - - +<h1 id="service-orchestration">Service Orchestration</h1> +<ul> +<li>Service Orchestration: The orchestration engine evaluates the request, determines the necessary resources, and initiates the automated workflows.It interacts with underlying controller components (e.g. 5G Core, Radios, Containerized controllers, NFV, SDN controllers ) to provision and configure the required network functions and connectivity.</li> +</ul> +<h2 id="intended-audience-service-designers">Intended Audience: Service Designers</h2> +<p>OpenSlice end-to-end (E2E) service orchestration framework is designed to manage and automate the entire lifecycle of services across multiple domains and technologies. For delivering, Network as a Service (NaaS) OpenSlice automates and manages the entire lifecycle of network services, from provisioning to monitoring and decommissioning, while ensuring seamless integration, operation, and delivery of services from the initial request to the final delivery, spanning all involved components and layers.</p> +<p>This section provides an overview of the Service Orchestration process</p> diff --git a/public/develop/naas/so_servicespec_to_services_kubernetes/index.html b/public/develop/naas/so_servicespec_to_services_kubernetes/index.html index 8a607db0..28d7ea3a 100644 --- a/public/develop/naas/so_servicespec_to_services_kubernetes/index.html +++ b/public/develop/naas/so_servicespec_to_services_kubernetes/index.html @@ -911,7 +911,7 @@ <li class="md-nav__item"> - <a href="../gst_to_tmf.md" class="md-nav__link"> + <a href="../gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/naas/so_servicespec_to_services_nfv/index.html b/public/develop/naas/so_servicespec_to_services_nfv/index.html index e200c09b..4ab37193 100644 --- a/public/develop/naas/so_servicespec_to_services_nfv/index.html +++ b/public/develop/naas/so_servicespec_to_services_nfv/index.html @@ -911,7 +911,7 @@ <li class="md-nav__item"> - <a href="../gst_to_tmf.md" class="md-nav__link"> + <a href="../gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/nfvoconfig/index.html b/public/develop/nfvoconfig/index.html index 5f47d102..9a04fdba 100644 --- a/public/develop/nfvoconfig/index.html +++ b/public/develop/nfvoconfig/index.html @@ -928,7 +928,7 @@ <li class="md-nav__item"> - <a href="../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/ole_keycloak_management/index.html b/public/develop/ole_keycloak_management/index.html index cdab09ef..5a237601 100644 --- a/public/develop/ole_keycloak_management/index.html +++ b/public/develop/ole_keycloak_management/index.html @@ -905,7 +905,7 @@ <li class="md-nav__item"> - <a href="../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/portals_intro/index.html b/public/develop/portals_intro/index.html index b4c947cf..de10a28d 100644 --- a/public/develop/portals_intro/index.html +++ b/public/develop/portals_intro/index.html @@ -928,7 +928,7 @@ <li class="md-nav__item"> - <a href="../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/role_keycloak_management/index.html b/public/develop/role_keycloak_management/index.html index fcb16d9b..ba9e15c7 100644 --- a/public/develop/role_keycloak_management/index.html +++ b/public/develop/role_keycloak_management/index.html @@ -967,7 +967,7 @@ <li class="md-nav__item"> - <a href="../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/search/search_index.json b/public/develop/search/search_index.json index 9701c7ee..bf03c486 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":"Introduction","text":"<p>version: 2024Q2 - SNAPSHOT</p> <p>The ETSI Software Development Group for OpenSlice (SDG OSL) is developing an open-source service-based Operations Support System (OSS) to deliver Network as a Service (NaaS) following specifications from major SDOs including ETSI, TM Forum and GSMA.</p>"},{"location":"#usage","title":"Usage","text":"<p>OpenSlice can be used in managing 5G network services from the user device to the core network and cloud as well as for Orchestrating cloud resources across private and public clouds for enterprise applications. OpenSlice is capable of supporting most of the features of an end-to-end (E2E) service orchestration framework while many of them will be more mature in future releases. The following figure displays the general usage of OpenSlice. </p> <p></p> <p>The image illustrates how OpenSlice supports the idea of an E2E network service orchestration framework by integrating multiple network components and layers, from user devices at the edge to radio, transport networks, core and public cloud services, ensuring seamless, secure, and efficient delivery of network services. Assuming that there are domain controllers for all the above domains OpenSlice can create the end-to-end service via the domain controllers by following the process of creating and deploying the end-to-end service by implementing transformations, and consuming APIs from various network entities. OpenSlice, in a nutchell, offers user interfaces where users can interact with the framework to order, expose, and manage service catalogs, services and resources that can be ordered, following business logic and policies and exposed through the APIs. </p>"},{"location":"#an-end-to-end-e2e-service-orchestration-framework","title":"An end-to-end (E2E) service orchestration framework","text":"<p>An end-to-end (E2E) service orchestration framework is designed to manage and automate the entire lifecycle of services across multiple domains and technologies. For delivering, especially, Network as a Service (NaaS) a comprehensive system is needed that automates and manages the entire lifecycle of network services, from provisioning to monitoring and decommissioning, while ensuring seamless integration, operation, and delivery of services from the initial request to the final delivery, spanning all involved components and layers. Such E2E frameworks enable users to consume network services on-demand, similar to how cloud computing services are consumed. Some key components and features of such frameworks are:</p> <ul> <li>Service Catalogs including predefined Network Services based on service templates for common network services like 5G core functions, 5G slices, VPNs, SD-WAN, firewalls, load balancers, etc. as well as custom Network services with Options for users to define their own network configurations.</li> <li>User Interface (UI) and APIs exposure, offering both a Self-Service Portal that allows users to request, configure, and manage network services as well as APIs for enabling programmatic access to network services for integration with other systems and automation scripts.</li> <li>Service Design and Creation tharough service templates based on predefined models for creating services.</li> <li>Automation and Workflow Management via Orchestration Engines, supporting Process Automation for automating repetitive tasks and processes, workflow management and orchestration for automating the provisioning, configuration, and management of network services while coordinating multiple workflows to ensure services are delivered efficiently, ensuring that services comply with predefined policies and standards.</li> <li>Standardized API exposure for seamless integration with different systems and services and APIs transformation support for converting data formats and protocols to ensure compatibility and information exhange between systems during workflows orchestration</li> <li>Service and Resource management and Orchestration while including the capability of multi-domain coordination in managing services/resources across different domains like cloud, 5G core, radios, transport network, and edge including dynamic allocation with adjusting resources based on demand and service requirements. To accomplish the above advanced technologies need to be exploited like, Containerized workloads, Network Function Virtualization (NFV) which uses virtualized network functions to provide services like routing, switching, and security and Software-Defined Networking (SDN) which Controls the network programmatically to dynamically manage traffic and resources.</li> <li>Monitoring and Analytics including Service Monitoring while continuously tracking the performance and health of services with capabilities to analyse data to optimize service delivery and predict issues. Real-Time Monitoring is also needed for tracking the performance and health of network services enabling analytics that provide insights for optimization and troubleshooting.</li> <li>Security and Access Control for ensuring only authorized users and systems can access network services. while implementing rules and policies to comply with regulatory requirements.</li> </ul>"},{"location":"#an-e2e-service-orchestration-workflow","title":"An E2E service orchestration workflow","text":"<p>In general an E2E service orchestration workflow includes the following phases:</p> <ul> <li>Service Request: Users or systems request a network service through the self-service portal or API. The request can specify details such as bandwidth, security features, geographic coverage, and duration.</li> <li>Service Orchestration: The orchestration engine evaluates the request, determines the necessary resources, and initiates the automated workflows.It interacts with the underlying components (e.g. 5G Core, Radios, Containerized controllers, NFV, SDN controllers ) to provision and configure the required network functions and connectivity.</li> <li>Provisioning and Configuration: Services, network resources and network functions (VNFs) are instantiated and configured according to the service request during Service Orchestration through the orchestration engine. Other controllers manage their own domains, for example SDN controllers, manage the flow of data through the network to ensure optimal performance and adherence to policies, RAN controllers manage the RAN resoruces, Containerized controllers manage their workload, etc</li> <li>Service Delivery: The E2E network service is activated and made available to the user. Continuous monitoring ensures the service operates as expected, with automatic adjustments made as necessary.</li> <li>Lifecycle Management: The orchestration framework handles updates, scaling, and any necessary modifications throughout the service lifecycle.</li> <li>At the end of the service period, resources are decommissioned and reclaimed.</li> </ul>"},{"location":"#openslice-for-service-providers","title":"OpenSlice for Service Providers","text":"<p>OpenSlice is used by Service Providers to design Network Services, expose them in Service Catalogues and make them available for Service Orders. OpenSlice then can perform the E2E service orchestration workflow.</p> <p>There are various portals offering UI friendly access to users acting as Service Providers:</p> <ul> <li>The Services portal allows Service Providers to design and expose services.</li> <li>The Resource portal allows users to access resource specifications and running resources in resource inventory.</li> <li>The NFV portal allows users to manage NFV artifacts and onboard them to a target MANO/NFV Orchestrator.</li> <li>The Testing portal allows Service Providers to manage test artifacts</li> <li>The Products portal allows Service Providers to expose services as products</li> </ul>"},{"location":"#openslice-for-service-consumers","title":"OpenSlice for Service Consumers","text":"<p>OpenSlice allows Service Consumers to browse the available offered service specifications in a self-service manner. It also supports TMFORUM Northbound APIs regarding Service Catalog Management, Ordering, Resource, etc. There are various portals offering UI friendly access to users acting as Service Consumers:</p> <ul> <li>The Services portal allows Service Consumers to select and order predefined services.</li> <li>The Resource portal allows users to access running resources in resource inventory.</li> <li>The NFV portal allows users to self-manage NFV artifacts and onboard them to a target MANO/NFV Orchestrator.</li> <li>The Testing portal allows Service Consumers to manage test artifacts</li> <li>The Products portal allows Service Consumers to expose services as products</li> </ul> <p>3rd party applications can use OpenSlice through TMForum Open APIs.</p>"},{"location":"#live-demo","title":"Live Demo","text":"<p>Check a live demo of OpenSlice in the following pages:</p> <p>(username=admin, password=openslice or username=admin, password=changeme)</p> <ul> <li>OpenSlice demo: http://portal.openslice.io/</li> <li>OpenSlice Service Catalogs and ordering: http://portal.openslice.io/services/</li> <li>OpenSlice NFV Services onboarding: http://portal.openslice.io/nfvportal </li> </ul>"},{"location":"#whats-next","title":"What's next","text":"<p>Installing OpenSlice. See the Deployment of OpenSlice</p> <p>Lear more on how OpenSlice supports Network as a Service(NaaS)</p> <p>Who is implementing OpenSlice? See OSL ETSI SDG</p> <p>How OpenSlice works? See the Architecture of OpenSlice</p>"},{"location":"OpenSlice_deployment_examples/","title":"OpenSlice deployment examples","text":"<p>Here are some examples from past and current efforts that use OpenSlice in various cases.</p>"},{"location":"OpenSlice_deployment_examples/#5ginfire-eu-project2018","title":"5GinFIRE EU project(2018)","text":"<ul> <li>MultiVIM approach</li> <li>9 Testbeds</li> <li>Automotive, Smart City, eHeath, \u000bPPDR, Media, SDR, Cloud</li> <li>22 Experiment proposals from Verticals</li> <li>100+ Users</li> <li>VxF catalog: </li> <li>150+ ONBOARDED VxFs</li> <li>OSM TWO, FOUR, FIVE</li> <li>50+ are public to be reused</li> <li>NSD catalog: </li> <li>90+ ONBOARDED NSDs</li> <li>30+ are public to be reused</li> <li>500+ Deployment requests \u000b(orchestrations) performed</li> </ul> <p>[</p>"},{"location":"OpenSlice_deployment_examples/#5g-vinni-eu-project-2020","title":"5G-VINNI EU project (2020)","text":"<ul> <li>Multi-vendor challenge \u2013 Commercial and opensource</li> <li>5G services on multiple sites</li> <li>Introduction of TMFORUM models and APIs </li> </ul> <p>[</p>"},{"location":"OpenSlice_deployment_examples/#5gasp-eu-project-2021-2024","title":"5GASP EU project (2021-2024)","text":"<ul> <li>Support a multi-site CI/CD testing automated DevOps cycle for network Applications</li> <li>Multiple NFVOs</li> <li>Introducing Service Test models</li> <li>Introducing the Product models for a network application marketplace</li> </ul> <p>[</p>"},{"location":"OpenSlice_deployment_examples/#fidal-eu-project-2023-","title":"FIDAL EU project (2023-)","text":"<ul> <li>Support multi-site automated testing</li> <li>Multiple testbeds/ different APIs</li> </ul> <p>[</p>"},{"location":"OpenSlice_deployment_examples/#across-eu-project-2023-","title":"ACROSS EU project (2023-)","text":"<ul> <li>Used as a cross-domain orchestrator</li> <li>Support the multi-domain orchestrator</li> <li>Support Zero-touch provisioning concepts</li> </ul> <p>[</p>"},{"location":"OpenSlice_deployment_examples/#incode-eu-project-2023-","title":"INCODE EU project (2023-)","text":"<ul> <li>Support the provisioning of end-to-end domain services</li> </ul> <p>[</p>"},{"location":"OpenSlice_deployment_examples/#imagineb5g-eu-project-2023-","title":"IMAGINEB5G EU project (2023-)","text":"<ul> <li>Support the provisioning of end-to-end domain services</li> </ul>"},{"location":"OpenSlice_deployment_examples/#etsi-zsm-poc-2","title":"ETSI ZSM PoC #2","text":"<ul> <li>Automated Network Slice Scaling in Multi-Site Environments</li> </ul> <p>[</p>"},{"location":"alarms_actions/","title":"Alarms","text":"<p>In Openslice parts of TMF642 Alarm Management API are currently implemented. Alarms can be managed through the TMF API endpoint as well as the UI.</p>"},{"location":"alarms_actions/#alarms-and-actions","title":"Alarms and Actions","text":"<p>Note: Actions is an experimental feature. We expect to have a more mature solution in future. The component in the architecture is the Openslcie Assurance Services</p> <p>Alarms can be automatically resolved by specific actions. Today only the following actions are offered.</p> <ul> <li>execDay2</li> <li>scaleServiceEqually</li> </ul>"},{"location":"alarms_actions/#execday2","title":"execDay2","text":"<p>Usually used to perform a Day2 configuration (towards OSM). To use it, Create a New Action Specification Name=execDay2 as following</p> <p></p> <p>Now make a Service Order for your service. In this example \u03c2\u03b5 used a cirros NSD</p> <p>Create a New Action Rule for the running services as the following example:</p> <p></p> <p>The scope is the running cirros service. </p> <p>Params should be paramname=value;paramname2=value2;paramname3=value3 (must exist in the VNF otherwise OSM will raise an error).</p> <p>In this case should be filename=test.txt</p> <p>Primitive=touch</p> <p>ServiceId = select the service which will accept the Day2. In this case is the same</p> <p>To test it:</p> <p>Go to the Service Inventory and select the active Service.</p> <p>Note the UUID of the service (e.g. c4e7990a-e174-4cd2-9133-b10e56721e08 copy from address bar), DeploymentRequestID and NSDID from characteristics</p> <p>You can either use the UUID of the service or the DeploymentRequestID and POST to the Alarms endpoint ( /tmf-api/alarmManagement/v4/alarm)</p> <p>If the DeploymentRequestID is used then POST:</p> <pre><code>\n{\n \"alarmRaisedTime\": \"2021-06-29T12:30:24.675Z\",\n \"alarmReportingTime\": \"2021-06-29T12:30:54.675Z\",\n \"state\": \"raised\",\n \"alarmType\": \"qualityOfServiceAlarm\",\n \"probableCause\": \"thresholdCrossed\",\n \"ackState\": \"unacknowledged\",\n \"perceivedSeverity\": \"major\",\n \"sourceSystemId\": \"mano-client-service\",\n \"alarmDetails\": \"NSID=3;DeploymentRequestID=1\",\n \"specificProblem\": \"myalram raised\"\n}\n\n</code></pre> <p>If the UUID is used then POST:</p> <pre><code>\n{\n \"alarmRaisedTime\": \"2021-06-29T12:30:24.675Z\",\n \"alarmReportingTime\": \"2021-06-29T12:30:54.675Z\",\n \"state\": \"raised\",\n \"alarmType\": \"qualityOfServiceAlarm\",\n \"probableCause\": \"thresholdCrossed\",\n \"ackState\": \"unacknowledged\",\n \"perceivedSeverity\": \"major\",\n \"sourceSystemId\": \"mano-client-service\",\n \"alarmDetails\": \"analarm\",\n \"specificProblem\": \"myalram raised\",\n \"affectedService\": [\n {\n \"id\": \"c4e7990a-e174-4cd2-9133-b10e56721e08\"\n }\n ]\n\n}\n\n</code></pre> <p>The Alarm to be created must have the affected Service ID equal to the running service from the scope (the cirros_ns)</p> <p>Go to service inventory you will see the notes and also the service characteristics for any EXEC_ACTION updates</p> <p>You can also adjust the alarm conditions. They must match true so the alarm to be acknowledged So if another external service raises an Alarm (with POST) for the running service, a Day2 will be performed on another Service</p>"},{"location":"alarms_actions/#scaleserviceequally","title":"scaleServiceEqually","text":"<p>This action is used from getting a scaling event from OSM. Please see the next demo for details on how it works</p>"},{"location":"alarms_actions/#prototype-demo","title":"Prototype demo","text":"<p>You can watch how we used the prototype on the following ETSI ZMS PoC #2</p> <ul> <li>ETSI ZMS PoC #2: https://www.etsi.org/events/1905-webinar-zsm-poc-2-showcase-automated-network-slice-scaling-in-multi-site-environments/</li> </ul>"},{"location":"catalogs/","title":"Catalogs and Templates","text":"<p>The Openslice Service Catalogue (accessible through the API or Services portal) contains the representation of Service Specifications, either created from the provider defining service attributes, or by supporting the GSMA Generic Slice Templates (GST) as well as the VINNI Service Blueprint. The following scenarios are supported by the Openslice Service Catalogue.</p>"},{"location":"catalogs/#createdesign-a-service-specification","title":"Create/Design a Service Specification","text":""},{"location":"catalogs/#first-import-some-resources-as-resource-facing-services-rfss","title":"First Import some Resources as Resource Facing Services (RFSs)","text":"<p>If you have any NSDs as NFV artifacts, import them through the UI menu (Import from NSD list). Then an NSD is imported as a resource and an RFS automatically is created. RFSs then later are used to design a Customer Facing Service Specification</p>"},{"location":"catalogs/#createdesign-a-customer-facing-service-specification","title":"Create/Design a Customer Facing Service Specification","text":"<p>Customer Facing Service Specification are the services offered to customers. You can create a new Service Specification from the menu. The services created through the UI are Customer Facing Services (CFS). Usually you create a CFS as a bundle and then you include Service Specification Relationships with RFSs or/and CFSs.</p> <p>Any Service Specification Characteristics from the RFS are copied to the CFS specification. A CFS can include multiple RFS or/and CFSs. For example you can create a CFS spec called \"A 5G Service\" which is a bundle of two other services (include them in Service Specification Relationships) such as 5G eMBB Slice and a Customer VPN. So when the user orders \"A 5G Service\" services from 5G eMBB Slice and a Customer VPN will be created during the order.</p>"},{"location":"catalogs/#initial-configuration-for-osm-deployment","title":"Initial configuration for OSM deployment","text":"<p>if you have an initial configuration that needs to be applied in the NSD deployment, then you go to the RFS (or CFS) and in Service Specification Characteristics go and edit the OSM_CONFIG characteristic. You can add in the Service Characteristic Value, in the Value field something like the following example which gives a floating IP to a VNF:</p> <pre><code>{ \"nsdId\": \"e855be91-567b-45cf-9f86-18653e7ea\", \"vimAccountId\": \"4efd8bf4-5292-4634-87b7-7b3d49108\" , \"vnf\": [ {\"member-vnf-index\": \"1\", \"vdu\": [ {\"id\": \"MyCharmedVNF-VM\", \"interface\": [{\"name\": \"eth0\", \"floating-ip-required\": true }]}]}]}\n\n</code></pre> <p>or a more complex example (beautify it first if you want to view it, but in the parameter OSM_CONFIG must be minified like the example):</p> <pre><code>{\"nsdId\":\"e855be91-567b-45cf-9f86-18653e7\",\"vimAccountId\":\"4efd8bf4-5292-4634-87b7-7b3d491\",\"vnf\":[{\"member-vnf-index\":\"1\",\"vdu\":[{\"id\":\"haproxy_vdu\",\"interface\":[{\"name\":\"haproxy_vdu_eth1\",\"floating-ip-required\":true}]}]}],\"vld\":[{\"name\":\"pub_net\",\"vim-network-name\":\"OSMFIVE_selfservice01\"},{\"name\":\"management\",\"vim-network-name\":\"OSMFIVE_selfservice01\"},{\"name\":\"lba_net\",\"vim-network-name\":\"lba_net\",\"vnfd-connection-point-ref\":[{\"member-vnf-index-ref\":\"1\",\"vnfd-connection-point-ref\":\"haproxy_private\",\"ip-address\":\"192.168.28.2\"}]},{\"name\":\"backend_net\",\"vim-network-name\":\"backend_net\",\"vnfd-connection-point-ref\":[{\"member-vnf-index-ref\":\"3\",\"vnfd-connection-point-ref\":\"haproxy_public\",\"ip-address\":\"192.168.20.2\"}]},{\"name\":\"lb_sb_net\",\"vim-network-name\":\"lb_sb_net\",\"vnfd-connection-point-ref\":[{\"member-vnf-index-ref\":\"3\",\"vnfd-connection-point-ref\":\"haproxy_private\",\"ip-address\":\"192.168.28.2\"}]},{\"name\":\"breaking_point_Spain\",\"vim-network-name\":\"sb_repo_net\"},{\"name\":\"breaking_point_Greece\",\"vim-network-name\":\"5TONICexternal\"}],\"additionalParamsForVnf\":[{\"member-vnf-index\":\"2\",\"additionalParams\":{\"target_IP\":\"192.168.20.2\"}},{\"member-vnf-index\":\"4\",\"additionalParams\":{\"target1_IP\":\"192.168.21.2\",\"target2_IP\":\"10.154.252.10\"}}]}\n</code></pre> <p>You can leave the Alias and Unit of Measure as is. Check also the is Default.</p>"},{"location":"catalogs/#day-2-primitive-actions","title":"Day 2 Primitive Actions","text":"<p>NFVOs like OSM allow to perform actions while a service is running, for example change attributes or make actions on a specific VNF. To design this do something similar to the following example:</p> <ul> <li>Go to the RFS related to the NSD that contains VNFs with primitives</li> <li>create a characteristic named Primitive:: , e.g. Primitive::touch <li>select Value Type: ARRAY</li> <li>add Service Characteristic Value: i) alias=primitive, value= (e.g. touch), ii) alias=member_vnf_index, value= (e.g. 1), iii) add the params that the user will change in alias the name of param and in value an initial value (e.g. alias=filename, value=myfile.txt) <p>In the above example, when the service is running and the user goes to service inventory to MODIFY it, changes the value of the alias=filename, value=myfile.txt, to value =secondfile.txt. Then inside the VNF a file will be created called secondfile.txt</p>"},{"location":"catalogs/#generic-slice-templates-gst","title":"Generic Slice Templates (GST)","text":"<p>(Offered only as a design for now. THere is no direct implementation to NFV) On October 16th 2019 GSMA published NG.116 Version 2.0 which defines the Generic Network Slice Template (GST). GST is a set of attributes that can characterise a type of network slice/service. GST is generic and is not tied to any specific network deployment. Here is a list of the various attributes of the template:</p> <ul> <li>Availability</li> <li>Area of Service</li> <li>Delay tolerance</li> <li>Deterministic communication</li> <li>Downlink throughput per network slice</li> <li>Downlink throughput per UE</li> <li>Energy efficiency</li> <li>Group communication support</li> <li>Isolation level</li> <li>Location based message delivery</li> <li>Maximum supported packet size</li> <li>Mission critical support</li> <li>MMTel support</li> <li>NB-IoT support</li> <li>Network Slice Customer network functions</li> <li>Number of connections</li> <li>Number of terminals</li> <li>Performance monitoring</li> <li>Performance prediction</li> <li>Positioning support</li> <li>Radio spectrum</li> <li>Reliability</li> <li>Root cause investigation</li> <li>Session and Service Continuity support </li> <li>Simultaneous use of the network slice</li> <li>Slice quality of service parameters</li> <li>Support for non-IP traffic </li> <li>Supported access technologies </li> <li>Supported device velocity </li> <li>Synchronicity</li> <li>Terminal density </li> <li>Uplink throughput per network slice </li> <li>Uplink throughput per UE</li> <li>User management openness</li> <li>User data access </li> <li>V2X communication mode</li> </ul> <p>Openslice offers the GST in a format that is machine readable and aligned with the TMF SID model. Here is a tentative approach in JSON : https://github.com/openslice/org.etsi.osl.tmf.api/blob/master/src/main/resources/gst.json</p> <p>Providers can clone a GST as e NEST directly in Openslice Web portal and the adjust the default attributes to their Service Specification</p>"},{"location":"catalogs/#5g-vinni-service-blueprint","title":"5G-VINNI Service Blueprint","text":"<p>(Offered only as a design for now. THere is no direct implementation to NFV) 5G-VINNI Service Blueprint is a special Service Specification defined by teh 5G-VINNI project. Many details can be found in document https://zenodo.org/record/3345612</p> <p>5G-VINNI Service Blueprint is a reusable self-contained specification of required network slice service (instances). As described in GST mapping VINNI-SB is also machine readable. </p> <p>Here is a tentative approach in JSON : https://github.com/openslice/org.etsi.osl.tmf.api/tree/master/src/main/resources/vinnisb</p> <p>5G-VINNI SB has many commonalities with GST as well as it offers Testing as a Service attributes.</p> <p>Next figure presents the high-level object model of a 5G-VINNI service blueprint.</p> <p>The 5G-VINNI SB as a first prototype approach is conceived as a CFS of a \u2018bundle\u2019 of services. It has some characteristics, like name, description, service type (eMBB, etc) and others. The constituent services are:</p> <ul> <li>A \u201cService Topology\u201d Service Specification which is related to a Network Service Resource topology (a Logical Resource Spec). It is considered at this stage as an RFS but is subject to change in future</li> <li>A \u201cVINNI SB Service Requirements\u201d Service Specification which is related to Service requirements. This is very similar to GST. It is considered at this stage a CFS.</li> <li>A \u201cVINNI SB Service Exposure Level 1\u201d Service Specification which contains characteristics for service exposure on level 1 ( see D3.1 for details). It is considered at this stage a CFS.</li> <li>A \u201cVINNI SB Service Exposure Level 2\u201d Service Specification which contains characteristics for service exposure on level 2. It is considered at this stage a CFS.</li> <li>A \u201cVINNI SB Service Exposure Level 3\u201d Service Specification which contains characteristics for service exposure on level 3. It is considered at this stage a CFS.</li> <li>A \u201cVINNI SB Service Exposure Level 4\u201d Service Specification which contains characteristics for service exposure on level 4. It is considered at this stage a CFS.</li> <li>A \u201cVINNI SB Service 3rd part VNF\u201d Service Specification which contains characteristics for support 3rd party VNFs to be included in the service. It is considered at this stage as an RFS but is subject to change in future</li> <li>A \u201cVINNI SB Service 3rd part NSD\u201d Service Specification which contains characteristics for support 3rd party NSDs to be included in the service. It is considered at this stage as an RFS but is subject to change in future</li> <li>A \u201cVINNI SB Service Monitoring\u201d Service Specification which contains characteristics for offering Monitoring capabilities on the requested Service. It is considered at this stage a CFS.</li> <li>A \u201cVINNI SB Service Testing\u201d Service Specification which contains characteristics for offering Testing capabilities on the requested Service. It is considered at this stage a CFS.</li> </ul> <p></p>"},{"location":"catalogs/#manage-a-service-specification","title":"Manage a Service Specification","text":"<p>You can manage them though the Web UI</p>"},{"location":"catalogs/#assign-a-service-specification-to-service-categories-and-publish","title":"Assign a Service Specification to Service Categories and Publish","text":"<p>Just create categories and from the menu select the category and add services</p>"},{"location":"catalogs/#retireremove-a-service-specification","title":"Retire/Remove a Service Specification","text":"<p>Delete it from the category</p>"},{"location":"catalogs/#consume-and-expose-service-specifications-from-other-service-catalogues","title":"Consume and expose Service Specifications from other Service Catalogues","text":"<p>See more on Consuming Services From External Partner Organizations</p>"},{"location":"config_intro/","title":"Configuring and managing OpenSlice","text":""},{"location":"config_intro/#intended-audience-openslice-administrators","title":"Intended Audience: OpenSlice administrators","text":"<p>This section provides information on how to configure and manage different aspect of OpenSlice while in operation. For example:</p> <ul> <li>Manage user roles and access in Keycloak</li> <li>Configure/Manage NFVOs</li> <li>Advanced configuration scenarios</li> </ul>"},{"location":"deployment/","title":"OpenSlice Deployment","text":"<p>This section is meant to guide the user through the installation of OpenSlice. </p>"},{"location":"deployment/#intended-audience-openslice-administrators","title":"Intended Audience: OpenSlice administrators","text":"<p>Following, you may thorough guides depending on the installation type of your choice:</p> <ul> <li>Installing via Docker Compose guide</li> <li>Installing via Kubernetes guide</li> </ul>"},{"location":"deploymentCompose/","title":"OpenSlice Deployment Guide with Docker Compose","text":""},{"location":"deploymentCompose/#intended-audience-openslice-administrators","title":"Intended Audience: OpenSlice administrators","text":""},{"location":"deploymentCompose/#requirements","title":"Requirements","text":""},{"location":"deploymentCompose/#hardware-requirements","title":"Hardware requirements:","text":"Minimum Hardware Requirements Recomended Hardware Requirements 4 CPU cores 8 CPU cores 8 GB RAM 16 GB RAM 30 GB storage 50 GB storage"},{"location":"deploymentCompose/#software-requirements","title":"Software Requirements:","text":"<ul> <li>Docker: A running environment for Docker Compose services</li> </ul>"},{"location":"deploymentCompose/#preparing-the-environment","title":"Preparing the environment","text":""},{"location":"deploymentCompose/#1-backup-your-previous-database-if-necessary","title":"1. Backup your previous database if necessary:","text":"<pre><code>sudo docker exec amysql /usr/bin/mysqldump -u root --password=letmein ostmfdb > backup_ostmfdb.sql\n</code></pre>"},{"location":"deploymentCompose/#2-install-docker","title":"2. Install docker","text":"<p>Since July 2023 Docker Compose V1 stopped receiving updates. OpenSlice fully reverted to Compose V2, which is integrated in the Docker installation.</p>"},{"location":"deploymentCompose/#3-configure-containers-to-properly-resolve-the-dns-of-your-domain-optional","title":"3. Configure containers to properly resolve the DNS of your domain (optional)","text":"<pre><code>sudo nano /etc/docker/daemon.json\n</code></pre> <p>and add:</p> <pre><code>{ \n \"dns\": [\"8.8.8.8\", \"8.8.4.4\"]\n}\n</code></pre> <p>After editing daemon.json restart docker daemon for the changes to take place</p> <pre><code>sudo systemctl restart docker\n</code></pre>"},{"location":"deploymentCompose/#downloading-the-project","title":"Downloading the project","text":""},{"location":"deploymentCompose/#1-create-a-new-folder-to-download-the-project","title":"1. Create a new folder to download the project","text":"<pre><code>mkdir openslice\n</code></pre> <pre><code>cd openslice\n</code></pre>"},{"location":"deploymentCompose/#2-download-the-deployment-script","title":"2. Download the deployment script","text":"<p>Download the deployment / environment preparation script</p> <pre><code>wget https://labs.etsi.org/rep/osl/code/org.etsi.osl.main/-/raw/develop/compose/deploy.sh\n</code></pre> <p>Make it executable</p> <pre><code>sudo chmod +x deploy.sh\n</code></pre>"},{"location":"deploymentCompose/#3-run-the-deployment-script","title":"3. Run the deployment script","text":"<p>OpenSlice is a multi repo project. This script selects the same branch for all repositories of the project to pull from.</p> <p>After that it builds the respective jar files locally and installs all the npm packages needed for the UI.</p> <p>If you run the script without selecting a branch the the main branch is going to be selected.</p> <p>We recommend:</p> <ul> <li>main branch for the most stable experience and</li> <li>develop branch for an experience with the latest features (for develop branch installation, it is strongly advisable that you may as well follow the develop documentation)</li> </ul> <pre><code>sudo ./deploy.sh develop #[or replace main with other branch name]\n</code></pre> <p>We recommend running the deploy.sh script with root permissions! In other case, some directories may not be accessible by the project building tools and hinder the smooth installation.</p>"},{"location":"deploymentCompose/#configure-docker-compose-services","title":"Configure Docker Compose services","text":""},{"location":"deploymentCompose/#1-create-configuration-specific-docker-compose-file-from-the-template","title":"1. Create configuration specific Docker Compose file from the template","text":"<pre><code>cd org.etsi.osl.main/compose/\n</code></pre> <pre><code>sudo cp docker-compose.yaml.configure docker-compose.yaml\n</code></pre>"},{"location":"deploymentCompose/#2-configure-mysql-portal-container-optional","title":"2. Configure mysql-portal container (optional)","text":"<ol> <li>In folder <code>org.etsi.osl.main/compose/mysql-init</code> edit the file <code>01-databases.sql</code>.</li> <li>In the <code>org.etsi.osl.main/compose/docker-compose.yaml</code> edit the credentials of the users that services use to connect to the databases, if you wish.<ul> <li>portaluser (default is 12345) and</li> <li>keycloak (default is password)</li> </ul> </li> </ol>"},{"location":"deploymentCompose/#3-configure-keycloak-container-optional","title":"3. Configure keycloak container (optional)","text":"<ol> <li> <p>If you made changes to keycloak's mysql credentials:</p> <p>In folder <code>org.etsi.osl.main/compose/</code> edit the file <code>docker-compose.yaml</code>.</p> </li> </ol> <pre><code>DB_DATABASE: keycloak\nDB_USER: keycloak\nDB_PASSWORD: password\n</code></pre> <ol> <li> <p>If you want to change the keycloak admin password:</p> <p>In folder <code>org.etsi.osl.main/compose/</code> edit the file <code>docker-compose.yaml</code></p> </li> </ol> <pre><code>KEYCLOAK_PASSWORD: Pa55w0rd\n</code></pre>"},{"location":"deploymentCompose/#4-configure-bugzilla-container-optional","title":"4. Configure bugzilla container (optional)","text":"<p>If you want to utilise the Bugzilla connector:</p> <p>In folder <code>org.etsi.osl.main/compose/</code> edit the file <code>docker-compose.yaml</code></p> <pre><code>SPRING_APPLICATION_JSON: '{\n \"spring.activemq.brokerUrl\": \"tcp://anartemis:61616?jms.watchTopicAdvisories=false\",\n \"spring.activemq.user\": \"artemis\",\n \"spring.activemq.password\": \"artemis\",\n \"bugzillaurl\":\"\",\n \"bugzillakey\":\"\",\n \"main_operations_product\":\"\"\n}'\n</code></pre> <p>And add the provided Bugzilla installation information:</p> <pre><code>\"bugzillaurl\":\"bugzillaurl.xx:443/bugzilla/\",\n\"bugzillakey\":\"exampleKeyeqNNwxBlgxZgMEIne0Oeq0Bz\",\n\"main_operations_product\":\"Main Site Operations\" // this is the default product to issue tickets\n</code></pre> <p>Bugzilla should have the following components under the specified product: </p> <ul> <li>NSD Deployment Request: Component used to schedule deployment req </li> <li>Onboarding: Issues related to VNF/NSD Onboarding </li> <li>Operations Support: Default component for operations support </li> <li>Validation: Use to track validation processes of VNFs and NSDs </li> <li>VPN Credentials/Access: Used for requesting VPN Credentials/Access </li> </ul> <p>Also in the 'Main Site Operations' product, a version named 'unspecified' must be created.</p>"},{"location":"deploymentCompose/#5-configure-osportalapi-container-nfv-services-conditional","title":"5. Configure osportalapi container (NFV services) (conditional)","text":"<p>Change the respective fields: </p> <ul> <li>If you made changes to mysql and keycloak credentials.</li> <li>If you want to change logging level (TRACE / DEBUG / INFO / WARN / ERROR).</li> </ul> <p>If you are using a non-local domain, replace everywhere the http://keycloak:8080 with the respective {{protocol://domain.name}}, as well as \"spring.portal.main.domain\" property.</p> <p>In folder <code>org.etsi.osl.main/compose/</code> edit the file <code>docker-compose.yaml</code></p> <pre><code>SPRING_APPLICATION_JSON: '{\n \"spring.datasource.username\":\"root\",\n \"spring.datasource.password\":\"letmein\",\n \"spring-addons.issuers[0].uri\": \"http://keycloak:8080/auth/realms/openslice\",\n \"spring.security.oauth2.resourceserver.jwt.issuer-uri\": \"http://keycloak:8080/auth/realms/openslice\",\n \"springdoc.oAuthFlow.authorizationUrl\": \"http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/auth\",\n \"springdoc.oAuthFlow.tokenUrl\": \"http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/token\", \n \"spring.portal.main.domain\": \"http://localhost\",\n \"logging.level.org.springframework\" : \"INFO\"\n}'\n</code></pre>"},{"location":"deploymentCompose/#6-osscapi-container-tmf-api-service-conditional","title":"6. osscapi container (TMF API service) (conditional)","text":"<p>Change the respective fields: </p> <ul> <li>If you made changes to mysql and keycloak credentials.</li> <li>If you want to change logging level (TRACE / DEBUG / INFO / WARN / ERROR).</li> </ul> <p>If you are using a non-local domain, replace everywhere the http://keycloak:8080 with the respective {{protocol://domain.name}}.</p> <p>In folder <code>org.etsi.osl.main/compose/</code> edit the file <code>docker-compose.yaml</code></p> <pre><code>SPRING_APPLICATION_JSON: '{\n \"spring.datasource.username\":\"root\",\n \"spring.datasource.password\":\"letmein\",\n \"spring-addons.issuers[0].uri\": \"http://keycloak:8080/auth/realms/openslice\",\n \"spring.security.oauth2.resourceserver.jwt.issuer-uri\": \"http://keycloak:8080/auth/realms/openslice\",\n \"springdoc.oAuthFlow.authorizationUrl\": \"http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/auth\",\n \"springdoc.oAuthFlow.tokenUrl\": \"http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/token\", \n \"logging.level.org.springframework\" : \"INFO\"\n}'\n</code></pre>"},{"location":"deploymentCompose/#configure-nginx","title":"Configure nginx","text":"<p>In folder <code>org.etsi.osl.main/compose/nginx</code> create a configuration specific <code>nginx.conf</code> file.</p> <pre><code>cd org.etsi.osl.main/compose/nginx/\n</code></pre> <pre><code>sudo cp nginx.conf.default nginx.conf\n</code></pre> <p>If needed, in the nginx.conf file, edit the server_name for an non-local deployment.</p>"},{"location":"deploymentCompose/#configure-web-ui","title":"Configure Web UI","text":"<p>In folder <code>org.etsi.osl.portal.web/src/js/</code> create a configuration specific <code>config.js</code> file.</p> <pre><code>cd org.etsi.osl.portal.web/src/js\n</code></pre> <pre><code>sudo cp config.js.default config.js\n</code></pre> <p>Edit the <code>config.js</code> file with the information of your domain. <code>ROOTURL</code> will automatically extract the the Origin (Protocol://Domain:Port) of the deployment, but you must change <code>APIURL</code> property, if you are not aiming for a localhost installation, e.g. \"https://portal.openslice.io\".</p> <p>Example file:</p> <pre><code>{ \n BUGZILLA: \"ROOTURL/bugzilla/\",\n STATUS: \"ROOTURL/status/\",\n APIURL: \"http://localhost\",\n WEBURL: \"ROOTURL/nfvportal\",\n APIOAUTHURL: \"ROOTURL/auth/realms/openslice\",\n APITMFURL: \"ROOTURL/tmf-api/serviceCatalogManagement/v4\"\n}\n</code></pre>"},{"location":"deploymentCompose/#configure-tmf-web-ui","title":"Configure TMF Web UI","text":"<p>In the folder <code>org.etsi.osl.tmf.web/src/assets/config</code> there are 3 files available for configuration:</p> <ul> <li>config.prod.json (Basic information + API configuration)</li> <li>theming.scss (CSS color palette theming)</li> <li>config.theming.json (HTML configuration - Logo, Favicon, Footer)</li> </ul> <p>The first 2 files above (i.e. config.prod.json, theming.scss) are essential for the successful deployment of OpenSlice, thus created automatically during the initial deployment at <code>org.etsi.osl.tmf.web/src/assets/config</code> directory as a copy of the default ones from the remote repository.</p> <p>Ensure that you check the <code>config.prod.json</code> and <code>theming.scss</code> files and readjust to your deployment if needed.</p> <pre><code># Starting from the root project directory\ncd org.etsi.osl.tmf.web/src/assets/config\n</code></pre> <p>E.g. You may edit \"TITLE\", \"WIKI\", etc properties with your domain title. Also configure TMF's API and Keycloak's location for the web application, if needed.</p> <p>Example file:</p> <pre><code>{ \n \"TITLE\": \"OpenSlice by ETSI\",\n \"PORTALVERSION\":\"2024Q2\",\n \"WIKI\": \"https://osl.etsi.org/documentation\",\n \"BUGZILLA\": \"{BASEURL}/bugzilla/\",\n \"STATUS\": \"{BASEURL}/status/\",\n \"WEBURL\": \"{BASEURL}\",\n \"PORTAL_REPO_APIURL\": \"{BASEURL}/osapi\",\n \"ASSURANCE_SERVICE_MGMT_APIURL\": \"{BASEURL}/oas-api\",\n \"APITMFURL\": \"{BASEURL}/tmf-api\",\n \"OAUTH_CONFIG\" : {\n \"issuer\": \"{BASEURL}/auth/realms/openslice\",\n \"loginUrl\": \"{BASEURL}/auth/realms/openslice/protocol/openid-connect/auth\",\n \"tokenEndpoint\": \"{BASEURL}/auth/realms/openslice/protocol/openid-connect/token\",\n \"userinfoEndpoint\": \"{BASEURL}/auth/realms/openslice/protocol/openid-connect/userinfo\",\n \"redirectUri\": \"{BASEURL}/redirect\",\n \"logoutUrl\": \"{BASEURL}/auth/realms/openslice/protocol/openid-connect/logout\", \n \"postLogoutRedirectUri\": \"{BASEURL}\",\n\n \"responseType\": \"code\",\n \"oidc\": false,\n \"clientId\": \"osapiWebClientId\",\n \"dummyClientSecret\": \"secret\",\n\n \"requireHttps\": false,\n \"useHttpBasicAuth\": true,\n \"clearHashAfterLogin\": false,\n\n \"showDebugInformation\": true\n }\n}\n</code></pre> <p>The {BASEURL} placeholder in the file automatically detects the Origin (Protocol://Domain:Port) of the deployment and applies it to every respective property. E.g. If you are attempting a local deployment of OpenSlice, then {BASEURL} is automatically translated to \"http://localhost\". Similarly, you may use {BASEURL} to translate to a public deployment configuration, e.g. \"https://portal.openslice.io\".</p> <p>If further customization, apart from the default provided, is needed for branding (Logo, Footer) then <code>config.theming.json</code> needs to be created in io.openslice.tmf.web/src/assets/config directory, as follows:</p> <pre><code># Starting from the root project directory\ncd org.etsi.osl.tmf.web/src/assets/config\n</code></pre> <pre><code>sudo cp config.theming.default.json config.theming.json\n</code></pre> <p>IMPORTANT NOTE: If you want to apply changes to the JSON configuration files without the need to rebuild the application, you have to apply the changes at the <code>org.etsi.osl.tmf.web/dist/io-openslice-portal-web/assets/config</code> directory. Although, it is mandatory to also apply these changes to the <code>org.etsi.osl.tmf.web/src/assets/config</code> for persistancy, as after any future rebuild of OpenSlice the <code>/dist</code> directory is being overwritten along with its contents. The OpenSlice team strongly recommends to always apply your changes to the TMF web UI configuration files at <code>org.etsi.osl.tmf.web/src/assets/config</code> and rebuild the application.</p>"},{"location":"deploymentCompose/#deploy-openslice-via-docker-compose","title":"Deploy OpenSlice via Docker Compose","text":"<p>After configuring the services, and editing the docker compose file accordingly, the docker compose instantiation command can be performed.</p> <pre><code># Starting from the root project directory\ncd org.etsi.osl.main/compose/\n</code></pre> <pre><code>sudo docker compose --profile prod down;sudo docker compose --profile prod up -d --build\n</code></pre> <p>Depending on your machine, this process might take time. if for any reason the deployment fails during first time, please rerun the above before any further measures.</p>"},{"location":"deploymentCompose/#validating-deployments-and-container-monitoring","title":"Validating deployments and container monitoring","text":"<p>You can monitor containers' status with portainer at port 9000 (http://your-ip:9000).</p> <p>Initially, you may monitor the local machine at portainer.</p> <p>Please check that all containers are in running state.</p>"},{"location":"deploymentCompose/#post-installation-steps","title":"Post installation steps","text":"<p>After the successful deployment of OpenSlice, to ensure the E2E user experience, this section is mandatory. It contains crucial configuration in regard of authentication and user creation.</p>"},{"location":"deploymentCompose/#configure-keycloak-server","title":"Configure Keycloak server","text":"<p>The Keycloack server is managing authentication and running on a container at port 8080. It is also proxied to your host via nginx under http://localhost/auth. </p> <ul> <li> <p>Navigate to http://domain.com/auth/ or https://domain.com/auth/, (http://ipaddress:8080/auth/ or https://ipaddress:8443/auth/ which are directly accessible without proxy) </p> </li> <li> <p>Navigate to Administration Console </p> </li> <li> <p>Login with the credentials from section Configure keycloak container. Default values are:</p> <ul> <li>user: admin and </li> <li>password: Pa55w0rd</li> </ul> </li> </ul> <p>if you are running in HTTP you will get a message: HTTPS required.</p> <p>To resolve this issue when running in HTTP: </p> <ul> <li>Select the master realm from top left corner</li> <li>Go to login Tab and select \"Require SSL\": None</li> <li>Repeat for realm Openslice</li> </ul> <p>If you are running in HTTPS, then \"Require SSL\" can be left unchanged to external requests.</p>"},{"location":"deploymentCompose/#1-configure-redirects","title":"1. Configure redirects","text":"<p>Navigate to realm Openslice > Clients > osapiWebClientId and change the Root URL to your domain. </p> <p>Also, insert your domain, e.g. http://example.org/*, at:</p> <ul> <li>Valid Redirect URIs</li> <li>Web Origins</li> </ul>"},{"location":"deploymentCompose/#2-configure-email","title":"2. Configure email","text":"<p>Keycloak allows new users to register. Subsequently, this will also allow new users to register to the OpenSlice portal.</p> <p>Navigate to realm Openslice > Realm Settings > Login Tab > check User registration, Verify email, Forgot password etc.</p> <p>Finally, enter the details of the mail server at the Email Tab.</p> <p>Email configuration is optional for test runs, but if not provided the above functionalities (e.g. external user registration) will not be possible.</p>"},{"location":"deploymentCompose/#3-add-an-openslice-admin-user","title":"3. Add an OpenSlice admin user","text":"<p>This step is mandatory so as to access the OpenSlice Web UI. To add an OpenSlice admin user you must:</p> <ul> <li>Navigate to realm Openslice > Users > Add user</li> <li>Set a password</li> <li>Upon creation, navigate to Role Mappings and add ADMIN to Assigned Roles list</li> </ul> <p>That user is different from the Keycloak admin user. It is required to login and browse the OpenSlice Web UI. The Role ADMIN guarantee full access through the OpenSlice UI, thus such a user is always required.</p>"},{"location":"deploymentCompose/#keycloak-at-localhost","title":"Keycloak at localhost","text":"<p>This is an important step if you run Keycloak on localhost!</p> <p>1 - Edit your Hosts File, adding the line below</p> <p><code>127.0.0.1 keycloak</code></p> <p>Hosts File Location:</p> <ul> <li> <p>In Linux/Unix, the file's location is at /etc/hosts </p> </li> <li> <p>In Windows, its location is at c:\\Windows\\System32\\Drivers\\etc\\hosts</p> </li> </ul> <p>2 - Replace http://localhost/auth/ with http://keycloak:8080/auth/ in your Keycloak config for AngularJS and Angular (see examples below).</p> <p>Explanation</p> <p>Nginx uses the http://keycloak:8080 URL, which is accessible via the internal docker system's network. The Front-end (TS/Angular) shall also use the http://keycloak:8080. This way, you will not get the invalid token error, as the API is acquiring the token from http://keycloak:8080 (internally) and the Front-end is getting verified by an issuer at the same URL, as well.</p> <p>2.1 - For the Angular configuration (TMF portal UI), navigate to org.etsi.osl.tmf.web/src/assets/config and edit config.prod.json</p> <pre><code># Starting from the root project directory\ncd org.etsi.osl.tmf.web/src/assets/config\n</code></pre> <pre><code>nano config.prod.json\n</code></pre> <p>After editing, the displayed properties should look like the example below:</p> <pre><code>{ \n \"OAUTH_CONFIG\" : {\n \"issuer\": \"http://keycloak:8080/auth/realms/openslice\",\n \"loginUrl\": \"http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/auth\",\n \"tokenEndpoint\": \"http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/token\",\n \"userinfoEndpoint\": \"http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/userinfo\",\n \"redirectUri\": \"{BASEURL}/redirect\",\n \"logoutUrl\": \"http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/logout\", \n \"postLogoutRedirectUri\": \"{BASEURL}\",\n }\n}\n</code></pre> <p>Note the difference in changing {BASEURL} -> http://keycloak:8080</p> <p>If you want the changes to take place immediately without rebuilding the project, then repeat the process for org.etsi.osl.tmf.web/dist/org.etsi.osl.tmf.web/assets/config/config.prod.json</p> <p>2.2 - For the AngularJS configuration (NVF portal UI), navigate to org.etsi.osl.portal.web/src/js and edit config.js</p> <pre><code># Starting from the root project directory\ncd org.etsi.osl.portal.web/src/js\n</code></pre> <pre><code>nano config.js\n</code></pre> <p>After editing, the displayed properties should look like the example below:</p> <pre><code>var appConfig = angular.module('portalwebapp.config',[]);\n\n\nappConfig.factory('APIEndPointService', function() {\n return { \n APIOAUTHURL: \"http://keycloak:8080/auth/realms/openslice\",\n };\n});\n</code></pre> <p>Note the difference in \"APIOAUTHURL\" property, changing ROOTURL -> http://keycloak:8080</p>"},{"location":"deploymentCompose/#nfv-orchestrator-configuration","title":"NFV Orchestrator Configuration","text":"<p>After successfully deploying and configuring OpenSlice, you may configure its environment (e.g. the NFVO) that will facilitate the deployment of NFV artifacts.</p> <p>See NFV Orchestrator Configuration.</p>"},{"location":"deploymentK8s/","title":"OpenSlice Deployment Guide with Kubernetes","text":""},{"location":"deploymentK8s/#intended-audience-openslice-administrators","title":"Intended Audience: OpenSlice administrators","text":"<p>This is WIP.</p> <p>Please refer to this guide.</p>"},{"location":"etsi_osl/","title":"The ETSi SDG OSL","text":"<p>OpenSlice is developed by the OSL ETSI Software Development Group see more info</p>"},{"location":"history/","title":"History","text":""},{"location":"history/#history","title":"History","text":"<ul> <li>The NFV portal part of OpenSlice was initially developed in H2020 European Research project 5GinFIRE by University of Patras, Greece</li> <li>OpenSlice core services, APIs was further developed and maintained in H2020 European project 5G-VINNI by University of Patras, Greece</li> <li>OpenSlice has been a part of OSM's OSS/BSS ecosystem</li> <li>OpenSlice is now an ETSI SDG Group since 2023</li> </ul>"},{"location":"history/#citation","title":"Citation","text":"<p>Please cite our ![paper] if you use OpenSlice in your research</p> <pre><code>\n@misc{tranoris2021openslice,\n title={Openslice: An opensource OSS for Delivering Network Slice as a Service}, \n author={Christos Tranoris},\n year={2021},\n eprint={2102.03290},\n archivePrefix={arXiv},\n primaryClass={cs.NI}\n}\n\n\n</code></pre>"},{"location":"lcm/","title":"Lifecycle Management (LCM) Rules","text":"<ul> <li>NOTE: This is a prototype/experimental feature. So issues might raise during operation</li> </ul> <p>LCM Rules are used for defining complex conditions and actions during the lifecycle of a service. In Openslice there are four types of rules defined:</p> <ul> <li>PRE_PROVISION</li> <li>CREATION</li> <li>AFTER_ACTIVATION </li> <li>SUPERVISION </li> <li>AFTER_DEACTIVATION </li> </ul> <p>The following figure displays the different phases that the rules are performed, during the lifecycle of a Network Slice Instance.</p> <p></p> <ul> <li>PRE_PROVISION rules: Run only once just before creating a service with a given priority. </li> <li>CREATION rules: Run while the referenced service dependencies of a service are created</li> <li>AFTER_ACTIVATION rules: Run only once just after a service get the ACTIVE state</li> <li>SUPERVISION rules: Run when a characteristic of a service is changed and the service is in the ACTIVE state </li> <li>AFTER_DEACTIVATION rules: Run only once just after a service get the INACTIVE/TERMINATED state </li> </ul> <p>In general the rules allow to perform many actions during service LCM. Thes are some examples:</p> <ul> <li>Modify service specification parameters before the instantiation of a service (or during operation) based on other dependencies. These parameters might be part of other services already included in Service order</li> <li>Translate GST/NEST parameter values to other values passed later to NFVO for instantiation or control</li> <li>Define complex OSM Configs based on other dependencies and passing variables</li> <li>Define any dependencies when creating the referenced services</li> <li>Dynamically include new service dependencies</li> <li>Create new service orders so include dynamically other services</li> <li>Call external (RESTful) services (via http(s), define payload, examine response)</li> </ul>"},{"location":"lcm/#examine-if-the-rules-are-executed-successfully","title":"Examine if the rules are executed successfully","text":"<p>Rules are transformed automatically to executable code (currently is Java). If a rule is performed successfully or has any issues (e.g. unexpected syntax errors or exceptions) appear in OSOM logfiles and also tey are attached as Notes to the running Service.</p>"},{"location":"lcm/#lcm-rules-and-osom-service-orchestration","title":"LCM Rules and OSOM Service Orchestration","text":"<p>OSOM is the responsible service for executing the rules on a specific phase. The following image explains the design in the BPMN phases:</p> <p></p>"},{"location":"lcm/#define-rules","title":"Define rules","text":"<p>Rules are defined when designing a Service Spec. Here is an example of a list of rules:</p> <p></p> <p>Execution order of rules on a specific phase is random</p> <ul> <li>NOTE: There is a priority field. The lower the number the highest the priority of rule execution. For example Rule with priority 0 will run before rule with priority 1.</li> </ul>"},{"location":"lcm/#definition-language","title":"Definition language","text":"<ul> <li>The visual language that Openslice used is based on Google's Blockly (see https://developers.google.com/blockly)</li> <li>The blockly graph is automatically translated to Java internally and then dynamically executed during orchestration phases.</li> </ul> <p>The following figure is an example of such a rule design. The rule for example will run in PRE_PROVISION phase:</p> <p></p> <ul> <li>The goal of the above rule is to properly define a variable AreaCodes given the chosen AreaOfService from a Service Order.</li> <li>On the right side the user can define some rule properties or observe the underlying generated java code.</li> </ul>"},{"location":"lcm/#the-blocks-library","title":"The blocks library","text":"<p>The following images describe some blocks found in the library.</p> <p>Blockly has syntax rules. It helps with colours to define them. </p> <p>So for example a parameter that is a Number cannot be \"glued\" with a String. Will need some conversion first</p> <p> </p>"},{"location":"lcm/#examples-of-rules","title":"Examples of Rules","text":"<p>The following images provide some examples of rules.</p>"},{"location":"lcm/#define-variables-according-to-cases","title":"define variables according to cases","text":"<p>In the following example we :</p> <ul> <li>define a String variable. </li> <li>Then according to the Area of Service selected from the Service Order of the Service Specification we need to define it properly.</li> <li>We output the value to the OSOM Log</li> <li>Define dynamically the value of another parameter (This is fictional) and then do some other condition check</li> </ul> <p>The strAreaCodes could be passed then e.g. to NFVO for instantiation of services to these cells.</p> <p></p>"},{"location":"lcm/#define-complex-osm-configs-for-day-0","title":"Define complex OSM configs for DAY 0","text":"<p>The following displays some complex examples for defining the parameters to pass to the NFV. In this case is OSM.</p> <ul> <li> <p>NOTE: The OSM_CONFIG characteristic of a service is the one that it is used in orchestration to instantiate NS from OSM</p> </li> <li> <p>check the variable strTargetsParam. It is passed to the variable strOsmConfig3 which is executed if the Number of Cameras is more than 100. </p> </li> <li>if the Video quality requested is 3, then the Maximum Namber of camers will be 8. Check the OSM detailed configuration block and its syntax.</li> <li>if the Video quality requested is 2, we use a simpler OSM Config block to configure the parameter OSM_CONFIG. We just injected a json text ( watch the Escape of the string for the Quotes!)</li> <li>if the Video quality requested is 1, again we use a simpler OSM Config block to configure the parameter OSM_CONFIG. We use as injected json text a variable constructed later</li> </ul> <p></p>"},{"location":"lcm/#define-and-instantiate-different-services-according-to-service-order-request","title":"Define and instantiate different services according to Service Order request","text":"<p>In the following example we would like to offer a service either as Platinum, Gold or Silver. Depending on the selection we need to instantiate different services.</p> <p>There are different ways to accomplish this:</p> <ul> <li>create dynamically New Service Orders of RFSs with equivalent quality of Services</li> <li>change for example the VIMs that you deploy the NS</li> <li>change the NSD (that is use different VNFs)</li> </ul> <p>The following image displays for example the latter case.</p> <p></p>"},{"location":"lcm/#call-an-external-restful-service","title":"Call an external RESTful service","text":"<p>This is useful in cases for example of alarms , external logging, calling other services e.g. email or even a complex algorithm written in other language e.g. call an external service and get a result. (service e.g. a Python service)</p> <p></p> <p></p>"},{"location":"lcm/#create-new-service-orders","title":"Create New Service Orders","text":"<p>The following example calls to Order a New Service Specification with specific Parameter Values</p> <p></p>"},{"location":"nfvoconfig/","title":"NFV Orchestrator configuration","text":"<p>Currently we support Open Source MANO version EIGHT/NINE/TEN/ELEVEN/THIRTEEN. Later versions of OSM may also be supported by the existing configuration, as from OSM 9+ the project converged to the SOL005 interface, regarding the NBI, and SOL006 (YANG model), regarding the NFV/NS packaging. Also an implementation of a generic SOL005 interface is supported, but not extensively tested.</p> <p>Configuration of your target(s) NFVOs/MANO services with Openslice is performed through the NFV portal.</p> <ol> <li> <p>Login to {{yourdomain}}/nfvportal/</p> </li> <li> <p>Navigate to Admin > Manage MANO Platforms > Add New MANO Platform, pick one of the supported MANO platform(s), e.g. Name=OSMvTHIRTEEN, Version=OSMvTHIRTEEN and save. You may edit the saved MANO platforms after this.</p> </li> <li> <p>Navigate to Admin > Manage MANO providers > Add New MANO Provider and enter its details:</p> <ul> <li>Name and description of your choice. The selected name will supplement the NFV artifacts of this provider.</li> <li>One of the already defined MANO platforms</li> <li>API URL Endpoint, eg: https://10.10.10.10:9999 (This is the SOL005 NBI endpoint - Note the port 9999)</li> <li>Username, Password and Project of your OSM tenant.</li> </ul> </li> </ol> <p>Check EnabledForONBOARDING, if you want VNF/NS packages uploaded through the UI by the user, to also be automatically ONBOARDED to this MANO (1 step process). If left unchecked, the onboarding process must be performed manually after the VNF/NS package is uploaded to the portal, by the designated UI (2 step process).</p> <p>Check EnabledForSYNC, if you want to support the automatic synchronization of this MANO with OpenSlice. When enabled, the existing VNF/NS packages and VIMs (and any updates on them) of the registered MANO are also reflected to the portal to the respective UIs (Registered VNFs/NSDs and Manage Infrastructures). </p> <p>The synchronization is a continuous process that will confirm that the artifacts are still present in the MANO, updating the status field of the respective artifacts to <code>OSM_PRESENT</code>. If during this process, an artifact is deleted from the MANO, the respective status field will be updated to <code>OSM_MISSING</code>.</p>"},{"location":"portals_intro/","title":"OpenSlice Portals","text":"<p>Openslice comprises of a web landing page See Demo that navigates to the respective Portal:</p> <ul> <li>Services Portal See Demo</li> <li>NFV Portal See Demo</li> <li>Products Portal See Demo</li> <li>Testing Portal See Demo</li> <li>Resources Portal See Demo</li> </ul> <p>Following you may find the scope each portal focuses on and the main TMF APIs it supports.</p> <p>Services Portal is a designated portal for the: - Service Designer - To design Customer Facing Services as bundles of Resource Facing Services that map to specific Resourses (e.g. NFV, Testing, General Resources). Then, it is charged with the designed Services' exposure to public Service Catalogs. - Service Customer - To browse the public Service Catalogs and order the offered Services. The fulfilment process of the Service Order is also captured and the final deployed Services are exposed to the Customer.</p> <p>NFV Portal is a designated portal for the: Indicatively, the portal can be used to: - Register new a new MANO provider (e.g. OSM) - Synchronize the onboarded VNF/NS packages, and the VIMs of the registered MANO provider - Onboard/Delete VNF/NS packages on specific MANO provider - Deploy a NS to a target MANO provider</p> <p>More information can be found at NFV Services.</p> <p>Resources Portal is a designated portal for the: - Resource Administrator - To view the available Resources that are being synchronized from the underlying infrastructure. - Products Portal is a designated portal for the: - Product Designer - To design Products as bundles of available Services. Then, it is charged with the designed Products' exposure to public Product Catalogs. - Product Customer - To browse the public Product Catalogs and navigate to the respective offered Services.</p> <p>Testing Portal is a designated portal for the: - Testing Designer - To design Tests and provide the testing scripts as attachments to the latter. The Tests can be imported as Services at the Services Portal, and can be included in a Service Bundle.</p> TMF620 TMF632 TMF633 TMF634 TMF638 TMF639 TMF640 TMF641 TMF642 TMF653 TMF685 Services Portal x x x x x x Products Portal x x Testing Portal x x Resources Portal x x x x <p>The NFV Portal uses a proprietary API</p>"},{"location":"role_keycloak_management/","title":"Role management in Keycloak","text":"<p>Some initial configuration of Keycloak happens at Installation/Deployment time. Here are some notes regarding user management</p>"},{"location":"role_keycloak_management/#intended-audience-openslice-administrators","title":"Intended Audience: OpenSlice administrators","text":"<p>There are cases that OpenSlice administrators need to configure Keycloak:</p> <ul> <li>Change user roles, e.g. make a Simple user a Service Designer</li> <li>Domain management</li> <li>User Password reset</li> </ul>"},{"location":"service_inventory/","title":"Service Inventory","text":"<p>After a Service Order completion, active services with their additional characteristics are found:</p> <ul> <li>From the Order Items of a selected Service order</li> <li>from the menu of Service inventory and then selecting details of each service</li> <li>through the Service Inventory API (TMF 638 - Service Inventory Management ) </li> </ul> <p>Openslice creates a Service for the requested CFS. Customers make Service Orders and Openslice instantiates the requested Service Specifications for each Service Order Item of a Service Order. Running Services instantiated by Openslice, reside in Openslice Service Inventory. The following picture displays how Service Specifications are related to Running Services and how Running Services relate with instantiated running Network Services. </p> <p></p> <p>There is a hierarchy of services. Usually an Instantiated CFS has Supporting Services some Instantiated RFSs. Then an Instantiated RFS is related to some running NS managed by NFVO</p>"},{"location":"service_inventory/#interacting-with-an-active-service-day-2-config","title":"Interacting with an Active Service (Day 2 config)","text":"<p>In some cases, if the underlying service is configured with actions (for example in OSM Day 2 primitive actions), there are characteristics that can be modified. Usually they are named like : ::Primitive:: <p>The user can edit the characteristic with a new value. The value is propagated through the OSOM and NFVO down to the related VNF.</p>"},{"location":"service_inventory/#terminatinginactivating-a-service","title":"Terminating/Inactivating a service","text":"<p>You can terminate the service with one of the following processes:</p> <ul> <li>Select the related Service Order and terminate the Order Item. This will delete all the underlying related active services. The Order goes to ACKNOWLEDGED->INPROGRESS->COMPLETE</li> <li>To terminate or inactivate a service, select the specific service from the inventory, press Edit and set the State either to Inactive or Terminated</li> </ul> <p>Warning: if you terminate or inactivate a service the action cannot be undone. </p>"},{"location":"service_inventory/#uml-sequence-diagram","title":"uml: sequence diagram","text":"<p>Here I will embed PlantUML markup to generate a sequence diagram.</p> <p>I can include as many plantuml segments as I want in my Markdown, and the diagrams can be of any type supported by PlantUML.</p>"},{"location":"terminology/","title":"User Roles","text":"<ul> <li>User</li> <li>Service Designer</li> <li>OpenSlice administrator</li> </ul>"},{"location":"terminology/#terms","title":"Terms","text":"<ul> <li>Resource Facing Service Specification (RFSSpec): A Service that exposes a resource Specification as a Service.</li> <li>Customer Facing Service Specification (CFSSpec): Service exposed to users for Service Orders. Usually it exposes other CFSSpec(Service Bundle) or other RFSSpecs</li> <li>OpenSlice management cluster</li> <li>Service Specification: Detailed descriptions of services, including attributes, configurations, performance metrics, and SLAs.</li> <li>Service Catalog</li> <li>Service Categories</li> <li>Service Inventory</li> </ul>"},{"location":"under_construction/","title":"Under construction","text":"<p>under construction</p>"},{"location":"architecture/architecture/","title":"Architecture","text":"<p>Openslice offers the following main functionalities:</p> <ul> <li>Service Catalog Management: A CSP will have the ability to manage the Service Catalog Items, their attributes , organize in categories and decide what to make available to Customers</li> <li>Services Specifications: A CSP will be able to manage Service Specifications</li> <li>Service Catalog Exposure: A CSP will be able to expose catalog to customers and related parties</li> <li>Service Catalog to Service Catalog: Openslice able to consume and provide Service Catalog items to other catalogs</li> <li>Service Order: The Customer will be able to place a Service Order</li> <li>Service Inventory: The Customer and Provider will be able to view deployed Services status</li> </ul> <p>The following figure displays the overall architecture of Openslice.</p> <p></p> <p>Openslice allows Vertical Customers browsing the available offered service specifications. It consists of:</p> <ul> <li>Web frontend UIs that consist of mainly two portals: i) a NFV portal allowing users self-service management and onboarding VNFDs/NSDs to facility\u2019s NFVO ii) a Services Portal, which allows users to browse the Service Catalog, Service Blueprints specifications and the Service Inventory</li> <li>An API gateway that proxies the internal APIs and used by the web front end as well as any other 3rd party service</li> <li>A Message Bus where all microservices use it to exchange messages either via message queues or via publish/subscribe topics</li> <li>An authentication server implementing Oauth2 authentication scheme</li> <li>A microservice offering TMF compliant API services (eg Service Catalog API, Service Ordering APIetc)</li> <li>A microservice offering NFV API services (eg VNF/NSD onboarding etc) and allows to store VNFDs and NSDs in a catalog</li> <li>A microservice that is capable to interface to an issue management system. For example it raises an issue to all related stakeholders (CSP, NOP, CSC) that a new Service Order is requested</li> <li>Central logging microservice that is capable to log all distributed actions in to an Elasticsearch cluster</li> <li>A Service Orchestrator solution that will propagate Service Ordering requests to the equivalent SOs and NFVOs </li> </ul> <p>The following figure depicts how Openslice microservices are deployed</p> <p></p>"},{"location":"architecture/architecture/#deploying-openslice-in-multi-domain-scenarios","title":"Deploying Openslice in multi domain scenarios","text":"<p>A typical deployment across domains, involves today some typical components: i) an OSS/BSS to allow customers access the service catalog and perform service orders, ii) a Service Orchestrator (SO) component for executing the service order workflow, as well as iii) a Network Functions Virtualization Orchestrator (NFVO) for configuring the iv) network resources.</p> <p>TMF Open APIs are introduced not only for exposing catalogues and accepting service orders, but also implementing the East-West interfaces between the domains, fulfilling also the LSO requirements as introduced by MEF.</p> <p>The following figure shows how openslice could be used in such scenarios:</p> <p></p> <p>See more Consuming Services From External Partner Organizations</p>"},{"location":"architecture/centrallog/","title":"Central Logging","text":"<p>Openslice follows the centralized log management concept, i.e. a type of logging solution system that consolidates the log data from different services and pushes it to a central, accessible and easy-to-use interface. </p> <p>For that reason, Elasticsearch is elected as an open-source centralized logging solution for collecting, parsing and storing logs towards a real-time data analytics tool that provides insights from any type of structured and unstructured data source.</p>"},{"location":"architecture/consumingServicesFromExternalPartners/","title":"Consuming Services From External Partner Organizations","text":"<p>A typical deployment across domains, involves today some typical components: i) an OSS/BSS to allow customers access the service catalog and perform service orders, ii) a Service Orchestrator (SO) component for executing the service order workflow, as well as iii) a Network Functions Virtualization Orchestrator (NFVO) for configuring the iv) network resources.</p> <p>TMF Open APIs are introduced not only for exposing catalogues and accepting service orders, but also implementing the East-West interfaces between the domains, fulfilling also the LSO requirements as introduced by MEF.</p> <p>The following figure shows how openslice could be used in such scenarios:</p> <p></p> <p>In Openslice we can consume services from 3rd parties via Open APIs.</p> <p>We use the TMF 632 Party Management model to specify Organizations that we can exchange items and other information such as:</p> <ul> <li>Import Service Specifications</li> <li>Create a Service Order</li> <li>Use the Service Inventory to query the status of the service ordered to the external partner organization</li> </ul>"},{"location":"architecture/consumingServicesFromExternalPartners/#define-an-organization-as-3rd-party-to-consume-services-east-west","title":"Define an Organization as 3rd party to consume services East-West","text":"<p>An organization must have the following characteristics in openslice catalog, like for example:</p> <p>\"EXTERNAL_TMFAPI_BASEURL\", \"http://portal.openslice.io\"</p> <p>\"EXTERNAL_TMFAPI_CLIENTREGISTRATIONID\", \"authOpensliceProvider\"</p> <p>\"EXTERNAL_TMFAPI_OAUTH2CLIENTID\", \"osapiWebClientId\"</p> <p>\"EXTERNAL_TMFAPI_OAUTH2CLIENTSECRET\", \"secret\"</p> <p>\"EXTERNAL_TMFAPI_OAUTH2SCOPES\", scopes</p> <p>\"EXTERNAL_TMFAPI_OAUTH2TOKENURI\", \"http://portal.openslice.io/osapi-oauth-server/oauth/token\"</p> <p>\"EXTERNAL_TMFAPI_USERNAME\", \"admin\"</p> <p>\"EXTERNAL_TMFAPI_PASSWORD\", \"openslice\"</p> <p>\"EXTERNAL_TMFAPI_SERVICE_CATALOG_URLS\" = \"/tmf-api/serviceCatalogManagement/v4/serviceSpecification?type=CustomerFacingServiceSpecification\" (this is optional, fetch a list of service specs it will be relative with the BASEURL. If the url is empty then no specs will be fetched, the EXTERNAL_TMFAPI_SERVICE_CATEGORY_URLS might be used)</p> <p>\"EXTERNAL_TMFAPI_SERVICE_CATEGORY_URLS\" = \"/tmf-api/serviceCatalogManagement/v4/serviceCategory/{categoryid}\" (this example will fetch all specs in a category. You may define comma separated URLs of categories API URL . This will fetch specifications of every defined category. If you want only one specific category put for example the uuid only of one category: \"/tmf-api/serviceCatalogManagement/v4/serviceCategory/bda02821-bc4d-4bd6-b64b-d9c2aa5f8e6d\". multiple urls should be \"/tmf-api/serviceCatalogManagement/v4/serviceCategory/bda02821-bc4d-4bd6-b64b-d9c2aa5f8e6d,/tmf-api/serviceCatalogManagement/v4/serviceCategory/9b6d8bf3-abd2-43c4-8154-c8c6fe5545b2\")</p> <p>\"EXTERNAL_TMFAPI_SERVICE_SPEC\" = \"/tmf-api/serviceCatalogManagement/v4/serviceSpecification\"</p> <p>\"EXTERNAL_TMFAPI_SERVICE_ORDER_URLS\"= \"/test/v1/serviceorder\" (this is optional)</p> <p>An example Organization defined example in json:</p> <pre><code>\n{\n \"uuid\": \"1a09a8b5-6bd5-444b-b0b9-a73c69eb42ae\",\n \"@baseType\": \"BaseEntity\",\n \"@schemaLocation\": null,\n \"@type\": null,\n \"href\": null,\n \"name\": \"Openslice.io\",\n \"id\": \"1a09a8b5-6bd5-444b-b0b9-a73c69eb42ae\",\n \"isHeadOffice\": null,\n \"isLegalEntity\": null,\n \"nameType\": null,\n \"organizationType\": null,\n \"tradingName\": null,\n \"contactMedium\": [],\n \"creditRating\": [],\n \"existsDuring\": null,\n \"externalReference\": [],\n \"organizationChildRelationship\": [],\n \"organizationIdentification\": [],\n \"organizationParentRelationship\": null,\n \"otherName\": [],\n \"partyCharacteristic\": [\n {\n \"uuid\": \"3a2f7221-e0a2-4a6b-88d1-534c8e1963f6\",\n \"@baseType\": \"BaseEntity\",\n \"@schemaLocation\": null,\n \"@type\": null,\n \"href\": null,\n \"name\": \"EXTERNAL_TMFAPI_CLIENTREGISTRATIONID\",\n \"valueType\": null,\n \"value\": {\n \"value\": \"authOpensliceProvider\",\n \"alias\": null\n }\n },\n {\n \"uuid\": \"c24bb527-f178-4d38-9b93-2027c1732876\",\n \"@baseType\": \"BaseEntity\",\n \"@schemaLocation\": null,\n \"@type\": null,\n \"href\": null,\n \"name\": \"EXTERNAL_TMFAPI_USERNAME\",\n \"valueType\": null,\n \"value\": {\n \"value\": \"admin\",\n \"alias\": null\n }\n },\n {\n \"uuid\": \"27e45df8-414b-44c6-a5d5-3f064e2cfd3b\",\n \"@baseType\": \"BaseEntity\",\n \"@schemaLocation\": null,\n \"@type\": null,\n \"href\": null,\n \"name\": \"EXTERNAL_TMFAPI_PASSWORD\",\n \"valueType\": null,\n \"value\": {\n \"value\": \"openslice\",\n \"alias\": null\n }\n },\n {\n \"uuid\": \"e0e470b8-6024-4014-8a18-2333e5465ce1\",\n \"@baseType\": \"BaseEntity\",\n \"@schemaLocation\": null,\n \"@type\": null,\n \"href\": null,\n \"name\": \"EXTERNAL_TMFAPI_OAUTH2CLIENTSECRET\",\n \"valueType\": null,\n \"value\": {\n \"value\": \"secret\",\n \"alias\": null\n }\n },\n {\n \"uuid\": \"3e0de762-ac80-4c1e-a0a1-f265ff0899b4\",\n \"@baseType\": \"BaseEntity\",\n \"@schemaLocation\": null,\n \"@type\": null,\n \"href\": null,\n \"name\": \"EXTERNAL_TMFAPI_OAUTH2SCOPES\",\n \"valueType\": null,\n \"value\": {\n \"value\": \"admin;read\",\n \"alias\": null\n }\n },\n {\n \"uuid\": \"0bbb8314-f7f2-420d-9fed-ba054b15f886\",\n \"@baseType\": \"BaseEntity\",\n \"@schemaLocation\": null,\n \"@type\": null,\n \"href\": null,\n \"name\": \"EXTERNAL_TMFAPI_OAUTH2TOKENURI\",\n \"valueType\": null,\n \"value\": {\n \"value\": \"http://portal.openslice.io/osapi-oauth-server/oauth/token\",\n \"alias\": null\n }\n },\n {\n \"uuid\": \"3a567de4-79eb-4006-a500-3e5229b44175\",\n \"@baseType\": \"BaseEntity\",\n \"@schemaLocation\": null,\n \"@type\": null,\n \"href\": null,\n \"name\": \"EXTERNAL_TMFAPI_OAUTH2CLIENTID\",\n \"valueType\": null,\n \"value\": {\n \"value\": \"osapiWebClientId\",\n \"alias\": null\n }\n },\n {\n \"uuid\": \"6dca729f-dbe1-46b7-89f1-5c4f9fe89d4e\",\n \"@baseType\": \"BaseEntity\",\n \"@schemaLocation\": null,\n \"@type\": null,\n \"href\": null,\n \"name\": \"EXTERNAL_TMFAPI_BASEURL\",\n \"valueType\": null,\n \"value\": {\n \"value\": \"http://portal.openslice.io\",\n \"alias\": null\n }\n }\n ],\n \"relatedParty\": [],\n \"status\": null,\n \"taxExemptionCertificate\": []\n}\n\n</code></pre>"},{"location":"architecture/issuemgt/","title":"Issue Management","text":"<p>For issue management support, Openslice relies on Bugzilla. Bugzilla is a ticketing tool that allows issue reporting and tracking via tickets to all relevant stakeholders. </p> <p>The figure below displays the overall issue management service architecture integrating Bugzilla as its core and how this tool interacts with other Openslice services presenting some distinctive scenarios. It should be noted that Bugzilla tickets will not only be used for bugs/errors, but also for general requests, e.g. Service Order procedure.</p> <p></p>"},{"location":"architecture/messagebus/","title":"Message Bus and exchanged Messages","text":"<p>Openslice has a Message bus which allows Openslice services to exchange messages via queues and topics.</p> <p>It is based on ActiveMQ.</p> <p>3rd party services can be attached to bus and subscribe to message topics or request resources via queues.</p>"},{"location":"architecture/messagebus/#queue-messages","title":"QUEUE MESSAGES","text":"Message Alias CATALOG_GET_SERVICEORDERS Name jms:queue:CATALOG.GET.SERVICEORDERS Type queue Destination TMF API service Producers OSOM Body Description Return a List as String Json Message Alias CATALOG_GET_SERVICEORDER_BY_ID Name jms:queue:CATALOG.GET.SERVICEORDER_BY_ID Type queue Destination TMF API service Producers OSOM Body String orderid Description Return a ServiceOrder as String Json Message Alias CATALOG_UPD_SERVICEORDER_BY_ID Name jms:queue:CATALOG.UPD.SERVICEORDER_BY_ID Type queue Destination TMF API service Producers OSOM Body ServiceOrderUpdate serviceOrder Headers \"orderid\"= orderid Description Returns a ServiceOrder as String Message Alias CATALOG_GET_SERVICESPEC_BY_ID Name jms:queue:CATALOG.GET.SERVICESPEC_BY_ID Type queue Destination TMF API service Producers OSOM Body specid Description Return a ServiceSpecification Message Alias CATALOG_ADD_SERVICESPEC Name jms:queue:CATALOG.ADD.SERVICESPEC Type queue Destination TMF API service Producers CRIDGE Body ServiceSpecCreate Description Creates a ServiceSpecification and returns a ServiceSpecification as String Message Alias CATALOG_UPD_SERVICESPEC Name jms:queue:CATALOG.UPD.SERVICESPEC Type queue Destination TMF API service Producers CRIDGE Body ServiceSpecUpdate Headers \"serviceSpecid\" = serviceSpecId Description Updates a ServiceSpecification and returns a ServiceSpecification as String. --- Message Alias CATALOG_UPDADD_SERVICESPEC Name jms:queue:CATALOG.UPDADD.SERVICESPEC Type queue Destination TMF API service Producers CRIDGE Body ServiceSpecUpdate Headers \"serviceSpecid\" = serviceSpecId, \"forceId\"=forceId Description Updates a ServiceSpecification and returns a ServiceSpecification as String. If forceId is true then tries to assign the requested ID to the spec Message Alias CATALOG_ADD_SERVICEORDER Name jms:queue:CATALOG.ADD.SERVICEORDER Type queue Destination TMF API service Producers OSOM Body ServiceOrderCreate serviceOrder Headers Description Creates a ServiceOrder and returns a ServiceOrder as String Message Alias CATALOG_GET_INITIAL_SERVICEORDERS_IDS Name jms:queue:CATALOG.GET.INITIAL_SERVICEORDERS Type queue Destination TMF API service Producers Body Description Return a List as String Json Message Alias CATALOG_GET_SERVICEORDER_IDS_BY_STATE Name jms:queue:CATALOG.GET.ACKNOWLEDGED_SERVICEORDERS Type queue Destination TMF API service Producers OSOM Body Headers \"orderstate\"= orderState Description String Json ArrayList of ServiceOrders Message Alias CATALOG_ADD_SERVICE Name jms:queue:CATALOG.ADD.SERVICE Type queue Destination TMF API service Producers OSOM Body ServiceCreate String json Headers \"orderid\"=orderid, \"serviceSpecid\"= specid Description Creates Service based an a Service Spec, Returns a Service object Message Alias CATALOG_UPD_SERVICE Name jms:queue:CATALOG.UPD.SERVICE Type queue Destination TMF API service Producers Body ServiceUpdate Headers \"serviceid\" = serviceId, \"propagateToSO\" = true/false Description will update a service by id and return the service instance. If propagateToSO=true then any service change will be handled by OSOM. This is needed to be controlled in order to avoid update loops Message Alias CATALOG_GET_SERVICE_BY_ID Name jms:queue:CATALOG.GET.SERVICE Type queue Destination TMF API service Producers OSOM Body String serviceID Description returns a Service instance <p>---| Message | | | ------------- |----------------| |Alias | CATALOG_GET_SERVICE_BY_ORDERID | |Name | jms:queue:CATALOG.GET.SERVICE_BY_ORDERID | |Type | queue | |Destination | TMF API service | |Producers | | |Body | String serviceID | |Description | returns Service IDs of a specific order given then order id |</p> Message Alias CATALOG_SERVICE_QUEUE_ITEMS_GET Name jms:queue:CATALOG.SERVICEQUEUEITEMS.GET Type queue Destination TMF API service Producers OSOM Body Description returns a LIST OF Service Queue Items --- Message Alias CATALOG_SERVICE_QUEUE_ITEM_UPD Name jms:queue:CATALOG.SERVICEQUEUEITEM.UPDATE Type queue Destination TMF API service Producers OSOM Body String SERVICEQUEUEITEM Headers \"itemid\" = SERVICEQUEUEITEM id Description ill update a service queue item by id and return the instance --- Message Alias CATALOG_SERVICE_QUEUE_ITEM_DELETE Name jms:queue:CATALOG.SERVICEQUEUEITEM.DELETE Type queue Destination TMF API service Producers OSOM Body Headers \"itemid\" = SERVICEQUEUEITEM id Description ill delete a service queue item by id Message Alias CATALOG_SERVICES_TO_TERMINATE Name jms:queue:CATALOG.GET.SERVICETOTERMINATE Type queue Destination TMF API service Producers OSOM Body Headers Description Get a list of ACTIVE services with END DAte in the past --- Message Alias CATALOG_SERVICES_OF_PARTNERS Name jms:queue:CATALOG.GET.SERVICESOFPARTNERS Type queue Destination TMF API service Producers OSOM Body Headers Description Get a list of ACTIVE services from the inventory of partners Message Alias NFV_CATALOG_GET_NSD_BY_ID Name jms:queue:NFVCATALOG.GET.NSD_BY_ID Type queue Destination NFV Catalog service Producers TMF API, OSOM Body NSDid Description Returns a NetworkServiceDescriptor object Message Alias NFV_CATALOG_DEPLOY_NSD_REQ Name jms:queue:NFVCATALOG.DEPLOY.NSD_REQ Type queue Destination NFV Catalog service Producers OSOM Body DeploymentDescriptor as Json String Headers NSD id Description Returns a DeploymentDescriptor object as json string containing deployment info Message Alias NFV_CATALOG_UPD_DEPLOYMENT_BY_ID Name jms:queue:NFVCATALOG.UPD.DEPLOYMENT_BY_ID Type queue Destination NFV Catalog service Producers OSOM Body DeploymentDescriptor as Json String Headers DeploymentDescriptor id Description Updates and Returns a DeploymentDescriptor object as json string containing deployment info Message Alias GET_USER_BY_USERNAME Name jms:queue:GET.USER_BY_USERNAME Type queue Destination NFV Catalog service (this is temproary for now) Producers TMF API Body username Headers Description Returns a PortalUser object as json string containing user info Message Alias NFV_CATALOG_GET_DEPLOYMENT_BY_ID Name jms:queue:NFVCATALOG.GET.DEPLOYMENT_BY_ID Type queue Destination NFV Catalog service Producers OSOM Body Deployment ID Description Returns a DeploymentDescriptor object Message Alias CATALOG_GET_EXTERNAL_SERVICE_PARTNERS Name jms:queue:CATALOG.GET.EXTERNALSERVICEPARTNERS Type queue Destination TMF API service Producers OSOM Body Headers Description As a String Json ArrayList of Organizaton objects containing the characteristic name EXTERNAL_TMFAPI Message Alias CATALOG_UPD_EXTERNAL_SERVICESPEC Name jms:queue:CATALOG.UPD.EXTERNAL_SERVICESPEC Type queue Destination TMF API service Producers OSOM or maybe used by others that would like to update a Service Spec Body A serviceSpecification as json string Headers servicespecification id, orgid id Description Updates (or inserts if does not exist in catalog) an external service specification) Message Alias NFV_CATALOG_NSACTIONS_SCALE Name jms:queue:NSACTIONS.SCALE Type queue Destination TMF API service Producers OSOM or maybe used by others that would like scale a NS Body A ScaleDescriptor as json string Headers none Description performs a scale Message Alias NFV_CATALOG_NS_LCMCHANGED Name NFV_CATALOG_NS_LCMCHANGED Type topic Destination any Producers MANO client Body A json string Headers none Description A NFV_CATALOG_NS_LCMCHANGED message is published when LCM of a running NS is changed"},{"location":"architecture/messagebus/#alarms","title":"ALARMS","text":"Message Alias ALARMS_ADD_ALARM Name jms:queue:ALARMS.ADD.ALARM Type queue Publishers Consumers TMF API Body AlarmCreate Headers Description Add an alarm Message Alias ALARMS_UPDATE_ALARM Name jms:queue:ALARMS.UPDATE.ALARM Type queue Publishers Consumers TMF API Body AlarmUpdate Headers alarmid = alarm id, body (AlarmUpdate object) Description Update an alarm Message Alias ALARMS_GET_ALARM Name jms:queue:ALARMS.GET.ALARM Type queue Publishers Consumers TMF API Body Headers alarmid = alarm id Description get an alarm"},{"location":"architecture/messagebus/#event-topics-in-message-bus","title":"EVENT TOPICS IN Message Bus","text":"Message Alias EVENT_SERVICE_CREATE Name jms:topic:EVENT.SERVICE.CREATE Type topic Publishers TMF API Consumers - Body Notification object Headers \"eventid\"=eventid, \"objId\"= objId Description xx Message Alias EVENT_SERVICE_STATE_CHANGED Name jms:topic:EVENT.SERVICE.STATECHANGED Type topic Publishers TMF API Consumers - Body Notification object Headers \"eventid\"=eventid, \"objId\"= objId Description xx Message Alias EVENT_SERVICE_DELETE Name jms:topic:EVENT.SERVICE.DELETE Type topic Publishers TMF API Consumers - Body Notification object. Can be one of ServiceOrderCreateNotification, ServiceOrderStateChangeNotification, ServiceOrderAttributeValueChangeNotification, ServiceOrderDeleteNotification, etc Headers \"eventid\"=eventid, \"objId\"= objId Description xx Message Alias EVENT_SERVICE_ATTRIBUTE_VALUE_CHANGED Name jms:topic:EVENT.SERVICE.ATTRCHANGED Type topic Publishers TMF API Consumers - Body Notification object. Can be one of ServiceOrderCreateNotification, ServiceOrderStateChangeNotification, ServiceOrderAttributeValueChangeNotification, ServiceOrderDeleteNotification, etc Headers \"eventid\"=eventid, \"objId\"= objId Description xx Message Alias EVENT_SERVICE_ORDER_CREATE Name jms:topic:EVENT.SERVICEORDER.CREATE Type topic Publishers TMF API Consumers BUGZILLA Service, CentralLog Service Body Notification object. Can be one of ServiceOrderCreateNotification, ServiceOrderStateChangeNotification, ServiceOrderAttributeValueChangeNotification, ServiceOrderDeleteNotification, etc Headers \"eventid\"=eventid, \"objId\"= objId Description The Event of the Notification object contains the ServiceOrder object. Bugzilla service for example uses this to create a new issue Message Alias EVENT_SERVICE_ORDER_STATE_CHANGED Name jms:topic:EVENT.SERVICEORDER.STATECHANGED Type topic Publishers TMF API Consumers BUGZILLA Service, CentralLog Service Body Notification object. Can be one of ServiceOrderCreateNotification, ServiceOrderStateChangeNotification, ServiceOrderAttributeValueChangeNotification, ServiceOrderDeleteNotification, etc Headers \"eventid\"=eventid, \"objId\"= objId Description The Event of the Notification object contains the ServiceOrder object. Bugzilla service for example uses this to update an issue Message Alias EVENT_SERVICE_ORDER_DELETE Name jms:topic:EVENT.SERVICEORDER.DELETE Type topic Publishers TMF API Consumers BUGZILLA Service, CentralLog Service Body Notification object. Can be one of ServiceOrderCreateNotification, ServiceOrderStateChangeNotification, ServiceOrderAttributeValueChangeNotification, ServiceOrderDeleteNotification, etc Headers \"eventid\"=eventid, \"objId\"= objId Description The Event of the Notification object contains the ServiceOrder object Message Alias EVENT_SERVICE_ORDER_ATTRIBUTE_VALUE_CHANGED Name jms:topic:EVENT.SERVICEORDER.ATTRCHANGED Type topic Publishers TMF API Consumers BUGZILLA Service, CentralLog Service Body Notification object. Can be one of ServiceOrderCreateNotification, ServiceOrderStateChangeNotification, ServiceOrderAttributeValueChangeNotification, ServiceOrderDeleteNotification, etc Headers \"eventid\"=eventid, \"objId\"= objId Description The Event of the Notification object contains the ServiceOrder object Message Alias EVENT_ALARM_CREATE Name jms:topic:EVENT.ALARM.CREATE Type topic Publishers TMF API Consumers OAS, BUGZILLA Service, CentralLog Service Body AlarmCreateEvent Headers Description The Event contains the Alarm object in payload Message Alias CATALOG_ADD_RESOURCE Name jms:queue:CATALOG.ADD.RESOURCE Type topic Publishers TMF API Consumers any Body ResourceCreate Headers Description The Body contains the ResourceCreate object to add Message Alias CATALOG_UPD_RESOURCE Name jms:queue:CATALOG.UPD.RESOURCE Type topic Publishers TMF API Consumers any Body ResourceUpdate Headers resourceid , propagateToSO Description The Body contains the ResourceCreate object to update Message Alias CATALOG_GET_RESOURCE_BY_ID Name jms:queue:CATALOG.GET.RESOURCE Type topic Publishers TMF API Consumers any Body resourceid Headers Description The Body contains the ResourceCreate object to update Message Alias CATALOG_RESOURCES_OF_PARTNERS Name jms:queue:CATALOG.GET.SERVICESOFPARTNERS Type topic Publishers TMF API Consumers any Body none Headers none Description retrieve all active services of partners Message Alias CATALOG_ADD_RESOURCESPEC Name jms:queue:CATALOG.ADD.RESOURCESPEC Type topic Publishers TMF API Consumers any Body ResourceSpecificationCreate Headers Description The Body contains the ResourceSpecificationCreate object to add Message Alias CATALOG_UPD_RESOURCESPEC Name jms:queue:CATALOG.UPD.RESOURCESPEC Type topic Publishers TMF API Consumers any Body ResourceSpecificationUpdate Headers resourceSpecId Description The Body contains the ResourceSpecificationCreate object to update Message Alias CATALOG_GET_RESOURCESPEC_BY_ID Name jms:queue:CATALOG.GET.RESOURCESPEC_BY_ID Type topic Publishers TMF API Consumers any Body resourceSpecid Headers Description The Body contains the object id to find Message Alias CATALOG_UPDADD_RESOURCESPEC Name jms:queue:CATALOG.UPDADD.RESOURCESPEC Type topic Publishers TMF API Consumers any Body resourceid Headers Description The Body contains the ResourceSpecificationCreate object to update or create if not exist Message Alias EVENT_RESOURCE_CREATE Name jms:topic:EVENT.RESOURCE.CREATE Type topic Publishers TMF API Consumers BUGZILLA Service, CentralLog Service, other Body Notification object. Headers \"eventid\"=eventid, \"objId\"= objId Description The Event of the Notification object contains the Resource object Message Alias EVENT_RESOURCE_STATE_CHANGED Name jms:topic:EVENT.RESOURCE.STATECHANGED Type topic Publishers TMF API Consumers BUGZILLA Service, CentralLog Service, other Body Notification object. Headers \"eventid\"=eventid, \"objId\"= objId Description The Event of the Notification object contains the Resource object Message Alias EVENT_RESOURCE_DELETE Name jms:topic:EVENT.SERVICE.RESOURCE Type topic Publishers TMF API Consumers BUGZILLA Service, CentralLog Service, other Body Notification object. Headers \"eventid\"=eventid, \"objId\"= objId Description The Event of the Notification object contains the Resource object Message Alias EVENT_RESOURCE_ATTRIBUTE_VALUE_CHANGED Name jms:topic:EVENT.RESOURCE.ATTRCHANGED Type topic Publishers TMF API Consumers BUGZILLA Service, CentralLog Service, other Body Notification object. Headers \"eventid\"=eventid, \"objId\"= objId Description The Event of the Notification object contains the Resource object Message Alias CATALOG_GET_LCMRULE_BY_ID Name jms:queue:CATALOG.GET.LCMRULE Type topic Publishers TMF API Consumers any Body lcmid Headers Description The Body contains the LCMRuleSpec object Message Alias CATALOG_GET_LCMRULES_BY_SPECID_PHASE Name jms:queue:CATALOG.GET.LCMRULES_BY_SPECID_PHASE Type topic Publishers TMF API Consumers any Body Headers header.servicespecid, header.phasename Description The Body contains the LCMRuleSpec objects of the specific Service Spec and the specific phase Message Alias CATALOG_GET_SERVICETESTSPEC_BY_ID Name jms:queue:CATALOG.GET.SERVICETESTSPEC_BY_ID Type queue Destination TMF API service Producers OSOM Body specid Description Return a ServiceTestSpecification Message Alias CATALOG_ADD_SERVICETEST Name jms:queue:CATALOG.ADD.SERVICETEST Type queue Destination TMF API service Producers OSOM Body ServiceTestCreate String json Headers \"orderid\"=orderid, \"serviceTestSpecid\"= specid Description Creates Service Test based an a Service Test Spec, Returns a ServiceTest object Message Alias CATALOG_UPD_SERVICETEST Name jms:queue:CATALOG.UPD.SERVICETEST Type queue Destination TMF API service Producers Body ServiceTestUpdate Headers \"serviceid\" = serviceId, \"propagateToSO\" = true/false Description will update a service test by id and return the service instance. If propagateToSO=true then any service change will be handled by OSOM. This is needed to be controlled in order to avoid update loops Message Alias CATALOG_GET_SERVICETEST_BY_ID Name jms:queue:CATALOG.GET.SERVICETEST Type queue Destination TMF API service Producers OSOM Body String serviceID Description returns a Service TEST instance Message Alias CRD_DEPLOY_CR_REQ Name jms:queue:CRD.DEPLOY.CR_REQ Type queue Destination CRD service Producers OSOM Body CR spec as String Headers related service id Description Returns a String object containing deployment info Message Alias CRD_PATCH_CR_REQ Name jms:queue:CRD.PATCH.CR_REQ Type queue Destination CRD service Producers OSOM Body CR as String Headers related service id Description Returns a String object containing PATCH info Message Alias CRD_DELETE_CR_REQ Name jms:queue:CRD.DELETE.CR_REQ Type queue Destination CRD service Producers OSOM Body CR as String Headers related service id Description Returns a String object containing deletion info"},{"location":"architecture/nfvapi/","title":"API interaction","text":""},{"location":"architecture/nfvapi/#oauth-token","title":"OAuth token","text":"<p>See oauth</p>"},{"location":"architecture/nfvapi/#request-a-protected-api-resource","title":"Request a protected API resource","text":"<p>Example: Get all vxfs (check the <code>Authorization:Bearer</code> to be correct)</p> <pre><code>curl -H \"Authorization:Bearer eybGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbIm9wZW5hcGkiLCJhZG1pbiIsInJlYWQiLCJ3cml0ZSJdLCJvcmdhbml6YXRpb24iOiJteW9yZ2FuaXp0aW9uIiwiZXhwIjoxNTcxOTI0MjU2LCJhdXRob3JpdGllcyI6WyJST0xFX01FTlRPUiIsIlJPTEVfQURNSU4iXSwianRpIjoiNzNkZmIxODEtNTMwOS00MmExLThkOWUtOGM3YmQ0YTE1YmU0IiwiY2xpZW50X2lkIjoib3NhcGlXZWJDbGllbnRJZE91dCJ9.Pj_hxnyMGhFhN8avU_DiAw1-LlcaIz5Hp9HNqalw-X4\" http://localhost:13000/osapi/admin/vxfs\n</code></pre> <p>Example response:</p> <pre><code>[\n {\n \"id\": 1,\n \"owner\": {\n \"id\": 1,\n \"organization\": \"ee\",\n \"name\": \"Portal Administrator\",\n \"email\": \"\",\n \"username\": \"admin\",\n \"createdAt\": null\n },\n \"uuid\": \"a954daf2-16da-4b7e-ae42-4825936d453c\",\n \"name\": \"cirros_vnfd\",\n \"iconsrc\": \"/osapi/images/a954daf2-16da-4b7e-ae42-4825936d453c/cirros-64.png\",\n \"shortDescription\": \"cirros_vnfd\",\n \"longDescription\": \"Simple VNF example with a cirros\",\n \"version\": \"1.0\",\n \"packageLocation\": \"/osapi/packages/a954daf2-16da-4b7e-ae42-4825936d453c/cirros_vnf.tar.gz\",\n \"dateCreated\": 1568971426000,\n \"dateUpdated\": 1568981107000,\n \"categories\": [\n {\n \"id\": 3,\n \"name\": \"Service\",\n \"productsCount\": 1,\n \"appscount\": 0,\n \"vxFscount\": 1\n },\n {\n \"id\": 2,\n \"name\": \"Networking\",\n \"productsCount\": 1,\n \"appscount\": 0,\n \"vxFscount\": 1\n }\n ],\n \"extensions\": [],\n \"validationJobs\": [],\n \"screenshots\": \"\",\n \"vendor\": \"OSM\",\n \"published\": false,\n \"termsOfUse\": null,\n \"descriptor\": \"vnfd-catalog:\\n vnfd:\\n - connection-point:\\n - name: eth0\\n type: VPORT\\n description: Simple VNF example with a cirros\\n id: cirros_vnfd\\n logo: cirros-64.png\\n mgmt-interface:\\n cp: eth0\\n name: cirros_vnfd\\n short-name: cirros_vnfd\\n vdu:\\n - count: 1\\n description: cirros_vnfd-VM\\n id: cirros_vnfd-VM\\n image: cirros034\\n interface:\\n - external-connection-point-ref: eth0\\n name: eth0\\n position: '1'\\n type: EXTERNAL\\n virtual-interface:\\n bandwidth: '0'\\n type: VIRTIO\\n vpci: 0000:00:0a.0\\n name: cirros_vnfd-VM\\n vm-flavor:\\n memory-mb: 512\\n storage-gb: 1\\n vcpu-count: 1\\n vendor: OSM\\n version: '1.0'\\n\",\n \"descriptorHTML\": \"<h3>cirros_vnfd</h3><br><b>Vendor: </b>OSM<br><b>Version: </b>1.0<br><b>Description: </b>Simple VNF example with a cirros<br><b>VM Count: </b>1<br><b>vCPU Count: </b>1<br><b>Memory: </b>512 MB<br><b>Storage: </b>1 GB<br>\",\n \"certified\": false,\n \"certifiedBy\": null,\n \"validationStatus\": \"UNDER_REVIEW\",\n \"packagingFormat\": \"OSMvFIVE\",\n \"supportedMANOPlatforms\": [\n {\n \"id\": 1,\n \"name\": \"osm fivee\",\n \"version\": \"osm fivee\",\n \"description\": \"osm five\"\n }\n ],\n \"vxfOnBoardedDescriptors\": [],\n \"vfimagesVDU\": [\n {\n \"id\": 1,\n \"name\": \"cirros034\",\n \"uuid\": \"d4549610-8abd-42ad-97f4-0a64e1c93977\",\n \"shortDescription\": \"Automatically created during vxf cirros_vnfd submission. Owner must update.\",\n \"packageLocation\": null,\n \"publicURL\": null,\n \"dateCreated\": 1568971426000,\n \"dateUpdated\": null,\n \"refVxFs\": [\n {\n \"id\": 1,\n \"name\": \"cirros_vnfd\"\n }\n ],\n \"owner\": {\n \"id\": 1,\n \"organization\": \"ee\",\n \"name\": \"Portal Administrator\",\n \"email\": \"\",\n \"username\": \"admin\",\n \"active\": true,\n \"currentSessionID\": null,\n \"apikey\": \"e41c1cc4-aa56-4b7e-9f4d-64589549d768\",\n \"createdAt\": 1568711859000,\n \"roles\": [\n \"ADMIN\",\n \"MENTOR\"\n ]\n },\n \"published\": false,\n \"termsOfUse\": null,\n \"deployedInfrastructures\": []\n }\n ]\n },\n {\n \"id\": 2,\n \"owner\": {\n \"id\": 1,\n \"organization\": \"ee\",\n \"name\": \"Portal Administrator\",\n \"email\": \"\",\n \"username\": \"admin\",\n \"createdAt\": null\n },\n \"uuid\": \"4ab80095-a63e-4fe7-8598-e1c7e880706e\",\n \"name\": \"cirros_sriov_vnfd\",\n \"iconsrc\": null,\n \"shortDescription\": \"cirros_sriov_vnf\",\n \"longDescription\": \"Simple VNF example with a cirros SRIOV interface\",\n \"version\": \"1.0\",\n \"packageLocation\": \"/osapi/packages/4ab80095-a63e-4fe7-8598-e1c7e880706e/cirros_sriov.tar.gz\",\n \"dateCreated\": 1568971740000,\n \"dateUpdated\": 1568981100000,\n \"categories\": [\n {\n \"id\": 4,\n \"name\": \"tyu\",\n \"productsCount\": 1,\n \"appscount\": 0,\n \"vxFscount\": 1\n },\n {\n \"id\": 5,\n \"name\": \"tyi\",\n \"productsCount\": 1,\n \"appscount\": 0,\n \"vxFscount\": 1\n }\n ],\n \"extensions\": [],\n \"validationJobs\": [],\n \"screenshots\": \"\",\n \"vendor\": \"OSM\",\n \"published\": false,\n \"termsOfUse\": null,\n \"descriptor\": \"vnfd:vnfd-catalog:\\n vnfd:\\n - connection-point:\\n - name: eth0\\n type: VPORT\\n - name: eth1\\n type: VPORT\\n description: Simple VNF example with a cirros SRIOV interface\\n id: cirros_sriov_vnfd\\n logo: cirros-64.png\\n mgmt-interface:\\n cp: eth0\\n name: cirros_sriov_vnf\\n short-name: cirros_sriov_vnf\\n vdu:\\n - count: 1\\n description: cirros_sriov_vnfd-VM\\n guest-epa:\\n cpu-pinning-policy: DEDICATED\\n cpu-thread-pinning-policy: PREFER\\n mempage-size: SMALL\\n numa-node-policy:\\n mem-policy: STRICT\\n node:\\n - id: '1'\\n node-cnt: '1'\\n id: cirros_sriov_vnfd-VM\\n image: cirros-0.3.6-x86_64\\n interface:\\n - external-connection-point-ref: eth0\\n name: eth0\\n position: '1'\\n type: EXTERNAL\\n virtual-interface:\\n bandwidth: '0'\\n type: VIRTIO\\n vpci: 0000:00:0a.0\\n - external-connection-point-ref: eth1\\n name: eth1\\n position: '2'\\n type: EXTERNAL\\n virtual-interface:\\n type: SR-IOV\\n name: cirros_sriov_vnfd-VM\\n vm-flavor:\\n memory-mb: 4096\\n storage-gb: 10\\n vcpu-count: 4\\n vendor: OSM\\n version: '1.0'\\n\",\n \"descriptorHTML\": \"<h3>cirros_sriov_vnf</h3><br><b>Vendor: </b>OSM<br><b>Version: </b>1.0<br><b>Description: </b>Simple VNF example with a cirros SRIOV interface<br><b>VM Count: </b>1<br><b>vCPU Count: </b>1<br><b>Memory: </b>4096 MB<br><b>Storage: </b>10 GB<br>\",\n \"certified\": false,\n \"certifiedBy\": null,\n \"validationStatus\": \"UNDER_REVIEW\",\n \"packagingFormat\": \"OSMvFIVE\",\n \"supportedMANOPlatforms\": [\n {\n \"id\": 1,\n \"name\": \"osm fivee\",\n \"version\": \"osm fivee\",\n \"description\": \"osm five\"\n }\n ],\n \"vxfOnBoardedDescriptors\": [],\n \"vfimagesVDU\": [\n {\n \"id\": 2,\n \"name\": \"cirros-0.3.6-x86_64\",\n \"uuid\": \"be121176-1d62-4a1b-a3c1-7dce2e069d22\",\n \"shortDescription\": \"Automatically created during vxf cirros_sriov_vnfd submission. Owner must update.\",\n \"packageLocation\": null,\n \"publicURL\": null,\n \"dateCreated\": 1568971740000,\n \"dateUpdated\": null,\n \"refVxFs\": [\n {\n \"id\": 2,\n \"name\": \"cirros_sriov_vnfd\"\n }\n ],\n \"owner\": {\n \"id\": 1,\n \"organization\": \"ee\",\n \"name\": \"Portal Administrator\",\n \"email\": \"\",\n \"username\": \"admin\",\n \"active\": true,\n \"currentSessionID\": null,\n \"apikey\": \"e41c1cc4-aa56-4b7e-9f4d-64589549d768\",\n \"createdAt\": 1568711859000,\n \"roles\": [\n \"ROLE_ADMIN\",\n \"ROLE_MENTOR\"\n ]\n },\n \"published\": false,\n \"termsOfUse\": null,\n \"deployedInfrastructures\": []\n }\n ]\n }\n]\n</code></pre>"},{"location":"architecture/oauth/","title":"Authentication Server","text":"<p>Authentication is based on oAuth2. Our authentication service is a Keycloak server which is deployed with Openslice deployment </p> <p>API users needs to authenticate. All APIs (except grant token request) must include Bearer token in request Authorization header.</p>"},{"location":"architecture/oauth/#oauth-token","title":"OAuth token","text":"<p>Get first an oauth token, using your username and password. </p> <pre><code>curl -X POST http://portal.openslice.io/auth/realms/openslice/protocol/openid-connect/token -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=demouser' -d 'password=demouser' -d 'grant_type=password' -d 'client_id=osapiWebClientId' \n</code></pre> <p>response:</p> <pre><code> {\"access_token\":\"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJHZFRjQnpxczg2VW10NTRVZV8ybTJyWHJkV3dzaWdSZE9EUldMYm1memNvIn0.eyJleHAiOjE1ODgyNDA1NzAsImlhdCI6MTU4ODI0MDI3MCwianRpIjoiOGI2ZTU0NWUtNDIyYy00NzFiLWEwN2UtYTUzYzY1NDQ0MzZmIiwiaXNzIjoiaHR0cDovL3BvcnRhbC5vcGVuc2xpY2UuaW8vYXV0aC9yZWFsbXMvb3BlbnNsaWNlIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6ImExYTI3NjVhLWVjODMtNDQ1Ni1iN2IyLTIwNzMxOTg2ZTAzNSIsInR5cCI6IkJlYXJlciIsImF6cCI6Im9zYXBpV2ViQ2xpZW50SWQiLCJzZXNzaW9uX3N0YXRlIjoiMzM1MGY0OTMtNjYyNy00MzczLTg1NDQtZGVmZDI3YWQzYzc0IiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwOi8vbG9jYWxob3N0OjEzMDgyIiwiaHR0cDovL2xvY2FsaG9zdCIsImh0dHA6Ly9vcGVuc2xpY2UuaW8iLCJodHRwOi8vbG9jYWxob3N0OjEzMDAwIiwiaHR0cDovL2xvY2FsaG9zdDo0MjAwIiwiaHR0cDovL3BvcnRhbC5vcGVuc2xpY2UuaW8iXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIk5GVl9ERVZFTE9QRVIiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIiwiRVhQRVJJTUVOVEVSIiwiVVNFUiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoicHJvZmlsZSBlbWFpbCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJkZW1vdXNlciJ9.TnzzpRLMD94UTKpT5_wkr1h4_3KUQmr4TGvFLpJ7cZx-Klrv8tB_eRkWnPqqzCAM9G21a1qXboL8MLMW8ECzG7HYKpobKOGr7LSczMOTdA2ZDyBCRUSOdW77pchu54tJ0ITEkFaDwSKMKKt04V_Sy4U-eIndj0XzzRlkDolWDnK4Z2lRaXAI6fMwOKx1Toa6RfOcemxtzl3pdtjPx92zo6MaKlbIqHK82lxdK0k8aQQaT6TmIrXbZKV2dU_1d3O0q0dVUEZJ_1kzwqOFkmxr9w0EnndC6ccYJlDAr_-GgUhhhNOn5v6tjYLUQdj5e4KEAsxIPzaCreK4un7mEAPmDw\",\"expires_in\":300,\"refresh_expires_in\":1800,\"refresh_token\":\"eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIwZjUxMDk5Yy0wNTIzLTRjNGQtODM0Zi1iNDc0YzBjOTA1MzkifQ.eyJleHAiOjE1ODgyNDIwNzAsImlhdCI6MTU4ODI0MDI3MCwianRpIjoiZmViOTg5NWEtOTY5ZS00MzIzLWJjY2QtZTY2YzQ0NGE1MzJlIiwiaXNzIjoiaHR0cDovL3BvcnRhbC5vcGVuc2xpY2UuaW8vYXV0aC9yZWFsbXMvb3BlbnNsaWNlIiwiYXVkIjoiaHR0cDovL3BvcnRhbC5vcGVuc2xpY2UuaW8vYXV0aC9yZWFsbXMvb3BlbnNsaWNlIiwic3ViIjoiYTFhMjc2NWEtZWM4My00NDU2LWI3YjItMjA3MzE5ODZlMDM1IiwidHlwIjoiUmVmcmVzaCIsImF6cCI6Im9zYXBpV2ViQ2xpZW50SWQiLCJzZXNzaW9uX3N0YXRlIjoiMzM1MGY0OTMtNjYyNy00MzczLTg1NDQtZGVmZDI3YWQzYzc0Iiwic2NvcGUiOiJwcm9maWxlIGVtYWlsIn0.cDTx9BE1Df8EfGYm3VLr_MNFeymxZtJhMtlK7PVbIuk\",\"token_type\":\"bearer\",\"not-before-policy\":1586797346,\"session_state\":\"3350f493-6627-4373-8544-defd27ad3c74\",\"scope\":\"profile email\"}\n\n</code></pre> <p>The <code>access_token</code> will be used next as a Bearer.</p> <pre><code>curl http://portal.openslice.io/tmf-api/serviceCatalogManagement/v4/serviceCatalog -H 'Authorization: Bearer yJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJHZFRjQnpxczg2VW10NTRVZV8ybTJyWHJkV3dzaWdSZE9EUldMYm1memNvIn0.eyJleHAiOjE1ODgyNDA1MjQsImlhdCI6MTU4ODI0MDIyNCwianRpIjoiYjg0NGYxZDAtMzk3Mi00YTMyLThiMWEtZDAxMDY3OGZjMTQ4IiwiaXNzIjoiaHR0cDovL3BvcnRhbC5vcGVuc2xpY2UuaW8vYXV0aC9yZWFsbXMvb3BlbnNsaWNlIiwic3ViIjoiYTFhMjc2NWEtZWM4My00NDU2LWI3YjItMjA3MzE5ODZlMDM1IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoiYWRtaW4tY2xpIiwic2Vzc2lvbl9zdGF0ZSI6ImFmMmMzZmY1LTE4YWQtNDFkNC1hYTAyLTFlMGJkNzNmOTM5MSIsImFjciI6IjEiLCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwicHJlZmVycmVkX3VzZXJuYW1lIjoiZGVtb3VzZXIifQ.SMtgV1E44_K_MQumGXZtWsLGVhYNaoM8Pk-DiFIZtUP4Zu-ervOsxHVQMX1frgVERR4jJidBcSshy9TnJ3UjF4l33WujHltbs-1UPy-gaIufVuEpl8RmbjOti3Up70vLfLXbzb6kN6WaahgobWXlbJsSXXwaBPQP6vSX5KigCa8TmzXcuqom14lOrlU-RB2zQTlJ30p7d9ag-a7o3I5m9GZWLJCZW2UYMl1JkskTHKgilA8HFQY4C9DYwWu8YDMyzqQSNumrTlURalBFidFbZvb1kp4dAyct8TysSWSbxxiwaL2RX1PWUqk-5Fpc1Q6BnBC8muMheiukFuoSkuADAg'^C\nubuntu@portal:~$ curl http://portal.openslice.io/tmf-api/serviceCatalogManagement/v4/serviceCatalog -H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJHZFRjQnpxczg2VW10NTRVZV8ybTJyWHJkV3dzaWdSZE9EUldMYm1memNvIn0.eyJleHAiOjE1ODgyNDA1NzAsImlhdCI6MTU4ODI0MDI3MCwianRpIjoiOGI2ZTU0NWUtNDIyYy00NzFiLWEwN2UtYTUzYzY1NDQ0MzZmIiwiaXNzIjoiaHR0cDovL3BvcnRhbC5vcGVuc2xpY2UuaW8vYXV0aC9yZWFsbXMvb3BlbnNsaWNlIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6ImExYTI3NjVhLWVjODMtNDQ1Ni1iN2IyLTIwNzMxOTg2ZTAzNSIsInR5cCI6IkJlYXJlciIsImF6cCI6Im9zYXBpV2ViQ2xpZW50SWQiLCJzZXNzaW9uX3N0YXRlIjoiMzM1MGY0OTMtNjYyNy00MzczLTg1NDQtZGVmZDI3YWQzYzc0IiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwOi8vbG9jYWxob3N0OjEzMDgyIiwiaHR0cDovL2xvY2FsaG9zdCIsImh0dHA6Ly9vcGVuc2xpY2UuaW8iLCJodHRwOi8vbG9jYWxob3N0OjEzMDAwIiwiaHR0cDovL2xvY2FsaG9zdDo0MjAwIiwiaHR0cDovL3BvcnRhbC5vcGVuc2xpY2UuaW8iXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIk5GVl9ERVZFTE9QRVIiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIiwiRVhQRVJJTUVOVEVSIiwiVVNFUiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoicHJvZmlsZSBlbWFpbCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJkZW1vdXNlciJ9.TnzzpRLMD94UTKpT5_wkr1h4_3KUQmr4TGvFLpJ7cZx-Klrv8tB_eRkWnPqqzCAM9G21a1qXboL8MLMW8ECzG7HYKpobKOGr7LSczMOTdA2ZDyBCRUSOdW77pchu54tJ0ITEkFaDwSKMKKt04V_Sy4U-eIndj0XzzRlkDolWDnK4Z2lRaXAI6fMwOKx1Toa6RfOcemxtzl3pdtjPx92zo6MaKlbIqHK82lxdK0k8aQQaT6TmIrXbZKV2dU_1d3O0q0dVUEZJ_1kzwqOFkmxr9w0EnndC6ccYJlDAr_-GgUhhhNOn5v6tjYLUQdj5e4KEAsxIPzaCreK4un7mEAPmDw'\n\nResponse:\n\n\n[{\"uuid\":\"9e186cd5-b2b2-4a06-b1d6-895720193bc9\",\"lastUpdate\":\"2020-03-11T23:19:05Z\",\"@baseType\":\"BaseEntity\",\"@schemaLocation\":null,\"@type\":\"ServiceCatalog\",\"href\":null,\"name\":\"Example Facility Services\",\"description\":\"Example Facility Services\",\"lifecycleStatus\":\"Active\",\"version\":\"1.0\",\"validFor\":{\"endDateTime\":\"2039-11-20T23:07:21Z\",\"startDateTime\":\"2019-11-20T23:07:21Z\"},\"relatedParty\":null,\"id\":\"9e186cd5-b2b2-4a06-b1d6-895720193bc9\",\"category\":[{\"@baseType\":\"org.etsi.osl.tmf.scm633.model.ServiceCategoryRef\",\"@schemaLocation\":null,\"@type\":\"org.etsi.osl.tmf.scm633.model.ServiceCategoryRef\",\"href\":null,\"name\":\"Generic Services\",\"@referredType\":null,\"id\":\"98b9adf1-a1d6-4165-855f-153ddc2131b1\"},{\"@baseType\":\"org.etsi.osl.tmf.scm633.model.ServiceCategoryRef\",\"@schemaLocation\":null,\"@type\":\"org.etsi.osl.tmf.scm633.model.ServiceCategoryRef\",\"href\":null,\"name\":\"External\",\"@referredType\":null,\"id\":\"08ffdb3c-6237-45d0-9f3a-d43b5fc5f0b6\"},{\"@baseType\":\"org.etsi.osl.tmf.scm633.model.ServiceCategoryRef\",\"@schemaLocation\":null,\"@type\":\"org.etsi.osl.tmf.scm633.model.ServiceCategoryRef\",\"href\":null,\"name\":\"eMBB\",\"@referredType\":null,\"id\":\"ef2c90dd-b65e-4a9f-a9c3-427c9fb0219b\"}]}]\n\n\n</code></pre>"},{"location":"architecture/osom/","title":"Openslice Service Orchestration and Order Management - OSOM","text":"<p>OSOM is a service responsible for:</p> <ul> <li>Service Order Management (SOM)</li> <li>Service Orchestration (SO)</li> </ul> <p>It uses open source Flowable Business process engine (https://www.flowable.org) .</p> <p>A Service Order follows the states as defined in TMF641 specification: </p> <p></p>"},{"location":"architecture/osom/#initial-state","title":"Initial state","text":"<p>When a new order is created, it goes into the Initial state. It is stored in the repository and triggers an Event.</p> <p></p> <p>Administrators are notified usually from the Ticketing System of a new order. They login to Openslice and change the State of the order either to ACKNOWLEDGED or REJECTED. If ACKNOWLEDGED they can Propose a startDate, add Notes, and add any additional service items</p>"},{"location":"architecture/osom/#order-scheduler","title":"Order scheduler","text":"<p>A process checks every 1 minute for ACKNOWLEDGED orders.</p> <p></p> <p></p> <p>It retrieves all orders that are in ACKNOWLEDGED state and if the start date is in time it will initialize the process by settingn the order in IN_PROGRESS state. Finally the Start Order Process will start.</p>"},{"location":"architecture/osom/#start-order-process","title":"Start order process","text":"<p>This process for now is a draft simple prototype to make a simple orchestration via NFVO. Here the actual Services (TMF638/640 model) are created and attached to Service Order and Service Inventory.</p> <p></p> <p></p> <p>We expect here to check which tasks can be orchestrated by NFVO and which by human. We create the equivalent Services(TMF638/640 model) for this order.</p> <ol> <li>During check it should decide to create Service(s) for this service order O1 and send it to ServiceInventory</li> <li>The Services(TMF638 model) are assigned to the Order O1 In supportService List</li> <li>Each OrderItem OI1 is related to one serviceSpecification</li> <li>Each ServiceSpecification has also related serviceSpecRelationships</li> <li>So if we receive an order O1 for a ServiceSpec A which relates to (a bundle of) 3 specs(2 CFS, 1 RFS) we do the following:<ol> <li>Create a Service S_A(TMF638 model) for ServiceSpec A for Order O1</li> <li>We create also 3 Services S_C1, S_C2 and S_R1 equivalent to the serviceSpecRelationships (2 CFS, 1 RFS) </li> <li>At this point the order will have 1 Local Service Orchestration Process(S_A), 2 supportingServices refs(S_C1, S_C2) and 1 supportingResource(S_R1)</li> <li>The 3 supportingServices and 1 supportingResource correspond to total 4 Services in ServiceInventory</li> <li>Service S_A will have: <ol> <li>startMode 1: Automatically by the managed environment</li> <li>State: RESERVED and the Lifecycle will be handled by OSOM</li> </ol> </li> <li>Services S_C1 and S_C2 we decide that cannot be orchestrated then they have <ol> <li>startMode: 3: Manually by the Provider of the Service</li> <li>State: RESERVED and the Lifecycle will be handled by OSOM</li> <li>If the CFS is a bundle spec it is further recursively orchestrated </li> </ol> </li> <li>Service S_R1 will have <ol> <li>startMode 1: Automatically by the managed environment.</li> <li>State: RESERVED</li> <li>IF The Service has the characteristic CharacteristicByName( \"NSDID\") it will be further processed by the NFVO </li> </ol> </li> </ol> </li> </ol> <p>There will be two instances of task \"User Task Manual Complete Service\" each for Services S_C1 and S_C2. The task is Transient for now. It displays only the services that are not automated! Here is a flow for future:</p> <ol> <li>We wait here for human decision.</li> <li>From API we get a result: a. If set to ACTIVE/TERMINATED then we complete the task b. In any other state we stay in this task until it is resolved as in step a c. The Status of ORDER O1 is also updated to PARTIAL</li> </ol> <p>There will be an instance of NFVODeploymentRequest process each for Service S_R1. (see later)</p> <ol> <li>This process is related with the NFVO orchestration</li> <li>It will send a msg to NFVO(s?) for a specific deployment request</li> </ol> <p>All services in \"Order Complete\" are in a status:</p> <ol> <li>Depending on the result the service S_A is either ACTIVE or INACTIVE or TERMINATED</li> <li>The Status of ORDER O1 is also updated to COMPLETED or PARTIAL (in case we have some services running) or FAILED (in cases we have errors)</li> </ol> <p>A Service follows the states as defined in TMF638 Service Inventory specification: </p> <p></p>"},{"location":"architecture/osom/#nfvodeploymentrequest-process","title":"NFVODeploymentRequest process","text":"<p>This process is related with the NFVO orchestration It will send a msg to NFVO(s?) for a specific deployment request Then it checks the deployment status. It will wait 30 secs each time until the deployment is running (or failed)</p>"},{"location":"architecture/osom/#check-in-progress-orders-process","title":"Check In Progress orders process","text":"<p>Every 1 minute the \"Check In Progress Orders\" process is executed checking if a supported Service changed state (i.e. to ACTIVE) then the whole Order will change state (e.g. go to COMPLETED)</p> <p></p>"},{"location":"architecture/osom/#external-service-provider-deployment-request-process","title":"External Service Provider Deployment Request process","text":"<p>This process contains tasks for submitting order requests to external partners. - Submit Order To External Service Provider Task: This task creates automatically a Service Order request to a 3rd party provider SO that hosts the Service Specification - Check external service order fulfillment task: This task Check external partner for Service creations and updates our local inventory of services the service characteristics of remote Service Inventory</p>"},{"location":"architecture/osom/#fetch-partner-services-process","title":"Fetch Partner Services Process","text":"<p>Every 2 minutes the \"fetchPartnerServicesProcess\" process is executed checking remote Partner Organizations for changes in the published catalogues. The Fetch and Update External Partner Services Task is executed in paralle l for each Partner Organization </p>"},{"location":"architecture/osom/#local-service-orchestration-process","title":"Local Service Orchestration Process","text":"<p>This process handles automatically services that need to be further orchestrated or processed by OSOM. For example, for a CFS Bundled service we create such automated service instances that just aggregate the underlying services. </p>"},{"location":"architecture/tmfapi/","title":"TMF OpenAPI specification","text":"<p>PLease check the complete specification here.</p>"},{"location":"architecture/tmfapi/#api-interaction","title":"API interaction","text":""},{"location":"architecture/tmfapi/#oauth-token","title":"OAuth token","text":"<p>See oauth</p>"},{"location":"architecture/tmfapi/#request-a-protected-api-resource","title":"Request a protected API resource","text":"<p>Example: Get all Service Catalogs (check the <code>Authorization:Bearer</code> to be correct)</p> <pre><code>curl -H \"Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbIm9wZW5hcGkiLCJhZG1pbiIsInJlYWQiLCJ3cml0ZSJdLCJvcmdhbml6YXRpb24iOiJteW9yZ2FuaXp0aW9uIiwiZXhwIjoxNTc4NTA1MDcyLCJhdXRob3JpdGllcyI6WyJST0xFX01FTlRPUiIsIlJPTEVfQURNSU4iXSwianRpIjoiMTFlNGYxYTUtZDY0Ny00YzA1LWE0ZGMtYWFhYzUyMjk4YzMwIiwiY2xpZW50X2lkIjoib3NhcGlXZWJDbGllbnRJZE91dCJ9.gm7cKdusDrdMRkxEiFU5sENKGRC1xwVj2SgPRmE9xxx\" -H \"accept: application/json;charset=utf-8\" -X GET \"http://portal.openslice.io/tmf-api/serviceCatalogManagement/v4/serviceCatalog\"\n\n</code></pre> <p>response:</p> <pre><code>[\n {\n \"uuid\": \"9e186cd5-b2b2-4a06-b1d6-895720193bc9\",\n \"lastUpdate\": \"2019-12-19T10:45:55Z\",\n \"@baseType\": \"BaseEntity\",\n \"@schemaLocation\": null,\n \"@type\": \"ServiceCatalog\",\n \"href\": null,\n \"name\": \"Example Facility Services\",\n \"description\": \"Example Facility Services\",\n \"lifecycleStatus\": \"Active\",\n \"version\": \"1.0\",\n \"validFor\": {\n \"endDateTime\": \"2039-11-20T23:07:21Z\",\n \"startDateTime\": \"2019-11-20T23:07:21Z\"\n },\n \"relatedParty\": null,\n \"id\": \"9e186cd5-b2b2-4a06-b1d6-895720193bc9\",\n \"category\": [\n {\n \"@baseType\": \"org.etsi.osl.tmf.scm633.model.ServiceCategoryRef\",\n \"@schemaLocation\": null,\n \"@type\": \"org.etsi.osl.tmf.scm633.model.ServiceCategoryRef\",\n \"href\": null,\n \"name\": \"eMBB\",\n \"@referredType\": null,\n \"id\": \"ef2c90dd-b65e-4a9f-a9c3-427c9fb0219b\"\n },\n {\n \"@baseType\": \"org.etsi.osl.tmf.scm633.model.ServiceCategoryRef\",\n \"@schemaLocation\": null,\n \"@type\": \"org.etsi.osl.tmf.scm633.model.ServiceCategoryRef\",\n \"href\": null,\n \"name\": \"Generic Services\",\n \"@referredType\": null,\n \"id\": \"98b9adf1-a1d6-4165-855f-153ddc2131b1\"\n }\n ]\n }\n]\n</code></pre>"},{"location":"architecture/CRIDGE/CRIDGEforDevelopers/","title":"CRIDGE: A Service to manage Custom Resources in a Kubernetes Cluster","text":""},{"location":"architecture/CRIDGE/CRIDGEforDevelopers/#intended-audience-osl-developers","title":"Intended Audience: OSL developers","text":"<p>Kubernetes is an orchestration system for automating software deployment, scaling, and management. One can interact though the Kubernetes API and it has a set of objects ready for use out of the box. Custom Resource Definitions (CRDs) is a way that allows to manage things other than Kubernetes itself and allows to create our own objects The use of CRDs makes the possibilities of Kubernetes management almost limitless. You can extend the base Kubernetes API with any object you like using CRDs.</p> <p>CRIDGE is a service designed to create and manage Custom Resources (CRs) based on Custom Resource Definitions (CRDs) installed on a Kubernetes cluster. By leveraging the OpenSlice (OSL), CRIDGE enables seamless integration and orchestration within Kubernetes environments, utilizing Kubernetes APIs via the TMF APIs and models. Thus, more or less, OSL exposes Kubernetes APIs as TMF APIs and models.</p> <p>By allowing the design and lifecycle management of services/resources that expose CRDs/CRs in a Kubernetes cluster via the TMF APIs, OSL can be used in many complex scenarios now involing resources from multiple domains.</p> <ol> <li> <p>CRIDGE service allows OSL to:</p> <ul> <li>Create and manage Custom Resources (CRs) using installed CRDs on a target Kubernetes cluster.</li> <li>Facilitate complex orchestration scenarios by wrapping Kubernetes APIs as TMF APIs and models.</li> <li>Handles connectivity to a Kubernetes cluster and manages the lifecycle of CRDs</li> <li>Wraps the Kubernetes API, Receives and provides resources towards other OSL services via the service bus</li> </ul> </li> <li> <p>Enabling Loose Coupling and Orchestration</p> <ul> <li>Language Flexibility: Developers can write CRDs in any language and expose them via the Kubernetes APIs. OSL will reuse these CRDs, enhancing flexibility and integration capabilities.</li> <li>Familiar Deployment: Developers can create and deploy applications using familiar tools such as Helm charts, simplifying the process and reducing the learning curve.</li> </ul> </li> <li> <p>Ecosystem Reusability</p> <ul> <li>CRIDGE capitalizes on the extensive Kubernetes ecosystem, particularly focusing on operators (CRDs).</li> <li>Key repositories and hubs such as artifacthub.io and Operatorhub.io can be utilized for finding and deploying operators.</li> </ul> </li> <li> <p>Service Catalog Exposure and Deployment</p> <p>OSL can expose CRs in service catalogs, facilitating their deployment in complex scenarios. These scenarios may include service bundles that involve multiple systems, such as RAN controllers or other Kubernetes clusters, providing a robust and versatile deployment framework.</p> </li> </ol> <p>Why the CRIDGE name? we wanted to build a service that maps TMF models to CRDs; a kind of a CRD to TMF bridge. Therefore CRIDGE was born</p>"},{"location":"architecture/CRIDGE/CRIDGEforDevelopers/#approach","title":"Approach","text":"<p>OSL in general is responible for exposing service specifications which are ready to be ordered and orchestrated, through tmforum Open APIs as defined in the OSL Service Spec Catalog. Usually for a service specification a corresponding (one or more) resource specification (resourceSpecificationReference) is registered in the OSL Resource Spec Catalog.</p> <p>The following image illustrates the approach.</p> <p></p> <ol> <li>A CRD in a cluster will be mapped in TMF model as a Resource specification and therefore can be exposed as a service specification in a catalog</li> <li>Service Orders can be created for this service specification. The OSL Orchestrator (OSOM) will manage the lifecycle of the Service Order.</li> <li>OSOM creates a Resource in OSL Resource inventory and requests (via CRIDGE) a new Custom Resource (CR) in the target cluster<ul> <li>The resource is created in a specific namespace (for example the UUID of the Service Order)</li> <li>A CR in a cluster will be mapped in TMF model as a Resource in the resource Inventory</li> <li>Other related resources created by the CRD Controller within the namespace are automatically created in OSL Resource Inventory under the same Service Order</li> </ul> </li> </ol> <p></p> <p>The provided image illustrates the architecture and workflow of the CRIDGE service, showing how it interacts with other components within a Kubernetes (K8s) cluster. Here is an explanation of the key components and flow in the diagram:</p> <ul> <li>Other OSL Services: This box represents various OSL services such as Service Spec Catalogue, Resource Spec Catalogue, Service Inventory, Resource Inventory, and OSOM (OpenSlice Service Orchestration and Management).</li> <li>Service Bus: This is the communication layer that facilitates interaction between the CRIDGE service and other OSL services.</li> <li>CRIDGE: CRIDGE acts as a bridge that converts CRDs (Custom Resource Definitions) to TMF (TM Forum) APIs and models. It enables the creation and management of Custom Resources (CRs) in the Kubernetes cluster.</li> <li> <p>K8s API: The Kubernetes API server, which is the central control point for managing the Kubernetes cluster. CRIDGE interacts with the K8s API to manage CRDs and CRs.</p> <p>CRD (Custom Resource Definition): A CRD is a way to define custom resources in Kubernetes cluster-wise. It allows the extension of Kubernetes API to create and manage user-defined resources. Example :</p> </li> </ul> <pre><code> apiVersion: apiextensions.k8s.io/v1\n kind: CustomResourceDefinition\n metadata:\n name: myresource.example.com\n</code></pre> <ul> <li>Namespaces: Kubernetes namespaces provide a way to partition resources within a cluster. The diagram shows that multiple namespaces (nsxx, nsyy, nsz) can be managed by CRIDGE.</li> </ul> <p>CR (Custom Resource): A CR is an instance of a CRD. It represents the actual custom resource that is managed within the Kubernetes cluster. Example shown in different namespaces:</p> <pre><code> apiVersion: example.com/v1\n kind: Myresource\n metadata:\n name: example_resource_1\n</code></pre> <p>In a nutchell:</p> <ul> <li>Various OSL services use the Service Bus to communicate with CRIDGE.</li> <li>CRIDGE converts requests towards Kubernetes API and vice-versa, facilitating the integration of custom resources with other OSL services.</li> <li>CRDs are defined and managed through the K8s API. The example CRD is named myresource.example.com.</li> <li>Deploying CRs in Namespaces: Custom resources defined by the CRD are created and managed within different namespaces in the Kubernetes cluster. Each namespace can have its own instances of the custom resources.<pre><code>> The example CRD myresource.example.com allows the creation of custom resources of type Myresource.\n> Instances of Myresource are created in various namespaces, each with unique names like example_resource_1.\n</code></pre> </li> </ul>"},{"location":"architecture/CRIDGE/CRIDGEforDevelopers/#handling-more-than-one-clusters","title":"Handling more than one clusters","text":"<p>A CRIDGE service is usually responsible for managing one cluster. In the following diagram we show how it can be used for managing multiple clusters:</p> <p></p> <p>We assume that there is an OSL Management cluster that OSL is installed. CRIDGE is also installed there if we would like to manage resources in the same management cluster. - Each CRIDGE service has for example its own configuration to connect to target cluster - Each CRIDGE can be installed either in the managed cluster or at the remote clusters. Connectivity is handled via the service bus - Important: Each CRIDGE has a different context and API endpoints. This is used to request CRDs on a different cluster</p> <p>A CRD has a globally unique name for example mycrd.example.com. So we need to somehow identify also the different cluster</p>"},{"location":"architecture/CRIDGE/CRIDGEforDevelopers/#awareness-for-crds-and-crs-in-cluster","title":"Awareness for CRDs and CRs in cluster","text":"<p>CRDs and CRs can appear (disappear) or change status at any time in a cluster. OSL Resource Inventory need to be aware of these events.</p> <p>The sync process is found in the code and explained by the following picture:</p> <p></p> <p>WatcherService is executed when the cridge service application starts (see onApplicationEvent). First things:</p> <ul> <li>KubernetesClientResource is a class that wraps fabric8\u2019s KubernetesClient<ul> <li>This fabric8 KubernetesClient is initialized from the kubeconf and default context of the machine that runs CRIDGE</li> </ul> </li> <li>On CRIDGE Start up we try to register this cluster and context to OSL catalogs.<ul> <li>See registerKubernetesClientInOSLResource method which registers the KubernetesContextDefinition in Resource Inventory as a LogicalResource via createOrUpdateResourceByNameCategoryVersion method</li> </ul> </li> <li>After the creation(or update) of this cluster as a Resource in OSL we proceed to create SharedIndexInformers for CustomResourceDefinition objects</li> <li>In this way CRIDGE is always aware of all CRDs and their CRs in the cluster, even if a CRD or CR is added/updated/deleted in the K8S cluster outside of OSL(CRIDGE)</li> <li>The SharedIndexInformer events notify CRIDGE, which is always aware of all CRDs and their CRs in the cluster, even if a CRD or CR is added/updated/deleted in the K8S cluster outside of OSL(CRIDGE)<ul> <li>NOTE: The ADD event is raised every time also we run CRIDGE. Therefore, on ADD we do the method to createORupdate resource specifications and resources</li> </ul> </li> <li>On ADD event:<ul> <li>The CRD is transformed to OSL Kubernetes domain model: method kubernetesClientResource.KubernetesCRD2OpensliceCRD</li> <li>Then the OSL Kubernetes domain model is:<ul> <li>transformed to Resource Specification and is stored to catalog (see createOrUpdateResourceSpecByNameCategoryVersion)</li> <li>Transformed to Resource and is stored to catalog (see createOrUpdateResourceByNameCategoryVersion)</li> </ul> </li> <li>Conceptually while a CRD is a new resource located in the Kubernetes cluster resource, it is transformed also as a Resource Specification (a high-level entity) which is ready to be reused as an entity to other scenarios. The same concept as in Kubernetes where a CRD is a definition ready to be used for instantiating resources of this CRD</li> <li>Then for this CRD a Watcher is added for all Resources of this Kind (fabric8\u2019s GenericKubernetesResource entity) </li> <li>When we have a newly added/updated/deleted resource of a certain CRD the method updateGenericKubernetesResourceInOSLCatalog is called for this object (fabric8\u2019s GenericKubernetesResource entity)</li> <li>We examine if the resource has label org.etsi.osl.resourceId<ul> <li>This label is added by OSOM during service orders to correlate K8S requested resources with resources in inventory</li> </ul> </li> <li>If the label exists, we update the resource by ID updateResourceById</li> <li>Else a resource is created in catalog</li> </ul> </li> </ul>"},{"location":"architecture/CRIDGE/CRIDGEforDevelopers/#deployment-of-a-new-cr-based-on-a-crd","title":"Deployment of a new CR based on a CRD","text":"<ul> <li>A message arrives to deploy a CR<ul> <li>The call examines if this CRIDGE service can handle the request (based on context and masterURL)</li> </ul> </li> <li>There are headers received and a crspec in json</li> <li>The crspec is unmarshaled as GenericKubernetesResource</li> <li>Headers are in format org.etsi.osl.*</li> <li>These headers are injected as labels <ul> <li>(see later in orchestration)</li> </ul> </li> <li>A namespace is created for this resource</li> <li>Watchers are created for this namespace for e.g. new secrets, config maps etc , so that they can be available back as resources to the Inventory of OSL (Note only Secrets for now are watched)</li> </ul>"},{"location":"architecture/CRIDGE/CRIDGEforDevelopers/#expose-crds-as-service-specifications-in-openslice-catalogs","title":"Expose CRDs as Service Specifications in OpenSlice catalogs","text":"<p>See ExposingKubernetesResources</p>"},{"location":"architecture/CRIDGE/CRIDGEforDevelopers/#service-orchestration-and-crdscrs","title":"Service Orchestration and CRDs/CRs","text":"<p>OSOM checks the presence of attribute _CR_SPEC at the RFS to make a request for a CR deployment</p> <ul> <li>_CR_SPEC is a JSON or YAML string that is used for the request<ul> <li>It is similar to what one will do with e.g. a kubectl apply</li> <li>There are tools to translate a yaml file to a json</li> </ul> </li> </ul> <p>LCM rules can be used to change attributes of this yaml/json file, before sending this for orchestration</p> <p>However, the following issue needs to be solved: ** How to map the CR lifecycle that is defined in the CRD with the TMF resource Lifecycle? ** - For this We introduced the following characteristics: _CR_CHECK_FIELD, _CR_CHECKVAL_STANDBY, _CR_CHECKVAL_ALARM, _CR_CHECKVAL_AVAILABLE, _CR_CHECKVAL_RESERVED, _CR_CHECKVAL_UNKNOWN, _CR_CHECKVAL_SUSPENDED</p> <p>OSOM sends to CRIDGE a message with the following information:</p> <ul> <li>currentContextCluster: current context of cluster </li> <li>clusterMasterURL: current master url of the cluster </li> <li>org.etsi.osl.serviceId: This is the related service id that the created resource has a reference </li> <li>org.etsi.osl.resourceId: This is the related resource id that the created CR will wrap and reference. </li> <li>org.etsi.osl.prefixName: we need to add a short prefix (default is cr) to various places. For example in K8s cannot start with a number </li> <li>org.etsi.osl.serviceOrderId: the related service order id of this deployment request </li> <li>org.etsi.osl.namespace: requested namespace name </li> <li>org.etsi.osl.statusCheckFieldName: The name of the field that is needed to be monitored in order to monitor the status of the service and translate it to TMF resource statys (RESERVED AVAILABLE, etc) </li> <li>org.etsi.osl.statusCheckValueStandby: The CR specific value (of the CheckFieldName) that needs to me mapped to the TMF resource state STANDBY (see org.etsi.osl.tmf.ri639.model.ResourceStatusType) </li> <li>org.etsi.osl.statusCheckValueAlarm: The CR specific value (of the CheckFieldName) that needs to me mapped to the TMF resource state ALARMS (see org.etsi.osl.tmf.ri639.model.ResourceStatusType) </li> <li>org.etsi.osl.statusCheckValueAvailable: The CR specific value (of the CheckFieldName) that needs to me mapped to the TMF resource state AVAILABLE (see org.etsi.osl.tmf.ri639.model.ResourceStatusType) </li> <li>org.etsi.osl.statusCheckValueReserved: The CR specific value (of the CheckFieldName) that needs to me mapped to the TMF resource state RESERVED (see org.etsi.osl.tmf.ri639.model.ResourceStatusType) </li> <li>org.etsi.osl.statusCheckValueUnknown: The CR specific value (of the CheckFieldName) that needs to me mapped to the TMF resource state UNKNOWN (see org.etsi.osl.tmf.ri639.model.ResourceStatusType) </li> <li> <p>org.etsi.osl.statusCheckValueSuspended: The CR specific value (of the CheckFieldName) that needs to me mapped to the TMF resource state SUSPENDED (see org.etsi.osl.tmf.ri639.model.ResourceStatusType) </p> </li> <li> <p>Parameters:</p> <ul> <li>aService reference to the service that the resource and the CR belongs to</li> <li>resourceCR reference the equivalent resource in TMF repo of the target CR. One to one mapping</li> <li>orderId related service order ID</li> <li>startDate start date of the deployment (not used currently)</li> <li>endDate end date of the deployment (not used currently)</li> <li>_CR_SPEC the spec that is sent to cridge (in json)</li> </ul> </li> <li> <p>Returns:</p> <ul> <li>a string response from cridge. It might return \"OK\" if everything is ok. \"SEE OTHER\" if there are multiple CRIDGEs then some other cridge will handle the request for the equivalent cluster. Any other response is handled as error</li> </ul> </li> <li> <p>CRIDGE receives the message and creates according to the labels the necessary CR</p> </li> <li>It monitors the created resource(s) in namespace (see the Sequence Diagram in previous images)</li> <li>It monitors and tries to figure out and map the Status of the CR to the TMF Status according to the provided org.etsi.osl.statusCheck* labels</li> <li>It sends to the message bus the current resource for creation or update to the TMF service inventory</li> </ul>"},{"location":"architecture/CRIDGE/CRIDGEforDevelopers/#whats-next","title":"What's next?","text":"<ul> <li>See examples of exposing operators via OpenSlice:<ul> <li>Exposing Kubernetes Operators as a Service : Offering \"Calculator as a Service\" through OpenSlice</li> </ul> </li> </ul>"},{"location":"contributing/developing/","title":"Developing","text":"<p>OpenSlice backend services are mainly implemented with Java 17 or above and Spring boot.</p> <p>OpenSlice uses various subsystems and depending on the module would you like to work, other subsystems must be present (you can disable them though in the code, e.g. at docker-compose.yaml file).</p> <p>To get the latest development branch:</p> <pre><code>wget https://labs.etsi.org/rep/osl/code/org.etsi.osl.main/-/raw/develop/compose/deploy.sh \nsudo ./deploy.sh develop #[or replace develop with other branch name]\n</code></pre> <p>You may follow the installation process, as described at \"develop\" tagged documentation.</p> <p>To work on a specific subsystem e.g. org.etsi.osl.tmf.api, you must:</p> <p>1a - Deploy only the core necessary subsystems through:</p> <pre><code>sudo docker compose --profile dev down;sudo docker compose --profile dev up -d --build\n</code></pre> <p>Note --profile dev that will only deploy the core dependency subsystems, instead of the whole OpenSlice.</p> <p>1b - Or alternatively, commend out the respective container from the docker-compose.yaml file, so as to deploy the whole OpenSlice, except the subsystem you want to work on, following the provided installation steps.</p> <p>2 - Clone the respective repository, e.g. https://labs.etsi.org/rep/osl/code/org.etsi.osl.tmf.api/-/tree/develop</p> <p>3 - Code :)</p>"},{"location":"contributing/developing/#general-requirements","title":"General requirements","text":"<ul> <li>Docker should be installed in your development environment</li> <li>Run the core subsystems (see above section)</li> </ul>"},{"location":"contributing/developing/#slack","title":"Slack","text":"<p>Feel free to join OpenSlice Slack for any development oriented questions.</p>"},{"location":"contributing/developing/#examples-of-developing-on-specific-subsystems","title":"Examples of developing on specific subsystems","text":""},{"location":"contributing/developing/#vnfnsd-catalog-management-and-nsd-deployment-api-service","title":"VNF/NSD Catalog Management and NSD Deployment API service","text":"<p>Clone the repository: https://labs.etsi.org/rep/osl/code/org.etsi.osl.portal.api/-/tree/develop</p> <p>Check the docker-compose.yml file. Default port is 13080. Check specifically the datasource username/password, server port.</p> <p>Make sure that the core subsystems are up and running.</p> <p>Execute it with </p> <pre><code>mvn spring-boot:run\n</code></pre> <p>For verification, Swagger API of the service is at <code>http://localhost:13000/osapi/swagger-ui/index.html</code>. </p> <p>There, you may try there various REST actions and authenticate via the OAuth server without the use of the UI.</p>"},{"location":"contributing/developing/#vnfnsd-catalog-management-and-nsd-deployment-web-ui-service","title":"VNF/NSD Catalog Management and NSD Deployment WEB UI service","text":"<p>The Web UI is written in AngularJS.</p> <p>Clone the repository: https://labs.etsi.org/rep/osl/code/org.etsi.osl.portal.web/-/tree/develop</p> <p>By default the project org.etsi.osl.portal.api exposes the folder ../org.etsi.osl.portal.web/src/ in a folder testweb (Check class MvcConfig.java in org.etsi.osl.portal.api) for development. (In production nginx is used). Point your browser to <code>http://localhost:13000/osapi/testweb/index.html/</code></p>"},{"location":"contributing/developing/#versionrelease-management","title":"Version/release management","text":"<p>Check this nice article on how we develop and release versions.</p> <p>https://nvie.com/posts/a-successful-git-branching-model/</p> <p>We develop in the develop branch and follow a issue driven development model.</p>"},{"location":"contributing/developing/#wishlist","title":"Wishlist","text":"<p>Check also our wishlist of new features. You can add your own.</p> <p>See Wishlist.</p>"},{"location":"contributing/wishlist/","title":"TMF API","text":"<ul> <li>RBAC of API endpoints</li> <li>TMF Ticketing API support</li> <li>TMF Product</li> <li>HATEOAS integration</li> <li>Select Specs that can be exposed to partners (maybe with a characteristic?)</li> </ul>"},{"location":"contributing/wishlist/#resource-management","title":"resource management","text":"<ul> <li>Resource Activation and Configuration API TMF702 (NEW) (https://projects.tmforum.org/wiki/pages/viewpage.action?pageId=128855518)</li> </ul>"},{"location":"contributing/wishlist/#tmf-web","title":"TMF WEB","text":""},{"location":"contributing/wishlist/#osom","title":"OSOM","text":"<ul> <li>Actions on service order item and acknowledge order status will define the lifecycle</li> <li>action shutdown on specific date for service order</li> <li>action edit on service order item</li> </ul>"},{"location":"contributing/wishlist/#dynamic-attribute-transformation","title":"Dynamic attribute transformation","text":"<ul> <li>DTM decision tables support per Service Specification</li> <li>Schedule Termination of completed order on running services</li> </ul>"},{"location":"contributing/wishlist/#nfvo-connectivity","title":"NFVO connectivity","text":""},{"location":"contributing/wishlist/#osm-client","title":"OSM Client","text":"<ul> <li>VNF/NSD config params Day 2</li> <li>NSD Lifcecylce</li> <li>NST support</li> </ul>"},{"location":"contributing/wishlist/#nfv-api","title":"NFV API","text":""},{"location":"contributing/wishlist/#nfv-web","title":"NFV WEB","text":""},{"location":"contributing/wishlist/#3rd-party-connectivity","title":"3rd party connectivity","text":""},{"location":"contributing/wishlist/#flowone-connector","title":"FlowOne connector","text":""},{"location":"contributing/wishlist/#openstack-connector","title":"Openstack connector","text":""},{"location":"contributing/wishlist/#kubernetes-connector","title":"Kubernetes connector","text":""},{"location":"contributing/wishlist/#centrallog","title":"CentralLog","text":"<ul> <li>Events from TMF to be written to Central Log</li> </ul>"},{"location":"contributing/wishlist/#authentication","title":"Authentication","text":""},{"location":"naas/exposed_apis/","title":"Supported TMFORUM exposed APIs","text":"Endpoint Title Description Version /tmf-api/serviceCatalogManagement/v4 633 Service Catalog Management Provides a catalog of services. 4.0.0 /tmf-api/productCatalogManagement/v4/ 620 Product Catalog Management Provides a catalog of products. 4.0.0 /tmf-api/productOrderingManagement/v4/ v622 Product Ordering Provides a standardized mechanism for placing a product order. 4.0.0 /tmf-api/resourceCatalogManagement/v4 634 Resource Catalog Management This is Swagger UI environment generated for the TMF Resource Catalog Management specification. 4.0.0 /tmf-api/serviceInventory/v4 638 Service Inventory Management Provides a consistent/standardized mechanism to query and manipulate the Service inventory. 4.0.0 /tmf-api/serviceOrdering/v4 641 API ServiceOrdering Provides a standardized mechanism for managing Service Order. 4.0.0 /tmf-api/serviceQualityManagement/v2 657 Service Quality Management This is Swagger UI environment generated for the TMF Service Quality Management specification. 2.0.0 /tmf-api/partyRoleManagement/v4/ 669 Party Role Management This is Swagger UI environment generated for the TMF Party Role Management specification. 4.0.0 /tmf-api/party/v4/organization 632 API Party Provides standardized mechanism for party management such as creation, update, retrieval, deletion and notification of events. 4.0.0 /tmf-api/agreementManagement/v2/ 651 Agreement Management T his is Swagger UI environment generated for the TMF Agreement Management specification. 2.0.0 /tmf-api/resourceOrderingManagement/v4 652 Resource Order Management-v4.0.0 This is Swagger UI environment generated for the TMF 652-Resource Order Management-v4.0.0 specification. 4.0.0 /tmf-api/accountManagement/v4 666 Account Management This is Swagger UI environment generated for the TMF Account Management specification. 4.0.0 /tmf-api/customerManagement/v4 629 Customer Management TMF Customer Management 4.0.0 /tmf-api/userinfo 691 Federated ID TMF Federated ID 1.0.0 /tmf-api/ServiceActivationAndConfiguration/v3/ 640 API Service Activation and Configuration Provides the ability to activate and configure Services. 3.0.0 /tmf-api/alarmManagement/v4/ 642 API Alarm 4.0.0 /tmf-api/serviceTestManagement/v4 653 Service Test Management Provides the ability to manage tests of provisioned Services. 4.0.0 /tmf-api/resourceInventoryManagement/v4 639 API Resource Inventory Management Provides the ability to manage Resources. 4.0.0 /tmf-api/lcmrulesmanagement/v1/ LCM Rules Custom API environment for LCM Rules 1.0.0 /tmf-api/resourcePoolManagement/v1 685 Resource Pool Management Resources that can be reserved are only in one pool. 1.0.0 /tmf-api/geographicSiteManagement/v5 674 Geographic Site Management Covers the operations to manage sites that can be associated with entities 5.0.0"},{"location":"naas/introduction/","title":"Network as a Service (NaaS)","text":"<p>This section describes some core concepts for Delivering Network as a Service in OpenSlice. There are many articles and reports on the subject like:</p> <ul> <li>TMF909 API Suite Specification for NaaS</li> <li>TMF926A Connectivity_as_a_Service </li> <li>TMF931-Open_Gateway_Onboarding_and_Ordering_Component_Suite</li> <li>GSMA Open Gatewy initiative</li> </ul> <p>In general Network as a Service (NaaS) is a service model that allows users to consume network infrastructure and services , similar to how they would consume other cloud services like Software as a Service (SaaS) or Infrastructure as a Service (IaaS). NaaS abstracts the complexity of managing physical network infrastructure, providing users with virtualized network resources that can be dynamically allocated and managed through software.</p>"},{"location":"naas/introduction/#openslice-and-naas","title":"OpenSlice and NaaS","text":"<p>OpenSlice makes extensive use of TMFORUM's models and APIs. Therefore if one is familiar with TMF APIs the terminology and ideas are the same.</p> <p>To deliver NaaS we need to incorporate various APIs (see TMF909 API Suite Specification for NaaS). OpenSlice implements various TMF APIs to deliver NaaS and support the lifecycle functions required to manage the network capabilities exposed as Network as a Service and managed by operational domains.</p>"},{"location":"naas/introduction/#whats-next","title":"What's next","text":"<ul> <li>For a complete list of supported APIs, see Supported APIs</li> <li>Check the defined user roles of OpenSlice in our Terminology</li> </ul>"},{"location":"naas/resource_catalog/","title":"OpenSlice Resource Catalog:","text":"<pre><code>* Resource Specifications: Defines the underlying resources required to deliver services, such as network components, servers, and software.\n* Resource Availability: Tracks the availability and status of resources to ensure efficient service delivery.\n</code></pre>"},{"location":"naas/service_catalog/","title":"OpenSlice Service Catalogs","text":"<p>OpenSlice offers complete management of Service Catalogs.</p>"},{"location":"naas/service_catalog/#intended-audience-service-designers-openslice-administrators-users","title":"Intended Audience: Service Designers, OpenSlice administrators, Users","text":"<p>OpenSlice offers complete management of Service Catalogs which offer to end users:</p> <ul> <li>Service categories: Lists the available services, including their specifications and performance metrics.</li> <li>Service Bundles: Combines multiple services into a single offering to provide added value to customers.</li> </ul> <p>Service Catalogs contain Service Specifications (organized in Service Categories) exposed to users for Service Orders.</p>"},{"location":"naas/service_catalog/#ui-management","title":"UI management","text":"<p>In the UI this looks like the following. Service catalogs and categories exposed in Service marketplace. </p> <p>In the menu the administrator can manage the Service Catalogs and Categories.</p> <p></p>"},{"location":"naas/service_catalog/#api-exposed","title":"API exposed","text":"<p>When installing OpenSlice the API endpoints can be browsed at: </p> <pre><code>[YOURDOMAIN]/tmf-api/swagger-ui/index.html?urls.primaryName=tmf-api-633-ServiceCatalogManagement-v4.0.0\n\nendpoint examples:\n\n/serviceCatalogManagement/v4/serviceCatalog List or find ServiceCatalog objects\n/serviceCatalogManagement/v4/serviceCategory List or find ServiceCategory objects\n\n</code></pre>"},{"location":"naas/service_catalog/#example-use-case","title":"Example Use Case","text":"<p>Scenario: A service provider wants to offer a new managed XXXX service to enterprise customers.</p> <ul> <li>Service Definition: Service Template thus create a template for the XXXX service, including specifications for bandwidth, network features, and performance metrics.</li> <li>Service Catalog Integration: Add to Service Catalog the XXXX service with all relevant details.</li> <li>Service Delivery/Order: Provision Service by Using the orchestration system to provision and configure the XXXX service based on customer orders.</li> </ul>"},{"location":"naas/service_catalog/#whats-next","title":"What's next","text":"<ul> <li>Read the model of Service Catalogs in TMF TMF633 Service Catalog API User Guide v4.0.0</li> <li>Check a demo of the API here</li> <li>Check a demo of the Catalog and Categories here</li> </ul>"},{"location":"naas/service_inventory/","title":"Service Inventory","text":"<p>Service Inventory contains refences to running services that realize a Service Order</p>"},{"location":"naas/service_inventory/#intended-audience-service-designers-openslice-administrators-users","title":"Intended Audience: Service Designers, OpenSlice administrators, Users","text":"<p>The Service Inventory is a repository that maintains detailed records of all active services and the underlying resources that support them. It acts as a central repository, tracking the lifecycle of each service from provisioning to decommissioning, and includes references to the specific virtual and physical resources that realize the service, such as servers, network components, storage, and software instances. </p> <p>This inventory enables real-time visibility into the status, configuration, and dependencies of each service, facilitating effective management, troubleshooting, and optimization. </p> <p>By providing a view of the active services, the Service Inventory includes services/resource allocation, and ensures that services are delivered in alignment with the inital requst. </p>"},{"location":"naas/service_inventory/#ui-management","title":"UI management","text":"<p>Through the menu and dedicated forms the administrator can manage the Service Inventory and any active Services (reconfigure or terminate).Various examples in this document will guide you to the usage and the management of the Services in Service Inventory.</p>"},{"location":"naas/service_inventory/#api-exposed","title":"API exposed","text":"<p>When installing OpenSlice the API endpoints can be browsed at: </p> <pre><code>[YOURDOMAIN]/tmf-api/swagger-ui/index.html?urls.primaryName=tmf-api-638-ServiceInventoryManagement-v4.0.0\n</code></pre> <p>endpoint examples:</p> <p>/serviceInventory/v4/service List or find Service objects</p>"},{"location":"naas/service_inventory/#whats-next","title":"What's next","text":"<ul> <li>See Ordering Services from catalogs</li> <li>See Service Design</li> </ul>"},{"location":"naas/service_ordering/","title":"Service Ordering","text":"<p>Customer Facing Service Specifications - or also CFSSpec (organized in Service Categories) are exposed to users for Service Orders.</p>"},{"location":"naas/service_ordering/#intended-audience-service-designers-openslice-administrators","title":"Intended Audience: Service Designers, OpenSlice administrators","text":"<p>The Service Order process is a structured sequence of steps initiated by a customer's Service Order request for a specific service, aimed at delivering and activating the desired service or services (if it is a service bunlde), as well as its related services. It begins with the customer submitting a service request through OpenSlice Services portal or the Service Order API, specifying the necessary details such as service specification, configurations, and any specific requirements.</p> <p>The request is then validated and verified for completeness and eligibility by an administrator which marks the Service Order as ACKNOWLEDGED otherwise it rejects it. </p> <p>Once ACKNOWLEDGED, the service order is processed by OpenSlice orchestration system (OSOM), which schedules/automates the provisioning of the required resources and configurations, coordinating across various components such as MANO controlers for virtual network functions (VNFs), or Containerized controllers or any 3rd party controllers or services or even physical infrastructure. The OpenSlice orchestration system ensures that all dependencies are managed and that the service is correctly configured.</p> <p>After provisioning, the service is activated and handed over to the customer, . This end-to-end process ensures a seamless, efficient, and automated delivery of services, enhancing customer satisfaction and operational efficiency.</p> <p>Ongoing monitoring and other actions can be performed by the Life Cycle management rules</p> <p>Future developments: In future releases it might be possible the ongoing monitoring and support provided to ensure continuous performance and reliability. The service could undergoe a series of tests to ensure it meets the specified performance metrics and SLAs before delivering</p>"},{"location":"naas/service_ordering/#whats-next","title":"What's next","text":"<ul> <li>See Ordering Services from catalogs</li> <li>See Service Design</li> </ul>"},{"location":"naas/service_spec/","title":"OpenSlice Service Specification","text":"<p>OpenSlice offers complete management of Service Specifications.</p>"},{"location":"naas/service_spec/#intended-audience-service-designers","title":"Intended Audience: Service Designers","text":"<p>Service Specification is an entity that describes a service offering. There are two types of Service Specifications:</p> <ul> <li>Resource Facing Service Specification</li> <li>Customer Facing Service Specification</li> </ul>"},{"location":"naas/service_spec/#resource-facing-service-specification","title":"Resource Facing Service Specification","text":"<p>Is a Service that It exposes a resource Specification as a Service. (For example expose a Network Service Descriptor as a Service)</p>"},{"location":"naas/service_spec/#customer-facing-service-specification","title":"Customer Facing Service Specification","text":"<p>Customer Facing Service Specifications - or also CFSSpec (organized in Service Categories) are exposed to users for Service Orders. Usually it exposes other CFSSpec(as a Service Bundle) or other RFSSpecs</p>"},{"location":"naas/service_spec/#definition","title":"Definition","text":"<p>Usually a Service Specification has the following aspects:</p> <ul> <li>Name, Description, Version</li> <li>Marked as a Service Bundle: Combines multiple services into a single offering to provide added value to customers.</li> <li>if is is a Bundle then you must add Related Service Specifications</li> <li>If it is a Resource Facing Service Specification has multiple related Resource Facing Service Specifications</li> <li>Characteristics: a list of service characteristics and their type (TEXT, INTEGER, etc)</li> <li>Also they can be exposed as \"Configurable\" so to allow to end-users during the Service Order to select or type values</li> <li>A logo, displayed if needed in the Service Marketplace</li> <li>Any attachments that further help the user</li> <li>Life Cycle Rules that determine the behavior of the Service and instrument the Service Orchestrator. More on Life Cycle Rules here</li> </ul> <p>Service Designers can create a Service Specification from scratch or use some templates:</p> <pre><code>* Create a Service based from a Network Service Descriptor (NSD)\n* Create a Service based on a Kubernetes Operator\n* Create a Service based on the GSMA GST - Generic Slice Template\n</code></pre>"},{"location":"naas/service_spec/#ui-management","title":"UI management","text":"<p>In the UI this looks like the following.</p> <p>Through the menu and dedicated forms the administrator can manage the Service Specifications. Various examples in this document will guide you to the usage and the design of the services.</p>"},{"location":"naas/service_spec/#api-exposed","title":"API exposed","text":"<p>When installing OpenSlice the API endpoints can be browsed at: </p> <pre><code>[YOURDOMAIN]/tmf-api/swagger-ui/index.html?urls.primaryName=tmf-api-633-ServiceCatalogManagement-v4.0.0\n</code></pre> <p>endpoint examples:</p> <p>/serviceCatalogManagement/v4/serviceSpecification List or find ServiceSpecification objects</p>"},{"location":"naas/service_spec/#example-use-case","title":"Example Use Case","text":"<p>Scenario: A service provider wants to offer a new managed XXXX service to enterprise customers.</p> <ul> <li>Service Definition: Create a service specification template for the XXXX service, including specifications for bandwidth, network features, and performance metrics.</li> </ul>"},{"location":"naas/service_spec/#whats-next","title":"What's next","text":"<ul> <li>Read the model of Service Catalogs in TMF TMF633 Service Catalog API User Guide v4.0.0</li> <li>Check a demo of the API here</li> <li>Check a demo of the Service Specifications in Catalog and Categories here (You need to login - see main guide page)</li> <li>Check the GSMA GST</li> </ul>"},{"location":"naas/nfv/nfvservices/","title":"NFV Services","text":"<p>NFV Services are managed through a dedicate UI the NFV portal (eg http://portal.openslice.io/nfvportal)</p> <p>Users are able through this portal to manage their NFV artifacts towards the NFVO, ( for example onboard VNFs and NSDs to a target OSM)</p> <p>Openslice NFV Services target to accommodate the following envisaged user roles. All users are assumed to be Authenticated:</p> <ul> <li>NFV developer: This role is responsible to upload VNF and NSD Descriptors in the Openslice services towards NFVO like OSM</li> <li>Services administrator: This role represents the user that are responsible for maintenance of the Openslice services</li> </ul> <p>(obsolete: )</p> <ul> <li>Testbed provider: This role represents users that are responsible for testbed administration, configuration, integration, adaptation, support, etc</li> <li>Experimenter: This role represents the user that will utilize our services and tools to deploy an experiment. That is the experiment description in terms of e.g.: NSD (Network Service Descriptor) or TOSCA Specification (in future versions)</li> </ul> <p>Finally an anonymous user role exists who has some really simple usage scenarios (e.g. signup through the portal)</p> <p>During the onboarding process the following occurs:</p> <p>\u2022 A NFV developer submits a NFV archive (VNF or NSD) (he can later manage if needed some metadata) \u2022 The administrator can manage the NFV artifact (e.g. edit it) \u2022 The administrator On-Boards the NFV artifact to the target MANO \u2022 The administrator can optionally mark the NFV: o As public in order to be publicly visible by all portal users o As Certified which means this is certified by a certain entity</p>"},{"location":"naas/nfv/nfvservices/#request-a-new-nsd-deployment-this-is-different-in-comparison-to-services","title":"Request a new NSD deployment (this is different in comparison to Services)","text":"<p>A developer requests a new network service deployment (which NSD, tentative dates, target infrastructure, etc.). The request is marked as UNDER_REVIEW</p> <ul> <li>The administrator is notified about the new request and he has the following options:</li> <li>Schedule the deployment for the requested dates or propose other dates. The request is marked as SCHEDULED</li> <li>Reject the request for some reason. The Request is marked as REJECTED</li> <li>Deploy the request to target VIM(s). The Request is marked as RUNNING</li> <li>Finalize the deployment and release resources. The Request is marked as COMPLETED</li> <li>every change of the request-lifecycle the experimenter is notified.</li> </ul>"},{"location":"service_design/intro/","title":"Service Design in OpenSlice","text":"<p>This section offers details on how to design Service Specifications and expose them in Service Catalogs</p>"},{"location":"service_design/intro/#intended-audience-service-designers","title":"Intended Audience: Service Designers","text":"<p>Service Designers create detailed service specifications, which are then managed and exposed in service catalogs. These services are integrated into OpenSlice E2E service orchestration framework to automate and optimize the delivery of network services.</p> <p>OpenSlice can be used to design service specifications for various services, even not networking related services. Here we cover how service designers can expose services related to the NFV world and the containerized world.</p>"},{"location":"service_design/intro/#whats-next","title":"What's next","text":"<ul> <li>Design and expose services based on containerized resources via the Kubernetes Operator pattern</li> <li>Design and expose services based on NFV artifacts</li> </ul>"},{"location":"service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/","title":"Exposing Kubernetes Operators as a Service : Offering \"Calculator as a Service\" through OpenSlice","text":""},{"location":"service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/#intended-audience-service-designers","title":"Intended Audience: Service Designers","text":"<p>To illustrate the powerful concept of Kubernetes operators and how they can be utilized to offer a service through OpenSlice, let's provide an example of a \"Calculator as a Service.\" </p> <p>This example will demonstrate the flexibility and capabilities of Kubernetes operators in managing custom resources and automating operational tasks.</p>"},{"location":"service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/#offering-calculator-as-a-service-through-openslice","title":"Offering \"Calculator as a Service\" through OpenSlice","text":"<ul> <li>We have a service that can accept two integers and an action (SUM, SUB, etc) and returns a result</li> <li>We would like to offer it as a Service through OpenSlice</li> <li>So when a user orders it with some initial parameters, OpenSlice will create it and return the result</li> <li>Also while the service is active, we can do further calculations, until we destroy it.</li> </ul> <p>Assume the following simple CRD of a calculator model accepting two params (spec section) and an action and returning a result (status section)</p> <p>The controller (the calculator code) is implemented in any language and is installed in a Kubernetes cluster</p> <pre><code>\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n name: mycalculators.examples.osl.etsi.org\nspec:\n group: examples.osl.etsi.org\n names:\n kind: MyCalculator\n plural: mycalculators\n singular: mycalculator\n scope: Namespaced\n versions:\n - name: v1alpha1\n schema:\n openAPIV3Schema:\n properties:\n spec:\n properties:\n parama:\n type: integer\n paramb:\n type: integer\n action:\n type: string\n type: object\n status:\n properties:\n result:\n type: integer\n status:\n type: string\n type: object\n type: object\n served: true\n storage: true\n subresources:\n status: {}\n</code></pre> <p>Request to the cluster (through e.g. kubectl apply)</p> <pre><code>apiVersion: examples.osl.etsi.org/v1alpha1\nkind: MyCalculator\nmetadata:\n name: mycalculator.examples.osl.etsi.org\nspec:\n parama: 170\n paramb: 180\n action: 'SUM'\n\n</code></pre> <p>Response</p> <pre><code>apiVersion: examples.osl.etsi.org/v1alpha1\nkind: MyCalculator\nmetadata:\n\u00a0 creationTimestamp: '2023-12-05T12:26:07Z\u2019\n\n<snip>\n\nstatus:\n\u00a0 result: 350\n\u00a0 status: CALCULATED\nspec:\n\u00a0 action: SUM\n\u00a0 parama: 170\n\u00a0 paramb: 180\n\n</code></pre> <p>To perform this through OpenSlice as a Service Specification ready to be ordered we need to do the following:</p>"},{"location":"service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/#crd-is-saved-automatically-as-resource-specification","title":"CRD is saved automatically as Resource Specification","text":"<p>As soon as the CRD is deployed in the cluster (e.g. by your admin via kubctl or via any installation through the internet) it is automatically transformed and is available in OpenSlice catalogs as a Resource Specification.</p> <ul> <li>See also the fully qualified name of the resource specification. <ul> <li>MyCalculator@examples.osl.etsi.org/v1alpha1@docker-desktop@https://kubernetes.docker.internal:6443/</li> <li>The resource specification name is quite unique, so you can install the CRD in many clusters around the internet. Each CRD on each cluster will appear here, for example:<ul> <li>MyCalculator@examples.osl.etsi.org/v1alpha1@default_cluster@https://10.10.10.8:6443/</li> <li>MyCalculator@examples.osl.etsi.org/v1alpha1@edge1_cluster@https://172.16.10.10:6443/</li> </ul> </li> <li>Having this OpenSlice can manage resources in multiple clusters</li> </ul> </li> </ul> <p></p> <p>See also the detailed characteristics. See how OpenSlice makes all characteristics automatically flat and expanded with key-value style</p> <p></p>"},{"location":"service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/#expose-to-users","title":"Expose to Users","text":""},{"location":"service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/#start-by-creating-a-resourcefacingservicespecification","title":"Start by Creating a ResourceFacingServiceSpecification","text":"<p>From the UI menu create a new Service Specification</p> <p></p> <p></p>"},{"location":"service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/#creation-of-crd-related-characteristics","title":"Creation of CRD-related characteristics","text":"<ul> <li>We need now to adjust some characteristics of this CRD as Resource Specification.</li> <li>OpenSlice transalted automatically the CRD spec in a flat list of characteristics.So the \"spec\" section from the original yaml for example, is now unfold into: spec, spec.parama, spec.paramb, etc. the same for \"status\" object</li> <li> <p>We need to make OpenSlice aware of when the service will be active. </p> <ul> <li>So we go to characteristic _CR_CHECK_FIELD and we define that the field that shows the status of the service is the characteristic \"status.status\" (is a text field) </li> <li>Then we go to _CR_CHECKVAL_AVAILABLE and we define the value CALCULATED, which signals the following: When the characteristic \"status.status\" has the value \"CALCULATED\" then OpenSlice will mark the underlying service as \"ACTIVE\"</li> <li>We need also to define the yaml file that OpenSLice will use to create the new resource in the kubernetes cluster</li> <li>We insert the YAML in the characteristic _CR_SPEC</li> </ul> <p>the _CR_SPEC is: </p> </li> </ul> <pre><code>apiVersion: examples.osl.etsi.org/v1alpha1\nkind: MyCalculator\nmetadata:\n name: mycalculator.examples.osl.etsi.org\nspec:\n parama: 170\n paramb: 180\n action: 'SUM'\n\n</code></pre> <p></p> <p>However the values are fixed. How do we allow a user to pass parameters through OpenSlice</p>"},{"location":"service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/#expose-in-catalog","title":"Expose in Catalog","text":"<p>Create a new CustomerFacingServiceSpecification</p> <pre><code>- Go to the menu Service Specification>New Service Specification\n- Create a service My Calulator and mark it as a Bundle\n- Go to Service Specification Relationships and add MyCalculatorRFS\n- The service will be automatically transformed to a \"CustomerFacingServiceSpecification\"\n- Add the following characteristics as the image shows:\n</code></pre> <p></p>"},{"location":"service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/#allow-users-to-pass-new-values-through-openslice","title":"Allow users to pass new values through OpenSlice","text":"<p>We need to Create LCM rules in CustomerFacingServiceSpecification:</p> <pre><code>- The goal of the rules is to allow the user to pass parameters to the actual resource towards the cluster.\n- we will create one rule that will pass the parameters just before creating the service (PRE_PROVISION phase)\n- we will create one rule that will pass the parameters while the service is active (SUPERVISION phase)\n- The rules will be the same\n</code></pre> <p></p> <p>If we see one rule it will look like the following:</p> <p></p> <ul> <li>We need to change the _CR_SPEC characteristic of the referenced ResourceFacingServiceSpecification</li> <li>First bring a block from Service>Relationships>Service Refs and drop the \"Service MyCalculatorRFS\" block</li> <li>Then add a list block from Lists</li> <li>Then add the block that modifies a referenced characteristic from Service>Relationships>Service Refs the block \"Set value to characteristic of a Referenced Service\"</li> <li>Add a block for text _CR_SPEC </li> <li>We use a block that changes a String according to variables Text>\"A formatted text replacing variables from List\"</li> <li>See that we have as Input string the YAML string lines<ul> <li>see that parama, paramb has a %d (they accept integers), action is %s (accepts a string)</li> <li>See that the variables tha will replace the %d, %d and %s are an list<ul> <li>the first %d will be replaced with the value from characteristic spec.parama</li> <li>the second %d will be replaced with the value from characteristic spec.paramb</li> <li>the %s will be replaced with the value from characteristic spec.action</li> </ul> </li> </ul> </li> </ul> <p>If we see the SUPERVISION rule it will look like the following:</p> <ul> <li>It contains also the Result field, which takes the value from the referenced service</li> <li>Add a block for the Result field from Service>Number blocks</li> <li>Add a str to int block from Number blocks</li> <li>Add Service>Relationships>Service Refs and drop the input block [Service MyCalculatorRFS] \"Get Service details from current context running service\" and select from the drop down the \"serviceCharacteristicValue\"</li> <li>Add as name the \"status.result\" </li> </ul> <p></p> <p></p> <p>Expose it then to a catalogue for orders through the Service Categories and Service Catalogs</p> <p></p>"},{"location":"service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/#order-the-service","title":"Order the Service","text":"<p>When a user orders the service, it will look like this:</p> <p></p> <ul> <li>After the Service Order we have 2 services in service inventory on CFS and on RFS. Both have references to values</li> <li>OpenSlice (via CRIDGE service) updates the Resource in Resource Inventory and OSOM updates the Services in Service Inventory</li> <li>The Actual resources are running in the Kubernetes cluster managed by OpenSlice</li> <li>The result is in the characteristic status.result of the running service</li> </ul> <p></p> <p></p>"},{"location":"service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/#modify-the-running-service","title":"Modify the running service","text":"<p>The user can modify the service</p> <p></p> <ul> <li>After a while the update is applied to the cluster, the controller will pick up the resource update and patch the resource</li> <li>OpenSlice (via CRIDGE service) updates the Resource in Resource Inventory and OSOM updates the Services in Service Inventory</li> <li>The result will be available to the respective characteristic \"Result\" after a few seconds, as need to go through various steps (OpenSlice orchestrator, down to kubernetes, to Calculator controller and back)</li> </ul> <p></p>"},{"location":"service_design/kubernetes/ExposingKubernetesResources/","title":"Expose and manage Kubernetes Custom Resource Definitions (Operators) in a Kubernetes Cluster","text":"<p>OpenSlice is capable of exposing Kubernetes Resources and Definitions as Service Specifications</p>"},{"location":"service_design/kubernetes/ExposingKubernetesResources/#intended-audience-service-designers","title":"Intended Audience: Service Designers","text":"<p>Kubernetes is an orchestration system for automating software deployment, scaling, and management. One can interact though the Kubernetes API and it has a set of objects ready for use out of the box. Custom Resource Definitions (CRDs) is a way that allows to manage things other than Kubernetes itself and allows to create our own objects The use of CRDs makes the possibilities of Kubernetes management almost limitless. You can extend the base Kubernetes API with any object you like using CRDs.</p> <p>By allowing the design and lifecycle management of services/resources that expose CRDs/CRs in a Kubernetes cluster via the TMF APIs, OSL can be used in many complex scenarios now involing resources from multiple domains.</p> <ol> <li> <p>OpenSlice is capable to:</p> <ul> <li>Create and manage Custom Resources (CRs) using installed CRDs on a target Kubernetes cluster.</li> <li>Facilitate complex orchestration scenarios by wrapping Kubernetes APIs as TMF APIs and models.</li> <li>Handles connectivity to a Kubernetes cluster and manages the lifecycle of CRDs</li> <li>Wraps the Kubernetes API, Receives and provides resources towards other OpenSlice services via the service bus</li> </ul> </li> <li> <p>Enabling Loose Coupling and Orchestration</p> <ul> <li>Language Flexibility: Developers can write CRDs in any language and expose them via the Kubernetes APIs. OSL will reuse these CRDs, enhancing flexibility and integration capabilities.</li> <li>Familiar Deployment: Developers can create and deploy applications using familiar tools such as Helm charts, simplifying the process and reducing the learning curve.</li> </ul> </li> <li> <p>Ecosystem Reusability</p> <ul> <li>OpenSlice capitalizes on the extensive Kubernetes ecosystem, particularly focusing on operators (CRDs).</li> <li>Key repositories and hubs such as artifacthub.io and Operatorhub.io can be utilized for finding and deploying operators.</li> </ul> </li> <li> <p>Service Catalog Exposure and Deployment</p> <ul> <li>OpenSlice can expose CRs in service catalogs, facilitating their deployment in complex scenarios.</li> <li>These scenarios may include service bundles that involve multiple systems, such as RAN controllers or other Kubernetes clusters, providing a robust and versatile deployment framework.</li> </ul> </li> </ol>"},{"location":"service_design/kubernetes/ExposingKubernetesResources/#approach","title":"Approach","text":"<p>OpenSlice in general is responible for exposing service specifications which are ready to be ordered and orchestrated, through tmforum Open APIs as defined in the OSL Service Spec Catalog. Usually for a service specification a corresponding (one or more) resource specification (resourceSpecificationReference) is registered in the OSL Resource Spec Catalog.</p> <p>The following image illustrates the approach.</p> <p></p> <ol> <li>A CRD in a cluster will be mapped in TMF model as a Resource specification and therefore can be exposed as a service specification in a catalog</li> <li>Service Orders can be created for this service specification. </li> <li>OSOM creates a Resource in OSL Resource inventory and requests new Custom Resource (CR) in the target cluster<ul> <li>The resource is created in a specific namespace (for example the UUID of the Service Order)</li> <li>A CR in a cluster will be mapped in TMF model as a Resource in the resource Inventory</li> <li>Other related resources created by the CRD Controller within the namespace are automatically created in OSL Resource Inventory under the same Service Order</li> </ul> </li> </ol>"},{"location":"service_design/kubernetes/ExposingKubernetesResources/#awareness-for-crds-and-crs-in-cluster","title":"Awareness for CRDs and CRs in cluster","text":"<p>CRDs and CRs can appear (disappear) or change status at any time in a cluster. OpenSlice Resource Inventory need to be aware of these events.</p> <p>When installing OpenSlice you can configure at least one management cluster. OpenSlice connects via a provided kubeconf</p> <ul> <li>On Start up OSL tries to register this cluster and context to OSL catalogs.</li> <li>After the registration of this cluster as a Resource in OSL OSL is always aware of all CRDs and their CRs in the cluster, even if a CRD or CR is added/updated/deleted in the K8S cluster outside of OSL</li> <li>Resources created by OpenSlice have labels, e.g. (org.etsi.osl.*)</li> </ul>"},{"location":"service_design/kubernetes/ExposingKubernetesResources/#expose-crds-as-service-specifications-in-openslice-catalogs","title":"Expose CRDs as Service Specifications in OpenSlice catalogs","text":"<p>A CRD by default is exposed as a Resource Specification</p> <p>To ensure unique names across the clusters that OpenSlice can manage, the name of a CRD is constructed as follows:</p> <p><code>Kind @ ApiGroup/version @ ContextCluster @ masterURL</code></p> <p>For example you might see resource Specifications like:</p> <pre><code>- ```Application@argoproj.io/v1alpha1@kubernetes@https://10.10.10.144:6443/```\n- ```IPAddressPool@metallb.io/v1beta1@kubernetes@https://10.10.10.144:6443/```\n- ```Provider@pkg.crossplane.io/v1@kubernetes@https://10.10.10.144:6443/```\n</code></pre> <p>All attributes of the CRD are translated into characteristics</p> <p>The following specific characteristics are added:</p> <pre><code> - _CR_SPEC: Used for providing the json Custom Resource description to apply\n - _CR_CHECK_FIELD: Used for providing the field that need to be checked for the resource status\n - _CR_CHECKVAL_STANDBY: Used for providing the equivalent value from resource to signal the standby status\n - _CR_CHECKVAL_ALARM: Used for providing the equivalent value from resource to signal the alarm status\n - _CR_CHECKVAL_AVAILABLE: Used for providing the equivalent value from resource to signal the available status\n - _CR_CHECKVAL_RESERVED: Used for providing the equivalent value from resource to signal the reserved status\n - _CR_CHECKVAL_UNKNOWN: Used for providing the equivalent value from resource to signal the unknown status\n - _CR_CHECKVAL_SUSPENDED: Used for providing the equivalent value from resource to signal the suspended status\n</code></pre> <ol> <li> <p>Create a new Service Specification and use this Resource Specification in Resource Specification Relationships</p> <ul> <li>Then the Service Specification is saved as ResourceFacingServiceSpecification</li> </ul> <p>1.1. You can give at this stage values to the characteristics:</p> <pre><code>- _CR_SPEC, \n- _CR_CHECK_FIELD\n- _CR_CHECKVAL_STANDBY\n- _CR_CHECKVAL_ALARM\n- _CR_CHECKVAL_AVAILABLE\n- _CR_CHECKVAL_RESERVED\n- _CR_CHECKVAL_UNKNOWN\n- _CR_CHECKVAL_SUSPENDED\n</code></pre> <p>1.2. You can now create LCM rules if you wish</p> </li> <li> <p>Create a new Service Specification and use the Resource Facing Service Specification in Service Specification Relationships</p> <ul> <li>Then the Service Specification is saved as CustomerFacingServiceSpecification</li> </ul> <p>2.1. You can give at this stage values to the characteristics: </p> <pre><code>- _CR_SPEC, \n- _CR_CHECK_FIELD\n- _CR_CHECKVAL_STANDBY\n- _CR_CHECKVAL_ALARM\n- _CR_CHECKVAL_AVAILABLE\n- _CR_CHECKVAL_RESERVED\n- _CR_CHECKVAL_UNKNOWN\n- _CR_CHECKVAL_SUSPENDED\n</code></pre> <p>2.2. You We can create LCM rules for this new Service Specification</p> <p>2.3. You Expose configurable values for users to configure during service order</p> </li> </ol> <p></p>"},{"location":"service_design/kubernetes/ExposingKubernetesResources/#service-orchestration-and-crdscrs","title":"Service Orchestration and CRDs/CRs","text":"<p>OSOM - OpenSlice Service Orchestrator, checks the presence of attribute _CR_SPEC at the RFS to make a request for a CR deployment</p> <ul> <li>_CR_SPEC is a JSON or YAML string that is used for the request<ul> <li>It is similar to what one will do with e.g. a kubectl apply</li> <li>There are tools to translate a yaml file to a json</li> </ul> </li> </ul> <p>LCM rules can be used to change attributes of this yaml/json file, before sending this for orchestration</p>"},{"location":"service_design/kubernetes/ExposingKubernetesResources/#mapping-the-cr-lifecycle-that-is-defined-in-the-crd-with-the-openslice-tmf-based-resource-lifecycle","title":"Mapping the CR lifecycle that is defined in the CRD with the OpenSLice (TMF-based) resource Lifecycle","text":"<p>OpenSlice adds automatically as we see the following characteristics: </p> <pre><code> - _CR_CHECK_FIELD\n - _CR_CHECKVAL_STANDBY\n - _CR_CHECKVAL_ALARM\n - _CR_CHECKVAL_AVAILABLE\n - _CR_CHECKVAL_RESERVED\n - _CR_CHECKVAL_UNKNOWN\n - _CR_CHECKVAL_SUSPENDED\n</code></pre> <p>These characteristics instrument OpenSlice services to manage and reflect the lifecycle of a kubernetes resource to OpenSlice's (TMF based) lifecycle</p> <ul> <li>_CR_CHECK_FIELD: The name of the field that is needed to be monitored in order to monitor the status of the service and translate it to TMF resource statys (RESERVED AVAILABLE, etc) </li> <li>_CR_CHECKVAL_STANDBY: The CR specific value (of the CheckFieldName) that needs to me mapped to the TMF resource state STANDBY (see org.etsi.osl.tmf.ri639.model.ResourceStatusType) </li> <li>_CR_CHECKVAL_ALARM: The CR specific value (of the CheckFieldName) that needs to me mapped to the TMF resource state ALARMS (see org.etsi.osl.tmf.ri639.model.ResourceStatusType) </li> <li>_CR_CHECKVAL_AVAILABLE: The CR specific value (of the CheckFieldName) that needs to me mapped to the TMF resource state AVAILABLE (see org.etsi.osl.tmf.ri639.model.ResourceStatusType) </li> <li>_CR_CHECKVAL_RESERVED: The CR specific value (of the CheckFieldName) that needs to me mapped to the TMF resource state RESERVED (see org.etsi.osl.tmf.ri639.model.ResourceStatusType) </li> <li>_CR_CHECKVAL_UNKNOWN: The CR specific value (of the CheckFieldName) that needs to me mapped to the TMF resource state UNKNOWN (see org.etsi.osl.tmf.ri639.model.ResourceStatusType) </li> <li>_CR_CHECKVAL_SUSPENDED: The CR specific value (of the CheckFieldName) that needs to me mapped to the TMF resource state SUSPENDED (see org.etsi.osl.tmf.ri639.model.ResourceStatusType) </li> </ul>"},{"location":"service_design/kubernetes/ExposingKubernetesResources/#whats-next","title":"What's next?","text":"<ul> <li>See examples of exposing operators via OpenSlice:<ul> <li>Exposing Kubernetes Operators as a Service : Offering \"Calculator as a Service\" through OpenSlice</li> </ul> </li> <li>Learn more about CRIDGE, the service in OSL that manages CRDs/CRs</li> </ul>"},{"location":"service_design/kubernetes/helm/HELM_Installation_aaS_Jenkins_Example/","title":"Example: Offer Jenkins as a Service via Openslice","text":"<p>Before reading this example please make sure that you went through the Design Helm as a Service </p> <p>We will use the <code>Kind: Application</code> of ArgoCD and create a ResourceFacingServiceSpecification for Jenkins</p> <pre><code>1. Go to Service Specifications\n2. Create New Specification\n3. Give a Name, eg. jenkinsrfs\n4. Go to Resource Specification Relationships\n5. Assign ```Application@argoproj.io/v1alpha1@kubernetes@https://10.10.10.144:6443/```\n</code></pre> <p></p> <p>Focus now on the characteristics configuration.</p> <p>First we need to map the lifecycle of ArgoCD Application to TMF Resource State</p> <p></p> <p>In ArgoCD the field health.status has the value that we need to check (Healty, Progressing, etc)</p> <p>The _CR_SPEC can be designed first in a YAML or json editor. Let's see a YAML definition:</p> <p>```</p> <p>apiVersion: argoproj.io/v1alpha1 kind: Application metadata: finalizers: - resources-finalizer.argocd.argoproj.io name: openslice-jenkins namespace: argocd spec: project: default destination: namespace: opencrdtest name: in-cluster source: repoURL: https://charts.jenkins.io targetRevision: 4.6.1 chart: jenkins helm: values: | controller: service: type: ClusterIP syncPolicy: automated: prune: true selfHeal: true allowEmpty: false syncOptions: - Validate=false - CreateNamespace=true - PrunePropagationPolicy=foreground - PruneLast=true - RespectIgnoreDifferences=true ```</p> <p>NOTICE</p> <p>On each installation OSOM will change the name of the resource in order to be unique (will have a UUID)</p> <p><code>name: openslice-jenkins</code> </p> <p>destination namespace that ArgoCD will use is the name <code>opencrdtest</code></p> <p><code>destination: namespace: opencrdtest</code></p> <p>This implies that ArgoCD installs the Jenkins always in the same namespace</p> <p>To avoid this we will create a simple pre-provision rule to change the namespace properly</p> <p>See the following image: </p> <p></p> <ol> <li>Drag-Drop the _CR_SPEC characteristic of jenkinsrfs from the Service>Text blocks</li> <li>Drag-Drop Text>Formatted text block</li> <li>Drag-Drop Text>Multi-line text input block</li> <li>Copy paste the YAML text</li> <li>Change the spec: destination:namespace to the value %s</li> <li>Drag-Drop Lists>Create list with block delete 2 items (click the gear icon). Connect it to formatted text block</li> <li>Drag-Drop Context>Current Service Order block and select the id. Connect it to the List</li> <li>Save the PRE_PROVISION Rule</li> </ol>"},{"location":"service_design/kubernetes/helm/HELM_Installation_aaS_Jenkins_Example/#expose-the-service-to-your-users","title":"Expose the service to your users","text":"<p>Expose then as CustomerFacingServiceSpecification by using the previous RFSS as Service Specification Relationship 1. Create a Jenkins service and mark as Bundle and save it 2. Go to Service Specification Relationships and assign Jenkinsrfs 3. Add also a Logo if you wish</p> <p></p> <p></p> <p>Expose it now to a Category and a Catalog to be available for ordering.</p> <p></p>"},{"location":"service_design/kubernetes/helm/HELM_Installation_aaS_Jenkins_Example/#order-the-service","title":"Order the service","text":"<p>Order the service from the catalog. </p> <p>Soon the order will be completed and the Services will be active</p> <p></p>"},{"location":"service_design/kubernetes/helm/HELM_Installation_aaS_Jenkins_Example/#how-to-access-the-jenkins-installation","title":"How to access the Jenkins installation:","text":"<p>From the Supporting services of the Service Order, select the ResourceFacingService (jenkinsrfs)</p> <p>The ResourceFacingService has also supporting resources in resource inventory.</p> <p></p> <p>One is the resource reference to the application (e.g. cr_tmpname...), the other is a secret (e.g. cr87893...). </p> <p>Click to go to the secret resource (This is in the Resource inventory of OpenSlice)</p> <p></p> <p>Use them to login in your Jenkins.</p> <p>Exposing Jenkins to you external is a matter of cluster configuration and request (nodeport, load balancing, etc)! This is not a topic for this example</p>"},{"location":"service_design/kubernetes/helm/design_helmaas/","title":"Expose HELM charts as Service Specifications","text":"<p>Manage Helm charts installations via OpenSlice Service Specifications and Service Orders.</p>"},{"location":"service_design/kubernetes/helm/design_helmaas/#intended-audience-service-designers","title":"Intended Audience: Service Designers","text":"<p>Kubernetes is an orchestration system for automating software deployment, scaling, and management. One can interact though the Kubernetes API and it has a set of objects ready for use out of the box. </p> <p>Helm is a tool that automates the creation, packaging, configuration, and deployment of Kubernetes applications by combining your configuration files into a single reusable package</p> <p>At the heart of Helm is the packaging format called charts. Each chart comprises one or more Kubernetes manifests -- and a given chart can have child charts and dependent charts, as well. Using Helm charts:</p> <pre><code> - Reduces the complexity of deploying Microservices\n - Enhances deployment speed\n - Developers already know the technology\n</code></pre> <p>There are many Helm charts and Helm repositories there that are ready to be used</p> <p>Enable loose coupling and more orchestration scenarios</p> <p>Developers create and deploy applications in things they already know (e.g. Helm charts)</p> <p>Use the TMF models as wrapper entities around Helm charts</p> <p>Use OpenSlice to expose them in service catalogs and deploy them in complex scenarios (service bundles) involving also other systems:</p> <pre><code>- Include e.g. RAN controllers, \n- Pass values through life cycle rules from one service to another, \n- Manage multiple Helms in multiple clusters\n</code></pre>"},{"location":"service_design/kubernetes/helm/design_helmaas/#the-installation-of-helm-charts-is-based-on-openslice-crd-support","title":"The installation of HELM charts is based on OpenSlice CRD support","text":"<p>Please read more here</p> <p>For installing HELM charts we will use ArgoCD a well known Kubernetes-native continuous deployment (CD) tool </p> <p>ArgoCD is a Kubernetes-native continuous deployment (CD) tool</p> <p>While just deploying Heml charts is just a scenario for ArgoCD , in future one can exploit it for many things</p> <p>Despite some other tools like FluxCD, it provides also a UI which is useful for management and troubleshooting</p> <p>We will mainly use the CRD of <code>Kind: Application</code> that ArgoCD can manage</p> <p>Before proceeding, install ArgoCD in your management cluster, by following ArgoCD instructions</p> <p>As soon as you install ArgoCD, OpenSlice is automatically aware for specific new Kinds. The one we will use is is the <code>Kind: Application</code> that ArgoCD can manage under the apiGroup argoproj.io</p> <p>Browse to Resource Specifications. You will see an entry like the following:</p> <p><code>Application@argoproj.io/v1alpha1@kubernetes@https://10.10.10.144:6443/</code></p> <p>see image: </p> <p></p>"},{"location":"service_design/kubernetes/helm/design_helmaas/#whats-next","title":"What's next","text":"<p>See the Example: Offer Jenkins as a Service via Openslice </p>"},{"location":"service_ordering/ordering_services/","title":"Service Ordering","text":""},{"location":"service_ordering/ordering_services/#intended-audience-users","title":"Intended Audience: Users","text":""}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Introduction","text":"<p>version: 2024Q2 - SNAPSHOT</p> <p>The ETSI Software Development Group for OpenSlice (SDG OSL) is developing an open-source service-based Operations Support System (OSS) to deliver Network as a Service (NaaS) following specifications from major SDOs including ETSI, TM Forum and GSMA.</p>"},{"location":"#usage","title":"Usage","text":"<p>OpenSlice can be used in managing 5G network services from the user device to the core network and cloud as well as for Orchestrating cloud resources across private and public clouds for enterprise applications. OpenSlice is capable of supporting most of the features of an end-to-end (E2E) service orchestration framework while many of them will be more mature in future releases. The following figure displays the general usage of OpenSlice. </p> <p></p> <p>The image illustrates how OpenSlice supports the idea of an E2E network service orchestration framework by integrating multiple network components and layers, from user devices at the edge to radio, transport networks, core and public cloud services, ensuring seamless, secure, and efficient delivery of network services. Assuming that there are domain controllers for all the above domains OpenSlice can create the end-to-end service via the domain controllers by following the process of creating and deploying the end-to-end service by implementing transformations, and consuming APIs from various network entities. OpenSlice, in a nutchell, offers user interfaces where users can interact with the framework to order, expose, and manage service catalogs, services and resources that can be ordered, following business logic and policies and exposed through the APIs. </p>"},{"location":"#an-end-to-end-e2e-service-orchestration-framework","title":"An end-to-end (E2E) service orchestration framework","text":"<p>An end-to-end (E2E) service orchestration framework is designed to manage and automate the entire lifecycle of services across multiple domains and technologies. For delivering, especially, Network as a Service (NaaS) a comprehensive system is needed that automates and manages the entire lifecycle of network services, from provisioning to monitoring and decommissioning, while ensuring seamless integration, operation, and delivery of services from the initial request to the final delivery, spanning all involved components and layers. Such E2E frameworks enable users to consume network services on-demand, similar to how cloud computing services are consumed. Some key components and features of such frameworks are:</p> <ul> <li>Service Catalogs including predefined Network Services based on service templates for common network services like 5G core functions, 5G slices, VPNs, SD-WAN, firewalls, load balancers, etc. as well as custom Network services with Options for users to define their own network configurations.</li> <li>User Interface (UI) and APIs exposure, offering both a Self-Service Portal that allows users to request, configure, and manage network services as well as APIs for enabling programmatic access to network services for integration with other systems and automation scripts.</li> <li>Service Design and Creation tharough service templates based on predefined models for creating services.</li> <li>Automation and Workflow Management via Orchestration Engines, supporting Process Automation for automating repetitive tasks and processes, workflow management and orchestration for automating the provisioning, configuration, and management of network services while coordinating multiple workflows to ensure services are delivered efficiently, ensuring that services comply with predefined policies and standards.</li> <li>Standardized API exposure for seamless integration with different systems and services and APIs transformation support for converting data formats and protocols to ensure compatibility and information exhange between systems during workflows orchestration</li> <li>Service and Resource management and Orchestration while including the capability of multi-domain coordination in managing services/resources across different domains like cloud, 5G core, radios, transport network, and edge including dynamic allocation with adjusting resources based on demand and service requirements. To accomplish the above advanced technologies need to be exploited like, Containerized workloads, Network Function Virtualization (NFV) which uses virtualized network functions to provide services like routing, switching, and security and Software-Defined Networking (SDN) which Controls the network programmatically to dynamically manage traffic and resources.</li> <li>Monitoring and Analytics including Service Monitoring while continuously tracking the performance and health of services with capabilities to analyse data to optimize service delivery and predict issues. Real-Time Monitoring is also needed for tracking the performance and health of network services enabling analytics that provide insights for optimization and troubleshooting.</li> <li>Security and Access Control for ensuring only authorized users and systems can access network services. while implementing rules and policies to comply with regulatory requirements.</li> </ul>"},{"location":"#an-e2e-service-orchestration-workflow","title":"An E2E service orchestration workflow","text":"<p>In general an E2E service orchestration workflow includes the following phases:</p> <ul> <li>Service Request: Users or systems request a network service through the self-service portal or API. The request can specify details such as bandwidth, security features, geographic coverage, and duration.</li> <li>Service Orchestration: The orchestration engine evaluates the request, determines the necessary resources, and initiates the automated workflows.It interacts with the underlying components (e.g. 5G Core, Radios, Containerized controllers, NFV, SDN controllers ) to provision and configure the required network functions and connectivity.</li> <li>Provisioning and Configuration: Services, network resources and network functions (VNFs) are instantiated and configured according to the service request during Service Orchestration through the orchestration engine. Other controllers manage their own domains, for example SDN controllers, manage the flow of data through the network to ensure optimal performance and adherence to policies, RAN controllers manage the RAN resoruces, Containerized controllers manage their workload, etc</li> <li>Service Delivery: The E2E network service is activated and made available to the user. Continuous monitoring ensures the service operates as expected, with automatic adjustments made as necessary.</li> <li>Lifecycle Management: The orchestration framework handles updates, scaling, and any necessary modifications throughout the service lifecycle.</li> <li>At the end of the service period, resources are decommissioned and reclaimed.</li> </ul>"},{"location":"#openslice-for-service-providers","title":"OpenSlice for Service Providers","text":"<p>OpenSlice is used by Service Providers to design Network Services, expose them in Service Catalogues and make them available for Service Orders. OpenSlice then can perform the E2E service orchestration workflow.</p> <p>There are various portals offering UI friendly access to users acting as Service Providers:</p> <ul> <li>The Services portal allows Service Providers to design and expose services.</li> <li>The Resource portal allows users to access resource specifications and running resources in resource inventory.</li> <li>The NFV portal allows users to manage NFV artifacts and onboard them to a target MANO/NFV Orchestrator.</li> <li>The Testing portal allows Service Providers to manage test artifacts</li> <li>The Products portal allows Service Providers to expose services as products</li> </ul>"},{"location":"#openslice-for-service-consumers","title":"OpenSlice for Service Consumers","text":"<p>OpenSlice allows Service Consumers to browse the available offered service specifications in a self-service manner. It also supports TMFORUM Northbound APIs regarding Service Catalog Management, Ordering, Resource, etc. There are various portals offering UI friendly access to users acting as Service Consumers:</p> <ul> <li>The Services portal allows Service Consumers to select and order predefined services.</li> <li>The Resource portal allows users to access running resources in resource inventory.</li> <li>The NFV portal allows users to self-manage NFV artifacts and onboard them to a target MANO/NFV Orchestrator.</li> <li>The Testing portal allows Service Consumers to manage test artifacts</li> <li>The Products portal allows Service Consumers to expose services as products</li> </ul> <p>3rd party applications can use OpenSlice through TMForum Open APIs.</p>"},{"location":"#live-demo","title":"Live Demo","text":"<p>Check a live demo of OpenSlice in the following pages:</p> <p>(username=admin, password=openslice or username=admin, password=changeme)</p> <ul> <li>OpenSlice demo: http://portal.openslice.io/</li> <li>OpenSlice Service Catalogs and ordering: http://portal.openslice.io/services/</li> <li>OpenSlice NFV Services onboarding: http://portal.openslice.io/nfvportal </li> </ul>"},{"location":"#probe-further","title":"Probe further","text":"<ul> <li>Installing OpenSlice. See the Deployment of OpenSlice</li> <li>Learn more on [how OpenSlice supports Network as a Service(NaaS)](./naas/introduction</li> <li>Who is implementing OpenSlice? See OSL ETSI SDG</li> <li>How OpenSlice works? See the Architecture of OpenSlice</li> </ul>"},{"location":"OpenSlice_deployment_examples/","title":"OpenSlice deployment examples","text":"<p>Here are some examples from past and current efforts that use OpenSlice in various cases.</p>"},{"location":"OpenSlice_deployment_examples/#5ginfire-eu-project2018","title":"5GinFIRE EU project(2018)","text":"<ul> <li>MultiVIM approach</li> <li>9 Testbeds</li> <li>Automotive, Smart City, eHeath, \u000bPPDR, Media, SDR, Cloud</li> <li>22 Experiment proposals from Verticals</li> <li>100+ Users</li> <li>VxF catalog: </li> <li>150+ ONBOARDED VxFs</li> <li>OSM TWO, FOUR, FIVE</li> <li>50+ are public to be reused</li> <li>NSD catalog: </li> <li>90+ ONBOARDED NSDs</li> <li>30+ are public to be reused</li> <li>500+ Deployment requests \u000b(orchestrations) performed</li> </ul> <p>[</p>"},{"location":"OpenSlice_deployment_examples/#5g-vinni-eu-project-2020","title":"5G-VINNI EU project (2020)","text":"<ul> <li>Multi-vendor challenge \u2013 Commercial and opensource</li> <li>5G services on multiple sites</li> <li>Introduction of TMFORUM models and APIs </li> </ul> <p>[</p>"},{"location":"OpenSlice_deployment_examples/#5gasp-eu-project-2021-2024","title":"5GASP EU project (2021-2024)","text":"<ul> <li>Support a multi-site CI/CD testing automated DevOps cycle for network Applications</li> <li>Multiple NFVOs</li> <li>Introducing Service Test models</li> <li>Introducing the Product models for a network application marketplace</li> </ul> <p>[</p>"},{"location":"OpenSlice_deployment_examples/#fidal-eu-project-2023-","title":"FIDAL EU project (2023-)","text":"<ul> <li>Support multi-site automated testing</li> <li>Multiple testbeds/ different APIs</li> </ul> <p>[</p>"},{"location":"OpenSlice_deployment_examples/#across-eu-project-2023-","title":"ACROSS EU project (2023-)","text":"<ul> <li>Used as a cross-domain orchestrator</li> <li>Support the multi-domain orchestrator</li> <li>Support Zero-touch provisioning concepts</li> </ul> <p>[</p>"},{"location":"OpenSlice_deployment_examples/#incode-eu-project-2023-","title":"INCODE EU project (2023-)","text":"<ul> <li>Support the provisioning of end-to-end domain services</li> </ul> <p>[</p>"},{"location":"OpenSlice_deployment_examples/#imagineb5g-eu-project-2023-","title":"IMAGINEB5G EU project (2023-)","text":"<ul> <li>Support the provisioning of end-to-end domain services</li> </ul>"},{"location":"OpenSlice_deployment_examples/#etsi-zsm-poc-2","title":"ETSI ZSM PoC #2","text":"<ul> <li>Automated Network Slice Scaling in Multi-Site Environments</li> </ul> <p>[</p>"},{"location":"alarms_actions/","title":"Alarms","text":"<p>In Openslice parts of TMF642 Alarm Management API are currently implemented. Alarms can be managed through the TMF API endpoint as well as the UI.</p>"},{"location":"alarms_actions/#alarms-and-actions","title":"Alarms and Actions","text":"<p>Note: Actions is an experimental feature. We expect to have a more mature solution in future. The component in the architecture is the Openslcie Assurance Services</p> <p>Alarms can be automatically resolved by specific actions. Today only the following actions are offered.</p> <ul> <li>execDay2</li> <li>scaleServiceEqually</li> </ul>"},{"location":"alarms_actions/#execday2","title":"execDay2","text":"<p>Usually used to perform a Day2 configuration (towards OSM). To use it, Create a New Action Specification Name=execDay2 as following</p> <p></p> <p>Now make a Service Order for your service. In this example \u03c2\u03b5 used a cirros NSD</p> <p>Create a New Action Rule for the running services as the following example:</p> <p></p> <p>The scope is the running cirros service. </p> <p>Params should be paramname=value;paramname2=value2;paramname3=value3 (must exist in the VNF otherwise OSM will raise an error).</p> <p>In this case should be filename=test.txt</p> <p>Primitive=touch</p> <p>ServiceId = select the service which will accept the Day2. In this case is the same</p> <p>To test it:</p> <p>Go to the Service Inventory and select the active Service.</p> <p>Note the UUID of the service (e.g. c4e7990a-e174-4cd2-9133-b10e56721e08 copy from address bar), DeploymentRequestID and NSDID from characteristics</p> <p>You can either use the UUID of the service or the DeploymentRequestID and POST to the Alarms endpoint ( /tmf-api/alarmManagement/v4/alarm)</p> <p>If the DeploymentRequestID is used then POST:</p> <pre><code>\n{\n \"alarmRaisedTime\": \"2021-06-29T12:30:24.675Z\",\n \"alarmReportingTime\": \"2021-06-29T12:30:54.675Z\",\n \"state\": \"raised\",\n \"alarmType\": \"qualityOfServiceAlarm\",\n \"probableCause\": \"thresholdCrossed\",\n \"ackState\": \"unacknowledged\",\n \"perceivedSeverity\": \"major\",\n \"sourceSystemId\": \"mano-client-service\",\n \"alarmDetails\": \"NSID=3;DeploymentRequestID=1\",\n \"specificProblem\": \"myalram raised\"\n}\n\n</code></pre> <p>If the UUID is used then POST:</p> <pre><code>\n{\n \"alarmRaisedTime\": \"2021-06-29T12:30:24.675Z\",\n \"alarmReportingTime\": \"2021-06-29T12:30:54.675Z\",\n \"state\": \"raised\",\n \"alarmType\": \"qualityOfServiceAlarm\",\n \"probableCause\": \"thresholdCrossed\",\n \"ackState\": \"unacknowledged\",\n \"perceivedSeverity\": \"major\",\n \"sourceSystemId\": \"mano-client-service\",\n \"alarmDetails\": \"analarm\",\n \"specificProblem\": \"myalram raised\",\n \"affectedService\": [\n {\n \"id\": \"c4e7990a-e174-4cd2-9133-b10e56721e08\"\n }\n ]\n\n}\n\n</code></pre> <p>The Alarm to be created must have the affected Service ID equal to the running service from the scope (the cirros_ns)</p> <p>Go to service inventory you will see the notes and also the service characteristics for any EXEC_ACTION updates</p> <p>You can also adjust the alarm conditions. They must match true so the alarm to be acknowledged So if another external service raises an Alarm (with POST) for the running service, a Day2 will be performed on another Service</p>"},{"location":"alarms_actions/#scaleserviceequally","title":"scaleServiceEqually","text":"<p>This action is used from getting a scaling event from OSM. Please see the next demo for details on how it works</p>"},{"location":"alarms_actions/#prototype-demo","title":"Prototype demo","text":"<p>You can watch how we used the prototype on the following ETSI ZMS PoC #2</p> <ul> <li>ETSI ZMS PoC #2: https://www.etsi.org/events/1905-webinar-zsm-poc-2-showcase-automated-network-slice-scaling-in-multi-site-environments/</li> </ul>"},{"location":"catalogs/","title":"Catalogs and Templates","text":"<p>The Openslice Service Catalogue (accessible through the API or Services portal) contains the representation of Service Specifications, either created from the provider defining service attributes, or by supporting the GSMA Generic Slice Templates (GST) as well as the VINNI Service Blueprint. The following scenarios are supported by the Openslice Service Catalogue.</p>"},{"location":"catalogs/#createdesign-a-service-specification","title":"Create/Design a Service Specification","text":""},{"location":"catalogs/#first-import-some-resources-as-resource-facing-services-rfss","title":"First Import some Resources as Resource Facing Services (RFSs)","text":"<p>If you have any NSDs as NFV artifacts, import them through the UI menu (Import from NSD list). Then an NSD is imported as a resource and an RFS automatically is created. RFSs then later are used to design a Customer Facing Service Specification</p>"},{"location":"catalogs/#createdesign-a-customer-facing-service-specification","title":"Create/Design a Customer Facing Service Specification","text":"<p>Customer Facing Service Specification are the services offered to customers. You can create a new Service Specification from the menu. The services created through the UI are Customer Facing Services (CFS). Usually you create a CFS as a bundle and then you include Service Specification Relationships with RFSs or/and CFSs.</p> <p>Any Service Specification Characteristics from the RFS are copied to the CFS specification. A CFS can include multiple RFS or/and CFSs. For example you can create a CFS spec called \"A 5G Service\" which is a bundle of two other services (include them in Service Specification Relationships) such as 5G eMBB Slice and a Customer VPN. So when the user orders \"A 5G Service\" services from 5G eMBB Slice and a Customer VPN will be created during the order.</p>"},{"location":"catalogs/#initial-configuration-for-osm-deployment","title":"Initial configuration for OSM deployment","text":"<p>if you have an initial configuration that needs to be applied in the NSD deployment, then you go to the RFS (or CFS) and in Service Specification Characteristics go and edit the OSM_CONFIG characteristic. You can add in the Service Characteristic Value, in the Value field something like the following example which gives a floating IP to a VNF:</p> <pre><code>{ \"nsdId\": \"e855be91-567b-45cf-9f86-18653e7ea\", \"vimAccountId\": \"4efd8bf4-5292-4634-87b7-7b3d49108\" , \"vnf\": [ {\"member-vnf-index\": \"1\", \"vdu\": [ {\"id\": \"MyCharmedVNF-VM\", \"interface\": [{\"name\": \"eth0\", \"floating-ip-required\": true }]}]}]}\n\n</code></pre> <p>or a more complex example (beautify it first if you want to view it, but in the parameter OSM_CONFIG must be minified like the example):</p> <pre><code>{\"nsdId\":\"e855be91-567b-45cf-9f86-18653e7\",\"vimAccountId\":\"4efd8bf4-5292-4634-87b7-7b3d491\",\"vnf\":[{\"member-vnf-index\":\"1\",\"vdu\":[{\"id\":\"haproxy_vdu\",\"interface\":[{\"name\":\"haproxy_vdu_eth1\",\"floating-ip-required\":true}]}]}],\"vld\":[{\"name\":\"pub_net\",\"vim-network-name\":\"OSMFIVE_selfservice01\"},{\"name\":\"management\",\"vim-network-name\":\"OSMFIVE_selfservice01\"},{\"name\":\"lba_net\",\"vim-network-name\":\"lba_net\",\"vnfd-connection-point-ref\":[{\"member-vnf-index-ref\":\"1\",\"vnfd-connection-point-ref\":\"haproxy_private\",\"ip-address\":\"192.168.28.2\"}]},{\"name\":\"backend_net\",\"vim-network-name\":\"backend_net\",\"vnfd-connection-point-ref\":[{\"member-vnf-index-ref\":\"3\",\"vnfd-connection-point-ref\":\"haproxy_public\",\"ip-address\":\"192.168.20.2\"}]},{\"name\":\"lb_sb_net\",\"vim-network-name\":\"lb_sb_net\",\"vnfd-connection-point-ref\":[{\"member-vnf-index-ref\":\"3\",\"vnfd-connection-point-ref\":\"haproxy_private\",\"ip-address\":\"192.168.28.2\"}]},{\"name\":\"breaking_point_Spain\",\"vim-network-name\":\"sb_repo_net\"},{\"name\":\"breaking_point_Greece\",\"vim-network-name\":\"5TONICexternal\"}],\"additionalParamsForVnf\":[{\"member-vnf-index\":\"2\",\"additionalParams\":{\"target_IP\":\"192.168.20.2\"}},{\"member-vnf-index\":\"4\",\"additionalParams\":{\"target1_IP\":\"192.168.21.2\",\"target2_IP\":\"10.154.252.10\"}}]}\n</code></pre> <p>You can leave the Alias and Unit of Measure as is. Check also the is Default.</p>"},{"location":"catalogs/#day-2-primitive-actions","title":"Day 2 Primitive Actions","text":"<p>NFVOs like OSM allow to perform actions while a service is running, for example change attributes or make actions on a specific VNF. To design this do something similar to the following example:</p> <ul> <li>Go to the RFS related to the NSD that contains VNFs with primitives</li> <li>create a characteristic named Primitive:: , e.g. Primitive::touch <li>select Value Type: ARRAY</li> <li>add Service Characteristic Value: i) alias=primitive, value= (e.g. touch), ii) alias=member_vnf_index, value= (e.g. 1), iii) add the params that the user will change in alias the name of param and in value an initial value (e.g. alias=filename, value=myfile.txt) <p>In the above example, when the service is running and the user goes to service inventory to MODIFY it, changes the value of the alias=filename, value=myfile.txt, to value =secondfile.txt. Then inside the VNF a file will be created called secondfile.txt</p>"},{"location":"catalogs/#generic-slice-templates-gst","title":"Generic Slice Templates (GST)","text":"<p>(Offered only as a design for now. THere is no direct implementation to NFV) On October 16th 2019 GSMA published NG.116 Version 2.0 which defines the Generic Network Slice Template (GST). GST is a set of attributes that can characterise a type of network slice/service. GST is generic and is not tied to any specific network deployment. Here is a list of the various attributes of the template:</p> <ul> <li>Availability</li> <li>Area of Service</li> <li>Delay tolerance</li> <li>Deterministic communication</li> <li>Downlink throughput per network slice</li> <li>Downlink throughput per UE</li> <li>Energy efficiency</li> <li>Group communication support</li> <li>Isolation level</li> <li>Location based message delivery</li> <li>Maximum supported packet size</li> <li>Mission critical support</li> <li>MMTel support</li> <li>NB-IoT support</li> <li>Network Slice Customer network functions</li> <li>Number of connections</li> <li>Number of terminals</li> <li>Performance monitoring</li> <li>Performance prediction</li> <li>Positioning support</li> <li>Radio spectrum</li> <li>Reliability</li> <li>Root cause investigation</li> <li>Session and Service Continuity support </li> <li>Simultaneous use of the network slice</li> <li>Slice quality of service parameters</li> <li>Support for non-IP traffic </li> <li>Supported access technologies </li> <li>Supported device velocity </li> <li>Synchronicity</li> <li>Terminal density </li> <li>Uplink throughput per network slice </li> <li>Uplink throughput per UE</li> <li>User management openness</li> <li>User data access </li> <li>V2X communication mode</li> </ul> <p>Openslice offers the GST in a format that is machine readable and aligned with the TMF SID model. Here is a tentative approach in JSON : https://github.com/openslice/org.etsi.osl.tmf.api/blob/master/src/main/resources/gst.json</p> <p>Providers can clone a GST as e NEST directly in Openslice Web portal and the adjust the default attributes to their Service Specification</p>"},{"location":"catalogs/#5g-vinni-service-blueprint","title":"5G-VINNI Service Blueprint","text":"<p>(Offered only as a design for now. THere is no direct implementation to NFV) 5G-VINNI Service Blueprint is a special Service Specification defined by teh 5G-VINNI project. Many details can be found in document https://zenodo.org/record/3345612</p> <p>5G-VINNI Service Blueprint is a reusable self-contained specification of required network slice service (instances). As described in GST mapping VINNI-SB is also machine readable. </p> <p>Here is a tentative approach in JSON : https://github.com/openslice/org.etsi.osl.tmf.api/tree/master/src/main/resources/vinnisb</p> <p>5G-VINNI SB has many commonalities with GST as well as it offers Testing as a Service attributes.</p> <p>Next figure presents the high-level object model of a 5G-VINNI service blueprint.</p> <p>The 5G-VINNI SB as a first prototype approach is conceived as a CFS of a \u2018bundle\u2019 of services. It has some characteristics, like name, description, service type (eMBB, etc) and others. The constituent services are:</p> <ul> <li>A \u201cService Topology\u201d Service Specification which is related to a Network Service Resource topology (a Logical Resource Spec). It is considered at this stage as an RFS but is subject to change in future</li> <li>A \u201cVINNI SB Service Requirements\u201d Service Specification which is related to Service requirements. This is very similar to GST. It is considered at this stage a CFS.</li> <li>A \u201cVINNI SB Service Exposure Level 1\u201d Service Specification which contains characteristics for service exposure on level 1 ( see D3.1 for details). It is considered at this stage a CFS.</li> <li>A \u201cVINNI SB Service Exposure Level 2\u201d Service Specification which contains characteristics for service exposure on level 2. It is considered at this stage a CFS.</li> <li>A \u201cVINNI SB Service Exposure Level 3\u201d Service Specification which contains characteristics for service exposure on level 3. It is considered at this stage a CFS.</li> <li>A \u201cVINNI SB Service Exposure Level 4\u201d Service Specification which contains characteristics for service exposure on level 4. It is considered at this stage a CFS.</li> <li>A \u201cVINNI SB Service 3rd part VNF\u201d Service Specification which contains characteristics for support 3rd party VNFs to be included in the service. It is considered at this stage as an RFS but is subject to change in future</li> <li>A \u201cVINNI SB Service 3rd part NSD\u201d Service Specification which contains characteristics for support 3rd party NSDs to be included in the service. It is considered at this stage as an RFS but is subject to change in future</li> <li>A \u201cVINNI SB Service Monitoring\u201d Service Specification which contains characteristics for offering Monitoring capabilities on the requested Service. It is considered at this stage a CFS.</li> <li>A \u201cVINNI SB Service Testing\u201d Service Specification which contains characteristics for offering Testing capabilities on the requested Service. It is considered at this stage a CFS.</li> </ul> <p></p>"},{"location":"catalogs/#manage-a-service-specification","title":"Manage a Service Specification","text":"<p>You can manage them though the Web UI</p>"},{"location":"catalogs/#assign-a-service-specification-to-service-categories-and-publish","title":"Assign a Service Specification to Service Categories and Publish","text":"<p>Just create categories and from the menu select the category and add services</p>"},{"location":"catalogs/#retireremove-a-service-specification","title":"Retire/Remove a Service Specification","text":"<p>Delete it from the category</p>"},{"location":"catalogs/#consume-and-expose-service-specifications-from-other-service-catalogues","title":"Consume and expose Service Specifications from other Service Catalogues","text":"<p>See more on Consuming Services From External Partner Organizations</p>"},{"location":"config_intro/","title":"Configuring and managing OpenSlice","text":""},{"location":"config_intro/#intended-audience-openslice-administrators","title":"Intended Audience: OpenSlice administrators","text":"<p>This section provides information on how to configure and manage different aspect of OpenSlice while in operation. For example:</p> <ul> <li>Manage user roles and access in Keycloak</li> <li>Configure/Manage NFVOs</li> <li>Advanced configuration scenarios</li> </ul>"},{"location":"deployment/","title":"OpenSlice Deployment","text":"<p>This section is meant to guide the user through the installation of OpenSlice. </p>"},{"location":"deployment/#intended-audience-openslice-administrators","title":"Intended Audience: OpenSlice administrators","text":"<p>Following, you may thorough guides depending on the installation type of your choice:</p> <ul> <li>Installing via Docker Compose guide</li> <li>Installing via Kubernetes guide</li> </ul>"},{"location":"deploymentCompose/","title":"OpenSlice Deployment Guide with Docker Compose","text":""},{"location":"deploymentCompose/#intended-audience-openslice-administrators","title":"Intended Audience: OpenSlice administrators","text":""},{"location":"deploymentCompose/#requirements","title":"Requirements","text":""},{"location":"deploymentCompose/#hardware-requirements","title":"Hardware requirements:","text":"Minimum Hardware Requirements Recomended Hardware Requirements 4 CPU cores 8 CPU cores 8 GB RAM 16 GB RAM 30 GB storage 50 GB storage"},{"location":"deploymentCompose/#software-requirements","title":"Software Requirements:","text":"<ul> <li>Docker: A running environment for Docker Compose services</li> </ul>"},{"location":"deploymentCompose/#preparing-the-environment","title":"Preparing the environment","text":""},{"location":"deploymentCompose/#1-backup-your-previous-database-if-necessary","title":"1. Backup your previous database if necessary:","text":"<pre><code>sudo docker exec amysql /usr/bin/mysqldump -u root --password=letmein ostmfdb > backup_ostmfdb.sql\n</code></pre>"},{"location":"deploymentCompose/#2-install-docker","title":"2. Install docker","text":"<p>Since July 2023 Docker Compose V1 stopped receiving updates. OpenSlice fully reverted to Compose V2, which is integrated in the Docker installation.</p>"},{"location":"deploymentCompose/#3-configure-containers-to-properly-resolve-the-dns-of-your-domain-optional","title":"3. Configure containers to properly resolve the DNS of your domain (optional)","text":"<pre><code>sudo nano /etc/docker/daemon.json\n</code></pre> <p>and add:</p> <pre><code>{ \n \"dns\": [\"8.8.8.8\", \"8.8.4.4\"]\n}\n</code></pre> <p>After editing daemon.json restart docker daemon for the changes to take place</p> <pre><code>sudo systemctl restart docker\n</code></pre>"},{"location":"deploymentCompose/#downloading-the-project","title":"Downloading the project","text":""},{"location":"deploymentCompose/#1-create-a-new-folder-to-download-the-project","title":"1. Create a new folder to download the project","text":"<pre><code>mkdir openslice\n</code></pre> <pre><code>cd openslice\n</code></pre>"},{"location":"deploymentCompose/#2-download-the-deployment-script","title":"2. Download the deployment script","text":"<p>Download the deployment / environment preparation script</p> <pre><code>wget https://labs.etsi.org/rep/osl/code/org.etsi.osl.main/-/raw/develop/compose/deploy.sh\n</code></pre> <p>Make it executable</p> <pre><code>sudo chmod +x deploy.sh\n</code></pre>"},{"location":"deploymentCompose/#3-run-the-deployment-script","title":"3. Run the deployment script","text":"<p>OpenSlice is a multi repo project. This script selects the same branch for all repositories of the project to pull from.</p> <p>After that it builds the respective jar files locally and installs all the npm packages needed for the UI.</p> <p>If you run the script without selecting a branch the the main branch is going to be selected.</p> <p>We recommend:</p> <ul> <li>main branch for the most stable experience and</li> <li>develop branch for an experience with the latest features (for develop branch installation, it is strongly advisable that you may as well follow the develop documentation)</li> </ul> <pre><code>sudo ./deploy.sh develop #[or replace main with other branch name]\n</code></pre> <p>We recommend running the deploy.sh script with root permissions! In other case, some directories may not be accessible by the project building tools and hinder the smooth installation.</p>"},{"location":"deploymentCompose/#configure-docker-compose-services","title":"Configure Docker Compose services","text":""},{"location":"deploymentCompose/#1-create-configuration-specific-docker-compose-file-from-the-template","title":"1. Create configuration specific Docker Compose file from the template","text":"<pre><code>cd org.etsi.osl.main/compose/\n</code></pre> <pre><code>sudo cp docker-compose.yaml.configure docker-compose.yaml\n</code></pre>"},{"location":"deploymentCompose/#2-configure-mysql-portal-container-optional","title":"2. Configure mysql-portal container (optional)","text":"<ol> <li>In folder <code>org.etsi.osl.main/compose/mysql-init</code> edit the file <code>01-databases.sql</code>.</li> <li>In the <code>org.etsi.osl.main/compose/docker-compose.yaml</code> edit the credentials of the users that services use to connect to the databases, if you wish.<ul> <li>portaluser (default is 12345) and</li> <li>keycloak (default is password)</li> </ul> </li> </ol>"},{"location":"deploymentCompose/#3-configure-keycloak-container-optional","title":"3. Configure keycloak container (optional)","text":"<ol> <li> <p>If you made changes to keycloak's mysql credentials:</p> <p>In folder <code>org.etsi.osl.main/compose/</code> edit the file <code>docker-compose.yaml</code>.</p> </li> </ol> <pre><code>DB_DATABASE: keycloak\nDB_USER: keycloak\nDB_PASSWORD: password\n</code></pre> <ol> <li> <p>If you want to change the keycloak admin password:</p> <p>In folder <code>org.etsi.osl.main/compose/</code> edit the file <code>docker-compose.yaml</code></p> </li> </ol> <pre><code>KEYCLOAK_PASSWORD: Pa55w0rd\n</code></pre>"},{"location":"deploymentCompose/#4-configure-bugzilla-container-optional","title":"4. Configure bugzilla container (optional)","text":"<p>If you want to utilise the Bugzilla connector:</p> <p>In folder <code>org.etsi.osl.main/compose/</code> edit the file <code>docker-compose.yaml</code></p> <pre><code>SPRING_APPLICATION_JSON: '{\n \"spring.activemq.brokerUrl\": \"tcp://anartemis:61616?jms.watchTopicAdvisories=false\",\n \"spring.activemq.user\": \"artemis\",\n \"spring.activemq.password\": \"artemis\",\n \"bugzillaurl\":\"\",\n \"bugzillakey\":\"\",\n \"main_operations_product\":\"\"\n}'\n</code></pre> <p>And add the provided Bugzilla installation information:</p> <pre><code>\"bugzillaurl\":\"bugzillaurl.xx:443/bugzilla/\",\n\"bugzillakey\":\"exampleKeyeqNNwxBlgxZgMEIne0Oeq0Bz\",\n\"main_operations_product\":\"Main Site Operations\" // this is the default product to issue tickets\n</code></pre> <p>Bugzilla should have the following components under the specified product: </p> <ul> <li>NSD Deployment Request: Component used to schedule deployment req </li> <li>Onboarding: Issues related to VNF/NSD Onboarding </li> <li>Operations Support: Default component for operations support </li> <li>Validation: Use to track validation processes of VNFs and NSDs </li> <li>VPN Credentials/Access: Used for requesting VPN Credentials/Access </li> </ul> <p>Also in the 'Main Site Operations' product, a version named 'unspecified' must be created.</p>"},{"location":"deploymentCompose/#5-configure-osportalapi-container-nfv-services-conditional","title":"5. Configure osportalapi container (NFV services) (conditional)","text":"<p>Change the respective fields: </p> <ul> <li>If you made changes to mysql and keycloak credentials.</li> <li>If you want to change logging level (TRACE / DEBUG / INFO / WARN / ERROR).</li> </ul> <p>If you are using a non-local domain, replace everywhere the http://keycloak:8080 with the respective {{protocol://domain.name}}, as well as \"spring.portal.main.domain\" property.</p> <p>In folder <code>org.etsi.osl.main/compose/</code> edit the file <code>docker-compose.yaml</code></p> <pre><code>SPRING_APPLICATION_JSON: '{\n \"spring.datasource.username\":\"root\",\n \"spring.datasource.password\":\"letmein\",\n \"spring-addons.issuers[0].uri\": \"http://keycloak:8080/auth/realms/openslice\",\n \"spring.security.oauth2.resourceserver.jwt.issuer-uri\": \"http://keycloak:8080/auth/realms/openslice\",\n \"springdoc.oAuthFlow.authorizationUrl\": \"http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/auth\",\n \"springdoc.oAuthFlow.tokenUrl\": \"http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/token\", \n \"spring.portal.main.domain\": \"http://localhost\",\n \"logging.level.org.springframework\" : \"INFO\"\n}'\n</code></pre>"},{"location":"deploymentCompose/#6-osscapi-container-tmf-api-service-conditional","title":"6. osscapi container (TMF API service) (conditional)","text":"<p>Change the respective fields: </p> <ul> <li>If you made changes to mysql and keycloak credentials.</li> <li>If you want to change logging level (TRACE / DEBUG / INFO / WARN / ERROR).</li> </ul> <p>If you are using a non-local domain, replace everywhere the http://keycloak:8080 with the respective {{protocol://domain.name}}.</p> <p>In folder <code>org.etsi.osl.main/compose/</code> edit the file <code>docker-compose.yaml</code></p> <pre><code>SPRING_APPLICATION_JSON: '{\n \"spring.datasource.username\":\"root\",\n \"spring.datasource.password\":\"letmein\",\n \"spring-addons.issuers[0].uri\": \"http://keycloak:8080/auth/realms/openslice\",\n \"spring.security.oauth2.resourceserver.jwt.issuer-uri\": \"http://keycloak:8080/auth/realms/openslice\",\n \"springdoc.oAuthFlow.authorizationUrl\": \"http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/auth\",\n \"springdoc.oAuthFlow.tokenUrl\": \"http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/token\", \n \"logging.level.org.springframework\" : \"INFO\"\n}'\n</code></pre>"},{"location":"deploymentCompose/#configure-nginx","title":"Configure nginx","text":"<p>In folder <code>org.etsi.osl.main/compose/nginx</code> create a configuration specific <code>nginx.conf</code> file.</p> <pre><code>cd org.etsi.osl.main/compose/nginx/\n</code></pre> <pre><code>sudo cp nginx.conf.default nginx.conf\n</code></pre> <p>If needed, in the nginx.conf file, edit the server_name for an non-local deployment.</p>"},{"location":"deploymentCompose/#configure-web-ui","title":"Configure Web UI","text":"<p>In folder <code>org.etsi.osl.portal.web/src/js/</code> create a configuration specific <code>config.js</code> file.</p> <pre><code>cd org.etsi.osl.portal.web/src/js\n</code></pre> <pre><code>sudo cp config.js.default config.js\n</code></pre> <p>Edit the <code>config.js</code> file with the information of your domain. <code>ROOTURL</code> will automatically extract the the Origin (Protocol://Domain:Port) of the deployment, but you must change <code>APIURL</code> property, if you are not aiming for a localhost installation, e.g. \"https://portal.openslice.io\".</p> <p>Example file:</p> <pre><code>{ \n BUGZILLA: \"ROOTURL/bugzilla/\",\n STATUS: \"ROOTURL/status/\",\n APIURL: \"http://localhost\",\n WEBURL: \"ROOTURL/nfvportal\",\n APIOAUTHURL: \"ROOTURL/auth/realms/openslice\",\n APITMFURL: \"ROOTURL/tmf-api/serviceCatalogManagement/v4\"\n}\n</code></pre>"},{"location":"deploymentCompose/#configure-tmf-web-ui","title":"Configure TMF Web UI","text":"<p>In the folder <code>org.etsi.osl.tmf.web/src/assets/config</code> there are 3 files available for configuration:</p> <ul> <li>config.prod.json (Basic information + API configuration)</li> <li>theming.scss (CSS color palette theming)</li> <li>config.theming.json (HTML configuration - Logo, Favicon, Footer)</li> </ul> <p>The first 2 files above (i.e. config.prod.json, theming.scss) are essential for the successful deployment of OpenSlice, thus created automatically during the initial deployment at <code>org.etsi.osl.tmf.web/src/assets/config</code> directory as a copy of the default ones from the remote repository.</p> <p>Ensure that you check the <code>config.prod.json</code> and <code>theming.scss</code> files and readjust to your deployment if needed.</p> <pre><code># Starting from the root project directory\ncd org.etsi.osl.tmf.web/src/assets/config\n</code></pre> <p>E.g. You may edit \"TITLE\", \"WIKI\", etc properties with your domain title. Also configure TMF's API and Keycloak's location for the web application, if needed.</p> <p>Example file:</p> <pre><code>{ \n \"TITLE\": \"OpenSlice by ETSI\",\n \"PORTALVERSION\":\"2024Q2\",\n \"WIKI\": \"https://osl.etsi.org/documentation\",\n \"BUGZILLA\": \"{BASEURL}/bugzilla/\",\n \"STATUS\": \"{BASEURL}/status/\",\n \"WEBURL\": \"{BASEURL}\",\n \"PORTAL_REPO_APIURL\": \"{BASEURL}/osapi\",\n \"ASSURANCE_SERVICE_MGMT_APIURL\": \"{BASEURL}/oas-api\",\n \"APITMFURL\": \"{BASEURL}/tmf-api\",\n \"OAUTH_CONFIG\" : {\n \"issuer\": \"{BASEURL}/auth/realms/openslice\",\n \"loginUrl\": \"{BASEURL}/auth/realms/openslice/protocol/openid-connect/auth\",\n \"tokenEndpoint\": \"{BASEURL}/auth/realms/openslice/protocol/openid-connect/token\",\n \"userinfoEndpoint\": \"{BASEURL}/auth/realms/openslice/protocol/openid-connect/userinfo\",\n \"redirectUri\": \"{BASEURL}/redirect\",\n \"logoutUrl\": \"{BASEURL}/auth/realms/openslice/protocol/openid-connect/logout\", \n \"postLogoutRedirectUri\": \"{BASEURL}\",\n\n \"responseType\": \"code\",\n \"oidc\": false,\n \"clientId\": \"osapiWebClientId\",\n \"dummyClientSecret\": \"secret\",\n\n \"requireHttps\": false,\n \"useHttpBasicAuth\": true,\n \"clearHashAfterLogin\": false,\n\n \"showDebugInformation\": true\n }\n}\n</code></pre> <p>The {BASEURL} placeholder in the file automatically detects the Origin (Protocol://Domain:Port) of the deployment and applies it to every respective property. E.g. If you are attempting a local deployment of OpenSlice, then {BASEURL} is automatically translated to \"http://localhost\". Similarly, you may use {BASEURL} to translate to a public deployment configuration, e.g. \"https://portal.openslice.io\".</p> <p>If further customization, apart from the default provided, is needed for branding (Logo, Footer) then <code>config.theming.json</code> needs to be created in io.openslice.tmf.web/src/assets/config directory, as follows:</p> <pre><code># Starting from the root project directory\ncd org.etsi.osl.tmf.web/src/assets/config\n</code></pre> <pre><code>sudo cp config.theming.default.json config.theming.json\n</code></pre> <p>IMPORTANT NOTE: If you want to apply changes to the JSON configuration files without the need to rebuild the application, you have to apply the changes at the <code>org.etsi.osl.tmf.web/dist/io-openslice-portal-web/assets/config</code> directory. Although, it is mandatory to also apply these changes to the <code>org.etsi.osl.tmf.web/src/assets/config</code> for persistancy, as after any future rebuild of OpenSlice the <code>/dist</code> directory is being overwritten along with its contents. The OpenSlice team strongly recommends to always apply your changes to the TMF web UI configuration files at <code>org.etsi.osl.tmf.web/src/assets/config</code> and rebuild the application.</p>"},{"location":"deploymentCompose/#deploy-openslice-via-docker-compose","title":"Deploy OpenSlice via Docker Compose","text":"<p>After configuring the services, and editing the docker compose file accordingly, the docker compose instantiation command can be performed.</p> <pre><code># Starting from the root project directory\ncd org.etsi.osl.main/compose/\n</code></pre> <pre><code>sudo docker compose --profile prod down;sudo docker compose --profile prod up -d --build\n</code></pre> <p>Depending on your machine, this process might take time. if for any reason the deployment fails during first time, please rerun the above before any further measures.</p>"},{"location":"deploymentCompose/#validating-deployments-and-container-monitoring","title":"Validating deployments and container monitoring","text":"<p>You can monitor containers' status with portainer at port 9000 (http://your-ip:9000).</p> <p>Initially, you may monitor the local machine at portainer.</p> <p>Please check that all containers are in running state.</p>"},{"location":"deploymentCompose/#post-installation-steps","title":"Post installation steps","text":"<p>After the successful deployment of OpenSlice, to ensure the E2E user experience, this section is mandatory. It contains crucial configuration in regard of authentication and user creation.</p>"},{"location":"deploymentCompose/#configure-keycloak-server","title":"Configure Keycloak server","text":"<p>The Keycloack server is managing authentication and running on a container at port 8080. It is also proxied to your host via nginx under http://localhost/auth. </p> <ul> <li> <p>Navigate to http://domain.com/auth/ or https://domain.com/auth/, (http://ipaddress:8080/auth/ or https://ipaddress:8443/auth/ which are directly accessible without proxy) </p> </li> <li> <p>Navigate to Administration Console </p> </li> <li> <p>Login with the credentials from section Configure keycloak container. Default values are:</p> <ul> <li>user: admin and </li> <li>password: Pa55w0rd</li> </ul> </li> </ul> <p>if you are running in HTTP you will get a message: HTTPS required.</p> <p>To resolve this issue when running in HTTP: </p> <ul> <li>Select the master realm from top left corner</li> <li>Go to login Tab and select \"Require SSL\": None</li> <li>Repeat for realm Openslice</li> </ul> <p>If you are running in HTTPS, then \"Require SSL\" can be left unchanged to external requests.</p>"},{"location":"deploymentCompose/#1-configure-redirects","title":"1. Configure redirects","text":"<p>Navigate to realm Openslice > Clients > osapiWebClientId and change the Root URL to your domain. </p> <p>Also, insert your domain, e.g. http://example.org/*, at:</p> <ul> <li>Valid Redirect URIs</li> <li>Web Origins</li> </ul>"},{"location":"deploymentCompose/#2-configure-email","title":"2. Configure email","text":"<p>Keycloak allows new users to register. Subsequently, this will also allow new users to register to the OpenSlice portal.</p> <p>Navigate to realm Openslice > Realm Settings > Login Tab > check User registration, Verify email, Forgot password etc.</p> <p>Finally, enter the details of the mail server at the Email Tab.</p> <p>Email configuration is optional for test runs, but if not provided the above functionalities (e.g. external user registration) will not be possible.</p>"},{"location":"deploymentCompose/#3-add-an-openslice-admin-user","title":"3. Add an OpenSlice admin user","text":"<p>This step is mandatory so as to access the OpenSlice Web UI. To add an OpenSlice admin user you must:</p> <ul> <li>Navigate to realm Openslice > Users > Add user</li> <li>Set a password</li> <li>Upon creation, navigate to Role Mappings and add ADMIN to Assigned Roles list</li> </ul> <p>That user is different from the Keycloak admin user. It is required to login and browse the OpenSlice Web UI. The Role ADMIN guarantee full access through the OpenSlice UI, thus such a user is always required.</p>"},{"location":"deploymentCompose/#keycloak-at-localhost","title":"Keycloak at localhost","text":"<p>This is an important step if you run Keycloak on localhost!</p> <p>1 - Edit your Hosts File, adding the line below</p> <p><code>127.0.0.1 keycloak</code></p> <p>Hosts File Location:</p> <ul> <li> <p>In Linux/Unix, the file's location is at /etc/hosts </p> </li> <li> <p>In Windows, its location is at c:\\Windows\\System32\\Drivers\\etc\\hosts</p> </li> </ul> <p>2 - Replace http://localhost/auth/ with http://keycloak:8080/auth/ in your Keycloak config for AngularJS and Angular (see examples below).</p> <p>Explanation</p> <p>Nginx uses the http://keycloak:8080 URL, which is accessible via the internal docker system's network. The Front-end (TS/Angular) shall also use the http://keycloak:8080. This way, you will not get the invalid token error, as the API is acquiring the token from http://keycloak:8080 (internally) and the Front-end is getting verified by an issuer at the same URL, as well.</p> <p>2.1 - For the Angular configuration (TMF portal UI), navigate to org.etsi.osl.tmf.web/src/assets/config and edit config.prod.json</p> <pre><code># Starting from the root project directory\ncd org.etsi.osl.tmf.web/src/assets/config\n</code></pre> <pre><code>nano config.prod.json\n</code></pre> <p>After editing, the displayed properties should look like the example below:</p> <pre><code>{ \n \"OAUTH_CONFIG\" : {\n \"issuer\": \"http://keycloak:8080/auth/realms/openslice\",\n \"loginUrl\": \"http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/auth\",\n \"tokenEndpoint\": \"http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/token\",\n \"userinfoEndpoint\": \"http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/userinfo\",\n \"redirectUri\": \"{BASEURL}/redirect\",\n \"logoutUrl\": \"http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/logout\", \n \"postLogoutRedirectUri\": \"{BASEURL}\",\n }\n}\n</code></pre> <p>Note the difference in changing {BASEURL} -> http://keycloak:8080</p> <p>If you want the changes to take place immediately without rebuilding the project, then repeat the process for org.etsi.osl.tmf.web/dist/org.etsi.osl.tmf.web/assets/config/config.prod.json</p> <p>2.2 - For the AngularJS configuration (NVF portal UI), navigate to org.etsi.osl.portal.web/src/js and edit config.js</p> <pre><code># Starting from the root project directory\ncd org.etsi.osl.portal.web/src/js\n</code></pre> <pre><code>nano config.js\n</code></pre> <p>After editing, the displayed properties should look like the example below:</p> <pre><code>var appConfig = angular.module('portalwebapp.config',[]);\n\n\nappConfig.factory('APIEndPointService', function() {\n return { \n APIOAUTHURL: \"http://keycloak:8080/auth/realms/openslice\",\n };\n});\n</code></pre> <p>Note the difference in \"APIOAUTHURL\" property, changing ROOTURL -> http://keycloak:8080</p>"},{"location":"deploymentCompose/#nfv-orchestrator-configuration","title":"NFV Orchestrator Configuration","text":"<p>After successfully deploying and configuring OpenSlice, you may configure its environment (e.g. the NFVO) that will facilitate the deployment of NFV artifacts.</p> <p>See NFV Orchestrator Configuration.</p>"},{"location":"deploymentK8s/","title":"OpenSlice Deployment Guide with Kubernetes","text":""},{"location":"deploymentK8s/#intended-audience-openslice-administrators","title":"Intended Audience: OpenSlice administrators","text":"<p>This is WIP.</p> <p>Please refer to this guide.</p>"},{"location":"etsi_osl/","title":"The ETSi SDG OSL","text":"<p>OpenSlice is developed by the OSL ETSI Software Development Group see more info</p>"},{"location":"history/","title":"History","text":""},{"location":"history/#history","title":"History","text":"<ul> <li>The NFV portal part of OpenSlice was initially developed in H2020 European Research project 5GinFIRE by University of Patras, Greece</li> <li>OpenSlice core services, APIs was further developed and maintained in H2020 European project 5G-VINNI by University of Patras, Greece</li> <li>OpenSlice has been a part of OSM's OSS/BSS ecosystem</li> <li>OpenSlice is now an ETSI SDG Group since 2023</li> </ul>"},{"location":"history/#citation","title":"Citation","text":"<p>Please cite our ![paper] if you use OpenSlice in your research</p> <pre><code>\n@misc{tranoris2021openslice,\n title={Openslice: An opensource OSS for Delivering Network Slice as a Service}, \n author={Christos Tranoris},\n year={2021},\n eprint={2102.03290},\n archivePrefix={arXiv},\n primaryClass={cs.NI}\n}\n\n\n</code></pre>"},{"location":"lcm/","title":"Lifecycle Management (LCM) Rules","text":"<ul> <li>NOTE: This is a prototype/experimental feature. So issues might raise during operation</li> </ul> <p>LCM Rules are used for defining complex conditions and actions during the lifecycle of a service. In Openslice there are four types of rules defined:</p> <ul> <li>PRE_PROVISION</li> <li>CREATION</li> <li>AFTER_ACTIVATION </li> <li>SUPERVISION </li> <li>AFTER_DEACTIVATION </li> </ul> <p>The following figure displays the different phases that the rules are performed, during the lifecycle of a Network Slice Instance.</p> <p></p> <ul> <li>PRE_PROVISION rules: Run only once just before creating a service with a given priority. </li> <li>CREATION rules: Run while the referenced service dependencies of a service are created</li> <li>AFTER_ACTIVATION rules: Run only once just after a service get the ACTIVE state</li> <li>SUPERVISION rules: Run when a characteristic of a service is changed and the service is in the ACTIVE state </li> <li>AFTER_DEACTIVATION rules: Run only once just after a service get the INACTIVE/TERMINATED state </li> </ul> <p>In general the rules allow to perform many actions during service LCM. Thes are some examples:</p> <ul> <li>Modify service specification parameters before the instantiation of a service (or during operation) based on other dependencies. These parameters might be part of other services already included in Service order</li> <li>Translate GST/NEST parameter values to other values passed later to NFVO for instantiation or control</li> <li>Define complex OSM Configs based on other dependencies and passing variables</li> <li>Define any dependencies when creating the referenced services</li> <li>Dynamically include new service dependencies</li> <li>Create new service orders so include dynamically other services</li> <li>Call external (RESTful) services (via http(s), define payload, examine response)</li> </ul>"},{"location":"lcm/#examine-if-the-rules-are-executed-successfully","title":"Examine if the rules are executed successfully","text":"<p>Rules are transformed automatically to executable code (currently is Java). If a rule is performed successfully or has any issues (e.g. unexpected syntax errors or exceptions) appear in OSOM logfiles and also tey are attached as Notes to the running Service.</p>"},{"location":"lcm/#lcm-rules-and-osom-service-orchestration","title":"LCM Rules and OSOM Service Orchestration","text":"<p>OSOM is the responsible service for executing the rules on a specific phase. The following image explains the design in the BPMN phases:</p> <p></p>"},{"location":"lcm/#define-rules","title":"Define rules","text":"<p>Rules are defined when designing a Service Spec. Here is an example of a list of rules:</p> <p></p> <p>Execution order of rules on a specific phase is random</p> <ul> <li>NOTE: There is a priority field. The lower the number the highest the priority of rule execution. For example Rule with priority 0 will run before rule with priority 1.</li> </ul>"},{"location":"lcm/#definition-language","title":"Definition language","text":"<ul> <li>The visual language that Openslice used is based on Google's Blockly (see https://developers.google.com/blockly)</li> <li>The blockly graph is automatically translated to Java internally and then dynamically executed during orchestration phases.</li> </ul> <p>The following figure is an example of such a rule design. The rule for example will run in PRE_PROVISION phase:</p> <p></p> <ul> <li>The goal of the above rule is to properly define a variable AreaCodes given the chosen AreaOfService from a Service Order.</li> <li>On the right side the user can define some rule properties or observe the underlying generated java code.</li> </ul>"},{"location":"lcm/#the-blocks-library","title":"The blocks library","text":"<p>The following images describe some blocks found in the library.</p> <p>Blockly has syntax rules. It helps with colours to define them. </p> <p>So for example a parameter that is a Number cannot be \"glued\" with a String. Will need some conversion first</p> <p> </p>"},{"location":"lcm/#examples-of-rules","title":"Examples of Rules","text":"<p>The following images provide some examples of rules.</p>"},{"location":"lcm/#define-variables-according-to-cases","title":"define variables according to cases","text":"<p>In the following example we :</p> <ul> <li>define a String variable. </li> <li>Then according to the Area of Service selected from the Service Order of the Service Specification we need to define it properly.</li> <li>We output the value to the OSOM Log</li> <li>Define dynamically the value of another parameter (This is fictional) and then do some other condition check</li> </ul> <p>The strAreaCodes could be passed then e.g. to NFVO for instantiation of services to these cells.</p> <p></p>"},{"location":"lcm/#define-complex-osm-configs-for-day-0","title":"Define complex OSM configs for DAY 0","text":"<p>The following displays some complex examples for defining the parameters to pass to the NFV. In this case is OSM.</p> <ul> <li> <p>NOTE: The OSM_CONFIG characteristic of a service is the one that it is used in orchestration to instantiate NS from OSM</p> </li> <li> <p>check the variable strTargetsParam. It is passed to the variable strOsmConfig3 which is executed if the Number of Cameras is more than 100. </p> </li> <li>if the Video quality requested is 3, then the Maximum Namber of camers will be 8. Check the OSM detailed configuration block and its syntax.</li> <li>if the Video quality requested is 2, we use a simpler OSM Config block to configure the parameter OSM_CONFIG. We just injected a json text ( watch the Escape of the string for the Quotes!)</li> <li>if the Video quality requested is 1, again we use a simpler OSM Config block to configure the parameter OSM_CONFIG. We use as injected json text a variable constructed later</li> </ul> <p></p>"},{"location":"lcm/#define-and-instantiate-different-services-according-to-service-order-request","title":"Define and instantiate different services according to Service Order request","text":"<p>In the following example we would like to offer a service either as Platinum, Gold or Silver. Depending on the selection we need to instantiate different services.</p> <p>There are different ways to accomplish this:</p> <ul> <li>create dynamically New Service Orders of RFSs with equivalent quality of Services</li> <li>change for example the VIMs that you deploy the NS</li> <li>change the NSD (that is use different VNFs)</li> </ul> <p>The following image displays for example the latter case.</p> <p></p>"},{"location":"lcm/#call-an-external-restful-service","title":"Call an external RESTful service","text":"<p>This is useful in cases for example of alarms , external logging, calling other services e.g. email or even a complex algorithm written in other language e.g. call an external service and get a result. (service e.g. a Python service)</p> <p></p> <p></p>"},{"location":"lcm/#create-new-service-orders","title":"Create New Service Orders","text":"<p>The following example calls to Order a New Service Specification with specific Parameter Values</p> <p></p>"},{"location":"nfvoconfig/","title":"NFV Orchestrator configuration","text":"<p>Currently we support Open Source MANO version EIGHT/NINE/TEN/ELEVEN/THIRTEEN. Later versions of OSM may also be supported by the existing configuration, as from OSM 9+ the project converged to the SOL005 interface, regarding the NBI, and SOL006 (YANG model), regarding the NFV/NS packaging. Also an implementation of a generic SOL005 interface is supported, but not extensively tested.</p> <p>Configuration of your target(s) NFVOs/MANO services with Openslice is performed through the NFV portal.</p> <ol> <li> <p>Login to {{yourdomain}}/nfvportal/</p> </li> <li> <p>Navigate to Admin > Manage MANO Platforms > Add New MANO Platform, pick one of the supported MANO platform(s), e.g. Name=OSMvTHIRTEEN, Version=OSMvTHIRTEEN and save. You may edit the saved MANO platforms after this.</p> </li> <li> <p>Navigate to Admin > Manage MANO providers > Add New MANO Provider and enter its details:</p> <ul> <li>Name and description of your choice. The selected name will supplement the NFV artifacts of this provider.</li> <li>One of the already defined MANO platforms</li> <li>API URL Endpoint, eg: https://10.10.10.10:9999 (This is the SOL005 NBI endpoint - Note the port 9999)</li> <li>Username, Password and Project of your OSM tenant.</li> </ul> </li> </ol> <p>Check EnabledForONBOARDING, if you want VNF/NS packages uploaded through the UI by the user, to also be automatically ONBOARDED to this MANO (1 step process). If left unchecked, the onboarding process must be performed manually after the VNF/NS package is uploaded to the portal, by the designated UI (2 step process).</p> <p>Check EnabledForSYNC, if you want to support the automatic synchronization of this MANO with OpenSlice. When enabled, the existing VNF/NS packages and VIMs (and any updates on them) of the registered MANO are also reflected to the portal to the respective UIs (Registered VNFs/NSDs and Manage Infrastructures). </p> <p>The synchronization is a continuous process that will confirm that the artifacts are still present in the MANO, updating the status field of the respective artifacts to <code>OSM_PRESENT</code>. If during this process, an artifact is deleted from the MANO, the respective status field will be updated to <code>OSM_MISSING</code>.</p>"},{"location":"portals_intro/","title":"OpenSlice Portals","text":"<p>Openslice comprises of a web landing page See Demo that navigates to the respective Portal:</p> <ul> <li>Services Portal See Demo</li> <li>NFV Portal See Demo</li> <li>Products Portal See Demo</li> <li>Testing Portal See Demo</li> <li>Resources Portal See Demo</li> </ul> <p>Following you may find the scope each portal focuses on and the main TMF APIs it supports.</p> <p>Services Portal is a designated portal for the: - Service Designer - To design Customer Facing Services as bundles of Resource Facing Services that map to specific Resourses (e.g. NFV, Testing, General Resources). Then, it is charged with the designed Services' exposure to public Service Catalogs. - Service Customer - To browse the public Service Catalogs and order the offered Services. The fulfilment process of the Service Order is also captured and the final deployed Services are exposed to the Customer.</p> <p>NFV Portal is a designated portal for the: Indicatively, the portal can be used to: - Register new a new MANO provider (e.g. OSM) - Synchronize the onboarded VNF/NS packages, and the VIMs of the registered MANO provider - Onboard/Delete VNF/NS packages on specific MANO provider - Deploy a NS to a target MANO provider</p> <p>More information can be found at NFV Services.</p> <p>Resources Portal is a designated portal for the: - Resource Administrator - To view the available Resources that are being synchronized from the underlying infrastructure. - Products Portal is a designated portal for the: - Product Designer - To design Products as bundles of available Services. Then, it is charged with the designed Products' exposure to public Product Catalogs. - Product Customer - To browse the public Product Catalogs and navigate to the respective offered Services.</p> <p>Testing Portal is a designated portal for the: - Testing Designer - To design Tests and provide the testing scripts as attachments to the latter. The Tests can be imported as Services at the Services Portal, and can be included in a Service Bundle.</p> TMF620 TMF632 TMF633 TMF634 TMF638 TMF639 TMF640 TMF641 TMF642 TMF653 TMF685 Services Portal x x x x x x Products Portal x x Testing Portal x x Resources Portal x x x x <p>The NFV Portal uses a proprietary API</p>"},{"location":"role_keycloak_management/","title":"Role management in Keycloak","text":"<p>Some initial configuration of Keycloak happens at Installation/Deployment time. Here are some notes regarding user management</p>"},{"location":"role_keycloak_management/#intended-audience-openslice-administrators","title":"Intended Audience: OpenSlice administrators","text":"<p>There are cases that OpenSlice administrators need to configure Keycloak:</p> <ul> <li>Change user roles, e.g. make a Simple user a Service Designer</li> <li>Domain management</li> <li>User Password reset</li> </ul>"},{"location":"service_inventory/","title":"Service Inventory","text":"<p>After a Service Order completion, active services with their additional characteristics are found:</p> <ul> <li>From the Order Items of a selected Service order</li> <li>from the menu of Service inventory and then selecting details of each service</li> <li>through the Service Inventory API (TMF 638 - Service Inventory Management ) </li> </ul> <p>Openslice creates a Service for the requested CFS. Customers make Service Orders and Openslice instantiates the requested Service Specifications for each Service Order Item of a Service Order. Running Services instantiated by Openslice, reside in Openslice Service Inventory. The following picture displays how Service Specifications are related to Running Services and how Running Services relate with instantiated running Network Services. </p> <p></p> <p>There is a hierarchy of services. Usually an Instantiated CFS has Supporting Services some Instantiated RFSs. Then an Instantiated RFS is related to some running NS managed by NFVO</p>"},{"location":"service_inventory/#interacting-with-an-active-service-day-2-config","title":"Interacting with an Active Service (Day 2 config)","text":"<p>In some cases, if the underlying service is configured with actions (for example in OSM Day 2 primitive actions), there are characteristics that can be modified. Usually they are named like : ::Primitive:: <p>The user can edit the characteristic with a new value. The value is propagated through the OSOM and NFVO down to the related VNF.</p>"},{"location":"service_inventory/#terminatinginactivating-a-service","title":"Terminating/Inactivating a service","text":"<p>You can terminate the service with one of the following processes:</p> <ul> <li>Select the related Service Order and terminate the Order Item. This will delete all the underlying related active services. The Order goes to ACKNOWLEDGED->INPROGRESS->COMPLETE</li> <li>To terminate or inactivate a service, select the specific service from the inventory, press Edit and set the State either to Inactive or Terminated</li> </ul> <p>Warning: if you terminate or inactivate a service the action cannot be undone. </p>"},{"location":"service_inventory/#uml-sequence-diagram","title":"uml: sequence diagram","text":"<p>Here I will embed PlantUML markup to generate a sequence diagram.</p> <p>I can include as many plantuml segments as I want in my Markdown, and the diagrams can be of any type supported by PlantUML.</p>"},{"location":"terminology/","title":"User Roles","text":"<ul> <li>User</li> <li>Service Designer</li> <li>OpenSlice administrator</li> </ul>"},{"location":"terminology/#terms","title":"Terms","text":"<ul> <li>Resource Facing Service Specification (RFSSpec): A Service that exposes a resource Specification as a Service.</li> <li>Customer Facing Service Specification (CFSSpec): Service exposed to users for Service Orders. Usually it exposes other CFSSpec(Service Bundle) or other RFSSpecs</li> <li>OpenSlice management cluster</li> <li>Service Specification: Detailed descriptions of services, including attributes, configurations, performance metrics, and SLAs.</li> <li>Service Catalog</li> <li>Service Categories</li> <li>Service Inventory</li> </ul>"},{"location":"under_construction/","title":"Under construction","text":"<p>under construction</p>"},{"location":"architecture/architecture/","title":"Architecture","text":"<p>Openslice offers the following main functionalities:</p> <ul> <li>Service Catalog Management: A CSP will have the ability to manage the Service Catalog Items, their attributes , organize in categories and decide what to make available to Customers</li> <li>Services Specifications: A CSP will be able to manage Service Specifications</li> <li>Service Catalog Exposure: A CSP will be able to expose catalog to customers and related parties</li> <li>Service Catalog to Service Catalog: Openslice able to consume and provide Service Catalog items to other catalogs</li> <li>Service Order: The Customer will be able to place a Service Order</li> <li>Service Inventory: The Customer and Provider will be able to view deployed Services status</li> </ul> <p>The following figure displays the overall architecture of Openslice.</p> <p></p> <p>Openslice allows Vertical Customers browsing the available offered service specifications. It consists of:</p> <ul> <li>Web frontend UIs that consist of mainly two portals: i) a NFV portal allowing users self-service management and onboarding VNFDs/NSDs to facility\u2019s NFVO ii) a Services Portal, which allows users to browse the Service Catalog, Service Blueprints specifications and the Service Inventory</li> <li>An API gateway that proxies the internal APIs and used by the web front end as well as any other 3rd party service</li> <li>A Message Bus where all microservices use it to exchange messages either via message queues or via publish/subscribe topics</li> <li>An authentication server implementing Oauth2 authentication scheme</li> <li>A microservice offering TMF compliant API services (eg Service Catalog API, Service Ordering APIetc)</li> <li>A microservice offering NFV API services (eg VNF/NSD onboarding etc) and allows to store VNFDs and NSDs in a catalog</li> <li>A microservice that is capable to interface to an issue management system. For example it raises an issue to all related stakeholders (CSP, NOP, CSC) that a new Service Order is requested</li> <li>Central logging microservice that is capable to log all distributed actions in to an Elasticsearch cluster</li> <li>A Service Orchestrator solution that will propagate Service Ordering requests to the equivalent SOs and NFVOs </li> </ul> <p>The following figure depicts how Openslice microservices are deployed</p> <p></p>"},{"location":"architecture/architecture/#deploying-openslice-in-multi-domain-scenarios","title":"Deploying Openslice in multi domain scenarios","text":"<p>A typical deployment across domains, involves today some typical components: i) an OSS/BSS to allow customers access the service catalog and perform service orders, ii) a Service Orchestrator (SO) component for executing the service order workflow, as well as iii) a Network Functions Virtualization Orchestrator (NFVO) for configuring the iv) network resources.</p> <p>TMF Open APIs are introduced not only for exposing catalogues and accepting service orders, but also implementing the East-West interfaces between the domains, fulfilling also the LSO requirements as introduced by MEF.</p> <p>The following figure shows how openslice could be used in such scenarios:</p> <p></p> <p>See more Consuming Services From External Partner Organizations</p>"},{"location":"architecture/centrallog/","title":"Central Logging","text":"<p>Openslice follows the centralized log management concept, i.e. a type of logging solution system that consolidates the log data from different services and pushes it to a central, accessible and easy-to-use interface. </p> <p>For that reason, Elasticsearch is elected as an open-source centralized logging solution for collecting, parsing and storing logs towards a real-time data analytics tool that provides insights from any type of structured and unstructured data source.</p>"},{"location":"architecture/consumingServicesFromExternalPartners/","title":"Consuming Services From External Partner Organizations","text":"<p>A typical deployment across domains, involves today some typical components: i) an OSS/BSS to allow customers access the service catalog and perform service orders, ii) a Service Orchestrator (SO) component for executing the service order workflow, as well as iii) a Network Functions Virtualization Orchestrator (NFVO) for configuring the iv) network resources.</p> <p>TMF Open APIs are introduced not only for exposing catalogues and accepting service orders, but also implementing the East-West interfaces between the domains, fulfilling also the LSO requirements as introduced by MEF.</p> <p>The following figure shows how openslice could be used in such scenarios:</p> <p></p> <p>In Openslice we can consume services from 3rd parties via Open APIs.</p> <p>We use the TMF 632 Party Management model to specify Organizations that we can exchange items and other information such as:</p> <ul> <li>Import Service Specifications</li> <li>Create a Service Order</li> <li>Use the Service Inventory to query the status of the service ordered to the external partner organization</li> </ul>"},{"location":"architecture/consumingServicesFromExternalPartners/#define-an-organization-as-3rd-party-to-consume-services-east-west","title":"Define an Organization as 3rd party to consume services East-West","text":"<p>An organization must have the following characteristics in openslice catalog, like for example:</p> <p>\"EXTERNAL_TMFAPI_BASEURL\", \"http://portal.openslice.io\"</p> <p>\"EXTERNAL_TMFAPI_CLIENTREGISTRATIONID\", \"authOpensliceProvider\"</p> <p>\"EXTERNAL_TMFAPI_OAUTH2CLIENTID\", \"osapiWebClientId\"</p> <p>\"EXTERNAL_TMFAPI_OAUTH2CLIENTSECRET\", \"secret\"</p> <p>\"EXTERNAL_TMFAPI_OAUTH2SCOPES\", scopes</p> <p>\"EXTERNAL_TMFAPI_OAUTH2TOKENURI\", \"http://portal.openslice.io/osapi-oauth-server/oauth/token\"</p> <p>\"EXTERNAL_TMFAPI_USERNAME\", \"admin\"</p> <p>\"EXTERNAL_TMFAPI_PASSWORD\", \"openslice\"</p> <p>\"EXTERNAL_TMFAPI_SERVICE_CATALOG_URLS\" = \"/tmf-api/serviceCatalogManagement/v4/serviceSpecification?type=CustomerFacingServiceSpecification\" (this is optional, fetch a list of service specs it will be relative with the BASEURL. If the url is empty then no specs will be fetched, the EXTERNAL_TMFAPI_SERVICE_CATEGORY_URLS might be used)</p> <p>\"EXTERNAL_TMFAPI_SERVICE_CATEGORY_URLS\" = \"/tmf-api/serviceCatalogManagement/v4/serviceCategory/{categoryid}\" (this example will fetch all specs in a category. You may define comma separated URLs of categories API URL . This will fetch specifications of every defined category. If you want only one specific category put for example the uuid only of one category: \"/tmf-api/serviceCatalogManagement/v4/serviceCategory/bda02821-bc4d-4bd6-b64b-d9c2aa5f8e6d\". multiple urls should be \"/tmf-api/serviceCatalogManagement/v4/serviceCategory/bda02821-bc4d-4bd6-b64b-d9c2aa5f8e6d,/tmf-api/serviceCatalogManagement/v4/serviceCategory/9b6d8bf3-abd2-43c4-8154-c8c6fe5545b2\")</p> <p>\"EXTERNAL_TMFAPI_SERVICE_SPEC\" = \"/tmf-api/serviceCatalogManagement/v4/serviceSpecification\"</p> <p>\"EXTERNAL_TMFAPI_SERVICE_ORDER_URLS\"= \"/test/v1/serviceorder\" (this is optional)</p> <p>An example Organization defined example in json:</p> <pre><code>\n{\n \"uuid\": \"1a09a8b5-6bd5-444b-b0b9-a73c69eb42ae\",\n \"@baseType\": \"BaseEntity\",\n \"@schemaLocation\": null,\n \"@type\": null,\n \"href\": null,\n \"name\": \"Openslice.io\",\n \"id\": \"1a09a8b5-6bd5-444b-b0b9-a73c69eb42ae\",\n \"isHeadOffice\": null,\n \"isLegalEntity\": null,\n \"nameType\": null,\n \"organizationType\": null,\n \"tradingName\": null,\n \"contactMedium\": [],\n \"creditRating\": [],\n \"existsDuring\": null,\n \"externalReference\": [],\n \"organizationChildRelationship\": [],\n \"organizationIdentification\": [],\n \"organizationParentRelationship\": null,\n \"otherName\": [],\n \"partyCharacteristic\": [\n {\n \"uuid\": \"3a2f7221-e0a2-4a6b-88d1-534c8e1963f6\",\n \"@baseType\": \"BaseEntity\",\n \"@schemaLocation\": null,\n \"@type\": null,\n \"href\": null,\n \"name\": \"EXTERNAL_TMFAPI_CLIENTREGISTRATIONID\",\n \"valueType\": null,\n \"value\": {\n \"value\": \"authOpensliceProvider\",\n \"alias\": null\n }\n },\n {\n \"uuid\": \"c24bb527-f178-4d38-9b93-2027c1732876\",\n \"@baseType\": \"BaseEntity\",\n \"@schemaLocation\": null,\n \"@type\": null,\n \"href\": null,\n \"name\": \"EXTERNAL_TMFAPI_USERNAME\",\n \"valueType\": null,\n \"value\": {\n \"value\": \"admin\",\n \"alias\": null\n }\n },\n {\n \"uuid\": \"27e45df8-414b-44c6-a5d5-3f064e2cfd3b\",\n \"@baseType\": \"BaseEntity\",\n \"@schemaLocation\": null,\n \"@type\": null,\n \"href\": null,\n \"name\": \"EXTERNAL_TMFAPI_PASSWORD\",\n \"valueType\": null,\n \"value\": {\n \"value\": \"openslice\",\n \"alias\": null\n }\n },\n {\n \"uuid\": \"e0e470b8-6024-4014-8a18-2333e5465ce1\",\n \"@baseType\": \"BaseEntity\",\n \"@schemaLocation\": null,\n \"@type\": null,\n \"href\": null,\n \"name\": \"EXTERNAL_TMFAPI_OAUTH2CLIENTSECRET\",\n \"valueType\": null,\n \"value\": {\n \"value\": \"secret\",\n \"alias\": null\n }\n },\n {\n \"uuid\": \"3e0de762-ac80-4c1e-a0a1-f265ff0899b4\",\n \"@baseType\": \"BaseEntity\",\n \"@schemaLocation\": null,\n \"@type\": null,\n \"href\": null,\n \"name\": \"EXTERNAL_TMFAPI_OAUTH2SCOPES\",\n \"valueType\": null,\n \"value\": {\n \"value\": \"admin;read\",\n \"alias\": null\n }\n },\n {\n \"uuid\": \"0bbb8314-f7f2-420d-9fed-ba054b15f886\",\n \"@baseType\": \"BaseEntity\",\n \"@schemaLocation\": null,\n \"@type\": null,\n \"href\": null,\n \"name\": \"EXTERNAL_TMFAPI_OAUTH2TOKENURI\",\n \"valueType\": null,\n \"value\": {\n \"value\": \"http://portal.openslice.io/osapi-oauth-server/oauth/token\",\n \"alias\": null\n }\n },\n {\n \"uuid\": \"3a567de4-79eb-4006-a500-3e5229b44175\",\n \"@baseType\": \"BaseEntity\",\n \"@schemaLocation\": null,\n \"@type\": null,\n \"href\": null,\n \"name\": \"EXTERNAL_TMFAPI_OAUTH2CLIENTID\",\n \"valueType\": null,\n \"value\": {\n \"value\": \"osapiWebClientId\",\n \"alias\": null\n }\n },\n {\n \"uuid\": \"6dca729f-dbe1-46b7-89f1-5c4f9fe89d4e\",\n \"@baseType\": \"BaseEntity\",\n \"@schemaLocation\": null,\n \"@type\": null,\n \"href\": null,\n \"name\": \"EXTERNAL_TMFAPI_BASEURL\",\n \"valueType\": null,\n \"value\": {\n \"value\": \"http://portal.openslice.io\",\n \"alias\": null\n }\n }\n ],\n \"relatedParty\": [],\n \"status\": null,\n \"taxExemptionCertificate\": []\n}\n\n</code></pre>"},{"location":"architecture/issuemgt/","title":"Issue Management","text":"<p>For issue management support, Openslice relies on Bugzilla. Bugzilla is a ticketing tool that allows issue reporting and tracking via tickets to all relevant stakeholders. </p> <p>The figure below displays the overall issue management service architecture integrating Bugzilla as its core and how this tool interacts with other Openslice services presenting some distinctive scenarios. It should be noted that Bugzilla tickets will not only be used for bugs/errors, but also for general requests, e.g. Service Order procedure.</p> <p></p>"},{"location":"architecture/messagebus/","title":"Message Bus and exchanged Messages","text":"<p>Openslice has a Message bus which allows Openslice services to exchange messages via queues and topics.</p> <p>It is based on ActiveMQ.</p> <p>3rd party services can be attached to bus and subscribe to message topics or request resources via queues.</p>"},{"location":"architecture/messagebus/#queue-messages","title":"QUEUE MESSAGES","text":"Message Alias CATALOG_GET_SERVICEORDERS Name jms:queue:CATALOG.GET.SERVICEORDERS Type queue Destination TMF API service Producers OSOM Body Description Return a List as String Json Message Alias CATALOG_GET_SERVICEORDER_BY_ID Name jms:queue:CATALOG.GET.SERVICEORDER_BY_ID Type queue Destination TMF API service Producers OSOM Body String orderid Description Return a ServiceOrder as String Json Message Alias CATALOG_UPD_SERVICEORDER_BY_ID Name jms:queue:CATALOG.UPD.SERVICEORDER_BY_ID Type queue Destination TMF API service Producers OSOM Body ServiceOrderUpdate serviceOrder Headers \"orderid\"= orderid Description Returns a ServiceOrder as String Message Alias CATALOG_GET_SERVICESPEC_BY_ID Name jms:queue:CATALOG.GET.SERVICESPEC_BY_ID Type queue Destination TMF API service Producers OSOM Body specid Description Return a ServiceSpecification Message Alias CATALOG_ADD_SERVICESPEC Name jms:queue:CATALOG.ADD.SERVICESPEC Type queue Destination TMF API service Producers CRIDGE Body ServiceSpecCreate Description Creates a ServiceSpecification and returns a ServiceSpecification as String Message Alias CATALOG_UPD_SERVICESPEC Name jms:queue:CATALOG.UPD.SERVICESPEC Type queue Destination TMF API service Producers CRIDGE Body ServiceSpecUpdate Headers \"serviceSpecid\" = serviceSpecId Description Updates a ServiceSpecification and returns a ServiceSpecification as String. --- Message Alias CATALOG_UPDADD_SERVICESPEC Name jms:queue:CATALOG.UPDADD.SERVICESPEC Type queue Destination TMF API service Producers CRIDGE Body ServiceSpecUpdate Headers \"serviceSpecid\" = serviceSpecId, \"forceId\"=forceId Description Updates a ServiceSpecification and returns a ServiceSpecification as String. If forceId is true then tries to assign the requested ID to the spec Message Alias CATALOG_ADD_SERVICEORDER Name jms:queue:CATALOG.ADD.SERVICEORDER Type queue Destination TMF API service Producers OSOM Body ServiceOrderCreate serviceOrder Headers Description Creates a ServiceOrder and returns a ServiceOrder as String Message Alias CATALOG_GET_INITIAL_SERVICEORDERS_IDS Name jms:queue:CATALOG.GET.INITIAL_SERVICEORDERS Type queue Destination TMF API service Producers Body Description Return a List as String Json Message Alias CATALOG_GET_SERVICEORDER_IDS_BY_STATE Name jms:queue:CATALOG.GET.ACKNOWLEDGED_SERVICEORDERS Type queue Destination TMF API service Producers OSOM Body Headers \"orderstate\"= orderState Description String Json ArrayList of ServiceOrders Message Alias CATALOG_ADD_SERVICE Name jms:queue:CATALOG.ADD.SERVICE Type queue Destination TMF API service Producers OSOM Body ServiceCreate String json Headers \"orderid\"=orderid, \"serviceSpecid\"= specid Description Creates Service based an a Service Spec, Returns a Service object Message Alias CATALOG_UPD_SERVICE Name jms:queue:CATALOG.UPD.SERVICE Type queue Destination TMF API service Producers Body ServiceUpdate Headers \"serviceid\" = serviceId, \"propagateToSO\" = true/false Description will update a service by id and return the service instance. If propagateToSO=true then any service change will be handled by OSOM. This is needed to be controlled in order to avoid update loops Message Alias CATALOG_GET_SERVICE_BY_ID Name jms:queue:CATALOG.GET.SERVICE Type queue Destination TMF API service Producers OSOM Body String serviceID Description returns a Service instance <p>---| Message | | | ------------- |----------------| |Alias | CATALOG_GET_SERVICE_BY_ORDERID | |Name | jms:queue:CATALOG.GET.SERVICE_BY_ORDERID | |Type | queue | |Destination | TMF API service | |Producers | | |Body | String serviceID | |Description | returns Service IDs of a specific order given then order id |</p> Message Alias CATALOG_SERVICE_QUEUE_ITEMS_GET Name jms:queue:CATALOG.SERVICEQUEUEITEMS.GET Type queue Destination TMF API service Producers OSOM Body Description returns a LIST OF Service Queue Items --- Message Alias CATALOG_SERVICE_QUEUE_ITEM_UPD Name jms:queue:CATALOG.SERVICEQUEUEITEM.UPDATE Type queue Destination TMF API service Producers OSOM Body String SERVICEQUEUEITEM Headers \"itemid\" = SERVICEQUEUEITEM id Description ill update a service queue item by id and return the instance --- Message Alias CATALOG_SERVICE_QUEUE_ITEM_DELETE Name jms:queue:CATALOG.SERVICEQUEUEITEM.DELETE Type queue Destination TMF API service Producers OSOM Body Headers \"itemid\" = SERVICEQUEUEITEM id Description ill delete a service queue item by id Message Alias CATALOG_SERVICES_TO_TERMINATE Name jms:queue:CATALOG.GET.SERVICETOTERMINATE Type queue Destination TMF API service Producers OSOM Body Headers Description Get a list of ACTIVE services with END DAte in the past --- Message Alias CATALOG_SERVICES_OF_PARTNERS Name jms:queue:CATALOG.GET.SERVICESOFPARTNERS Type queue Destination TMF API service Producers OSOM Body Headers Description Get a list of ACTIVE services from the inventory of partners Message Alias NFV_CATALOG_GET_NSD_BY_ID Name jms:queue:NFVCATALOG.GET.NSD_BY_ID Type queue Destination NFV Catalog service Producers TMF API, OSOM Body NSDid Description Returns a NetworkServiceDescriptor object Message Alias NFV_CATALOG_DEPLOY_NSD_REQ Name jms:queue:NFVCATALOG.DEPLOY.NSD_REQ Type queue Destination NFV Catalog service Producers OSOM Body DeploymentDescriptor as Json String Headers NSD id Description Returns a DeploymentDescriptor object as json string containing deployment info Message Alias NFV_CATALOG_UPD_DEPLOYMENT_BY_ID Name jms:queue:NFVCATALOG.UPD.DEPLOYMENT_BY_ID Type queue Destination NFV Catalog service Producers OSOM Body DeploymentDescriptor as Json String Headers DeploymentDescriptor id Description Updates and Returns a DeploymentDescriptor object as json string containing deployment info Message Alias GET_USER_BY_USERNAME Name jms:queue:GET.USER_BY_USERNAME Type queue Destination NFV Catalog service (this is temproary for now) Producers TMF API Body username Headers Description Returns a PortalUser object as json string containing user info Message Alias NFV_CATALOG_GET_DEPLOYMENT_BY_ID Name jms:queue:NFVCATALOG.GET.DEPLOYMENT_BY_ID Type queue Destination NFV Catalog service Producers OSOM Body Deployment ID Description Returns a DeploymentDescriptor object Message Alias CATALOG_GET_EXTERNAL_SERVICE_PARTNERS Name jms:queue:CATALOG.GET.EXTERNALSERVICEPARTNERS Type queue Destination TMF API service Producers OSOM Body Headers Description As a String Json ArrayList of Organizaton objects containing the characteristic name EXTERNAL_TMFAPI Message Alias CATALOG_UPD_EXTERNAL_SERVICESPEC Name jms:queue:CATALOG.UPD.EXTERNAL_SERVICESPEC Type queue Destination TMF API service Producers OSOM or maybe used by others that would like to update a Service Spec Body A serviceSpecification as json string Headers servicespecification id, orgid id Description Updates (or inserts if does not exist in catalog) an external service specification) Message Alias NFV_CATALOG_NSACTIONS_SCALE Name jms:queue:NSACTIONS.SCALE Type queue Destination TMF API service Producers OSOM or maybe used by others that would like scale a NS Body A ScaleDescriptor as json string Headers none Description performs a scale Message Alias NFV_CATALOG_NS_LCMCHANGED Name NFV_CATALOG_NS_LCMCHANGED Type topic Destination any Producers MANO client Body A json string Headers none Description A NFV_CATALOG_NS_LCMCHANGED message is published when LCM of a running NS is changed"},{"location":"architecture/messagebus/#alarms","title":"ALARMS","text":"Message Alias ALARMS_ADD_ALARM Name jms:queue:ALARMS.ADD.ALARM Type queue Publishers Consumers TMF API Body AlarmCreate Headers Description Add an alarm Message Alias ALARMS_UPDATE_ALARM Name jms:queue:ALARMS.UPDATE.ALARM Type queue Publishers Consumers TMF API Body AlarmUpdate Headers alarmid = alarm id, body (AlarmUpdate object) Description Update an alarm Message Alias ALARMS_GET_ALARM Name jms:queue:ALARMS.GET.ALARM Type queue Publishers Consumers TMF API Body Headers alarmid = alarm id Description get an alarm"},{"location":"architecture/messagebus/#event-topics-in-message-bus","title":"EVENT TOPICS IN Message Bus","text":"Message Alias EVENT_SERVICE_CREATE Name jms:topic:EVENT.SERVICE.CREATE Type topic Publishers TMF API Consumers - Body Notification object Headers \"eventid\"=eventid, \"objId\"= objId Description xx Message Alias EVENT_SERVICE_STATE_CHANGED Name jms:topic:EVENT.SERVICE.STATECHANGED Type topic Publishers TMF API Consumers - Body Notification object Headers \"eventid\"=eventid, \"objId\"= objId Description xx Message Alias EVENT_SERVICE_DELETE Name jms:topic:EVENT.SERVICE.DELETE Type topic Publishers TMF API Consumers - Body Notification object. Can be one of ServiceOrderCreateNotification, ServiceOrderStateChangeNotification, ServiceOrderAttributeValueChangeNotification, ServiceOrderDeleteNotification, etc Headers \"eventid\"=eventid, \"objId\"= objId Description xx Message Alias EVENT_SERVICE_ATTRIBUTE_VALUE_CHANGED Name jms:topic:EVENT.SERVICE.ATTRCHANGED Type topic Publishers TMF API Consumers - Body Notification object. Can be one of ServiceOrderCreateNotification, ServiceOrderStateChangeNotification, ServiceOrderAttributeValueChangeNotification, ServiceOrderDeleteNotification, etc Headers \"eventid\"=eventid, \"objId\"= objId Description xx Message Alias EVENT_SERVICE_ORDER_CREATE Name jms:topic:EVENT.SERVICEORDER.CREATE Type topic Publishers TMF API Consumers BUGZILLA Service, CentralLog Service Body Notification object. Can be one of ServiceOrderCreateNotification, ServiceOrderStateChangeNotification, ServiceOrderAttributeValueChangeNotification, ServiceOrderDeleteNotification, etc Headers \"eventid\"=eventid, \"objId\"= objId Description The Event of the Notification object contains the ServiceOrder object. Bugzilla service for example uses this to create a new issue Message Alias EVENT_SERVICE_ORDER_STATE_CHANGED Name jms:topic:EVENT.SERVICEORDER.STATECHANGED Type topic Publishers TMF API Consumers BUGZILLA Service, CentralLog Service Body Notification object. Can be one of ServiceOrderCreateNotification, ServiceOrderStateChangeNotification, ServiceOrderAttributeValueChangeNotification, ServiceOrderDeleteNotification, etc Headers \"eventid\"=eventid, \"objId\"= objId Description The Event of the Notification object contains the ServiceOrder object. Bugzilla service for example uses this to update an issue Message Alias EVENT_SERVICE_ORDER_DELETE Name jms:topic:EVENT.SERVICEORDER.DELETE Type topic Publishers TMF API Consumers BUGZILLA Service, CentralLog Service Body Notification object. Can be one of ServiceOrderCreateNotification, ServiceOrderStateChangeNotification, ServiceOrderAttributeValueChangeNotification, ServiceOrderDeleteNotification, etc Headers \"eventid\"=eventid, \"objId\"= objId Description The Event of the Notification object contains the ServiceOrder object Message Alias EVENT_SERVICE_ORDER_ATTRIBUTE_VALUE_CHANGED Name jms:topic:EVENT.SERVICEORDER.ATTRCHANGED Type topic Publishers TMF API Consumers BUGZILLA Service, CentralLog Service Body Notification object. Can be one of ServiceOrderCreateNotification, ServiceOrderStateChangeNotification, ServiceOrderAttributeValueChangeNotification, ServiceOrderDeleteNotification, etc Headers \"eventid\"=eventid, \"objId\"= objId Description The Event of the Notification object contains the ServiceOrder object Message Alias EVENT_ALARM_CREATE Name jms:topic:EVENT.ALARM.CREATE Type topic Publishers TMF API Consumers OAS, BUGZILLA Service, CentralLog Service Body AlarmCreateEvent Headers Description The Event contains the Alarm object in payload Message Alias CATALOG_ADD_RESOURCE Name jms:queue:CATALOG.ADD.RESOURCE Type topic Publishers TMF API Consumers any Body ResourceCreate Headers Description The Body contains the ResourceCreate object to add Message Alias CATALOG_UPD_RESOURCE Name jms:queue:CATALOG.UPD.RESOURCE Type topic Publishers TMF API Consumers any Body ResourceUpdate Headers resourceid , propagateToSO Description The Body contains the ResourceCreate object to update Message Alias CATALOG_GET_RESOURCE_BY_ID Name jms:queue:CATALOG.GET.RESOURCE Type topic Publishers TMF API Consumers any Body resourceid Headers Description The Body contains the ResourceCreate object to update Message Alias CATALOG_RESOURCES_OF_PARTNERS Name jms:queue:CATALOG.GET.SERVICESOFPARTNERS Type topic Publishers TMF API Consumers any Body none Headers none Description retrieve all active services of partners Message Alias CATALOG_ADD_RESOURCESPEC Name jms:queue:CATALOG.ADD.RESOURCESPEC Type topic Publishers TMF API Consumers any Body ResourceSpecificationCreate Headers Description The Body contains the ResourceSpecificationCreate object to add Message Alias CATALOG_UPD_RESOURCESPEC Name jms:queue:CATALOG.UPD.RESOURCESPEC Type topic Publishers TMF API Consumers any Body ResourceSpecificationUpdate Headers resourceSpecId Description The Body contains the ResourceSpecificationCreate object to update Message Alias CATALOG_GET_RESOURCESPEC_BY_ID Name jms:queue:CATALOG.GET.RESOURCESPEC_BY_ID Type topic Publishers TMF API Consumers any Body resourceSpecid Headers Description The Body contains the object id to find Message Alias CATALOG_UPDADD_RESOURCESPEC Name jms:queue:CATALOG.UPDADD.RESOURCESPEC Type topic Publishers TMF API Consumers any Body resourceid Headers Description The Body contains the ResourceSpecificationCreate object to update or create if not exist Message Alias EVENT_RESOURCE_CREATE Name jms:topic:EVENT.RESOURCE.CREATE Type topic Publishers TMF API Consumers BUGZILLA Service, CentralLog Service, other Body Notification object. Headers \"eventid\"=eventid, \"objId\"= objId Description The Event of the Notification object contains the Resource object Message Alias EVENT_RESOURCE_STATE_CHANGED Name jms:topic:EVENT.RESOURCE.STATECHANGED Type topic Publishers TMF API Consumers BUGZILLA Service, CentralLog Service, other Body Notification object. Headers \"eventid\"=eventid, \"objId\"= objId Description The Event of the Notification object contains the Resource object Message Alias EVENT_RESOURCE_DELETE Name jms:topic:EVENT.SERVICE.RESOURCE Type topic Publishers TMF API Consumers BUGZILLA Service, CentralLog Service, other Body Notification object. Headers \"eventid\"=eventid, \"objId\"= objId Description The Event of the Notification object contains the Resource object Message Alias EVENT_RESOURCE_ATTRIBUTE_VALUE_CHANGED Name jms:topic:EVENT.RESOURCE.ATTRCHANGED Type topic Publishers TMF API Consumers BUGZILLA Service, CentralLog Service, other Body Notification object. Headers \"eventid\"=eventid, \"objId\"= objId Description The Event of the Notification object contains the Resource object Message Alias CATALOG_GET_LCMRULE_BY_ID Name jms:queue:CATALOG.GET.LCMRULE Type topic Publishers TMF API Consumers any Body lcmid Headers Description The Body contains the LCMRuleSpec object Message Alias CATALOG_GET_LCMRULES_BY_SPECID_PHASE Name jms:queue:CATALOG.GET.LCMRULES_BY_SPECID_PHASE Type topic Publishers TMF API Consumers any Body Headers header.servicespecid, header.phasename Description The Body contains the LCMRuleSpec objects of the specific Service Spec and the specific phase Message Alias CATALOG_GET_SERVICETESTSPEC_BY_ID Name jms:queue:CATALOG.GET.SERVICETESTSPEC_BY_ID Type queue Destination TMF API service Producers OSOM Body specid Description Return a ServiceTestSpecification Message Alias CATALOG_ADD_SERVICETEST Name jms:queue:CATALOG.ADD.SERVICETEST Type queue Destination TMF API service Producers OSOM Body ServiceTestCreate String json Headers \"orderid\"=orderid, \"serviceTestSpecid\"= specid Description Creates Service Test based an a Service Test Spec, Returns a ServiceTest object Message Alias CATALOG_UPD_SERVICETEST Name jms:queue:CATALOG.UPD.SERVICETEST Type queue Destination TMF API service Producers Body ServiceTestUpdate Headers \"serviceid\" = serviceId, \"propagateToSO\" = true/false Description will update a service test by id and return the service instance. If propagateToSO=true then any service change will be handled by OSOM. This is needed to be controlled in order to avoid update loops Message Alias CATALOG_GET_SERVICETEST_BY_ID Name jms:queue:CATALOG.GET.SERVICETEST Type queue Destination TMF API service Producers OSOM Body String serviceID Description returns a Service TEST instance Message Alias CRD_DEPLOY_CR_REQ Name jms:queue:CRD.DEPLOY.CR_REQ Type queue Destination CRD service Producers OSOM Body CR spec as String Headers related service id Description Returns a String object containing deployment info Message Alias CRD_PATCH_CR_REQ Name jms:queue:CRD.PATCH.CR_REQ Type queue Destination CRD service Producers OSOM Body CR as String Headers related service id Description Returns a String object containing PATCH info Message Alias CRD_DELETE_CR_REQ Name jms:queue:CRD.DELETE.CR_REQ Type queue Destination CRD service Producers OSOM Body CR as String Headers related service id Description Returns a String object containing deletion info"},{"location":"architecture/nfvapi/","title":"API interaction","text":""},{"location":"architecture/nfvapi/#oauth-token","title":"OAuth token","text":"<p>See oauth</p>"},{"location":"architecture/nfvapi/#request-a-protected-api-resource","title":"Request a protected API resource","text":"<p>Example: Get all vxfs (check the <code>Authorization:Bearer</code> to be correct)</p> <pre><code>curl -H \"Authorization:Bearer eybGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbIm9wZW5hcGkiLCJhZG1pbiIsInJlYWQiLCJ3cml0ZSJdLCJvcmdhbml6YXRpb24iOiJteW9yZ2FuaXp0aW9uIiwiZXhwIjoxNTcxOTI0MjU2LCJhdXRob3JpdGllcyI6WyJST0xFX01FTlRPUiIsIlJPTEVfQURNSU4iXSwianRpIjoiNzNkZmIxODEtNTMwOS00MmExLThkOWUtOGM3YmQ0YTE1YmU0IiwiY2xpZW50X2lkIjoib3NhcGlXZWJDbGllbnRJZE91dCJ9.Pj_hxnyMGhFhN8avU_DiAw1-LlcaIz5Hp9HNqalw-X4\" http://localhost:13000/osapi/admin/vxfs\n</code></pre> <p>Example response:</p> <pre><code>[\n {\n \"id\": 1,\n \"owner\": {\n \"id\": 1,\n \"organization\": \"ee\",\n \"name\": \"Portal Administrator\",\n \"email\": \"\",\n \"username\": \"admin\",\n \"createdAt\": null\n },\n \"uuid\": \"a954daf2-16da-4b7e-ae42-4825936d453c\",\n \"name\": \"cirros_vnfd\",\n \"iconsrc\": \"/osapi/images/a954daf2-16da-4b7e-ae42-4825936d453c/cirros-64.png\",\n \"shortDescription\": \"cirros_vnfd\",\n \"longDescription\": \"Simple VNF example with a cirros\",\n \"version\": \"1.0\",\n \"packageLocation\": \"/osapi/packages/a954daf2-16da-4b7e-ae42-4825936d453c/cirros_vnf.tar.gz\",\n \"dateCreated\": 1568971426000,\n \"dateUpdated\": 1568981107000,\n \"categories\": [\n {\n \"id\": 3,\n \"name\": \"Service\",\n \"productsCount\": 1,\n \"appscount\": 0,\n \"vxFscount\": 1\n },\n {\n \"id\": 2,\n \"name\": \"Networking\",\n \"productsCount\": 1,\n \"appscount\": 0,\n \"vxFscount\": 1\n }\n ],\n \"extensions\": [],\n \"validationJobs\": [],\n \"screenshots\": \"\",\n \"vendor\": \"OSM\",\n \"published\": false,\n \"termsOfUse\": null,\n \"descriptor\": \"vnfd-catalog:\\n vnfd:\\n - connection-point:\\n - name: eth0\\n type: VPORT\\n description: Simple VNF example with a cirros\\n id: cirros_vnfd\\n logo: cirros-64.png\\n mgmt-interface:\\n cp: eth0\\n name: cirros_vnfd\\n short-name: cirros_vnfd\\n vdu:\\n - count: 1\\n description: cirros_vnfd-VM\\n id: cirros_vnfd-VM\\n image: cirros034\\n interface:\\n - external-connection-point-ref: eth0\\n name: eth0\\n position: '1'\\n type: EXTERNAL\\n virtual-interface:\\n bandwidth: '0'\\n type: VIRTIO\\n vpci: 0000:00:0a.0\\n name: cirros_vnfd-VM\\n vm-flavor:\\n memory-mb: 512\\n storage-gb: 1\\n vcpu-count: 1\\n vendor: OSM\\n version: '1.0'\\n\",\n \"descriptorHTML\": \"<h3>cirros_vnfd</h3><br><b>Vendor: </b>OSM<br><b>Version: </b>1.0<br><b>Description: </b>Simple VNF example with a cirros<br><b>VM Count: </b>1<br><b>vCPU Count: </b>1<br><b>Memory: </b>512 MB<br><b>Storage: </b>1 GB<br>\",\n \"certified\": false,\n \"certifiedBy\": null,\n \"validationStatus\": \"UNDER_REVIEW\",\n \"packagingFormat\": \"OSMvFIVE\",\n \"supportedMANOPlatforms\": [\n {\n \"id\": 1,\n \"name\": \"osm fivee\",\n \"version\": \"osm fivee\",\n \"description\": \"osm five\"\n }\n ],\n \"vxfOnBoardedDescriptors\": [],\n \"vfimagesVDU\": [\n {\n \"id\": 1,\n \"name\": \"cirros034\",\n \"uuid\": \"d4549610-8abd-42ad-97f4-0a64e1c93977\",\n \"shortDescription\": \"Automatically created during vxf cirros_vnfd submission. Owner must update.\",\n \"packageLocation\": null,\n \"publicURL\": null,\n \"dateCreated\": 1568971426000,\n \"dateUpdated\": null,\n \"refVxFs\": [\n {\n \"id\": 1,\n \"name\": \"cirros_vnfd\"\n }\n ],\n \"owner\": {\n \"id\": 1,\n \"organization\": \"ee\",\n \"name\": \"Portal Administrator\",\n \"email\": \"\",\n \"username\": \"admin\",\n \"active\": true,\n \"currentSessionID\": null,\n \"apikey\": \"e41c1cc4-aa56-4b7e-9f4d-64589549d768\",\n \"createdAt\": 1568711859000,\n \"roles\": [\n \"ADMIN\",\n \"MENTOR\"\n ]\n },\n \"published\": false,\n \"termsOfUse\": null,\n \"deployedInfrastructures\": []\n }\n ]\n },\n {\n \"id\": 2,\n \"owner\": {\n \"id\": 1,\n \"organization\": \"ee\",\n \"name\": \"Portal Administrator\",\n \"email\": \"\",\n \"username\": \"admin\",\n \"createdAt\": null\n },\n \"uuid\": \"4ab80095-a63e-4fe7-8598-e1c7e880706e\",\n \"name\": \"cirros_sriov_vnfd\",\n \"iconsrc\": null,\n \"shortDescription\": \"cirros_sriov_vnf\",\n \"longDescription\": \"Simple VNF example with a cirros SRIOV interface\",\n \"version\": \"1.0\",\n \"packageLocation\": \"/osapi/packages/4ab80095-a63e-4fe7-8598-e1c7e880706e/cirros_sriov.tar.gz\",\n \"dateCreated\": 1568971740000,\n \"dateUpdated\": 1568981100000,\n \"categories\": [\n {\n \"id\": 4,\n \"name\": \"tyu\",\n \"productsCount\": 1,\n \"appscount\": 0,\n \"vxFscount\": 1\n },\n {\n \"id\": 5,\n \"name\": \"tyi\",\n \"productsCount\": 1,\n \"appscount\": 0,\n \"vxFscount\": 1\n }\n ],\n \"extensions\": [],\n \"validationJobs\": [],\n \"screenshots\": \"\",\n \"vendor\": \"OSM\",\n \"published\": false,\n \"termsOfUse\": null,\n \"descriptor\": \"vnfd:vnfd-catalog:\\n vnfd:\\n - connection-point:\\n - name: eth0\\n type: VPORT\\n - name: eth1\\n type: VPORT\\n description: Simple VNF example with a cirros SRIOV interface\\n id: cirros_sriov_vnfd\\n logo: cirros-64.png\\n mgmt-interface:\\n cp: eth0\\n name: cirros_sriov_vnf\\n short-name: cirros_sriov_vnf\\n vdu:\\n - count: 1\\n description: cirros_sriov_vnfd-VM\\n guest-epa:\\n cpu-pinning-policy: DEDICATED\\n cpu-thread-pinning-policy: PREFER\\n mempage-size: SMALL\\n numa-node-policy:\\n mem-policy: STRICT\\n node:\\n - id: '1'\\n node-cnt: '1'\\n id: cirros_sriov_vnfd-VM\\n image: cirros-0.3.6-x86_64\\n interface:\\n - external-connection-point-ref: eth0\\n name: eth0\\n position: '1'\\n type: EXTERNAL\\n virtual-interface:\\n bandwidth: '0'\\n type: VIRTIO\\n vpci: 0000:00:0a.0\\n - external-connection-point-ref: eth1\\n name: eth1\\n position: '2'\\n type: EXTERNAL\\n virtual-interface:\\n type: SR-IOV\\n name: cirros_sriov_vnfd-VM\\n vm-flavor:\\n memory-mb: 4096\\n storage-gb: 10\\n vcpu-count: 4\\n vendor: OSM\\n version: '1.0'\\n\",\n \"descriptorHTML\": \"<h3>cirros_sriov_vnf</h3><br><b>Vendor: </b>OSM<br><b>Version: </b>1.0<br><b>Description: </b>Simple VNF example with a cirros SRIOV interface<br><b>VM Count: </b>1<br><b>vCPU Count: </b>1<br><b>Memory: </b>4096 MB<br><b>Storage: </b>10 GB<br>\",\n \"certified\": false,\n \"certifiedBy\": null,\n \"validationStatus\": \"UNDER_REVIEW\",\n \"packagingFormat\": \"OSMvFIVE\",\n \"supportedMANOPlatforms\": [\n {\n \"id\": 1,\n \"name\": \"osm fivee\",\n \"version\": \"osm fivee\",\n \"description\": \"osm five\"\n }\n ],\n \"vxfOnBoardedDescriptors\": [],\n \"vfimagesVDU\": [\n {\n \"id\": 2,\n \"name\": \"cirros-0.3.6-x86_64\",\n \"uuid\": \"be121176-1d62-4a1b-a3c1-7dce2e069d22\",\n \"shortDescription\": \"Automatically created during vxf cirros_sriov_vnfd submission. Owner must update.\",\n \"packageLocation\": null,\n \"publicURL\": null,\n \"dateCreated\": 1568971740000,\n \"dateUpdated\": null,\n \"refVxFs\": [\n {\n \"id\": 2,\n \"name\": \"cirros_sriov_vnfd\"\n }\n ],\n \"owner\": {\n \"id\": 1,\n \"organization\": \"ee\",\n \"name\": \"Portal Administrator\",\n \"email\": \"\",\n \"username\": \"admin\",\n \"active\": true,\n \"currentSessionID\": null,\n \"apikey\": \"e41c1cc4-aa56-4b7e-9f4d-64589549d768\",\n \"createdAt\": 1568711859000,\n \"roles\": [\n \"ROLE_ADMIN\",\n \"ROLE_MENTOR\"\n ]\n },\n \"published\": false,\n \"termsOfUse\": null,\n \"deployedInfrastructures\": []\n }\n ]\n }\n]\n</code></pre>"},{"location":"architecture/oauth/","title":"Authentication Server","text":"<p>Authentication is based on oAuth2. Our authentication service is a Keycloak server which is deployed with Openslice deployment </p> <p>API users needs to authenticate. All APIs (except grant token request) must include Bearer token in request Authorization header.</p>"},{"location":"architecture/oauth/#oauth-token","title":"OAuth token","text":"<p>Get first an oauth token, using your username and password. </p> <pre><code>curl -X POST http://portal.openslice.io/auth/realms/openslice/protocol/openid-connect/token -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=demouser' -d 'password=demouser' -d 'grant_type=password' -d 'client_id=osapiWebClientId' \n</code></pre> <p>response:</p> <pre><code> {\"access_token\":\"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJHZFRjQnpxczg2VW10NTRVZV8ybTJyWHJkV3dzaWdSZE9EUldMYm1memNvIn0.eyJleHAiOjE1ODgyNDA1NzAsImlhdCI6MTU4ODI0MDI3MCwianRpIjoiOGI2ZTU0NWUtNDIyYy00NzFiLWEwN2UtYTUzYzY1NDQ0MzZmIiwiaXNzIjoiaHR0cDovL3BvcnRhbC5vcGVuc2xpY2UuaW8vYXV0aC9yZWFsbXMvb3BlbnNsaWNlIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6ImExYTI3NjVhLWVjODMtNDQ1Ni1iN2IyLTIwNzMxOTg2ZTAzNSIsInR5cCI6IkJlYXJlciIsImF6cCI6Im9zYXBpV2ViQ2xpZW50SWQiLCJzZXNzaW9uX3N0YXRlIjoiMzM1MGY0OTMtNjYyNy00MzczLTg1NDQtZGVmZDI3YWQzYzc0IiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwOi8vbG9jYWxob3N0OjEzMDgyIiwiaHR0cDovL2xvY2FsaG9zdCIsImh0dHA6Ly9vcGVuc2xpY2UuaW8iLCJodHRwOi8vbG9jYWxob3N0OjEzMDAwIiwiaHR0cDovL2xvY2FsaG9zdDo0MjAwIiwiaHR0cDovL3BvcnRhbC5vcGVuc2xpY2UuaW8iXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIk5GVl9ERVZFTE9QRVIiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIiwiRVhQRVJJTUVOVEVSIiwiVVNFUiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoicHJvZmlsZSBlbWFpbCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJkZW1vdXNlciJ9.TnzzpRLMD94UTKpT5_wkr1h4_3KUQmr4TGvFLpJ7cZx-Klrv8tB_eRkWnPqqzCAM9G21a1qXboL8MLMW8ECzG7HYKpobKOGr7LSczMOTdA2ZDyBCRUSOdW77pchu54tJ0ITEkFaDwSKMKKt04V_Sy4U-eIndj0XzzRlkDolWDnK4Z2lRaXAI6fMwOKx1Toa6RfOcemxtzl3pdtjPx92zo6MaKlbIqHK82lxdK0k8aQQaT6TmIrXbZKV2dU_1d3O0q0dVUEZJ_1kzwqOFkmxr9w0EnndC6ccYJlDAr_-GgUhhhNOn5v6tjYLUQdj5e4KEAsxIPzaCreK4un7mEAPmDw\",\"expires_in\":300,\"refresh_expires_in\":1800,\"refresh_token\":\"eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIwZjUxMDk5Yy0wNTIzLTRjNGQtODM0Zi1iNDc0YzBjOTA1MzkifQ.eyJleHAiOjE1ODgyNDIwNzAsImlhdCI6MTU4ODI0MDI3MCwianRpIjoiZmViOTg5NWEtOTY5ZS00MzIzLWJjY2QtZTY2YzQ0NGE1MzJlIiwiaXNzIjoiaHR0cDovL3BvcnRhbC5vcGVuc2xpY2UuaW8vYXV0aC9yZWFsbXMvb3BlbnNsaWNlIiwiYXVkIjoiaHR0cDovL3BvcnRhbC5vcGVuc2xpY2UuaW8vYXV0aC9yZWFsbXMvb3BlbnNsaWNlIiwic3ViIjoiYTFhMjc2NWEtZWM4My00NDU2LWI3YjItMjA3MzE5ODZlMDM1IiwidHlwIjoiUmVmcmVzaCIsImF6cCI6Im9zYXBpV2ViQ2xpZW50SWQiLCJzZXNzaW9uX3N0YXRlIjoiMzM1MGY0OTMtNjYyNy00MzczLTg1NDQtZGVmZDI3YWQzYzc0Iiwic2NvcGUiOiJwcm9maWxlIGVtYWlsIn0.cDTx9BE1Df8EfGYm3VLr_MNFeymxZtJhMtlK7PVbIuk\",\"token_type\":\"bearer\",\"not-before-policy\":1586797346,\"session_state\":\"3350f493-6627-4373-8544-defd27ad3c74\",\"scope\":\"profile email\"}\n\n</code></pre> <p>The <code>access_token</code> will be used next as a Bearer.</p> <pre><code>curl http://portal.openslice.io/tmf-api/serviceCatalogManagement/v4/serviceCatalog -H 'Authorization: Bearer yJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJHZFRjQnpxczg2VW10NTRVZV8ybTJyWHJkV3dzaWdSZE9EUldMYm1memNvIn0.eyJleHAiOjE1ODgyNDA1MjQsImlhdCI6MTU4ODI0MDIyNCwianRpIjoiYjg0NGYxZDAtMzk3Mi00YTMyLThiMWEtZDAxMDY3OGZjMTQ4IiwiaXNzIjoiaHR0cDovL3BvcnRhbC5vcGVuc2xpY2UuaW8vYXV0aC9yZWFsbXMvb3BlbnNsaWNlIiwic3ViIjoiYTFhMjc2NWEtZWM4My00NDU2LWI3YjItMjA3MzE5ODZlMDM1IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoiYWRtaW4tY2xpIiwic2Vzc2lvbl9zdGF0ZSI6ImFmMmMzZmY1LTE4YWQtNDFkNC1hYTAyLTFlMGJkNzNmOTM5MSIsImFjciI6IjEiLCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwicHJlZmVycmVkX3VzZXJuYW1lIjoiZGVtb3VzZXIifQ.SMtgV1E44_K_MQumGXZtWsLGVhYNaoM8Pk-DiFIZtUP4Zu-ervOsxHVQMX1frgVERR4jJidBcSshy9TnJ3UjF4l33WujHltbs-1UPy-gaIufVuEpl8RmbjOti3Up70vLfLXbzb6kN6WaahgobWXlbJsSXXwaBPQP6vSX5KigCa8TmzXcuqom14lOrlU-RB2zQTlJ30p7d9ag-a7o3I5m9GZWLJCZW2UYMl1JkskTHKgilA8HFQY4C9DYwWu8YDMyzqQSNumrTlURalBFidFbZvb1kp4dAyct8TysSWSbxxiwaL2RX1PWUqk-5Fpc1Q6BnBC8muMheiukFuoSkuADAg'^C\nubuntu@portal:~$ curl http://portal.openslice.io/tmf-api/serviceCatalogManagement/v4/serviceCatalog -H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJHZFRjQnpxczg2VW10NTRVZV8ybTJyWHJkV3dzaWdSZE9EUldMYm1memNvIn0.eyJleHAiOjE1ODgyNDA1NzAsImlhdCI6MTU4ODI0MDI3MCwianRpIjoiOGI2ZTU0NWUtNDIyYy00NzFiLWEwN2UtYTUzYzY1NDQ0MzZmIiwiaXNzIjoiaHR0cDovL3BvcnRhbC5vcGVuc2xpY2UuaW8vYXV0aC9yZWFsbXMvb3BlbnNsaWNlIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6ImExYTI3NjVhLWVjODMtNDQ1Ni1iN2IyLTIwNzMxOTg2ZTAzNSIsInR5cCI6IkJlYXJlciIsImF6cCI6Im9zYXBpV2ViQ2xpZW50SWQiLCJzZXNzaW9uX3N0YXRlIjoiMzM1MGY0OTMtNjYyNy00MzczLTg1NDQtZGVmZDI3YWQzYzc0IiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwOi8vbG9jYWxob3N0OjEzMDgyIiwiaHR0cDovL2xvY2FsaG9zdCIsImh0dHA6Ly9vcGVuc2xpY2UuaW8iLCJodHRwOi8vbG9jYWxob3N0OjEzMDAwIiwiaHR0cDovL2xvY2FsaG9zdDo0MjAwIiwiaHR0cDovL3BvcnRhbC5vcGVuc2xpY2UuaW8iXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIk5GVl9ERVZFTE9QRVIiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIiwiRVhQRVJJTUVOVEVSIiwiVVNFUiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoicHJvZmlsZSBlbWFpbCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJkZW1vdXNlciJ9.TnzzpRLMD94UTKpT5_wkr1h4_3KUQmr4TGvFLpJ7cZx-Klrv8tB_eRkWnPqqzCAM9G21a1qXboL8MLMW8ECzG7HYKpobKOGr7LSczMOTdA2ZDyBCRUSOdW77pchu54tJ0ITEkFaDwSKMKKt04V_Sy4U-eIndj0XzzRlkDolWDnK4Z2lRaXAI6fMwOKx1Toa6RfOcemxtzl3pdtjPx92zo6MaKlbIqHK82lxdK0k8aQQaT6TmIrXbZKV2dU_1d3O0q0dVUEZJ_1kzwqOFkmxr9w0EnndC6ccYJlDAr_-GgUhhhNOn5v6tjYLUQdj5e4KEAsxIPzaCreK4un7mEAPmDw'\n\nResponse:\n\n\n[{\"uuid\":\"9e186cd5-b2b2-4a06-b1d6-895720193bc9\",\"lastUpdate\":\"2020-03-11T23:19:05Z\",\"@baseType\":\"BaseEntity\",\"@schemaLocation\":null,\"@type\":\"ServiceCatalog\",\"href\":null,\"name\":\"Example Facility Services\",\"description\":\"Example Facility Services\",\"lifecycleStatus\":\"Active\",\"version\":\"1.0\",\"validFor\":{\"endDateTime\":\"2039-11-20T23:07:21Z\",\"startDateTime\":\"2019-11-20T23:07:21Z\"},\"relatedParty\":null,\"id\":\"9e186cd5-b2b2-4a06-b1d6-895720193bc9\",\"category\":[{\"@baseType\":\"org.etsi.osl.tmf.scm633.model.ServiceCategoryRef\",\"@schemaLocation\":null,\"@type\":\"org.etsi.osl.tmf.scm633.model.ServiceCategoryRef\",\"href\":null,\"name\":\"Generic Services\",\"@referredType\":null,\"id\":\"98b9adf1-a1d6-4165-855f-153ddc2131b1\"},{\"@baseType\":\"org.etsi.osl.tmf.scm633.model.ServiceCategoryRef\",\"@schemaLocation\":null,\"@type\":\"org.etsi.osl.tmf.scm633.model.ServiceCategoryRef\",\"href\":null,\"name\":\"External\",\"@referredType\":null,\"id\":\"08ffdb3c-6237-45d0-9f3a-d43b5fc5f0b6\"},{\"@baseType\":\"org.etsi.osl.tmf.scm633.model.ServiceCategoryRef\",\"@schemaLocation\":null,\"@type\":\"org.etsi.osl.tmf.scm633.model.ServiceCategoryRef\",\"href\":null,\"name\":\"eMBB\",\"@referredType\":null,\"id\":\"ef2c90dd-b65e-4a9f-a9c3-427c9fb0219b\"}]}]\n\n\n</code></pre>"},{"location":"architecture/osom/","title":"Openslice Service Orchestration and Order Management - OSOM","text":"<p>OSOM is a service responsible for:</p> <ul> <li>Service Order Management (SOM)</li> <li>Service Orchestration (SO)</li> </ul> <p>It uses open source Flowable Business process engine (https://www.flowable.org) .</p> <p>A Service Order follows the states as defined in TMF641 specification: </p> <p></p>"},{"location":"architecture/osom/#initial-state","title":"Initial state","text":"<p>When a new order is created, it goes into the Initial state. It is stored in the repository and triggers an Event.</p> <p></p> <p>Administrators are notified usually from the Ticketing System of a new order. They login to Openslice and change the State of the order either to ACKNOWLEDGED or REJECTED. If ACKNOWLEDGED they can Propose a startDate, add Notes, and add any additional service items</p>"},{"location":"architecture/osom/#order-scheduler","title":"Order scheduler","text":"<p>A process checks every 1 minute for ACKNOWLEDGED orders.</p> <p></p> <p></p> <p>It retrieves all orders that are in ACKNOWLEDGED state and if the start date is in time it will initialize the process by settingn the order in IN_PROGRESS state. Finally the Start Order Process will start.</p>"},{"location":"architecture/osom/#start-order-process","title":"Start order process","text":"<p>This process for now is a draft simple prototype to make a simple orchestration via NFVO. Here the actual Services (TMF638/640 model) are created and attached to Service Order and Service Inventory.</p> <p></p> <p></p> <p>We expect here to check which tasks can be orchestrated by NFVO and which by human. We create the equivalent Services(TMF638/640 model) for this order.</p> <ol> <li>During check it should decide to create Service(s) for this service order O1 and send it to ServiceInventory</li> <li>The Services(TMF638 model) are assigned to the Order O1 In supportService List</li> <li>Each OrderItem OI1 is related to one serviceSpecification</li> <li>Each ServiceSpecification has also related serviceSpecRelationships</li> <li>So if we receive an order O1 for a ServiceSpec A which relates to (a bundle of) 3 specs(2 CFS, 1 RFS) we do the following:<ol> <li>Create a Service S_A(TMF638 model) for ServiceSpec A for Order O1</li> <li>We create also 3 Services S_C1, S_C2 and S_R1 equivalent to the serviceSpecRelationships (2 CFS, 1 RFS) </li> <li>At this point the order will have 1 Local Service Orchestration Process(S_A), 2 supportingServices refs(S_C1, S_C2) and 1 supportingResource(S_R1)</li> <li>The 3 supportingServices and 1 supportingResource correspond to total 4 Services in ServiceInventory</li> <li>Service S_A will have: <ol> <li>startMode 1: Automatically by the managed environment</li> <li>State: RESERVED and the Lifecycle will be handled by OSOM</li> </ol> </li> <li>Services S_C1 and S_C2 we decide that cannot be orchestrated then they have <ol> <li>startMode: 3: Manually by the Provider of the Service</li> <li>State: RESERVED and the Lifecycle will be handled by OSOM</li> <li>If the CFS is a bundle spec it is further recursively orchestrated </li> </ol> </li> <li>Service S_R1 will have <ol> <li>startMode 1: Automatically by the managed environment.</li> <li>State: RESERVED</li> <li>IF The Service has the characteristic CharacteristicByName( \"NSDID\") it will be further processed by the NFVO </li> </ol> </li> </ol> </li> </ol> <p>There will be two instances of task \"User Task Manual Complete Service\" each for Services S_C1 and S_C2. The task is Transient for now. It displays only the services that are not automated! Here is a flow for future:</p> <ol> <li>We wait here for human decision.</li> <li>From API we get a result: a. If set to ACTIVE/TERMINATED then we complete the task b. In any other state we stay in this task until it is resolved as in step a c. The Status of ORDER O1 is also updated to PARTIAL</li> </ol> <p>There will be an instance of NFVODeploymentRequest process each for Service S_R1. (see later)</p> <ol> <li>This process is related with the NFVO orchestration</li> <li>It will send a msg to NFVO(s?) for a specific deployment request</li> </ol> <p>All services in \"Order Complete\" are in a status:</p> <ol> <li>Depending on the result the service S_A is either ACTIVE or INACTIVE or TERMINATED</li> <li>The Status of ORDER O1 is also updated to COMPLETED or PARTIAL (in case we have some services running) or FAILED (in cases we have errors)</li> </ol> <p>A Service follows the states as defined in TMF638 Service Inventory specification: </p> <p></p>"},{"location":"architecture/osom/#nfvodeploymentrequest-process","title":"NFVODeploymentRequest process","text":"<p>This process is related with the NFVO orchestration It will send a msg to NFVO(s?) for a specific deployment request Then it checks the deployment status. It will wait 30 secs each time until the deployment is running (or failed)</p>"},{"location":"architecture/osom/#check-in-progress-orders-process","title":"Check In Progress orders process","text":"<p>Every 1 minute the \"Check In Progress Orders\" process is executed checking if a supported Service changed state (i.e. to ACTIVE) then the whole Order will change state (e.g. go to COMPLETED)</p> <p></p>"},{"location":"architecture/osom/#external-service-provider-deployment-request-process","title":"External Service Provider Deployment Request process","text":"<p>This process contains tasks for submitting order requests to external partners. - Submit Order To External Service Provider Task: This task creates automatically a Service Order request to a 3rd party provider SO that hosts the Service Specification - Check external service order fulfillment task: This task Check external partner for Service creations and updates our local inventory of services the service characteristics of remote Service Inventory</p>"},{"location":"architecture/osom/#fetch-partner-services-process","title":"Fetch Partner Services Process","text":"<p>Every 2 minutes the \"fetchPartnerServicesProcess\" process is executed checking remote Partner Organizations for changes in the published catalogues. The Fetch and Update External Partner Services Task is executed in paralle l for each Partner Organization </p>"},{"location":"architecture/osom/#local-service-orchestration-process","title":"Local Service Orchestration Process","text":"<p>This process handles automatically services that need to be further orchestrated or processed by OSOM. For example, for a CFS Bundled service we create such automated service instances that just aggregate the underlying services. </p>"},{"location":"architecture/tmfapi/","title":"TMF OpenAPI specification","text":"<p>PLease check the complete specification here.</p>"},{"location":"architecture/tmfapi/#api-interaction","title":"API interaction","text":""},{"location":"architecture/tmfapi/#oauth-token","title":"OAuth token","text":"<p>See oauth</p>"},{"location":"architecture/tmfapi/#request-a-protected-api-resource","title":"Request a protected API resource","text":"<p>Example: Get all Service Catalogs (check the <code>Authorization:Bearer</code> to be correct)</p> <pre><code>curl -H \"Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbIm9wZW5hcGkiLCJhZG1pbiIsInJlYWQiLCJ3cml0ZSJdLCJvcmdhbml6YXRpb24iOiJteW9yZ2FuaXp0aW9uIiwiZXhwIjoxNTc4NTA1MDcyLCJhdXRob3JpdGllcyI6WyJST0xFX01FTlRPUiIsIlJPTEVfQURNSU4iXSwianRpIjoiMTFlNGYxYTUtZDY0Ny00YzA1LWE0ZGMtYWFhYzUyMjk4YzMwIiwiY2xpZW50X2lkIjoib3NhcGlXZWJDbGllbnRJZE91dCJ9.gm7cKdusDrdMRkxEiFU5sENKGRC1xwVj2SgPRmE9xxx\" -H \"accept: application/json;charset=utf-8\" -X GET \"http://portal.openslice.io/tmf-api/serviceCatalogManagement/v4/serviceCatalog\"\n\n</code></pre> <p>response:</p> <pre><code>[\n {\n \"uuid\": \"9e186cd5-b2b2-4a06-b1d6-895720193bc9\",\n \"lastUpdate\": \"2019-12-19T10:45:55Z\",\n \"@baseType\": \"BaseEntity\",\n \"@schemaLocation\": null,\n \"@type\": \"ServiceCatalog\",\n \"href\": null,\n \"name\": \"Example Facility Services\",\n \"description\": \"Example Facility Services\",\n \"lifecycleStatus\": \"Active\",\n \"version\": \"1.0\",\n \"validFor\": {\n \"endDateTime\": \"2039-11-20T23:07:21Z\",\n \"startDateTime\": \"2019-11-20T23:07:21Z\"\n },\n \"relatedParty\": null,\n \"id\": \"9e186cd5-b2b2-4a06-b1d6-895720193bc9\",\n \"category\": [\n {\n \"@baseType\": \"org.etsi.osl.tmf.scm633.model.ServiceCategoryRef\",\n \"@schemaLocation\": null,\n \"@type\": \"org.etsi.osl.tmf.scm633.model.ServiceCategoryRef\",\n \"href\": null,\n \"name\": \"eMBB\",\n \"@referredType\": null,\n \"id\": \"ef2c90dd-b65e-4a9f-a9c3-427c9fb0219b\"\n },\n {\n \"@baseType\": \"org.etsi.osl.tmf.scm633.model.ServiceCategoryRef\",\n \"@schemaLocation\": null,\n \"@type\": \"org.etsi.osl.tmf.scm633.model.ServiceCategoryRef\",\n \"href\": null,\n \"name\": \"Generic Services\",\n \"@referredType\": null,\n \"id\": \"98b9adf1-a1d6-4165-855f-153ddc2131b1\"\n }\n ]\n }\n]\n</code></pre>"},{"location":"architecture/CRIDGE/CRIDGEforDevelopers/","title":"CRIDGE: A Service to manage Custom Resources in a Kubernetes Cluster","text":""},{"location":"architecture/CRIDGE/CRIDGEforDevelopers/#intended-audience-osl-developers","title":"Intended Audience: OSL developers","text":"<p>Kubernetes is an orchestration system for automating software deployment, scaling, and management. One can interact though the Kubernetes API and it has a set of objects ready for use out of the box. Custom Resource Definitions (CRDs) is a way that allows to manage things other than Kubernetes itself and allows to create our own objects The use of CRDs makes the possibilities of Kubernetes management almost limitless. You can extend the base Kubernetes API with any object you like using CRDs.</p> <p>CRIDGE is a service designed to create and manage Custom Resources (CRs) based on Custom Resource Definitions (CRDs) installed on a Kubernetes cluster. By leveraging the OpenSlice (OSL), CRIDGE enables seamless integration and orchestration within Kubernetes environments, utilizing Kubernetes APIs via the TMF APIs and models. Thus, more or less, OSL exposes Kubernetes APIs as TMF APIs and models.</p> <p>By allowing the design and lifecycle management of services/resources that expose CRDs/CRs in a Kubernetes cluster via the TMF APIs, OSL can be used in many complex scenarios now involing resources from multiple domains.</p> <ol> <li> <p>CRIDGE service allows OSL to:</p> <ul> <li>Create and manage Custom Resources (CRs) using installed CRDs on a target Kubernetes cluster.</li> <li>Facilitate complex orchestration scenarios by wrapping Kubernetes APIs as TMF APIs and models.</li> <li>Handles connectivity to a Kubernetes cluster and manages the lifecycle of CRDs</li> <li>Wraps the Kubernetes API, Receives and provides resources towards other OSL services via the service bus</li> </ul> </li> <li> <p>Enabling Loose Coupling and Orchestration</p> <ul> <li>Language Flexibility: Developers can write CRDs in any language and expose them via the Kubernetes APIs. OSL will reuse these CRDs, enhancing flexibility and integration capabilities.</li> <li>Familiar Deployment: Developers can create and deploy applications using familiar tools such as Helm charts, simplifying the process and reducing the learning curve.</li> </ul> </li> <li> <p>Ecosystem Reusability</p> <ul> <li>CRIDGE capitalizes on the extensive Kubernetes ecosystem, particularly focusing on operators (CRDs).</li> <li>Key repositories and hubs such as artifacthub.io and Operatorhub.io can be utilized for finding and deploying operators.</li> </ul> </li> <li> <p>Service Catalog Exposure and Deployment</p> <p>OSL can expose CRs in service catalogs, facilitating their deployment in complex scenarios. These scenarios may include service bundles that involve multiple systems, such as RAN controllers or other Kubernetes clusters, providing a robust and versatile deployment framework.</p> </li> </ol> <p>Why the CRIDGE name? we wanted to build a service that maps TMF models to CRDs; a kind of a CRD to TMF bridge. Therefore CRIDGE was born</p>"},{"location":"architecture/CRIDGE/CRIDGEforDevelopers/#approach","title":"Approach","text":"<p>OSL in general is responible for exposing service specifications which are ready to be ordered and orchestrated, through tmforum Open APIs as defined in the OSL Service Spec Catalog. Usually for a service specification a corresponding (one or more) resource specification (resourceSpecificationReference) is registered in the OSL Resource Spec Catalog.</p> <p>The following image illustrates the approach.</p> <p></p> <ol> <li>A CRD in a cluster will be mapped in TMF model as a Resource specification and therefore can be exposed as a service specification in a catalog</li> <li>Service Orders can be created for this service specification. The OSL Orchestrator (OSOM) will manage the lifecycle of the Service Order.</li> <li>OSOM creates a Resource in OSL Resource inventory and requests (via CRIDGE) a new Custom Resource (CR) in the target cluster<ul> <li>The resource is created in a specific namespace (for example the UUID of the Service Order)</li> <li>A CR in a cluster will be mapped in TMF model as a Resource in the resource Inventory</li> <li>Other related resources created by the CRD Controller within the namespace are automatically created in OSL Resource Inventory under the same Service Order</li> </ul> </li> </ol> <p></p> <p>The provided image illustrates the architecture and workflow of the CRIDGE service, showing how it interacts with other components within a Kubernetes (K8s) cluster. Here is an explanation of the key components and flow in the diagram:</p> <ul> <li>Other OSL Services: This box represents various OSL services such as Service Spec Catalogue, Resource Spec Catalogue, Service Inventory, Resource Inventory, and OSOM (OpenSlice Service Orchestration and Management).</li> <li>Service Bus: This is the communication layer that facilitates interaction between the CRIDGE service and other OSL services.</li> <li>CRIDGE: CRIDGE acts as a bridge that converts CRDs (Custom Resource Definitions) to TMF (TM Forum) APIs and models. It enables the creation and management of Custom Resources (CRs) in the Kubernetes cluster.</li> <li> <p>K8s API: The Kubernetes API server, which is the central control point for managing the Kubernetes cluster. CRIDGE interacts with the K8s API to manage CRDs and CRs.</p> <p>CRD (Custom Resource Definition): A CRD is a way to define custom resources in Kubernetes cluster-wise. It allows the extension of Kubernetes API to create and manage user-defined resources. Example :</p> </li> </ul> <pre><code> apiVersion: apiextensions.k8s.io/v1\n kind: CustomResourceDefinition\n metadata:\n name: myresource.example.com\n</code></pre> <ul> <li>Namespaces: Kubernetes namespaces provide a way to partition resources within a cluster. The diagram shows that multiple namespaces (nsxx, nsyy, nsz) can be managed by CRIDGE.</li> </ul> <p>CR (Custom Resource): A CR is an instance of a CRD. It represents the actual custom resource that is managed within the Kubernetes cluster. Example shown in different namespaces:</p> <pre><code> apiVersion: example.com/v1\n kind: Myresource\n metadata:\n name: example_resource_1\n</code></pre> <p>In a nutchell:</p> <ul> <li>Various OSL services use the Service Bus to communicate with CRIDGE.</li> <li>CRIDGE converts requests towards Kubernetes API and vice-versa, facilitating the integration of custom resources with other OSL services.</li> <li>CRDs are defined and managed through the K8s API. The example CRD is named myresource.example.com.</li> <li>Deploying CRs in Namespaces: Custom resources defined by the CRD are created and managed within different namespaces in the Kubernetes cluster. Each namespace can have its own instances of the custom resources.<pre><code>> The example CRD myresource.example.com allows the creation of custom resources of type Myresource.\n> Instances of Myresource are created in various namespaces, each with unique names like example_resource_1.\n</code></pre> </li> </ul>"},{"location":"architecture/CRIDGE/CRIDGEforDevelopers/#handling-more-than-one-clusters","title":"Handling more than one clusters","text":"<p>A CRIDGE service is usually responsible for managing one cluster. In the following diagram we show how it can be used for managing multiple clusters:</p> <p></p> <p>We assume that there is an OSL Management cluster that OSL is installed. CRIDGE is also installed there if we would like to manage resources in the same management cluster. - Each CRIDGE service has for example its own configuration to connect to target cluster - Each CRIDGE can be installed either in the managed cluster or at the remote clusters. Connectivity is handled via the service bus - Important: Each CRIDGE has a different context and API endpoints. This is used to request CRDs on a different cluster</p> <p>A CRD has a globally unique name for example mycrd.example.com. So we need to somehow identify also the different cluster</p>"},{"location":"architecture/CRIDGE/CRIDGEforDevelopers/#awareness-for-crds-and-crs-in-cluster","title":"Awareness for CRDs and CRs in cluster","text":"<p>CRDs and CRs can appear (disappear) or change status at any time in a cluster. OSL Resource Inventory need to be aware of these events.</p> <p>The sync process is found in the code and explained by the following picture:</p> <p></p> <p>WatcherService is executed when the cridge service application starts (see onApplicationEvent). First things:</p> <ul> <li>KubernetesClientResource is a class that wraps fabric8\u2019s KubernetesClient<ul> <li>This fabric8 KubernetesClient is initialized from the kubeconf and default context of the machine that runs CRIDGE</li> </ul> </li> <li>On CRIDGE Start up we try to register this cluster and context to OSL catalogs.<ul> <li>See registerKubernetesClientInOSLResource method which registers the KubernetesContextDefinition in Resource Inventory as a LogicalResource via createOrUpdateResourceByNameCategoryVersion method</li> </ul> </li> <li>After the creation(or update) of this cluster as a Resource in OSL we proceed to create SharedIndexInformers for CustomResourceDefinition objects</li> <li>In this way CRIDGE is always aware of all CRDs and their CRs in the cluster, even if a CRD or CR is added/updated/deleted in the K8S cluster outside of OSL(CRIDGE)</li> <li>The SharedIndexInformer events notify CRIDGE, which is always aware of all CRDs and their CRs in the cluster, even if a CRD or CR is added/updated/deleted in the K8S cluster outside of OSL(CRIDGE)<ul> <li>NOTE: The ADD event is raised every time also we run CRIDGE. Therefore, on ADD we do the method to createORupdate resource specifications and resources</li> </ul> </li> <li>On ADD event:<ul> <li>The CRD is transformed to OSL Kubernetes domain model: method kubernetesClientResource.KubernetesCRD2OpensliceCRD</li> <li>Then the OSL Kubernetes domain model is:<ul> <li>transformed to Resource Specification and is stored to catalog (see createOrUpdateResourceSpecByNameCategoryVersion)</li> <li>Transformed to Resource and is stored to catalog (see createOrUpdateResourceByNameCategoryVersion)</li> </ul> </li> <li>Conceptually while a CRD is a new resource located in the Kubernetes cluster resource, it is transformed also as a Resource Specification (a high-level entity) which is ready to be reused as an entity to other scenarios. The same concept as in Kubernetes where a CRD is a definition ready to be used for instantiating resources of this CRD</li> <li>Then for this CRD a Watcher is added for all Resources of this Kind (fabric8\u2019s GenericKubernetesResource entity) </li> <li>When we have a newly added/updated/deleted resource of a certain CRD the method updateGenericKubernetesResourceInOSLCatalog is called for this object (fabric8\u2019s GenericKubernetesResource entity)</li> <li>We examine if the resource has label org.etsi.osl.resourceId<ul> <li>This label is added by OSOM during service orders to correlate K8S requested resources with resources in inventory</li> </ul> </li> <li>If the label exists, we update the resource by ID updateResourceById</li> <li>Else a resource is created in catalog</li> </ul> </li> </ul>"},{"location":"architecture/CRIDGE/CRIDGEforDevelopers/#deployment-of-a-new-cr-based-on-a-crd","title":"Deployment of a new CR based on a CRD","text":"<ul> <li>A message arrives to deploy a CR<ul> <li>The call examines if this CRIDGE service can handle the request (based on context and masterURL)</li> </ul> </li> <li>There are headers received and a crspec in json</li> <li>The crspec is unmarshaled as GenericKubernetesResource</li> <li>Headers are in format org.etsi.osl.*</li> <li>These headers are injected as labels <ul> <li>(see later in orchestration)</li> </ul> </li> <li>A namespace is created for this resource</li> <li>Watchers are created for this namespace for e.g. new secrets, config maps etc , so that they can be available back as resources to the Inventory of OSL (Note only Secrets for now are watched)</li> </ul>"},{"location":"architecture/CRIDGE/CRIDGEforDevelopers/#expose-crds-as-service-specifications-in-openslice-catalogs","title":"Expose CRDs as Service Specifications in OpenSlice catalogs","text":"<p>See ExposingKubernetesResources</p>"},{"location":"architecture/CRIDGE/CRIDGEforDevelopers/#service-orchestration-and-crdscrs","title":"Service Orchestration and CRDs/CRs","text":"<p>OSOM checks the presence of attribute _CR_SPEC at the RFS to make a request for a CR deployment</p> <ul> <li>_CR_SPEC is a JSON or YAML string that is used for the request<ul> <li>It is similar to what one will do with e.g. a kubectl apply</li> <li>There are tools to translate a yaml file to a json</li> </ul> </li> </ul> <p>LCM rules can be used to change attributes of this yaml/json file, before sending this for orchestration</p> <p>However, the following issue needs to be solved: ** How to map the CR lifecycle that is defined in the CRD with the TMF resource Lifecycle? ** - For this We introduced the following characteristics: _CR_CHECK_FIELD, _CR_CHECKVAL_STANDBY, _CR_CHECKVAL_ALARM, _CR_CHECKVAL_AVAILABLE, _CR_CHECKVAL_RESERVED, _CR_CHECKVAL_UNKNOWN, _CR_CHECKVAL_SUSPENDED</p> <p>OSOM sends to CRIDGE a message with the following information:</p> <ul> <li>currentContextCluster: current context of cluster </li> <li>clusterMasterURL: current master url of the cluster </li> <li>org.etsi.osl.serviceId: This is the related service id that the created resource has a reference </li> <li>org.etsi.osl.resourceId: This is the related resource id that the created CR will wrap and reference. </li> <li>org.etsi.osl.prefixName: we need to add a short prefix (default is cr) to various places. For example in K8s cannot start with a number </li> <li>org.etsi.osl.serviceOrderId: the related service order id of this deployment request </li> <li>org.etsi.osl.namespace: requested namespace name </li> <li>org.etsi.osl.statusCheckFieldName: The name of the field that is needed to be monitored in order to monitor the status of the service and translate it to TMF resource statys (RESERVED AVAILABLE, etc) </li> <li>org.etsi.osl.statusCheckValueStandby: The CR specific value (of the CheckFieldName) that needs to me mapped to the TMF resource state STANDBY (see org.etsi.osl.tmf.ri639.model.ResourceStatusType) </li> <li>org.etsi.osl.statusCheckValueAlarm: The CR specific value (of the CheckFieldName) that needs to me mapped to the TMF resource state ALARMS (see org.etsi.osl.tmf.ri639.model.ResourceStatusType) </li> <li>org.etsi.osl.statusCheckValueAvailable: The CR specific value (of the CheckFieldName) that needs to me mapped to the TMF resource state AVAILABLE (see org.etsi.osl.tmf.ri639.model.ResourceStatusType) </li> <li>org.etsi.osl.statusCheckValueReserved: The CR specific value (of the CheckFieldName) that needs to me mapped to the TMF resource state RESERVED (see org.etsi.osl.tmf.ri639.model.ResourceStatusType) </li> <li>org.etsi.osl.statusCheckValueUnknown: The CR specific value (of the CheckFieldName) that needs to me mapped to the TMF resource state UNKNOWN (see org.etsi.osl.tmf.ri639.model.ResourceStatusType) </li> <li> <p>org.etsi.osl.statusCheckValueSuspended: The CR specific value (of the CheckFieldName) that needs to me mapped to the TMF resource state SUSPENDED (see org.etsi.osl.tmf.ri639.model.ResourceStatusType) </p> </li> <li> <p>Parameters:</p> <ul> <li>aService reference to the service that the resource and the CR belongs to</li> <li>resourceCR reference the equivalent resource in TMF repo of the target CR. One to one mapping</li> <li>orderId related service order ID</li> <li>startDate start date of the deployment (not used currently)</li> <li>endDate end date of the deployment (not used currently)</li> <li>_CR_SPEC the spec that is sent to cridge (in json)</li> </ul> </li> <li> <p>Returns:</p> <ul> <li>a string response from cridge. It might return \"OK\" if everything is ok. \"SEE OTHER\" if there are multiple CRIDGEs then some other cridge will handle the request for the equivalent cluster. Any other response is handled as error</li> </ul> </li> <li> <p>CRIDGE receives the message and creates according to the labels the necessary CR</p> </li> <li>It monitors the created resource(s) in namespace (see the Sequence Diagram in previous images)</li> <li>It monitors and tries to figure out and map the Status of the CR to the TMF Status according to the provided org.etsi.osl.statusCheck* labels</li> <li>It sends to the message bus the current resource for creation or update to the TMF service inventory</li> </ul>"},{"location":"architecture/CRIDGE/CRIDGEforDevelopers/#probe-further","title":"Probe further","text":"<ul> <li>See examples of exposing operators via OpenSlice:<ul> <li>Exposing Kubernetes Operators as a Service : Offering \"Calculator as a Service\" through OpenSlice</li> </ul> </li> </ul>"},{"location":"contributing/developing/","title":"Developing","text":"<p>OpenSlice backend services are mainly implemented with Java 17 or above and Spring boot.</p> <p>OpenSlice uses various subsystems and depending on the module would you like to work, other subsystems must be present (you can disable them though in the code, e.g. at docker-compose.yaml file).</p> <p>To get the latest development branch:</p> <pre><code>wget https://labs.etsi.org/rep/osl/code/org.etsi.osl.main/-/raw/develop/compose/deploy.sh \nsudo ./deploy.sh develop #[or replace develop with other branch name]\n</code></pre> <p>You may follow the installation process, as described at \"develop\" tagged documentation.</p> <p>To work on a specific subsystem e.g. org.etsi.osl.tmf.api, you must:</p> <p>1a - Deploy only the core necessary subsystems through:</p> <pre><code>sudo docker compose --profile dev down;sudo docker compose --profile dev up -d --build\n</code></pre> <p>Note --profile dev that will only deploy the core dependency subsystems, instead of the whole OpenSlice.</p> <p>1b - Or alternatively, commend out the respective container from the docker-compose.yaml file, so as to deploy the whole OpenSlice, except the subsystem you want to work on, following the provided installation steps.</p> <p>2 - Clone the respective repository, e.g. https://labs.etsi.org/rep/osl/code/org.etsi.osl.tmf.api/-/tree/develop</p> <p>3 - Code :)</p>"},{"location":"contributing/developing/#general-requirements","title":"General requirements","text":"<ul> <li>Docker should be installed in your development environment</li> <li>Run the core subsystems (see above section)</li> </ul>"},{"location":"contributing/developing/#slack","title":"Slack","text":"<p>Feel free to join OpenSlice Slack for any development oriented questions.</p>"},{"location":"contributing/developing/#examples-of-developing-on-specific-subsystems","title":"Examples of developing on specific subsystems","text":""},{"location":"contributing/developing/#vnfnsd-catalog-management-and-nsd-deployment-api-service","title":"VNF/NSD Catalog Management and NSD Deployment API service","text":"<p>Clone the repository: https://labs.etsi.org/rep/osl/code/org.etsi.osl.portal.api/-/tree/develop</p> <p>Check the docker-compose.yml file. Default port is 13080. Check specifically the datasource username/password, server port.</p> <p>Make sure that the core subsystems are up and running.</p> <p>Execute it with </p> <pre><code>mvn spring-boot:run\n</code></pre> <p>For verification, Swagger API of the service is at <code>http://localhost:13000/osapi/swagger-ui/index.html</code>. </p> <p>There, you may try there various REST actions and authenticate via the OAuth server without the use of the UI.</p>"},{"location":"contributing/developing/#vnfnsd-catalog-management-and-nsd-deployment-web-ui-service","title":"VNF/NSD Catalog Management and NSD Deployment WEB UI service","text":"<p>The Web UI is written in AngularJS.</p> <p>Clone the repository: https://labs.etsi.org/rep/osl/code/org.etsi.osl.portal.web/-/tree/develop</p> <p>By default the project org.etsi.osl.portal.api exposes the folder ../org.etsi.osl.portal.web/src/ in a folder testweb (Check class MvcConfig.java in org.etsi.osl.portal.api) for development. (In production nginx is used). Point your browser to <code>http://localhost:13000/osapi/testweb/index.html/</code></p>"},{"location":"contributing/developing/#versionrelease-management","title":"Version/release management","text":"<p>Check this nice article on how we develop and release versions.</p> <p>https://nvie.com/posts/a-successful-git-branching-model/</p> <p>We develop in the develop branch and follow a issue driven development model.</p>"},{"location":"contributing/developing/#wishlist","title":"Wishlist","text":"<p>Check also our wishlist of new features. You can add your own.</p> <p>See Wishlist.</p>"},{"location":"contributing/wishlist/","title":"TMF API","text":"<ul> <li>RBAC of API endpoints</li> <li>TMF Ticketing API support</li> <li>TMF Product</li> <li>HATEOAS integration</li> <li>Select Specs that can be exposed to partners (maybe with a characteristic?)</li> </ul>"},{"location":"contributing/wishlist/#resource-management","title":"resource management","text":"<ul> <li>Resource Activation and Configuration API TMF702 (NEW) (https://projects.tmforum.org/wiki/pages/viewpage.action?pageId=128855518)</li> </ul>"},{"location":"contributing/wishlist/#tmf-web","title":"TMF WEB","text":""},{"location":"contributing/wishlist/#osom","title":"OSOM","text":"<ul> <li>Actions on service order item and acknowledge order status will define the lifecycle</li> <li>action shutdown on specific date for service order</li> <li>action edit on service order item</li> </ul>"},{"location":"contributing/wishlist/#dynamic-attribute-transformation","title":"Dynamic attribute transformation","text":"<ul> <li>DTM decision tables support per Service Specification</li> <li>Schedule Termination of completed order on running services</li> </ul>"},{"location":"contributing/wishlist/#nfvo-connectivity","title":"NFVO connectivity","text":""},{"location":"contributing/wishlist/#osm-client","title":"OSM Client","text":"<ul> <li>VNF/NSD config params Day 2</li> <li>NSD Lifcecylce</li> <li>NST support</li> </ul>"},{"location":"contributing/wishlist/#nfv-api","title":"NFV API","text":""},{"location":"contributing/wishlist/#nfv-web","title":"NFV WEB","text":""},{"location":"contributing/wishlist/#3rd-party-connectivity","title":"3rd party connectivity","text":""},{"location":"contributing/wishlist/#flowone-connector","title":"FlowOne connector","text":""},{"location":"contributing/wishlist/#openstack-connector","title":"Openstack connector","text":""},{"location":"contributing/wishlist/#kubernetes-connector","title":"Kubernetes connector","text":""},{"location":"contributing/wishlist/#centrallog","title":"CentralLog","text":"<ul> <li>Events from TMF to be written to Central Log</li> </ul>"},{"location":"contributing/wishlist/#authentication","title":"Authentication","text":""},{"location":"naas/exposed_apis/","title":"Supported TMFORUM exposed APIs","text":"Endpoint Title Description Version /tmf-api/serviceCatalogManagement/v4 633 Service Catalog Management Provides a catalog of services. 4.0.0 /tmf-api/productCatalogManagement/v4/ 620 Product Catalog Management Provides a catalog of products. 4.0.0 /tmf-api/productOrderingManagement/v4/ v622 Product Ordering Provides a standardized mechanism for placing a product order. 4.0.0 /tmf-api/resourceCatalogManagement/v4 634 Resource Catalog Management This is Swagger UI environment generated for the TMF Resource Catalog Management specification. 4.0.0 /tmf-api/serviceInventory/v4 638 Service Inventory Management Provides a consistent/standardized mechanism to query and manipulate the Service inventory. 4.0.0 /tmf-api/serviceOrdering/v4 641 API ServiceOrdering Provides a standardized mechanism for managing Service Order. 4.0.0 /tmf-api/serviceQualityManagement/v2 657 Service Quality Management This is Swagger UI environment generated for the TMF Service Quality Management specification. 2.0.0 /tmf-api/partyRoleManagement/v4/ 669 Party Role Management This is Swagger UI environment generated for the TMF Party Role Management specification. 4.0.0 /tmf-api/party/v4/organization 632 API Party Provides standardized mechanism for party management such as creation, update, retrieval, deletion and notification of events. 4.0.0 /tmf-api/agreementManagement/v2/ 651 Agreement Management T his is Swagger UI environment generated for the TMF Agreement Management specification. 2.0.0 /tmf-api/resourceOrderingManagement/v4 652 Resource Order Management-v4.0.0 This is Swagger UI environment generated for the TMF 652-Resource Order Management-v4.0.0 specification. 4.0.0 /tmf-api/accountManagement/v4 666 Account Management This is Swagger UI environment generated for the TMF Account Management specification. 4.0.0 /tmf-api/customerManagement/v4 629 Customer Management TMF Customer Management 4.0.0 /tmf-api/userinfo 691 Federated ID TMF Federated ID 1.0.0 /tmf-api/ServiceActivationAndConfiguration/v3/ 640 API Service Activation and Configuration Provides the ability to activate and configure Services. 3.0.0 /tmf-api/alarmManagement/v4/ 642 API Alarm 4.0.0 /tmf-api/serviceTestManagement/v4 653 Service Test Management Provides the ability to manage tests of provisioned Services. 4.0.0 /tmf-api/resourceInventoryManagement/v4 639 API Resource Inventory Management Provides the ability to manage Resources. 4.0.0 /tmf-api/lcmrulesmanagement/v1/ LCM Rules Custom API environment for LCM Rules 1.0.0 /tmf-api/resourcePoolManagement/v1 685 Resource Pool Management Resources that can be reserved are only in one pool. 1.0.0 /tmf-api/geographicSiteManagement/v5 674 Geographic Site Management Covers the operations to manage sites that can be associated with entities 5.0.0"},{"location":"naas/gst_to_tmf/","title":"Generic Slice Template as a Service Specification","text":""},{"location":"naas/gst_to_tmf/#intended-audience-service-designers","title":"Intended Audience: Service Designers","text":"<p>GSMA Generic Slice Template (GST) Defines customer-oriented service requirements, E.g. Availability, Area of service, delay tolerance, etc. and attempts to narrow down the gap between (network) service customers and vendors</p> <p>Moreove it Proposes standardized Network Slice Templates (NESTs) to target specific use cases</p> <p>In OpenSlice we made an effort and translated the GST to a Service Specification model. So Service Designers can use it as a template to design a new Service.</p> <p>The image illustrates the relationship between the GSMA Generic Slice Template (GST), TM Forum Service Specification, and how they are utilized within OpenSlice to offer network services.</p> <p></p> <p>The GST to TM Forum via OpenSlice:</p> <pre><code> * GST Attributes List: A comprehensive list of service attributes, such as availability, delay tolerance, downlink throughput, energy efficiency, isolation level, mission-critical support, and many others.\n * TMF Service Specification: Demonstrates the transformation of GST attributes into a TM Forum service specification, showing JSON code snippets that define service parameters.\n * Offered Service based on GST: Represents the final offered service, an example of a GST-based service shown as an entry in a catalog, ready to be consumed by customers.\n</code></pre> <p>What was our flow:</p> <pre><code>* Started with defining service requirements and attributes using GST.\n* Translated these GST attributes into a formal TM Forum service specification.\n* Service Offering in OpenSlice: The service specification is then used to create and offer a specific network service within OpenSlice, available for customer selection and deployment.\n</code></pre>"},{"location":"naas/gst_to_tmf/#probe-further","title":"Probe further","text":"<p>See v9 of the GST model in GSMA here</p>"},{"location":"naas/introduction/","title":"Network as a Service (NaaS)","text":"<p>This section describes some core concepts for Delivering Network as a Service in OpenSlice. There are many articles and reports on the subject like:</p> <ul> <li>TMF909 API Suite Specification for NaaS</li> <li>TMF926A Connectivity_as_a_Service </li> <li>TMF931-Open_Gateway_Onboarding_and_Ordering_Component_Suite</li> <li>GSMA Open Gatewy initiative</li> </ul> <p>In general Network as a Service (NaaS) is a service model that allows users to consume network infrastructure and services , similar to how they would consume other cloud services like Software as a Service (SaaS) or Infrastructure as a Service (IaaS). NaaS abstracts the complexity of managing physical network infrastructure, providing users with virtualized network resources that can be dynamically allocated and managed through software.</p>"},{"location":"naas/introduction/#openslice-and-naas","title":"OpenSlice and NaaS","text":"<p>OpenSlice makes extensive use of TMFORUM's models and APIs. Therefore if one is familiar with TMF APIs the terminology and ideas are the same.</p> <p>To deliver NaaS we need to incorporate various APIs (see TMF909 API Suite Specification for NaaS). OpenSlice implements various TMF APIs to deliver NaaS and support the lifecycle functions required to manage the network capabilities exposed as Network as a Service and managed by operational domains.</p>"},{"location":"naas/introduction/#probe-further","title":"Probe further","text":"<ul> <li>For a complete list of supported APIs, see Supported APIs</li> <li>Check the defined user roles of OpenSlice in our Terminology</li> </ul>"},{"location":"naas/lcm_intro/","title":"Service Lifecycle management","text":"<ul> <li>Lifecycle Management: The orchestration framework handles updates, scaling, and any necessary modifications throughout the service lifecycle.</li> </ul>"},{"location":"naas/resource_catalog/","title":"OpenSlice Resource Catalog:","text":"<pre><code>* Resource Specifications: Defines the underlying resources required to deliver services, such as network components, servers, and software.\n* Resource Availability: Tracks the availability and status of resources to ensure efficient service delivery.\n</code></pre>"},{"location":"naas/service_catalog/","title":"OpenSlice Service Catalogs","text":"<p>OpenSlice offers complete management of Service Catalogs.</p>"},{"location":"naas/service_catalog/#intended-audience-service-designers-openslice-administrators-users","title":"Intended Audience: Service Designers, OpenSlice administrators, Users","text":"<p>OpenSlice offers complete management of Service Catalogs which offer to end users:</p> <ul> <li>Service categories: Lists the available services, including their specifications and performance metrics.</li> <li>Service Bundles: Combines multiple services into a single offering to provide added value to customers.</li> </ul> <p>Service Catalogs contain Service Specifications (organized in Service Categories) exposed to users for Service Orders.</p>"},{"location":"naas/service_catalog/#ui-management","title":"UI management","text":"<p>In the UI this looks like the following. Service catalogs and categories exposed in Service marketplace. </p> <p>In the menu the administrator can manage the Service Catalogs and Categories.</p> <p></p>"},{"location":"naas/service_catalog/#api-exposed","title":"API exposed","text":"<p>When installing OpenSlice the API endpoints can be browsed at: </p> <pre><code>[YOURDOMAIN]/tmf-api/swagger-ui/index.html?urls.primaryName=tmf-api-633-ServiceCatalogManagement-v4.0.0\n\nendpoint examples:\n\n/serviceCatalogManagement/v4/serviceCatalog List or find ServiceCatalog objects\n/serviceCatalogManagement/v4/serviceCategory List or find ServiceCategory objects\n\n</code></pre>"},{"location":"naas/service_catalog/#example-use-case","title":"Example Use Case","text":"<p>Scenario: A service provider wants to offer a new managed XXXX service to enterprise customers.</p> <ul> <li>Service Definition: Service Template thus create a template for the XXXX service, including specifications for bandwidth, network features, and performance metrics.</li> <li>Service Catalog Integration: Add to Service Catalog the XXXX service with all relevant details.</li> <li>Service Delivery/Order: Provision Service by Using the orchestration system to provision and configure the XXXX service based on customer orders.</li> </ul>"},{"location":"naas/service_catalog/#probe-further","title":"Probe further","text":"<ul> <li>Read the model of Service Catalogs in TMF TMF633 Service Catalog API User Guide v4.0.0</li> <li>Check a demo of the API here</li> <li>Check a demo of the Catalog and Categories here</li> </ul>"},{"location":"naas/service_inventory/","title":"Service Inventory","text":"<p>Service Inventory contains refences to running services that realize a Service Order</p>"},{"location":"naas/service_inventory/#intended-audience-service-designers-openslice-administrators-users","title":"Intended Audience: Service Designers, OpenSlice administrators, Users","text":"<p>The Service Inventory is a repository that maintains detailed records of all active services and the underlying resources that support them. It acts as a central repository, tracking the lifecycle of each service from provisioning to decommissioning, and includes references to the specific virtual and physical resources that realize the service, such as servers, network components, storage, and software instances. </p> <p>This inventory enables real-time visibility into the status, configuration, and dependencies of each service, facilitating effective management, troubleshooting, and optimization. </p> <p>By providing a view of the active services, the Service Inventory includes services/resource allocation, and ensures that services are delivered in alignment with the inital requst. </p>"},{"location":"naas/service_inventory/#ui-management","title":"UI management","text":"<p>Through the menu and dedicated forms the administrator can manage the Service Inventory and any active Services (reconfigure or terminate).Various examples in this document will guide you to the usage and the management of the Services in Service Inventory.</p>"},{"location":"naas/service_inventory/#api-exposed","title":"API exposed","text":"<p>When installing OpenSlice the API endpoints can be browsed at: </p> <pre><code>[YOURDOMAIN]/tmf-api/swagger-ui/index.html?urls.primaryName=tmf-api-638-ServiceInventoryManagement-v4.0.0\n</code></pre> <p>endpoint examples:</p> <p>/serviceInventory/v4/service List or find Service objects</p>"},{"location":"naas/service_inventory/#probe-further","title":"Probe further","text":"<ul> <li>See Ordering Services from catalogs</li> <li>See Service Design</li> </ul>"},{"location":"naas/service_ordering/","title":"Service Ordering","text":"<p>Customer Facing Service Specifications - or also CFSSpec (organized in Service Categories) are exposed to users for Service Orders.</p>"},{"location":"naas/service_ordering/#intended-audience-service-designers-openslice-administrators","title":"Intended Audience: Service Designers, OpenSlice administrators","text":"<p>The Service Order process is a structured sequence of steps initiated by a customer's Service Order request for a specific service, aimed at delivering and activating the desired service or services (if it is a service bunlde), as well as its related services. It begins with the customer submitting a service request through OpenSlice Services portal or the Service Order API, specifying the necessary details such as service specification, configurations, and any specific requirements.</p> <p>The request is then validated and verified for completeness and eligibility by an administrator which marks the Service Order as ACKNOWLEDGED otherwise it rejects it. </p> <p>Once ACKNOWLEDGED, the service order is processed by OpenSlice orchestration system (OSOM), which schedules/automates the provisioning of the required resources and configurations, coordinating across various components such as MANO controlers for virtual network functions (VNFs), or Containerized controllers or any 3rd party controllers or services or even physical infrastructure. The OpenSlice orchestration system ensures that all dependencies are managed and that the service is correctly configured.</p> <p>After provisioning, the service is activated and handed over to the customer, . This end-to-end process ensures a seamless, efficient, and automated delivery of services, enhancing customer satisfaction and operational efficiency.</p> <p>Ongoing monitoring and other actions can be performed by the Life Cycle management rules</p> <p>Future developments: In future releases it might be possible the ongoing monitoring and support provided to ensure continuous performance and reliability. The service could undergoe a series of tests to ensure it meets the specified performance metrics and SLAs before delivering</p>"},{"location":"naas/service_ordering/#ui-management","title":"UI management","text":"<p>Through the menu and dedicated forms the administrator can manage the Service Orders. Various examples in this document will guide you to the usage and the management of the Service Orders.</p>"},{"location":"naas/service_ordering/#api-exposed","title":"API exposed","text":"<p>When installing OpenSlice the API endpoints can be browsed at: </p> <pre><code>[YOURDOMAIN]/tmf-api/swagger-ui/index.html?urls.primaryName=tmf-api-641-ServiceOrdering-v4.0.0\n</code></pre> <p>endpoint examples:</p> <p>/serviceOrdering/v4/serviceOrder List or find ServiceOrder objects</p>"},{"location":"naas/service_ordering/#probe-further","title":"Probe further","text":"<ul> <li>See Ordering Services from catalogs</li> <li>See Service Design</li> </ul>"},{"location":"naas/service_spec/","title":"OpenSlice Service Specification","text":"<p>OpenSlice offers complete management of Service Specifications.</p>"},{"location":"naas/service_spec/#intended-audience-service-designers","title":"Intended Audience: Service Designers","text":"<p>Service Specification is an entity that describes a service offering. There are two types of Service Specifications:</p> <ul> <li>Resource Facing Service Specification</li> <li>Customer Facing Service Specification</li> </ul>"},{"location":"naas/service_spec/#resource-facing-service-specification","title":"Resource Facing Service Specification","text":"<p>Is a Service that It exposes a resource Specification as a Service. (For example expose a Network Service Descriptor as a Service)</p>"},{"location":"naas/service_spec/#customer-facing-service-specification","title":"Customer Facing Service Specification","text":"<p>Customer Facing Service Specifications - or also CFSSpec (organized in Service Categories) are exposed to users for Service Orders. Usually it exposes other CFSSpec(as a Service Bundle) or other RFSSpecs</p>"},{"location":"naas/service_spec/#definition","title":"Definition","text":"<p>Usually a Service Specification has the following aspects:</p> <ul> <li>Name, Description, Version</li> <li>Marked as a Service Bundle: Combines multiple services into a single offering to provide added value to customers.</li> <li>if is is a Bundle then you must add Related Service Specifications</li> <li>If it is a Resource Facing Service Specification has multiple related Resource Facing Service Specifications</li> <li>Characteristics: a list of service characteristics and their type (TEXT, INTEGER, etc)</li> <li>Also they can be exposed as \"Configurable\" so to allow to end-users during the Service Order to select or type values</li> <li>A logo, displayed if needed in the Service Marketplace</li> <li>Any attachments that further help the user</li> <li>Life Cycle Rules that determine the behavior of the Service and instrument the Service Orchestrator. More on Life Cycle Rules here</li> </ul> <p>Service Designers can create a Service Specification from scratch or use some templates:</p> <pre><code>* Create a Service based from a Network Service Descriptor (NSD)\n* Create a Service based on a Kubernetes Operator\n* Create a Service based on the GSMA GST - Generic Slice Template\n</code></pre>"},{"location":"naas/service_spec/#ui-management","title":"UI management","text":"<p>In the UI this looks like the following.</p> <p>Through the menu and dedicated forms the administrator can manage the Service Specifications. Various examples in this document will guide you to the usage and the design of the services.</p>"},{"location":"naas/service_spec/#api-exposed","title":"API exposed","text":"<p>When installing OpenSlice the API endpoints can be browsed at: </p> <pre><code>[YOURDOMAIN]/tmf-api/swagger-ui/index.html?urls.primaryName=tmf-api-633-ServiceCatalogManagement-v4.0.0\n</code></pre> <p>endpoint examples:</p> <p>/serviceCatalogManagement/v4/serviceSpecification List or find ServiceSpecification objects</p>"},{"location":"naas/service_spec/#example-use-case","title":"Example Use Case","text":"<p>Scenario: A service provider wants to offer a new managed XXXX service to enterprise customers.</p> <ul> <li>Service Definition: Create a service specification template for the XXXX service, including specifications for bandwidth, network features, and performance metrics.</li> </ul>"},{"location":"naas/service_spec/#probe-further","title":"Probe further","text":"<ul> <li>Read the model of Service Catalogs in TMF TMF633 Service Catalog API User Guide v4.0.0</li> <li>Check a demo of the API here</li> <li>Check a demo of the Service Specifications in Catalog and Categories here (You need to login - see main guide page)</li> <li>Check the GSMA GST</li> </ul>"},{"location":"naas/so_intro/","title":"Service Orchestration","text":"<ul> <li>Service Orchestration: The orchestration engine evaluates the request, determines the necessary resources, and initiates the automated workflows.It interacts with underlying controller components (e.g. 5G Core, Radios, Containerized controllers, NFV, SDN controllers ) to provision and configure the required network functions and connectivity.</li> </ul>"},{"location":"naas/so_intro/#intended-audience-service-designers","title":"Intended Audience: Service Designers","text":"<p>OpenSlice end-to-end (E2E) service orchestration framework is designed to manage and automate the entire lifecycle of services across multiple domains and technologies. For delivering, Network as a Service (NaaS) OpenSlice automates and manages the entire lifecycle of network services, from provisioning to monitoring and decommissioning, while ensuring seamless integration, operation, and delivery of services from the initial request to the final delivery, spanning all involved components and layers.</p> <p>This section provides an overview of the Service Orchestration process</p>"},{"location":"naas/nfv/nfvservices/","title":"NFV Services","text":"<p>NFV Services are managed through a dedicate UI the NFV portal (eg http://portal.openslice.io/nfvportal)</p> <p>Users are able through this portal to manage their NFV artifacts towards the NFVO, ( for example onboard VNFs and NSDs to a target OSM)</p> <p>Openslice NFV Services target to accommodate the following envisaged user roles. All users are assumed to be Authenticated:</p> <ul> <li>NFV developer: This role is responsible to upload VNF and NSD Descriptors in the Openslice services towards NFVO like OSM</li> <li>Services administrator: This role represents the user that are responsible for maintenance of the Openslice services</li> </ul> <p>(obsolete: )</p> <ul> <li>Testbed provider: This role represents users that are responsible for testbed administration, configuration, integration, adaptation, support, etc</li> <li>Experimenter: This role represents the user that will utilize our services and tools to deploy an experiment. That is the experiment description in terms of e.g.: NSD (Network Service Descriptor) or TOSCA Specification (in future versions)</li> </ul> <p>Finally an anonymous user role exists who has some really simple usage scenarios (e.g. signup through the portal)</p> <p>During the onboarding process the following occurs:</p> <p>\u2022 A NFV developer submits a NFV archive (VNF or NSD) (he can later manage if needed some metadata) \u2022 The administrator can manage the NFV artifact (e.g. edit it) \u2022 The administrator On-Boards the NFV artifact to the target MANO \u2022 The administrator can optionally mark the NFV: o As public in order to be publicly visible by all portal users o As Certified which means this is certified by a certain entity</p>"},{"location":"naas/nfv/nfvservices/#request-a-new-nsd-deployment-this-is-different-in-comparison-to-services","title":"Request a new NSD deployment (this is different in comparison to Services)","text":"<p>A developer requests a new network service deployment (which NSD, tentative dates, target infrastructure, etc.). The request is marked as UNDER_REVIEW</p> <ul> <li>The administrator is notified about the new request and he has the following options:</li> <li>Schedule the deployment for the requested dates or propose other dates. The request is marked as SCHEDULED</li> <li>Reject the request for some reason. The Request is marked as REJECTED</li> <li>Deploy the request to target VIM(s). The Request is marked as RUNNING</li> <li>Finalize the deployment and release resources. The Request is marked as COMPLETED</li> <li>every change of the request-lifecycle the experimenter is notified.</li> </ul>"},{"location":"service_design/intro/","title":"Service Design in OpenSlice","text":"<p>This section offers details on how to design Service Specifications and expose them in Service Catalogs</p>"},{"location":"service_design/intro/#intended-audience-service-designers","title":"Intended Audience: Service Designers","text":"<p>Service Designers create detailed service specifications, which are then managed and exposed in service catalogs. These services are integrated into OpenSlice E2E service orchestration framework to automate and optimize the delivery of network services.</p> <p>OpenSlice can be used to design service specifications for various services, even not networking related services. Here we cover how service designers can expose services related to the NFV world and the containerized world.</p>"},{"location":"service_design/intro/#probe-further","title":"Probe further","text":"<ul> <li>Design and expose services based on containerized resources via the Kubernetes Operator pattern</li> <li>Design and expose services based on NFV artifacts</li> </ul>"},{"location":"service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/","title":"Exposing Kubernetes Operators as a Service : Offering \"Calculator as a Service\" through OpenSlice","text":""},{"location":"service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/#intended-audience-service-designers","title":"Intended Audience: Service Designers","text":"<p>To illustrate the powerful concept of Kubernetes operators and how they can be utilized to offer a service through OpenSlice, let's provide an example of a \"Calculator as a Service.\" </p> <p>This example will demonstrate the flexibility and capabilities of Kubernetes operators in managing custom resources and automating operational tasks.</p>"},{"location":"service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/#offering-calculator-as-a-service-through-openslice","title":"Offering \"Calculator as a Service\" through OpenSlice","text":"<ul> <li>We have a service that can accept two integers and an action (SUM, SUB, etc) and returns a result</li> <li>We would like to offer it as a Service through OpenSlice</li> <li>So when a user orders it with some initial parameters, OpenSlice will create it and return the result</li> <li>Also while the service is active, we can do further calculations, until we destroy it.</li> </ul> <p>Assume the following simple CRD of a calculator model accepting two params (spec section) and an action and returning a result (status section)</p> <p>The controller (the calculator code) is implemented in any language and is installed in a Kubernetes cluster</p> <pre><code>\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n name: mycalculators.examples.osl.etsi.org\nspec:\n group: examples.osl.etsi.org\n names:\n kind: MyCalculator\n plural: mycalculators\n singular: mycalculator\n scope: Namespaced\n versions:\n - name: v1alpha1\n schema:\n openAPIV3Schema:\n properties:\n spec:\n properties:\n parama:\n type: integer\n paramb:\n type: integer\n action:\n type: string\n type: object\n status:\n properties:\n result:\n type: integer\n status:\n type: string\n type: object\n type: object\n served: true\n storage: true\n subresources:\n status: {}\n</code></pre> <p>Request to the cluster (through e.g. kubectl apply)</p> <pre><code>apiVersion: examples.osl.etsi.org/v1alpha1\nkind: MyCalculator\nmetadata:\n name: mycalculator.examples.osl.etsi.org\nspec:\n parama: 170\n paramb: 180\n action: 'SUM'\n\n</code></pre> <p>Response</p> <pre><code>apiVersion: examples.osl.etsi.org/v1alpha1\nkind: MyCalculator\nmetadata:\n\u00a0 creationTimestamp: '2023-12-05T12:26:07Z\u2019\n\n<snip>\n\nstatus:\n\u00a0 result: 350\n\u00a0 status: CALCULATED\nspec:\n\u00a0 action: SUM\n\u00a0 parama: 170\n\u00a0 paramb: 180\n\n</code></pre> <p>To perform this through OpenSlice as a Service Specification ready to be ordered we need to do the following:</p>"},{"location":"service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/#crd-is-saved-automatically-as-resource-specification","title":"CRD is saved automatically as Resource Specification","text":"<p>As soon as the CRD is deployed in the cluster (e.g. by your admin via kubctl or via any installation through the internet) it is automatically transformed and is available in OpenSlice catalogs as a Resource Specification.</p> <ul> <li>See also the fully qualified name of the resource specification. <ul> <li>MyCalculator@examples.osl.etsi.org/v1alpha1@docker-desktop@https://kubernetes.docker.internal:6443/</li> <li>The resource specification name is quite unique, so you can install the CRD in many clusters around the internet. Each CRD on each cluster will appear here, for example:<ul> <li>MyCalculator@examples.osl.etsi.org/v1alpha1@default_cluster@https://10.10.10.8:6443/</li> <li>MyCalculator@examples.osl.etsi.org/v1alpha1@edge1_cluster@https://172.16.10.10:6443/</li> </ul> </li> <li>Having this OpenSlice can manage resources in multiple clusters</li> </ul> </li> </ul> <p></p> <p>See also the detailed characteristics. See how OpenSlice makes all characteristics automatically flat and expanded with key-value style</p> <p></p>"},{"location":"service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/#expose-to-users","title":"Expose to Users","text":""},{"location":"service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/#start-by-creating-a-resourcefacingservicespecification","title":"Start by Creating a ResourceFacingServiceSpecification","text":"<p>From the UI menu create a new Service Specification</p> <p></p> <p></p>"},{"location":"service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/#creation-of-crd-related-characteristics","title":"Creation of CRD-related characteristics","text":"<ul> <li>We need now to adjust some characteristics of this CRD as Resource Specification.</li> <li>OpenSlice transalted automatically the CRD spec in a flat list of characteristics.So the \"spec\" section from the original yaml for example, is now unfold into: spec, spec.parama, spec.paramb, etc. the same for \"status\" object</li> <li> <p>We need to make OpenSlice aware of when the service will be active. </p> <ul> <li>So we go to characteristic _CR_CHECK_FIELD and we define that the field that shows the status of the service is the characteristic \"status.status\" (is a text field) </li> <li>Then we go to _CR_CHECKVAL_AVAILABLE and we define the value CALCULATED, which signals the following: When the characteristic \"status.status\" has the value \"CALCULATED\" then OpenSlice will mark the underlying service as \"ACTIVE\"</li> <li>We need also to define the yaml file that OpenSLice will use to create the new resource in the kubernetes cluster</li> <li>We insert the YAML in the characteristic _CR_SPEC</li> </ul> <p>the _CR_SPEC is: </p> </li> </ul> <pre><code>apiVersion: examples.osl.etsi.org/v1alpha1\nkind: MyCalculator\nmetadata:\n name: mycalculator.examples.osl.etsi.org\nspec:\n parama: 170\n paramb: 180\n action: 'SUM'\n\n</code></pre> <p></p> <p>However the values are fixed. How do we allow a user to pass parameters through OpenSlice</p>"},{"location":"service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/#expose-in-catalog","title":"Expose in Catalog","text":"<p>Create a new CustomerFacingServiceSpecification</p> <pre><code>- Go to the menu Service Specification>New Service Specification\n- Create a service My Calulator and mark it as a Bundle\n- Go to Service Specification Relationships and add MyCalculatorRFS\n- The service will be automatically transformed to a \"CustomerFacingServiceSpecification\"\n- Add the following characteristics as the image shows:\n</code></pre> <p></p>"},{"location":"service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/#allow-users-to-pass-new-values-through-openslice","title":"Allow users to pass new values through OpenSlice","text":"<p>We need to Create LCM rules in CustomerFacingServiceSpecification:</p> <pre><code>- The goal of the rules is to allow the user to pass parameters to the actual resource towards the cluster.\n- we will create one rule that will pass the parameters just before creating the service (PRE_PROVISION phase)\n- we will create one rule that will pass the parameters while the service is active (SUPERVISION phase)\n- The rules will be the same\n</code></pre> <p></p> <p>If we see one rule it will look like the following:</p> <p></p> <ul> <li>We need to change the _CR_SPEC characteristic of the referenced ResourceFacingServiceSpecification</li> <li>First bring a block from Service>Relationships>Service Refs and drop the \"Service MyCalculatorRFS\" block</li> <li>Then add a list block from Lists</li> <li>Then add the block that modifies a referenced characteristic from Service>Relationships>Service Refs the block \"Set value to characteristic of a Referenced Service\"</li> <li>Add a block for text _CR_SPEC </li> <li>We use a block that changes a String according to variables Text>\"A formatted text replacing variables from List\"</li> <li>See that we have as Input string the YAML string lines<ul> <li>see that parama, paramb has a %d (they accept integers), action is %s (accepts a string)</li> <li>See that the variables tha will replace the %d, %d and %s are an list<ul> <li>the first %d will be replaced with the value from characteristic spec.parama</li> <li>the second %d will be replaced with the value from characteristic spec.paramb</li> <li>the %s will be replaced with the value from characteristic spec.action</li> </ul> </li> </ul> </li> </ul> <p>If we see the SUPERVISION rule it will look like the following:</p> <ul> <li>It contains also the Result field, which takes the value from the referenced service</li> <li>Add a block for the Result field from Service>Number blocks</li> <li>Add a str to int block from Number blocks</li> <li>Add Service>Relationships>Service Refs and drop the input block [Service MyCalculatorRFS] \"Get Service details from current context running service\" and select from the drop down the \"serviceCharacteristicValue\"</li> <li>Add as name the \"status.result\" </li> </ul> <p></p> <p></p> <p>Expose it then to a catalogue for orders through the Service Categories and Service Catalogs</p> <p></p>"},{"location":"service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/#order-the-service","title":"Order the Service","text":"<p>When a user orders the service, it will look like this:</p> <p></p> <ul> <li>After the Service Order we have 2 services in service inventory on CFS and on RFS. Both have references to values</li> <li>OpenSlice (via CRIDGE service) updates the Resource in Resource Inventory and OSOM updates the Services in Service Inventory</li> <li>The Actual resources are running in the Kubernetes cluster managed by OpenSlice</li> <li>The result is in the characteristic status.result of the running service</li> </ul> <p></p> <p></p>"},{"location":"service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/#modify-the-running-service","title":"Modify the running service","text":"<p>The user can modify the service</p> <p></p> <ul> <li>After a while the update is applied to the cluster, the controller will pick up the resource update and patch the resource</li> <li>OpenSlice (via CRIDGE service) updates the Resource in Resource Inventory and OSOM updates the Services in Service Inventory</li> <li>The result will be available to the respective characteristic \"Result\" after a few seconds, as need to go through various steps (OpenSlice orchestrator, down to kubernetes, to Calculator controller and back)</li> </ul> <p></p>"},{"location":"service_design/kubernetes/ExposingKubernetesResources/","title":"Expose and manage Kubernetes Custom Resource Definitions (Operators) in a Kubernetes Cluster","text":"<p>OpenSlice is capable of exposing Kubernetes Resources and Definitions as Service Specifications</p>"},{"location":"service_design/kubernetes/ExposingKubernetesResources/#intended-audience-service-designers","title":"Intended Audience: Service Designers","text":"<p>Kubernetes is an orchestration system for automating software deployment, scaling, and management. One can interact though the Kubernetes API and it has a set of objects ready for use out of the box. Custom Resource Definitions (CRDs) is a way that allows to manage things other than Kubernetes itself and allows to create our own objects The use of CRDs makes the possibilities of Kubernetes management almost limitless. You can extend the base Kubernetes API with any object you like using CRDs.</p> <p>By allowing the design and lifecycle management of services/resources that expose CRDs/CRs in a Kubernetes cluster via the TMF APIs, OSL can be used in many complex scenarios now involing resources from multiple domains.</p> <ol> <li> <p>OpenSlice is capable to:</p> <ul> <li>Create and manage Custom Resources (CRs) using installed CRDs on a target Kubernetes cluster.</li> <li>Facilitate complex orchestration scenarios by wrapping Kubernetes APIs as TMF APIs and models.</li> <li>Handles connectivity to a Kubernetes cluster and manages the lifecycle of CRDs</li> <li>Wraps the Kubernetes API, Receives and provides resources towards other OpenSlice services via the service bus</li> </ul> </li> <li> <p>Enabling Loose Coupling and Orchestration</p> <ul> <li>Language Flexibility: Developers can write CRDs in any language and expose them via the Kubernetes APIs. OSL will reuse these CRDs, enhancing flexibility and integration capabilities.</li> <li>Familiar Deployment: Developers can create and deploy applications using familiar tools such as Helm charts, simplifying the process and reducing the learning curve.</li> </ul> </li> <li> <p>Ecosystem Reusability</p> <ul> <li>OpenSlice capitalizes on the extensive Kubernetes ecosystem, particularly focusing on operators (CRDs).</li> <li>Key repositories and hubs such as artifacthub.io and Operatorhub.io can be utilized for finding and deploying operators.</li> </ul> </li> <li> <p>Service Catalog Exposure and Deployment</p> <ul> <li>OpenSlice can expose CRs in service catalogs, facilitating their deployment in complex scenarios.</li> <li>These scenarios may include service bundles that involve multiple systems, such as RAN controllers or other Kubernetes clusters, providing a robust and versatile deployment framework.</li> </ul> </li> </ol>"},{"location":"service_design/kubernetes/ExposingKubernetesResources/#approach","title":"Approach","text":"<p>OpenSlice in general is responible for exposing service specifications which are ready to be ordered and orchestrated, through tmforum Open APIs as defined in the OSL Service Spec Catalog. Usually for a service specification a corresponding (one or more) resource specification (resourceSpecificationReference) is registered in the OSL Resource Spec Catalog.</p> <p>The following image illustrates the approach.</p> <p></p> <ol> <li>A CRD in a cluster will be mapped in TMF model as a Resource specification and therefore can be exposed as a service specification in a catalog</li> <li>Service Orders can be created for this service specification. </li> <li>OSOM creates a Resource in OSL Resource inventory and requests new Custom Resource (CR) in the target cluster<ul> <li>The resource is created in a specific namespace (for example the UUID of the Service Order)</li> <li>A CR in a cluster will be mapped in TMF model as a Resource in the resource Inventory</li> <li>Other related resources created by the CRD Controller within the namespace are automatically created in OSL Resource Inventory under the same Service Order</li> </ul> </li> </ol>"},{"location":"service_design/kubernetes/ExposingKubernetesResources/#awareness-for-crds-and-crs-in-cluster","title":"Awareness for CRDs and CRs in cluster","text":"<p>CRDs and CRs can appear (disappear) or change status at any time in a cluster. OpenSlice Resource Inventory need to be aware of these events.</p> <p>When installing OpenSlice you can configure at least one management cluster. OpenSlice connects via a provided kubeconf</p> <ul> <li>On Start up OSL tries to register this cluster and context to OSL catalogs.</li> <li>After the registration of this cluster as a Resource in OSL OSL is always aware of all CRDs and their CRs in the cluster, even if a CRD or CR is added/updated/deleted in the K8S cluster outside of OSL</li> <li>Resources created by OpenSlice have labels, e.g. (org.etsi.osl.*)</li> </ul>"},{"location":"service_design/kubernetes/ExposingKubernetesResources/#expose-crds-as-service-specifications-in-openslice-catalogs","title":"Expose CRDs as Service Specifications in OpenSlice catalogs","text":"<p>A CRD by default is exposed as a Resource Specification</p> <p>To ensure unique names across the clusters that OpenSlice can manage, the name of a CRD is constructed as follows:</p> <p><code>Kind @ ApiGroup/version @ ContextCluster @ masterURL</code></p> <p>For example you might see resource Specifications like:</p> <pre><code>- ```Application@argoproj.io/v1alpha1@kubernetes@https://10.10.10.144:6443/```\n- ```IPAddressPool@metallb.io/v1beta1@kubernetes@https://10.10.10.144:6443/```\n- ```Provider@pkg.crossplane.io/v1@kubernetes@https://10.10.10.144:6443/```\n</code></pre> <p>All attributes of the CRD are translated into characteristics</p> <p>The following specific characteristics are added:</p> <pre><code> - _CR_SPEC: Used for providing the json Custom Resource description to apply\n - _CR_CHECK_FIELD: Used for providing the field that need to be checked for the resource status\n - _CR_CHECKVAL_STANDBY: Used for providing the equivalent value from resource to signal the standby status\n - _CR_CHECKVAL_ALARM: Used for providing the equivalent value from resource to signal the alarm status\n - _CR_CHECKVAL_AVAILABLE: Used for providing the equivalent value from resource to signal the available status\n - _CR_CHECKVAL_RESERVED: Used for providing the equivalent value from resource to signal the reserved status\n - _CR_CHECKVAL_UNKNOWN: Used for providing the equivalent value from resource to signal the unknown status\n - _CR_CHECKVAL_SUSPENDED: Used for providing the equivalent value from resource to signal the suspended status\n</code></pre> <ol> <li> <p>Create a new Service Specification and use this Resource Specification in Resource Specification Relationships</p> <ul> <li>Then the Service Specification is saved as ResourceFacingServiceSpecification</li> </ul> <p>1.1. You can give at this stage values to the characteristics:</p> <pre><code>- _CR_SPEC, \n- _CR_CHECK_FIELD\n- _CR_CHECKVAL_STANDBY\n- _CR_CHECKVAL_ALARM\n- _CR_CHECKVAL_AVAILABLE\n- _CR_CHECKVAL_RESERVED\n- _CR_CHECKVAL_UNKNOWN\n- _CR_CHECKVAL_SUSPENDED\n</code></pre> <p>1.2. You can now create LCM rules if you wish</p> </li> <li> <p>Create a new Service Specification and use the Resource Facing Service Specification in Service Specification Relationships</p> <ul> <li>Then the Service Specification is saved as CustomerFacingServiceSpecification</li> </ul> <p>2.1. You can give at this stage values to the characteristics: </p> <pre><code>- _CR_SPEC, \n- _CR_CHECK_FIELD\n- _CR_CHECKVAL_STANDBY\n- _CR_CHECKVAL_ALARM\n- _CR_CHECKVAL_AVAILABLE\n- _CR_CHECKVAL_RESERVED\n- _CR_CHECKVAL_UNKNOWN\n- _CR_CHECKVAL_SUSPENDED\n</code></pre> <p>2.2. You We can create LCM rules for this new Service Specification</p> <p>2.3. You Expose configurable values for users to configure during service order</p> </li> </ol> <p></p>"},{"location":"service_design/kubernetes/ExposingKubernetesResources/#service-orchestration-and-crdscrs","title":"Service Orchestration and CRDs/CRs","text":"<p>OSOM - OpenSlice Service Orchestrator, checks the presence of attribute _CR_SPEC at the RFS to make a request for a CR deployment</p> <ul> <li>_CR_SPEC is a JSON or YAML string that is used for the request<ul> <li>It is similar to what one will do with e.g. a kubectl apply</li> <li>There are tools to translate a yaml file to a json</li> </ul> </li> </ul> <p>LCM rules can be used to change attributes of this yaml/json file, before sending this for orchestration</p>"},{"location":"service_design/kubernetes/ExposingKubernetesResources/#mapping-the-cr-lifecycle-that-is-defined-in-the-crd-with-the-openslice-tmf-based-resource-lifecycle","title":"Mapping the CR lifecycle that is defined in the CRD with the OpenSLice (TMF-based) resource Lifecycle","text":"<p>OpenSlice adds automatically as we see the following characteristics: </p> <pre><code> - _CR_CHECK_FIELD\n - _CR_CHECKVAL_STANDBY\n - _CR_CHECKVAL_ALARM\n - _CR_CHECKVAL_AVAILABLE\n - _CR_CHECKVAL_RESERVED\n - _CR_CHECKVAL_UNKNOWN\n - _CR_CHECKVAL_SUSPENDED\n</code></pre> <p>These characteristics instrument OpenSlice services to manage and reflect the lifecycle of a kubernetes resource to OpenSlice's (TMF based) lifecycle</p> <ul> <li>_CR_CHECK_FIELD: The name of the field that is needed to be monitored in order to monitor the status of the service and translate it to TMF resource statys (RESERVED AVAILABLE, etc) </li> <li>_CR_CHECKVAL_STANDBY: The CR specific value (of the CheckFieldName) that needs to me mapped to the TMF resource state STANDBY (see org.etsi.osl.tmf.ri639.model.ResourceStatusType) </li> <li>_CR_CHECKVAL_ALARM: The CR specific value (of the CheckFieldName) that needs to me mapped to the TMF resource state ALARMS (see org.etsi.osl.tmf.ri639.model.ResourceStatusType) </li> <li>_CR_CHECKVAL_AVAILABLE: The CR specific value (of the CheckFieldName) that needs to me mapped to the TMF resource state AVAILABLE (see org.etsi.osl.tmf.ri639.model.ResourceStatusType) </li> <li>_CR_CHECKVAL_RESERVED: The CR specific value (of the CheckFieldName) that needs to me mapped to the TMF resource state RESERVED (see org.etsi.osl.tmf.ri639.model.ResourceStatusType) </li> <li>_CR_CHECKVAL_UNKNOWN: The CR specific value (of the CheckFieldName) that needs to me mapped to the TMF resource state UNKNOWN (see org.etsi.osl.tmf.ri639.model.ResourceStatusType) </li> <li>_CR_CHECKVAL_SUSPENDED: The CR specific value (of the CheckFieldName) that needs to me mapped to the TMF resource state SUSPENDED (see org.etsi.osl.tmf.ri639.model.ResourceStatusType) </li> </ul>"},{"location":"service_design/kubernetes/ExposingKubernetesResources/#probe-further","title":"Probe further","text":"<ul> <li>See examples of exposing operators via OpenSlice:<ul> <li>Exposing Kubernetes Operators as a Service : Offering \"Calculator as a Service\" through OpenSlice</li> </ul> </li> <li>Learn more about CRIDGE, the service in OSL that manages CRDs/CRs</li> </ul>"},{"location":"service_design/kubernetes/helm/HELM_Installation_aaS_Jenkins_Example/","title":"Example: Offer Jenkins as a Service via Openslice","text":"<p>Before reading this example please make sure that you went through the Design Helm as a Service </p> <p>We will use the <code>Kind: Application</code> of ArgoCD and create a ResourceFacingServiceSpecification for Jenkins</p> <pre><code>1. Go to Service Specifications\n2. Create New Specification\n3. Give a Name, eg. jenkinsrfs\n4. Go to Resource Specification Relationships\n5. Assign ```Application@argoproj.io/v1alpha1@kubernetes@https://10.10.10.144:6443/```\n</code></pre> <p></p> <p>Focus now on the characteristics configuration.</p> <p>First we need to map the lifecycle of ArgoCD Application to TMF Resource State</p> <p></p> <p>In ArgoCD the field health.status has the value that we need to check (Healty, Progressing, etc)</p> <p>The _CR_SPEC can be designed first in a YAML or json editor. Let's see a YAML definition:</p> <p>```</p> <p>apiVersion: argoproj.io/v1alpha1 kind: Application metadata: finalizers: - resources-finalizer.argocd.argoproj.io name: openslice-jenkins namespace: argocd spec: project: default destination: namespace: opencrdtest name: in-cluster source: repoURL: https://charts.jenkins.io targetRevision: 4.6.1 chart: jenkins helm: values: | controller: service: type: ClusterIP syncPolicy: automated: prune: true selfHeal: true allowEmpty: false syncOptions: - Validate=false - CreateNamespace=true - PrunePropagationPolicy=foreground - PruneLast=true - RespectIgnoreDifferences=true ```</p> <p>NOTICE</p> <p>On each installation OSOM will change the name of the resource in order to be unique (will have a UUID)</p> <p><code>name: openslice-jenkins</code> </p> <p>destination namespace that ArgoCD will use is the name <code>opencrdtest</code></p> <p><code>destination: namespace: opencrdtest</code></p> <p>This implies that ArgoCD installs the Jenkins always in the same namespace</p> <p>To avoid this we will create a simple pre-provision rule to change the namespace properly</p> <p>See the following image: </p> <p></p> <ol> <li>Drag-Drop the _CR_SPEC characteristic of jenkinsrfs from the Service>Text blocks</li> <li>Drag-Drop Text>Formatted text block</li> <li>Drag-Drop Text>Multi-line text input block</li> <li>Copy paste the YAML text</li> <li>Change the spec: destination:namespace to the value %s</li> <li>Drag-Drop Lists>Create list with block delete 2 items (click the gear icon). Connect it to formatted text block</li> <li>Drag-Drop Context>Current Service Order block and select the id. Connect it to the List</li> <li>Save the PRE_PROVISION Rule</li> </ol>"},{"location":"service_design/kubernetes/helm/HELM_Installation_aaS_Jenkins_Example/#expose-the-service-to-your-users","title":"Expose the service to your users","text":"<p>Expose then as CustomerFacingServiceSpecification by using the previous RFSS as Service Specification Relationship 1. Create a Jenkins service and mark as Bundle and save it 2. Go to Service Specification Relationships and assign Jenkinsrfs 3. Add also a Logo if you wish</p> <p></p> <p></p> <p>Expose it now to a Category and a Catalog to be available for ordering.</p> <p></p>"},{"location":"service_design/kubernetes/helm/HELM_Installation_aaS_Jenkins_Example/#order-the-service","title":"Order the service","text":"<p>Order the service from the catalog. </p> <p>Soon the order will be completed and the Services will be active</p> <p></p>"},{"location":"service_design/kubernetes/helm/HELM_Installation_aaS_Jenkins_Example/#how-to-access-the-jenkins-installation","title":"How to access the Jenkins installation:","text":"<p>From the Supporting services of the Service Order, select the ResourceFacingService (jenkinsrfs)</p> <p>The ResourceFacingService has also supporting resources in resource inventory.</p> <p></p> <p>One is the resource reference to the application (e.g. cr_tmpname...), the other is a secret (e.g. cr87893...). </p> <p>Click to go to the secret resource (This is in the Resource inventory of OpenSlice)</p> <p></p> <p>Use them to login in your Jenkins.</p> <p>Exposing Jenkins to you external is a matter of cluster configuration and request (nodeport, load balancing, etc)! This is not a topic for this example</p>"},{"location":"service_design/kubernetes/helm/design_helmaas/","title":"Expose HELM charts as Service Specifications","text":"<p>Manage Helm charts installations via OpenSlice Service Specifications and Service Orders.</p>"},{"location":"service_design/kubernetes/helm/design_helmaas/#intended-audience-service-designers","title":"Intended Audience: Service Designers","text":"<p>Kubernetes is an orchestration system for automating software deployment, scaling, and management. One can interact though the Kubernetes API and it has a set of objects ready for use out of the box. </p> <p>Helm is a tool that automates the creation, packaging, configuration, and deployment of Kubernetes applications by combining your configuration files into a single reusable package</p> <p>At the heart of Helm is the packaging format called charts. Each chart comprises one or more Kubernetes manifests -- and a given chart can have child charts and dependent charts, as well. Using Helm charts:</p> <pre><code> - Reduces the complexity of deploying Microservices\n - Enhances deployment speed\n - Developers already know the technology\n</code></pre> <p>There are many Helm charts and Helm repositories there that are ready to be used</p> <p>Enable loose coupling and more orchestration scenarios</p> <p>Developers create and deploy applications in things they already know (e.g. Helm charts)</p> <p>Use the TMF models as wrapper entities around Helm charts</p> <p>Use OpenSlice to expose them in service catalogs and deploy them in complex scenarios (service bundles) involving also other systems:</p> <pre><code>- Include e.g. RAN controllers, \n- Pass values through life cycle rules from one service to another, \n- Manage multiple Helms in multiple clusters\n</code></pre>"},{"location":"service_design/kubernetes/helm/design_helmaas/#the-installation-of-helm-charts-is-based-on-openslice-crd-support","title":"The installation of HELM charts is based on OpenSlice CRD support","text":"<p>Please read more here</p> <p>For installing HELM charts we will use ArgoCD a well known Kubernetes-native continuous deployment (CD) tool </p> <p>ArgoCD is a Kubernetes-native continuous deployment (CD) tool</p> <p>While just deploying Heml charts is just a scenario for ArgoCD , in future one can exploit it for many things</p> <p>Despite some other tools like FluxCD, it provides also a UI which is useful for management and troubleshooting</p> <p>We will mainly use the CRD of <code>Kind: Application</code> that ArgoCD can manage</p> <p>Before proceeding, install ArgoCD in your management cluster, by following ArgoCD instructions</p> <p>As soon as you install ArgoCD, OpenSlice is automatically aware for specific new Kinds. The one we will use is is the <code>Kind: Application</code> that ArgoCD can manage under the apiGroup argoproj.io</p> <p>Browse to Resource Specifications. You will see an entry like the following:</p> <p><code>Application@argoproj.io/v1alpha1@kubernetes@https://10.10.10.144:6443/</code></p> <p>see image: </p> <p></p>"},{"location":"service_design/kubernetes/helm/design_helmaas/#whats-next","title":"What's next","text":"<p>See the Example: Offer Jenkins as a Service via Openslice </p>"},{"location":"service_ordering/ordering_services/","title":"Service Ordering","text":""},{"location":"service_ordering/ordering_services/#intended-audience-users","title":"Intended Audience: Users","text":""}]} \ No newline at end of file diff --git a/public/develop/service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/index.html b/public/develop/service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/index.html index 20d494db..4846d533 100644 --- a/public/develop/service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/index.html +++ b/public/develop/service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/index.html @@ -914,7 +914,7 @@ <li class="md-nav__item"> - <a href="../../../../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../../../../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/service_design/intro/index.html b/public/develop/service_design/intro/index.html index 76231650..d14dda2a 100644 --- a/public/develop/service_design/intro/index.html +++ b/public/develop/service_design/intro/index.html @@ -914,7 +914,7 @@ <li class="md-nav__item"> - <a href="../../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> @@ -1445,9 +1445,9 @@ </li> <li class="md-nav__item"> - <a href="#whats-next" class="md-nav__link"> + <a href="#probe-further" class="md-nav__link"> <span class="md-ellipsis"> - What's next + Probe further </span> </a> @@ -2686,9 +2686,9 @@ </li> <li class="md-nav__item"> - <a href="#whats-next" class="md-nav__link"> + <a href="#probe-further" class="md-nav__link"> <span class="md-ellipsis"> - What's next + Probe further </span> </a> @@ -2714,7 +2714,7 @@ <h2 id="intended-audience-service-designers">Intended Audience: Service Designers</h2> <p>Service Designers create detailed service specifications, which are then managed and exposed in service catalogs. These services are integrated into OpenSlice E2E service orchestration framework to automate and optimize the delivery of network services.</p> <p>OpenSlice can be used to design service specifications for various services, even not networking related services. Here we cover how service designers can expose services related to the NFV world and the containerized world.</p> -<h2 id="whats-next">What's next</h2> +<h2 id="probe-further">Probe further</h2> <ul> <li><a href="ExposingKubernetesResources.md">Design and expose services based on containerized resources via the Kubernetes Operator pattern</a></li> <li><a href="../nfv/design_nfv_services/">Design and expose services based on NFV artifacts</a></li> diff --git a/public/develop/service_design/kubernetes/ExposingKubernetesResources/index.html b/public/develop/service_design/kubernetes/ExposingKubernetesResources/index.html index c94c903d..56b83942 100644 --- a/public/develop/service_design/kubernetes/ExposingKubernetesResources/index.html +++ b/public/develop/service_design/kubernetes/ExposingKubernetesResources/index.html @@ -914,7 +914,7 @@ <li class="md-nav__item"> - <a href="../../../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../../../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> @@ -2849,7 +2849,7 @@ <li>_CR_CHECKVAL_SUSPENDED: The CR specific value (of the CheckFieldName) that needs to me mapped to the TMF resource state SUSPENDED (see org.etsi.osl.tmf.ri639.model.ResourceStatusType) </li> </ul> <hr /> -<h2 id="whats-next">What's next?</h2> +<h2 id="probe-further">Probe further</h2> <ul> <li>See examples of exposing operators via OpenSlice:<ul> <li><a href="ExposingCRDs_aaS_Example_Calculator.md">Exposing Kubernetes Operators as a Service : Offering "Calculator as a Service" through OpenSlice</a></li> diff --git a/public/develop/service_design/kubernetes/helm/HELM_Installation_aaS_Jenkins_Example/index.html b/public/develop/service_design/kubernetes/helm/HELM_Installation_aaS_Jenkins_Example/index.html index cb79b8e0..366c4a86 100644 --- a/public/develop/service_design/kubernetes/helm/HELM_Installation_aaS_Jenkins_Example/index.html +++ b/public/develop/service_design/kubernetes/helm/HELM_Installation_aaS_Jenkins_Example/index.html @@ -914,7 +914,7 @@ <li class="md-nav__item"> - <a href="../../../../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../../../../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/service_design/kubernetes/helm/design_helmaas/index.html b/public/develop/service_design/kubernetes/helm/design_helmaas/index.html index 348129b5..49b3e7c9 100644 --- a/public/develop/service_design/kubernetes/helm/design_helmaas/index.html +++ b/public/develop/service_design/kubernetes/helm/design_helmaas/index.html @@ -914,7 +914,7 @@ <li class="md-nav__item"> - <a href="../../../../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../../../../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/service_design/kubernetes/intro/index.html b/public/develop/service_design/kubernetes/intro/index.html index aaa3af22..07edd101 100644 --- a/public/develop/service_design/kubernetes/intro/index.html +++ b/public/develop/service_design/kubernetes/intro/index.html @@ -909,7 +909,7 @@ <li class="md-nav__item"> - <a href="../../../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../../../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/service_design/nfv/design_nfv_services/index.html b/public/develop/service_design/nfv/design_nfv_services/index.html index a44e8dcc..8c7425b3 100644 --- a/public/develop/service_design/nfv/design_nfv_services/index.html +++ b/public/develop/service_design/nfv/design_nfv_services/index.html @@ -909,7 +909,7 @@ <li class="md-nav__item"> - <a href="../../../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../../../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/service_design_intro/index.html b/public/develop/service_design_intro/index.html index 450bd5a6..3eb858ac 100644 --- a/public/develop/service_design_intro/index.html +++ b/public/develop/service_design_intro/index.html @@ -905,7 +905,7 @@ <li class="md-nav__item"> - <a href="../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/service_inventory/index.html b/public/develop/service_inventory/index.html index baa790de..af5205b4 100644 --- a/public/develop/service_inventory/index.html +++ b/public/develop/service_inventory/index.html @@ -910,7 +910,7 @@ <li class="md-nav__item"> - <a href="../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/service_ordering/ordering_services/index.html b/public/develop/service_ordering/ordering_services/index.html index 421457ae..c699dca4 100644 --- a/public/develop/service_ordering/ordering_services/index.html +++ b/public/develop/service_ordering/ordering_services/index.html @@ -914,7 +914,7 @@ <li class="md-nav__item"> - <a href="../../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/sitemap.xml b/public/develop/sitemap.xml index cff01126..d60afb23 100644 --- a/public/develop/sitemap.xml +++ b/public/develop/sitemap.xml @@ -2,282 +2,287 @@ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc>https://osl.etsi.org/develop/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/OpenSlice_deployment_examples/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/alarms_actions/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/catalogs/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/config_intro/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/deployment/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/deploymentCompose/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/deploymentK8s/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/etsi_osl/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/history/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/lcm/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/nfvoconfig/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/ole_keycloak_management/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/portals_intro/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/role_keycloak_management/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/service_design_intro/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/service_inventory/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/terminology/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/under_construction/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/architecture/architecture/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/architecture/centrallog/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/architecture/consumingServicesFromExternalPartners/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/architecture/issuemgt/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/architecture/messagebus/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/architecture/nfvapi/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/architecture/oauth/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/architecture/osom/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/architecture/tmfapi/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/architecture/CRIDGE/CRIDGEforDevelopers/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/contributing/developing/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/contributing/wishlist/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/naas/exposed_apis/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> + <changefreq>daily</changefreq> + </url> + <url> + <loc>https://osl.etsi.org/develop/naas/gst_to_tmf/</loc> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/naas/introduction/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/naas/lcm_intro/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/naas/lcm_rules_intro/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/naas/resource_catalog/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/naas/resource_inventory/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/naas/resource_spec/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/naas/service_catalog/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/naas/service_inventory/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/naas/service_ordering/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/naas/service_spec/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/naas/so_intro/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/naas/so_servicespec_to_services_kubernetes/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/naas/so_servicespec_to_services_nfv/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/naas/nfv/intro/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/naas/nfv/nfvcatalogs/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/naas/nfv/nfvservices/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/service_design/intro/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/service_design/examples/ExposingCRDs_aaS_Example_Calculator/ExposingCRDs_aaS_Example_Calculator/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/service_design/kubernetes/ExposingKubernetesResources/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/service_design/kubernetes/intro/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/service_design/kubernetes/helm/HELM_Installation_aaS_Jenkins_Example/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/service_design/kubernetes/helm/design_helmaas/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/service_design/nfv/design_nfv_services/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>https://osl.etsi.org/develop/service_ordering/ordering_services/</loc> - <lastmod>2024-07-05</lastmod> + <lastmod>2024-07-06</lastmod> <changefreq>daily</changefreq> </url> </urlset> \ No newline at end of file diff --git a/public/develop/sitemap.xml.gz b/public/develop/sitemap.xml.gz index 89ed4d86a623b761810764082fba9e271874cbb5..adec834d3bb8e8804c8cd2d91c34918e1672083e 100644 GIT binary patch literal 755 zcmV<P0u22hiwFn+iHK$b|8r?{Wo=<_E_iKh0M(jZZ__XohVS<)s@|_D6M})d?xO2p z48*j-wdFadiB*3DAEzJxp5rtr?H$~p<49E<$F&|iZ(g6{bauP5X0(BT+Pj<ao5^%M z0;hbbU3D}5`Q!fbdVD*-n6<$m#1S=icr&hJY(5sncDtRRj$mbj6CbJqRZS;Y^p(YQ z@?ku`7}1eBIF!0$X1toGUXZ%+XeJO*cU_dQ0ppuuR-`7UzmOQMFXva&tGAca_m|Um z)TFOFX{KuFDp&>hH7}($`&n^Pb3iGMEdNaPy#e=Pv;t8=WBlHNivo7iHU^L>votbT z6jDXH#atnkjMDguEuMEPT?y@C@Jtc^2$DVE!rR6pu;+Zd=Bme3A?ONIyjo-QVb7G# zD9e=0tv3E(HB14$0kMX?GG4BQl}=W`*l`*kXjMVhwjJ`CQiQNMgg>Y&$9iT5RP8o2 zpM32oLa^F-ihj5fwyuOA$e1vOwhJS<hPpx3lzOPx1~@;-fLD=9gEXXrENDp$E$Oy; zIXq@~AG}@eNX$-}CmEunoHB=jXv7w56?0&<fJp1ZYn#Q)QZyqQodc<tZLG5ZMQ?N9 zjCPgDtzSGp+<jX1Un?K(4vqMl7a4C1`n8SZy+dUxW<a~uSQ|<Wxn^HdVgb9fHBkzZ zFLLIrFpB5}J!qUMyZoSJ9W!>EMp@Rm%n>rQ29Q5$0Q7C3<g4G;&4QJCqIgb=4Jgi_ zL;9V80&>|YID_?pl5)Na{~0TLt$O~JN{sz<rrAtu|8OeS?JK3-5CJnC0A-4t$rB!X zeI!WwFn^JHiaOl>EVjCf9Jac9)Z-r#mMNK`HDd96heFC1u{>N63u#nqB&~IS)h3Hk zpSa*KrpIH|b00Qgc4Ns%cPG>}7+ZW^e*GpM9FilEjwl7}^z{YYT00zcmgms=_g|@; l94(76B-`z|sVFkB-(#FR6#gT4_k|GWzX4jZ<h3U!003VuZ0!I5 literal 744 zcmV<E0vG)siwFpSH-}~d|8r?{Wo=<_E_iKh0M(hxZrd;rMfdp%!+Tq9(4uMKI1Afp z)3j)jv}=N)#u8yZR1W3G-*@zK>|MJlh5`&x6ipmbSHro~{O(}QXa@nccemp=)7f|g zPWfEB;&%M&=l$ene7Cro*TEpf5jA#rJ1%3aK4#f|zn`LxU}c3<ABqfBNf(&)mDz0i zVZ68+(b06!mD*!&yjnE9Aa&!>Od+CfyU1Y&##h-qYnq(@Lt?Z(UtG_w-%e)lC$o3d zq^~<`rb_7w*aY~!$fY*Nd3ILQp=2kPf2R6gfqOPufykjU{%FBP0S9R-1IUzF8W}7K zsUkgMu8>MbX?(#J&%2E-gmy7_riibCWDmIXw(<z<IUjGh>anR1bcZQksWJL+WJ+h0 zWlH8YJKu#Grhwjn*uqg6FSo)<CktR4aVj5ZRYBHaJES$G2w~TyKd1}GdS(Yy?RGSu ze8W+MV72p<{ct6$T@FD|V8R&cHjU((>IPMk^-!@6aCwmcuOgKOX-Ef2(2^Qz(rxkF zy=HhHyj>qi%ubpgGDJt7GKGO?#2Rc7Q((1#NbAE(oy5#iHX|#Y0;!jEERz65Z&Tom zc9Y1XUp_soKCS!H#)nnch;Q(sz#D^psUyYSp|U9^K)csi8nT95-ItV@!J*lj$OXw4 zIdis|cg{K+YdOhmvvvt5$WR+V{-^=a*MV$JzhjyND|ZWaNsARI&Y**_O+W#uc<>8Y zAIR?VT~aSt*=yDF52?i1PiHfmBEDXVZT&)q79wDx10WB^nY_Vcua5?je#}2no}&(r zKZ#A`EQL+v9`*F8f8E#wS|gTED-=>bi*<KLETvJkk+jzRRhuM6eHI0WF+HBDp8B*2 zlN(Dyx;vvT!PxBc`s+9G;E*B`>4+>~tFJHMw%XyKvowd+e_3kEO+-s#3{BYWxv3}; a3BRX2cPRWv@b-id7k>cFI%VyFCIA4#cV|cd diff --git a/public/develop/terminology/index.html b/public/develop/terminology/index.html index 35016d2a..b53b6972 100644 --- a/public/develop/terminology/index.html +++ b/public/develop/terminology/index.html @@ -912,7 +912,7 @@ <li class="md-nav__item"> - <a href="../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> diff --git a/public/develop/under_construction/index.html b/public/develop/under_construction/index.html index b2b5227f..366e97a4 100644 --- a/public/develop/under_construction/index.html +++ b/public/develop/under_construction/index.html @@ -905,7 +905,7 @@ <li class="md-nav__item"> - <a href="../naas/gst_to_tmf.md" class="md-nav__link"> + <a href="../naas/gst_to_tmf/" class="md-nav__link"> <span class="md-ellipsis"> -- GitLab