From 1c47a39191b7b73929d13c2b7e94c26a098f184c Mon Sep 17 00:00:00 2001
From: Dimitrios <dimit.giannopoulos@upnet.gr>
Date: Sat, 6 Jul 2024 10:45:19 +0000
Subject: [PATCH] Deployed 467173f to develop in public with MkDocs 1.6.0 and
 mike 2.1.2

---
 .../develop/naas/lcm_rules_intro/index.html   |  20 +-
 public/develop/search/search_index.json       |   2 +-
 .../lcmrules/examples/index.html              | 211 +++++++++++++++++-
 .../lcmrules/images/lcm/lcmfig15.png          | Bin 0 -> 292068 bytes
 .../service_design/lcmrules/intro/index.html  |   9 +-
 .../lcmrules/specification/index.html         |  78 ++++++-
 6 files changed, 304 insertions(+), 16 deletions(-)
 create mode 100644 public/develop/service_design/lcmrules/images/lcm/lcmfig15.png

diff --git a/public/develop/naas/lcm_rules_intro/index.html b/public/develop/naas/lcm_rules_intro/index.html
index 15bcfbda..f04258df 100644
--- a/public/develop/naas/lcm_rules_intro/index.html
+++ b/public/develop/naas/lcm_rules_intro/index.html
@@ -1182,6 +1182,15 @@
     </span>
   </a>
   
+</li>
+      
+        <li class="md-nav__item">
+  <a href="#how-is-it-possible-to-intervene-in-the-workflow-process-and-affect-it" class="md-nav__link">
+    <span class="md-ellipsis">
+      How is it possible to intervene in the workflow process and affect it?
+    </span>
+  </a>
+  
 </li>
       
         <li class="md-nav__item">
@@ -2715,6 +2724,15 @@
     </span>
   </a>
   
+</li>
+      
+        <li class="md-nav__item">
+  <a href="#how-is-it-possible-to-intervene-in-the-workflow-process-and-affect-it" class="md-nav__link">
+    <span class="md-ellipsis">
+      How is it possible to intervene in the workflow process and affect it?
+    </span>
+  </a>
+  
 </li>
       
         <li class="md-nav__item">
@@ -2757,7 +2775,7 @@
 <p>So in the system there are already predefined recipes, which in each process-step of the workflow some piece of code is executed. </p>
 <p>How is it possible to intervene in the workflow process and inject some user defined actions? The next image illustrates the idea</p>
 <p><a href="../lcm/img02.png"><img alt="lcm" src="../lcm/img02.png" /></a></p>
-<p>## How is it possible to intervene in the workflow process and affect it?</p>
+<h2 id="how-is-it-possible-to-intervene-in-the-workflow-process-and-affect-it">How is it possible to intervene in the workflow process and affect it?</h2>
 <p>LCM Rules are used for defining complex conditions and actions during the lifecycle of a service. In Openslice there are the following types of rules defined:</p>
 <ul>
 <li>PRE_PROVISION</li>
diff --git a/public/develop/search/search_index.json b/public/develop/search/search_index.json
index 0c9c4242..ba1307f2 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":"#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":"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 &gt; 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 &gt; Clients &gt; 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 &gt; Realm Settings &gt; Login Tab &gt; 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 &gt; Users &gt; 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} -&gt; 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 -&gt; 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":"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 &gt; Manage MANO Platforms &gt; 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 &gt; Manage MANO providers &gt; 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":"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\": \"&lt;h3&gt;cirros_vnfd&lt;/h3&gt;&lt;br&gt;&lt;b&gt;Vendor: &lt;/b&gt;OSM&lt;br&gt;&lt;b&gt;Version: &lt;/b&gt;1.0&lt;br&gt;&lt;b&gt;Description: &lt;/b&gt;Simple VNF example with a cirros&lt;br&gt;&lt;b&gt;VM Count: &lt;/b&gt;1&lt;br&gt;&lt;b&gt;vCPU Count: &lt;/b&gt;1&lt;br&gt;&lt;b&gt;Memory: &lt;/b&gt;512 MB&lt;br&gt;&lt;b&gt;Storage: &lt;/b&gt;1 GB&lt;br&gt;\",\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\": \"&lt;h3&gt;cirros_sriov_vnf&lt;/h3&gt;&lt;br&gt;&lt;b&gt;Vendor: &lt;/b&gt;OSM&lt;br&gt;&lt;b&gt;Version: &lt;/b&gt;1.0&lt;br&gt;&lt;b&gt;Description: &lt;/b&gt;Simple VNF example with a cirros SRIOV interface&lt;br&gt;&lt;b&gt;VM Count: &lt;/b&gt;1&lt;br&gt;&lt;b&gt;vCPU Count: &lt;/b&gt;1&lt;br&gt;&lt;b&gt;Memory: &lt;/b&gt;4096 MB&lt;br&gt;&lt;b&gt;Storage: &lt;/b&gt;10 GB&lt;br&gt;\",\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>&gt; The example CRD myresource.example.com allows the creation of custom resources of type Myresource.\n&gt; 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":"Lifecycle Management - LCM","text":"<p>Lifecycle Management: The orchestration framework handles the activation, termination and any necessary modifications throughout the service lifecycle.</p>"},{"location":"naas/lcm_intro/#intended-audience-service-designers","title":"Intended Audience: Service Designers","text":"<p>In OpenSlice the Lifecycle of a service follows in general the concept of Network Slice lifecycle as defined by 3GPP.</p> <p></p>"},{"location":"naas/lcm_intro/#introduction-in-openslice-lcm","title":"Introduction in OpenSlice LCM","text":"<p>OpenSlice adopted the LCM model by 3GPP and mapped to the TMF model service state. Next we discuss briefly the process and the relationships.</p> <p>The lifecycle of a service, particularly in the context of Network Service lifecycle encompasses several stages that ensure the service is effectively planned, deployed, managed, and eventually decommissioned. </p> <p>Here is an overview of these stages and relationships with OpenSlice:</p>"},{"location":"naas/lcm_intro/#0-preparation-phase","title":"0. Preparation Phase","text":"<p>This phase is performed by Service Designers</p>"},{"location":"naas/lcm_intro/#service-design","title":"Service Design:","text":"<ul> <li>Requirements Gathering: Collect service requirements from stakeholders, including performance metrics, quality of service (QoS), security needs, and geographical coverage.</li> <li>Service Specification: Define the service in terms of functionalities, attributes, and dependencies. This can be formalized using standardized templates such as the GSMA Generic Slice Template (GST).</li> <li>Resource Planning: Identify and plan the required resources, including network functions, computing power, storage, and connectivity, inclluding network function configurations.</li> <li>Expose to Service Catalog:  Expose to service catalog for user ordering.</li> </ul> <p>Next phases are handled by the Service Orchestrator after a service is scheduled for instantiation</p> <p>If it is a bundle of services, each services follows its own Lifecycle!</p>"},{"location":"naas/lcm_intro/#1-instantiation-phase","title":"1. Instantiation Phase","text":""},{"location":"naas/lcm_intro/#service-instantiation","title":"Service Instantiation:","text":"<ul> <li>Configuration: Configure the network service according to the specifications including the user requirements from the service order, ensuring that all components are correctly set up to provide the desired service.</li> <li>Resource Allocation - Feasibility check: Allocate the necessary physical and virtual resources based on the service specification. This includes any containerized resources, virtual network functions (VNFs) and software-defined networking (SDN) components. (This step is not performed in OpenSlice)</li> <li>OpenSlice Service Orchestrator creates the services at \"RESERVED\" state</li> <li>User Notification:  There could be an email notification from the system (if Bugzilla is configured)</li> </ul>"},{"location":"naas/lcm_intro/#service-deployment","title":"Service Deployment:","text":"<ul> <li>Activation: OpenSlice Service Orchestrator activates the network service and makes the service available to the end-users. This may involve:</li> <li>Create any related services that the service depends on</li> <li>Contacting all related controllers during provisioning, e.g. Kubernetes controllers, Kubernetes operators, MANO Orchestrators, RAN controllers, SDN Controlles, or other external services (e.g. via REST calls)</li> <li>Scheduling instantiation, Resolving dependencies and passing paramemters between controllers,</li> <li>setting up user accounts, provisioning access credentials -this is performed either offline or via other services.</li> <li>OpenSlice Service Orchestrator if everything is succesful puts the service at \"ACTIVE\" state</li> <li>User Notification:  There could be an email notification from the system (if Bugzilla is configured)</li> </ul>"},{"location":"naas/lcm_intro/#2-operation-phase","title":"2. Operation Phase","text":""},{"location":"naas/lcm_intro/#service-operation","title":"Service Operation:","text":"<ul> <li>Lifecycle Management: Manage the network slice throughout its lifecycle, including scaling, reconfiguration, and adaptation to changing requirements. </li> <li>In OpenSlice this is performed with Lifecycle management Rules (see next)</li> </ul> <p>In this phase the Service Designer can define several aspects.  Be aware that these are NOT performed automatically by OpenSlice - further examples and future enhancements will address these. This could include:</p> <ul> <li>Monitoring: Continuously monitor the service for performance, availability, and compliance with SLAs. Utilize tools for real-time tracking and alerts for any anomalies or performance degradation.</li> <li>Maintenance: Conduct regular maintenance activities, including software updates, patching, and optimization to ensure the service runs smoothly.</li> <li>Scaling: Dynamically scale the resources up or down based on the demand and performance requirements.</li> <li>Fault Management: Detect and resolve faults in the network slice to minimize downtime and maintain service quality.</li> </ul>"},{"location":"naas/lcm_intro/#3-decommissioning-phase","title":"3. Decommissioning Phase","text":"<ul> <li>Service Termination: Service Orchestrator terminates the network service. This may involve:</li> <li>Terminate any related services that the service depends on</li> <li>Contacting all related controllers during termination to release resources, e.g. Kubernetes controllers, Kubernetes operators, MANO Orchestrators, RAN controllers, SDN Controlles, or other external services (e.g. via REST calls)</li> <li>Scheduling termination, Resolving dependencies and passing paramemters between controllers</li> <li>OpenSlice Service Orchestrator, if everything is succesful, puts the service at \"TERMINATED\" state</li> <li>User Notification:  There could be an email notification from the system (if Bugzilla is configured)</li> </ul>"},{"location":"naas/lcm_intro/#high-level-example-enhanced-mobile-broadband-embb-service-lifecycle","title":"High level example: Enhanced Mobile Broadband (eMBB) Service Lifecycle","text":"<ol> <li> <p>Preparation:</p> </li> <li> <p>Define eMBB service requirements for high bandwidth and low latency.</p> </li> <li>Create an eMBB service specification template specifying related services and resources to Kubernetes Operators, VNFs for content delivery and traffic management.</li> <li> <p>Expose to catalog</p> </li> <li> <p>Instantiation:</p> </li> <li> <p>Instantiate other services and allocate resources such as edge computing nodes and high-capacity links.</p> </li> <li> <p>Configure the service to prioritize video streaming traffic.</p> </li> <li> <p>Operation:</p> </li> <li> <p>Monitor the service to ensure it meets high-bandwidth requirements.</p> </li> <li> <p>Scale up resources during peak usage periods, such as live sports events.</p> </li> <li> <p>Decommissioning:</p> </li> <li> <p>Notify users about service termination.</p> </li> <li>Decommission the network service, reclaiming resources for other services.</li> </ol>"},{"location":"naas/lcm_intro/#probe-further","title":"Probe further","text":"<ul> <li>See 3GPP Lifecycle</li> </ul>"},{"location":"naas/lcm_rules_intro/","title":"Lifecycle Management Rules - LCM Rules","text":"<p>Lifecycle Management Rules: Defining complex conditions and actions during the lifecycle of a service and any necessary modifications throughout the service lifecycle.</p>"},{"location":"naas/lcm_rules_intro/#intended-audience-service-designers","title":"Intended Audience: Service Designers","text":"<p>OpenSlice end-to-end (E2E) service orchestrator follows some predefined workflows to manage a service lifecycle (They are described in BPMN language and included in our orchestration engine)</p> <p>So in the system there are already predefined recipes, which in each process-step of the workflow some piece of code is executed. </p> <p>How is it possible to intervene in the workflow process and inject some user defined actions? The next image illustrates the idea</p> <p></p> <p>## How is it possible to intervene in the workflow process and affect it?</p> <p>LCM Rules are used for defining complex conditions and actions during the lifecycle of a service. In Openslice there are the following 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 Service 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. These 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":"naas/lcm_rules_intro/#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":"naas/lcm_rules_intro/#probe-further","title":"Probe further","text":"<ul> <li>In the Service Design section we present in details the Lifecycle rules and how one can design them</li> <li>Many of them are used in our provided Service Design examples</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>As next image depicts, service orchestrators follow some predefined workflows. OpenSlice end-to-end (E2E) service orchestrator follows some predefined workflows to manage a service lifecycle (They are described in BPMN language and included in our orchestration engine)</p> <p></p> <p>This section provides a high level overview of the Service Orchestration process.</p>"},{"location":"naas/so_servicespec_to_services_nfv/","title":"From Service Specification to NFV based services","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":"naas/so_servicespec_to_services_nfv/#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":"naas/so_servicespec_to_services_nfv/#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-&gt;INPROGRESS-&gt;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":"naas/so_servicespec_to_services_nfv/#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":"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/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":"service_design/catalogs/#createdesign-a-service-specification","title":"Create/Design a Service Specification","text":""},{"location":"service_design/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":"service_design/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":"service_design/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":"service_design/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":"service_design/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":"service_design/catalogs/#manage-a-service-specification","title":"Manage a Service Specification","text":"<p>You can manage them though the Web UI</p>"},{"location":"service_design/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":"service_design/catalogs/#retireremove-a-service-specification","title":"Retire/Remove a Service Specification","text":"<p>Delete it from the category</p>"},{"location":"service_design/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":"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&lt;snip&gt;\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&gt;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&gt;Relationships&gt;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&gt;Relationships&gt;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&gt;\"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&gt;Number blocks</li> <li>Add a  str to int block from Number blocks</li> <li>Add Service&gt;Relationships&gt;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&gt;Text blocks</li> <li>Drag-Drop Text&gt;Formatted text block</li> <li>Drag-Drop Text&gt;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&gt;Create list with block delete 2 items (click the gear icon). Connect it to formatted text block</li> <li>Drag-Drop Context&gt;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_design/lcmrules/intro/","title":"LCM Rules introduction","text":"<p>Lifecycle Management Rules: Defining complex conditions and actions during the lifecycle of a service and any necessary modifications throughout the service lifecycle.</p>"},{"location":"service_design/lcmrules/intro/#intended-audience-service-designers","title":"Intended Audience: Service Designers","text":"<p>In Naas LCM Introduction it was presented briefly the LCM Rules concept.</p> <p>This section goes deeply on how Service Designers can use them.</p> <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":"service_design/lcmrules/intro/#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":"service_design/lcmrules/intro/#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":"service_design/lcmrules/intro/#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":"service_design/lcmrules/intro/#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":"service_design/lcmrules/intro/#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":"service_design/lcmrules/intro/#examples-of-rules","title":"Examples of Rules","text":"<p>The following images provide some examples of rules.</p>"},{"location":"service_design/lcmrules/intro/#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":"service_design/lcmrules/intro/#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":"service_design/lcmrules/intro/#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":"service_design/lcmrules/intro/#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":"service_design/lcmrules/intro/#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":"service_design/lcmrules/intro/#probe-further","title":"Probe further","text":"<ul> <li>Check our examples for more usages</li> <li>See next the complete specification</li> </ul>"},{"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":"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 &gt; 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 &gt; Clients &gt; 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 &gt; Realm Settings &gt; Login Tab &gt; 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 &gt; Users &gt; 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} -&gt; 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 -&gt; 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":"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 &gt; Manage MANO Platforms &gt; 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 &gt; Manage MANO providers &gt; 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":"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\": \"&lt;h3&gt;cirros_vnfd&lt;/h3&gt;&lt;br&gt;&lt;b&gt;Vendor: &lt;/b&gt;OSM&lt;br&gt;&lt;b&gt;Version: &lt;/b&gt;1.0&lt;br&gt;&lt;b&gt;Description: &lt;/b&gt;Simple VNF example with a cirros&lt;br&gt;&lt;b&gt;VM Count: &lt;/b&gt;1&lt;br&gt;&lt;b&gt;vCPU Count: &lt;/b&gt;1&lt;br&gt;&lt;b&gt;Memory: &lt;/b&gt;512 MB&lt;br&gt;&lt;b&gt;Storage: &lt;/b&gt;1 GB&lt;br&gt;\",\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\": \"&lt;h3&gt;cirros_sriov_vnf&lt;/h3&gt;&lt;br&gt;&lt;b&gt;Vendor: &lt;/b&gt;OSM&lt;br&gt;&lt;b&gt;Version: &lt;/b&gt;1.0&lt;br&gt;&lt;b&gt;Description: &lt;/b&gt;Simple VNF example with a cirros SRIOV interface&lt;br&gt;&lt;b&gt;VM Count: &lt;/b&gt;1&lt;br&gt;&lt;b&gt;vCPU Count: &lt;/b&gt;1&lt;br&gt;&lt;b&gt;Memory: &lt;/b&gt;4096 MB&lt;br&gt;&lt;b&gt;Storage: &lt;/b&gt;10 GB&lt;br&gt;\",\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>&gt; The example CRD myresource.example.com allows the creation of custom resources of type Myresource.\n&gt; 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":"Lifecycle Management - LCM","text":"<p>Lifecycle Management: The orchestration framework handles the activation, termination and any necessary modifications throughout the service lifecycle.</p>"},{"location":"naas/lcm_intro/#intended-audience-service-designers","title":"Intended Audience: Service Designers","text":"<p>In OpenSlice the Lifecycle of a service follows in general the concept of Network Slice lifecycle as defined by 3GPP.</p> <p></p>"},{"location":"naas/lcm_intro/#introduction-in-openslice-lcm","title":"Introduction in OpenSlice LCM","text":"<p>OpenSlice adopted the LCM model by 3GPP and mapped to the TMF model service state. Next we discuss briefly the process and the relationships.</p> <p>The lifecycle of a service, particularly in the context of Network Service lifecycle encompasses several stages that ensure the service is effectively planned, deployed, managed, and eventually decommissioned. </p> <p>Here is an overview of these stages and relationships with OpenSlice:</p>"},{"location":"naas/lcm_intro/#0-preparation-phase","title":"0. Preparation Phase","text":"<p>This phase is performed by Service Designers</p>"},{"location":"naas/lcm_intro/#service-design","title":"Service Design:","text":"<ul> <li>Requirements Gathering: Collect service requirements from stakeholders, including performance metrics, quality of service (QoS), security needs, and geographical coverage.</li> <li>Service Specification: Define the service in terms of functionalities, attributes, and dependencies. This can be formalized using standardized templates such as the GSMA Generic Slice Template (GST).</li> <li>Resource Planning: Identify and plan the required resources, including network functions, computing power, storage, and connectivity, inclluding network function configurations.</li> <li>Expose to Service Catalog:  Expose to service catalog for user ordering.</li> </ul> <p>Next phases are handled by the Service Orchestrator after a service is scheduled for instantiation</p> <p>If it is a bundle of services, each services follows its own Lifecycle!</p>"},{"location":"naas/lcm_intro/#1-instantiation-phase","title":"1. Instantiation Phase","text":""},{"location":"naas/lcm_intro/#service-instantiation","title":"Service Instantiation:","text":"<ul> <li>Configuration: Configure the network service according to the specifications including the user requirements from the service order, ensuring that all components are correctly set up to provide the desired service.</li> <li>Resource Allocation - Feasibility check: Allocate the necessary physical and virtual resources based on the service specification. This includes any containerized resources, virtual network functions (VNFs) and software-defined networking (SDN) components. (This step is not performed in OpenSlice)</li> <li>OpenSlice Service Orchestrator creates the services at \"RESERVED\" state</li> <li>User Notification:  There could be an email notification from the system (if Bugzilla is configured)</li> </ul>"},{"location":"naas/lcm_intro/#service-deployment","title":"Service Deployment:","text":"<ul> <li>Activation: OpenSlice Service Orchestrator activates the network service and makes the service available to the end-users. This may involve:</li> <li>Create any related services that the service depends on</li> <li>Contacting all related controllers during provisioning, e.g. Kubernetes controllers, Kubernetes operators, MANO Orchestrators, RAN controllers, SDN Controlles, or other external services (e.g. via REST calls)</li> <li>Scheduling instantiation, Resolving dependencies and passing paramemters between controllers,</li> <li>setting up user accounts, provisioning access credentials -this is performed either offline or via other services.</li> <li>OpenSlice Service Orchestrator if everything is succesful puts the service at \"ACTIVE\" state</li> <li>User Notification:  There could be an email notification from the system (if Bugzilla is configured)</li> </ul>"},{"location":"naas/lcm_intro/#2-operation-phase","title":"2. Operation Phase","text":""},{"location":"naas/lcm_intro/#service-operation","title":"Service Operation:","text":"<ul> <li>Lifecycle Management: Manage the network slice throughout its lifecycle, including scaling, reconfiguration, and adaptation to changing requirements. </li> <li>In OpenSlice this is performed with Lifecycle management Rules (see next)</li> </ul> <p>In this phase the Service Designer can define several aspects.  Be aware that these are NOT performed automatically by OpenSlice - further examples and future enhancements will address these. This could include:</p> <ul> <li>Monitoring: Continuously monitor the service for performance, availability, and compliance with SLAs. Utilize tools for real-time tracking and alerts for any anomalies or performance degradation.</li> <li>Maintenance: Conduct regular maintenance activities, including software updates, patching, and optimization to ensure the service runs smoothly.</li> <li>Scaling: Dynamically scale the resources up or down based on the demand and performance requirements.</li> <li>Fault Management: Detect and resolve faults in the network slice to minimize downtime and maintain service quality.</li> </ul>"},{"location":"naas/lcm_intro/#3-decommissioning-phase","title":"3. Decommissioning Phase","text":"<ul> <li>Service Termination: Service Orchestrator terminates the network service. This may involve:</li> <li>Terminate any related services that the service depends on</li> <li>Contacting all related controllers during termination to release resources, e.g. Kubernetes controllers, Kubernetes operators, MANO Orchestrators, RAN controllers, SDN Controlles, or other external services (e.g. via REST calls)</li> <li>Scheduling termination, Resolving dependencies and passing paramemters between controllers</li> <li>OpenSlice Service Orchestrator, if everything is succesful, puts the service at \"TERMINATED\" state</li> <li>User Notification:  There could be an email notification from the system (if Bugzilla is configured)</li> </ul>"},{"location":"naas/lcm_intro/#high-level-example-enhanced-mobile-broadband-embb-service-lifecycle","title":"High level example: Enhanced Mobile Broadband (eMBB) Service Lifecycle","text":"<ol> <li> <p>Preparation:</p> </li> <li> <p>Define eMBB service requirements for high bandwidth and low latency.</p> </li> <li>Create an eMBB service specification template specifying related services and resources to Kubernetes Operators, VNFs for content delivery and traffic management.</li> <li> <p>Expose to catalog</p> </li> <li> <p>Instantiation:</p> </li> <li> <p>Instantiate other services and allocate resources such as edge computing nodes and high-capacity links.</p> </li> <li> <p>Configure the service to prioritize video streaming traffic.</p> </li> <li> <p>Operation:</p> </li> <li> <p>Monitor the service to ensure it meets high-bandwidth requirements.</p> </li> <li> <p>Scale up resources during peak usage periods, such as live sports events.</p> </li> <li> <p>Decommissioning:</p> </li> <li> <p>Notify users about service termination.</p> </li> <li>Decommission the network service, reclaiming resources for other services.</li> </ol>"},{"location":"naas/lcm_intro/#probe-further","title":"Probe further","text":"<ul> <li>See 3GPP Lifecycle</li> </ul>"},{"location":"naas/lcm_rules_intro/","title":"Lifecycle Management Rules - LCM Rules","text":"<p>Lifecycle Management Rules: Defining complex conditions and actions during the lifecycle of a service and any necessary modifications throughout the service lifecycle.</p>"},{"location":"naas/lcm_rules_intro/#intended-audience-service-designers","title":"Intended Audience: Service Designers","text":"<p>OpenSlice end-to-end (E2E) service orchestrator follows some predefined workflows to manage a service lifecycle (They are described in BPMN language and included in our orchestration engine)</p> <p>So in the system there are already predefined recipes, which in each process-step of the workflow some piece of code is executed. </p> <p>How is it possible to intervene in the workflow process and inject some user defined actions? The next image illustrates the idea</p> <p></p>"},{"location":"naas/lcm_rules_intro/#how-is-it-possible-to-intervene-in-the-workflow-process-and-affect-it","title":"How is it possible to intervene in the workflow process and affect it?","text":"<p>LCM Rules are used for defining complex conditions and actions during the lifecycle of a service. In Openslice there are the following 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 Service 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. These 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":"naas/lcm_rules_intro/#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":"naas/lcm_rules_intro/#probe-further","title":"Probe further","text":"<ul> <li>In the Service Design section we present in details the Lifecycle rules and how one can design them</li> <li>Many of them are used in our provided Service Design examples</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>As next image depicts, service orchestrators follow some predefined workflows. OpenSlice end-to-end (E2E) service orchestrator follows some predefined workflows to manage a service lifecycle (They are described in BPMN language and included in our orchestration engine)</p> <p></p> <p>This section provides a high level overview of the Service Orchestration process.</p>"},{"location":"naas/so_servicespec_to_services_nfv/","title":"From Service Specification to NFV based services","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":"naas/so_servicespec_to_services_nfv/#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":"naas/so_servicespec_to_services_nfv/#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-&gt;INPROGRESS-&gt;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":"naas/so_servicespec_to_services_nfv/#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":"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/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":"service_design/catalogs/#createdesign-a-service-specification","title":"Create/Design a Service Specification","text":""},{"location":"service_design/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":"service_design/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":"service_design/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":"service_design/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":"service_design/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":"service_design/catalogs/#manage-a-service-specification","title":"Manage a Service Specification","text":"<p>You can manage them though the Web UI</p>"},{"location":"service_design/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":"service_design/catalogs/#retireremove-a-service-specification","title":"Retire/Remove a Service Specification","text":"<p>Delete it from the category</p>"},{"location":"service_design/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":"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&lt;snip&gt;\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&gt;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&gt;Relationships&gt;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&gt;Relationships&gt;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&gt;\"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&gt;Number blocks</li> <li>Add a  str to int block from Number blocks</li> <li>Add Service&gt;Relationships&gt;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&gt;Text blocks</li> <li>Drag-Drop Text&gt;Formatted text block</li> <li>Drag-Drop Text&gt;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&gt;Create list with block delete 2 items (click the gear icon). Connect it to formatted text block</li> <li>Drag-Drop Context&gt;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_design/lcmrules/examples/","title":"Examples of Rules","text":"<p>The following images provide some examples of rules.</p>"},{"location":"service_design/lcmrules/examples/#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":"service_design/lcmrules/examples/#define-rules-to-create-a-resource-for-a-kubernetes-operator","title":"Define Rules to create a resource for a Kubernetes Operator","text":"<ul> <li>Modify the _CR_SPEC characteristic</li> <li>Add an \"Input with variables block\"</li> <li>Add a multiline Text block</li> <li>Mark with %s, %d, etc the parameters to modify with some action</li> <li>Add a list with the variables and their values</li> </ul> <p>in the example we modify a YAML spec with parama, paramb, action values from the characteristics spec.parama, spec.paramb, spec.action</p> <p></p>"},{"location":"service_design/lcmrules/examples/#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":"service_design/lcmrules/examples/#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":"service_design/lcmrules/examples/#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":"service_design/lcmrules/examples/#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":"service_design/lcmrules/intro/","title":"LCM Rules introduction","text":"<p>Lifecycle Management Rules: Defining complex conditions and actions during the lifecycle of a service and any necessary modifications throughout the service lifecycle.</p>"},{"location":"service_design/lcmrules/intro/#intended-audience-service-designers","title":"Intended Audience: Service Designers","text":"<p>In Naas LCM Introduction it was presented briefly the LCM Rules concept.</p> <p>This section goes deeply on how Service Designers can use them.</p> <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":"service_design/lcmrules/intro/#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":"service_design/lcmrules/intro/#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":"service_design/lcmrules/intro/#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":"service_design/lcmrules/intro/#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":"service_design/lcmrules/intro/#the-blocks-library","title":"The blocks library","text":"<p>See our LCM Blocks specification</p>"},{"location":"service_design/lcmrules/intro/#examples-of-rules","title":"Examples of Rules","text":"<p>The following images provide some examples of rules.</p>"},{"location":"service_design/lcmrules/intro/#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":"service_design/lcmrules/intro/#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":"service_design/lcmrules/intro/#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":"service_design/lcmrules/intro/#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":"service_design/lcmrules/intro/#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":"service_design/lcmrules/intro/#probe-further","title":"Probe further","text":"<ul> <li>Check our examples for more usages</li> <li>See next the complete specification</li> </ul>"},{"location":"service_design/lcmrules/specification/","title":"LCM Blocks specification","text":""},{"location":"service_design/lcmrules/specification/#intended-audience-service-designers","title":"Intended Audience: Service Designers","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":"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/lcmrules/examples/index.html b/public/develop/service_design/lcmrules/examples/index.html
index dff569ad..1a62170a 100644
--- a/public/develop/service_design/lcmrules/examples/index.html
+++ b/public/develop/service_design/lcmrules/examples/index.html
@@ -75,6 +75,11 @@
     <label class="md-overlay" for="__drawer"></label>
     <div data-md-component="skip">
       
+        
+        <a href="#examples-of-rules" class="md-skip">
+          Skip to content
+        </a>
+      
     </div>
     <div data-md-component="announce">
       
@@ -1661,6 +1666,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">
+    Typical Examples
+  </span>
+  
+
+          <span class="md-nav__icon md-icon"></span>
+        </label>
       
       <a href="./" class="md-nav__link md-nav__link--active">
         
@@ -1672,6 +1690,79 @@
 
       </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="#define-variables-according-to-cases" class="md-nav__link">
+    <span class="md-ellipsis">
+      Define variables according to cases
+    </span>
+  </a>
+  
+</li>
+      
+        <li class="md-nav__item">
+  <a href="#define-rules-to-create-a-resource-for-a-kubernetes-operator" class="md-nav__link">
+    <span class="md-ellipsis">
+      Define Rules to create a resource for a Kubernetes Operator
+    </span>
+  </a>
+  
+</li>
+      
+        <li class="md-nav__item">
+  <a href="#define-complex-osm-configs-for-day-0" class="md-nav__link">
+    <span class="md-ellipsis">
+      Define complex OSM configs for DAY 0
+    </span>
+  </a>
+  
+</li>
+      
+        <li class="md-nav__item">
+  <a href="#define-and-instantiate-different-services-according-to-service-order-request" class="md-nav__link">
+    <span class="md-ellipsis">
+      Define and instantiate different services according to Service Order request
+    </span>
+  </a>
+  
+</li>
+      
+        <li class="md-nav__item">
+  <a href="#call-an-external-restful-service" class="md-nav__link">
+    <span class="md-ellipsis">
+      Call an external RESTful service
+    </span>
+  </a>
+  
+</li>
+      
+        <li class="md-nav__item">
+  <a href="#create-new-service-orders" class="md-nav__link">
+    <span class="md-ellipsis">
+      Create New Service Orders
+    </span>
+  </a>
+  
+</li>
+      
+    </ul>
+  
+</nav>
+      
     </li>
   
 
@@ -2635,6 +2726,70 @@
   
   
   
+    
+  
+  
+    <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="#define-variables-according-to-cases" class="md-nav__link">
+    <span class="md-ellipsis">
+      Define variables according to cases
+    </span>
+  </a>
+  
+</li>
+      
+        <li class="md-nav__item">
+  <a href="#define-rules-to-create-a-resource-for-a-kubernetes-operator" class="md-nav__link">
+    <span class="md-ellipsis">
+      Define Rules to create a resource for a Kubernetes Operator
+    </span>
+  </a>
+  
+</li>
+      
+        <li class="md-nav__item">
+  <a href="#define-complex-osm-configs-for-day-0" class="md-nav__link">
+    <span class="md-ellipsis">
+      Define complex OSM configs for DAY 0
+    </span>
+  </a>
+  
+</li>
+      
+        <li class="md-nav__item">
+  <a href="#define-and-instantiate-different-services-according-to-service-order-request" class="md-nav__link">
+    <span class="md-ellipsis">
+      Define and instantiate different services according to Service Order request
+    </span>
+  </a>
+  
+</li>
+      
+        <li class="md-nav__item">
+  <a href="#call-an-external-restful-service" class="md-nav__link">
+    <span class="md-ellipsis">
+      Call an external RESTful service
+    </span>
+  </a>
+  
+</li>
+      
+        <li class="md-nav__item">
+  <a href="#create-new-service-orders" class="md-nav__link">
+    <span class="md-ellipsis">
+      Create New Service Orders
+    </span>
+  </a>
+  
+</li>
+      
+    </ul>
   
 </nav>
                   </div>
@@ -2649,9 +2804,59 @@
                   
 
 
-  <h1>Typical Examples</h1>
-
-
+<h1 id="examples-of-rules">Examples of Rules</h1>
+<p>The following images provide some examples of rules.</p>
+<h3 id="define-variables-according-to-cases">Define variables according to cases</h3>
+<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><a href="../images/lcm/lcmfig9.png"><img alt="lcmrules" src="../images/lcm/lcmfig9.png" /></a></p>
+<h3 id="define-rules-to-create-a-resource-for-a-kubernetes-operator">Define Rules to create a resource for a Kubernetes Operator</h3>
+<ul>
+<li>Modify the _CR_SPEC characteristic</li>
+<li>Add an "Input with variables block"</li>
+<li>Add a multiline Text block</li>
+<li>Mark with %s, %d, etc the parameters to modify with some action</li>
+<li>Add a list with the variables and their values</li>
+</ul>
+<p>in the example we modify a YAML spec with parama, paramb, action values from the characteristics spec.parama, spec.paramb, spec.action</p>
+<p><a href="../images/lcm/lcmfig15.png"><img alt="lcmrules" src="../images/lcm/lcmfig15.png" /></a></p>
+<h3 id="define-complex-osm-configs-for-day-0">Define complex OSM configs for DAY 0</h3>
+<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><a href="../images/lcm/lcmfig10.png"><img alt="lcmrules" src="../images/lcm/lcmfig10.png" /></a></p>
+<h3 id="define-and-instantiate-different-services-according-to-service-order-request">Define and instantiate different services according to Service Order request</h3>
+<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><a href="../images/lcm/lcmfig11.png"><img alt="lcmrules" src="../images/lcm/lcmfig11.png" /></a></p>
+<h3 id="call-an-external-restful-service">Call an external RESTful service</h3>
+<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><a href="../images/lcm/lcmfig12.png"><img alt="lcmrules" src="../images/lcm/lcmfig12.png" /></a></p>
+<p><a href="../images/lcm/lcmfig13.png"><img alt="lcmrules" src="../images/lcm/lcmfig13.png" /></a></p>
+<h3 id="create-new-service-orders">Create New Service Orders</h3>
+<p>The following example calls to Order a New Service Specification with specific Parameter Values</p>
+<p><a href="../images/lcm/lcmfig14.png"><img alt="lcmrules" src="../images/lcm/lcmfig14.png" /></a></p>
 
 
 
diff --git a/public/develop/service_design/lcmrules/images/lcm/lcmfig15.png b/public/develop/service_design/lcmrules/images/lcm/lcmfig15.png
new file mode 100644
index 0000000000000000000000000000000000000000..0005c110adce2a14ba143ee54b46e948d4f81c19
GIT binary patch
literal 292068
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
XHh0+kyMXHr^d%#qC|)jV?EilN#Re(+

literal 0
HcmV?d00001

diff --git a/public/develop/service_design/lcmrules/intro/index.html b/public/develop/service_design/lcmrules/intro/index.html
index fa06d35a..03f83836 100644
--- a/public/develop/service_design/lcmrules/intro/index.html
+++ b/public/develop/service_design/lcmrules/intro/index.html
@@ -3010,14 +3010,7 @@
 <li>On the right side the user can define some rule properties or observe the underlying generated java code.</li>
 </ul>
 <h2 id="the-blocks-library">The blocks library</h2>
-<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><a href="../images/lcm/lcmfig4.png"><img alt="lcmrules" src="../images/lcm/lcmfig4.png" /></a>
-<a href="../images/lcm/lcmfig5.png"><img alt="lcmrules" src="../images/lcm/lcmfig5.png" /></a>
-<a href="../images/lcm/lcmfig6.png"><img alt="lcmrules" src="../images/lcm/lcmfig6.png" /></a>
-<a href="../images/lcm/lcmfig7.png"><img alt="lcmrules" src="../images/lcm/lcmfig7.png" /></a>
-<a href="../images/lcm/lcmfig8.png"><img alt="lcmrules" src="../images/lcm/lcmfig8.png" /></a></p>
+<p>See our <a href="../specification/">LCM Blocks specification</a></p>
 <h2 id="examples-of-rules">Examples of Rules</h2>
 <p>The following images provide some examples of rules.</p>
 <h3 id="define-variables-according-to-cases">define variables according to cases</h3>
diff --git a/public/develop/service_design/lcmrules/specification/index.html b/public/develop/service_design/lcmrules/specification/index.html
index ba5318e6..d8283950 100644
--- a/public/develop/service_design/lcmrules/specification/index.html
+++ b/public/develop/service_design/lcmrules/specification/index.html
@@ -75,6 +75,11 @@
     <label class="md-overlay" for="__drawer"></label>
     <div data-md-component="skip">
       
+        
+        <a href="#lcm-blocks-specification" class="md-skip">
+          Skip to content
+        </a>
+      
     </div>
     <div data-md-component="announce">
       
@@ -1640,6 +1645,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">
+    Specification
+  </span>
+  
+
+          <span class="md-nav__icon md-icon"></span>
+        </label>
       
       <a href="./" class="md-nav__link md-nav__link--active">
         
@@ -1651,6 +1669,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>
   
 
@@ -2635,6 +2681,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>
@@ -2649,9 +2714,16 @@
                   
 
 
-  <h1>Specification</h1>
-
-
+<h1 id="lcm-blocks-specification">LCM Blocks specification</h1>
+<h2 id="intended-audience-service-designers">Intended Audience: Service Designers</h2>
+<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><a href="../images/lcm/lcmfig4.png"><img alt="lcmrules" src="../images/lcm/lcmfig4.png" /></a>
+<a href="../images/lcm/lcmfig5.png"><img alt="lcmrules" src="../images/lcm/lcmfig5.png" /></a>
+<a href="../images/lcm/lcmfig6.png"><img alt="lcmrules" src="../images/lcm/lcmfig6.png" /></a>
+<a href="../images/lcm/lcmfig7.png"><img alt="lcmrules" src="../images/lcm/lcmfig7.png" /></a>
+<a href="../images/lcm/lcmfig8.png"><img alt="lcmrules" src="../images/lcm/lcmfig8.png" /></a></p>
 
 
 
-- 
GitLab