Network Slicing Use Case
- Alex Stancu
Table of Contents
Sub pages
The O1 Simulator offers support for demonstrating the O-RAN-SC E-Release Network Slicing use case proposed by Radisys. This is available in the nts-ng-o-ran-du docker image, starting with version 1.4.3.
Features
- Support for o-ran-du-hello-world.yang model developed by the OAM project, containing slicing information
- Support for VES PM stndDefined messages
- Support for VES Subscription and PM Job creation
Usage
Details about how to start a simulated O-DU and how to use the Network Slicing use case features are below. A video demonstrating these capabilities was presented in this meeting. The recording is available there.
For starting the OAM Controller and VES Collector, a minimal SMO deployment is needed. This can be started using the instructions from here and ignoring the NonRT-RIC and ONAP-Policy steps. Please replace the version of the simulators in the ".env" file with the current 1.4.3 version.
Starting
A simulated O-DU can be started via docker-compose. The following .env and docker-compose.yaml files can be used to start such a simulator.
.env
NEXUS3_DOCKER_REPO=nexus3.o-ran-sc.org:10002/o-ran-sc/ NTS_BUILD_VERSION=1.4.3 CU_PREFIX=111 DU_PREFIX=${CU_PREFIX}1 IPv6_ENABLED=true SSH_CONNECTIONS=1 TLS_CONNECTIONS=0 #NTS_HOST_IP=10.20.11.121 NTS_HOST_IP=2001:db8:1::1 NTS_HOST_BASE_PORT=50000 NTS_HOST_NETCONF_SSH_BASE_PORT=50000 NTS_HOST_NETCONF_TLS_BASE_PORT=52000 NTS_HOST_TRANSFER_FTP_BASE_PORT=54000 NTS_HOST_TRANSFER_SFTP_BASE_PORT=56000 NTS_NF_MOUNT_POINT_ADDRESSING_METHOD=docker-mapping SDN_CONTROLLER_PROTOCOL=http SDN_CONTROLLER_IP=2001:db8:1:50::23 SDN_CONTROLLER_PORT=8181 SDN_CONTROLLER_CALLHOME_PORT=4335 SDN_CONTROLLER_CALLHOME_IP=2001:db8:1:50::23 SDN_CONTROLLER_USERNAME=admin SDN_CONTROLLER_PASSWORD=Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U VES_COMMON_HEADER_VERSION=7.2.1 VES_ENDPOINT_PROTOCOL=https VES_ENDPOINT_IP=2001:db8:1:50::27 VES_ENDPOINT_PORT=8443 VES_ENDPOINT_AUTH_METHOD=basic-auth VES_ENDPOINT_USERNAME=sample1 VES_ENDPOINT_PASSWORD=sample1
docker-compose.yaml
version: '3.8' x-common_env: &common_env IPv6_ENABLED: ${IPv6_ENABLED} SSH_CONNECTIONS: ${SSH_CONNECTIONS} TLS_CONNECTIONS: ${TLS_CONNECTIONS} NTS_NF_MOUNT_POINT_ADDRESSING_METHOD: ${NTS_NF_MOUNT_POINT_ADDRESSING_METHOD} NTS_HOST_IP: ${NTS_HOST_IP} NTS_HOST_BASE_PORT: ${NTS_HOST_BASE_PORT} NTS_HOST_NETCONF_SSH_BASE_PORT: ${NTS_HOST_NETCONF_SSH_BASE_PORT} NTS_HOST_NETCONF_TLS_BASE_PORT: ${NTS_HOST_NETCONF_TLS_BASE_PORT} NTS_HOST_TRANSFER_FTP_BASE_PORT: ${NTS_HOST_TRANSFER_FTP_BASE_PORT} NTS_HOST_TRANSFER_SFTP_BASE_PORT: ${NTS_HOST_TRANSFER_SFTP_BASE_PORT} SDN_CONTROLLER_PROTOCOL: ${SDN_CONTROLLER_PROTOCOL} SDN_CONTROLLER_IP: ${SDN_CONTROLLER_IP} SDN_CONTROLLER_PORT: ${SDN_CONTROLLER_PORT} SDN_CONTROLLER_CALLHOME_IP: ${SDN_CONTROLLER_CALLHOME_IP} SDN_CONTROLLER_CALLHOME_PORT: ${SDN_CONTROLLER_CALLHOME_PORT} SDN_CONTROLLER_USERNAME: ${SDN_CONTROLLER_USERNAME} SDN_CONTROLLER_PASSWORD: ${SDN_CONTROLLER_PASSWORD} VES_COMMON_HEADER_VERSION: ${VES_COMMON_HEADER_VERSION} VES_ENDPOINT_PROTOCOL: ${VES_ENDPOINT_PROTOCOL} VES_ENDPOINT_IP: ${VES_ENDPOINT_IP} VES_ENDPOINT_PORT: ${VES_ENDPOINT_PORT} VES_ENDPOINT_AUTH_METHOD: ${VES_ENDPOINT_AUTH_METHOD} VES_ENDPOINT_USERNAME: ${VES_ENDPOINT_USERNAME} VES_ENDPOINT_PASSWORD: ${VES_ENDPOINT_PASSWORD} x-du_env: &du_env NTS_NF_STANDALONE_START_FEATURES: "datastore-populate ves-heartbeat ves-file-ready ves-pnf-registration web-cut-through" x-nf: &common_nf stop_grace_period: 5m cap_add: - SYS_ADMIN - SYS_PTRACE services: ntsim-ng-o-ran-du-1: <<: *common_nf image: "${NEXUS3_DOCKER_REPO}nts-ng-o-ran-du:${NTS_BUILD_VERSION}" container_name: ntsim-ng-o-ran-du-${DU_PREFIX} hostname: O-DU-${DU_PREFIX} environment: <<: *common_env <<: *du_env networks: default: external: name: oam
Please adjust the values in the docker-compose.yaml according to your needs: e.g. specify the correct VES Endpoint IP address, SDN Controller IP address, rename or remove the oam network, as applicable to your specific host.
Starting can be done via:
docker-compose up -d
This will start a docker container containing the o-ran-sc-du-hello-world YANG model. The user can then start a NETCONF session to this device (default is port 830 and the IP address can be the one of the docker container).
Configure VES details
NETCONF
After the simulated O-DU is up and running, the VES subscription details can be configured. These are part of the o-ran-sc-du-hello-world model. An example edit-config NETCONF operation that configures VES endpoint details:
<?xml version="1.0" encoding="utf-8"?> <rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id=""> <edit-config> <target> <running/> </target> <config> <duhw:network-function xmlns:duhw="urn:o-ran-sc:yang:o-ran-sc-du-hello-world"> <duhw:subscription-streams> <duhw:id>stream-1</duhw:id> <duhw:administrative-state>unlocked</duhw:administrative-state> <duhw:user-label>stream1</duhw:user-label> <duhw:ves-endpoint-protocol>https</duhw:ves-endpoint-protocol> <duhw:ves-endpoint-auth-method>basic-auth</duhw:ves-endpoint-auth-method> <duhw:ves-endpoint-ip>10.20.11.121</duhw:ves-endpoint-ip> <duhw:ves-endpoint-port>8443</duhw:ves-endpoint-port> <duhw:ves-endpoint-username>sample1</duhw:ves-endpoint-username> <duhw:ves-endpoint-password>sample1</duhw:ves-endpoint-password> </duhw:subscription-streams> </duhw:network-function> </config> </edit-config> </rpc>
RESTCONF
After the simulated O-DU is mounted in the SDN Controller (this should be done automatically via VES pnfRegistration), the VES details could also be configured via RESTCONF.
### @name setSubscriptionSteram # baseUrl needs to be replaced by the OAM IP address and port of the SDN Controller RESTCONF interface # node needs to be replaced by the name of the O-DU (e.g. O-DU-1211) curl -X PUT -H "Content-Type: application/yang-data+json" -H "Accept: application/yang-data+json" -d '{"subscription-streams":{"id":"stream-1","administrative-state":"unlocked","user-label":"stream1","ves-endpoint-protocol":"https","ves-endpoint-auth-method":"basic-auth","ves-endpoint-ip":"10.20.11.121","ves-endpoint-port":"8443","ves-endpoint-username":"sample1","ves-endpoint-password":"sample1"}}' -u admin:Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U {{baseUrl}}/rests/data/network-topology:network-topology/topology=topology-netconf/node={{node}}/yang-ext:mount/o-ran-sc-du-hello-world:network-function/subscription-streams=stream-1
PM Job creation
NETCONF
Generating VES PM stndDefined events can be done by adding PM Job entries. An example edit-config NETCONF operation that adds a new PM job:
<?xml version="1.0" encoding="utf-8"?> <rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id=""> <edit-config> <target> <running/> </target> <config> <duhw:network-function xmlns:duhw="urn:o-ran-sc:yang:o-ran-sc-du-hello-world"> <duhw:performance-measurement-jobs xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" nc:operation="create"> <duhw:id>pm1</duhw:id> <duhw:administrative-state>unlocked</duhw:administrative-state> <duhw:user-label>pm-1</duhw:user-label> <duhw:performance-metrics>/duhw:network-function/duhw:distributed-unit-functions[duhw:id='O-DU-1211']/duhw:cell[duhw:id='cell-1']/duhw:supported-measurements[duhw:performance-measurement-type='user-equipment-average-throughput-downlink']</duhw:performance-metrics> <duhw:granularity-period>30</duhw:granularity-period> <duhw:stream-target>stream-1</duhw:stream-target> </duhw:performance-measurement-jobs> </duhw:network-function> </config> </edit-config> </rpc>
- The granularity-period specifies the amount of seconds between two "gathered" PM values, and it will be also the number of seconds between two generated VES events.
stream-target points to a previously created stream (describing to a VES endpoint)
RESTCONF
### @name setPerformanceMeasurementJobs # baseUrl needs to be replaced by the OAM IP address and port of the SDN Controller RESTCONF interface # node needs to be replaced by the name of the O-DU (e.g. O-DU-1211) cat payload.json {"performance-measurement-jobs":{"id":"pm-1","administrative-state":"unlocked","user-label":"pm","job-tag":"my-job-tag","performance-metrics":["/o-ran-sc-du-hello-world:network-function/o-ran-sc-du-hello-world:distributed-unit-functions[o-ran-sc-du-hello-world:id='O-DU-1211']/o-ran-sc-du-hello-world:cell[o-ran-sc-du-hello-world:id='cell-1']/o-ran-sc-du-hello-world:supported-measurements[o-ran-sc-du-hello-world:performance-measurement-type='user-equipment-average-throughput-uplink']/o-ran-sc-du-hello-world:supported-snssai-subcounter-instances[o-ran-sc-du-hello-world:slice-differentiator='1'][o-ran-sc-du-hello-world:slice-service-type='1']"],"granularity-period":30,"stream-target":"stream-1"}} curl -X PUT -H "Content-Type: application/yang-data+json" -H "Accept: application/yang-data+json" -d @payload.json -u admin:Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U {{baseUrl}}/rests/data/network-topology:network-topology/topology=topology-netconf/node={{node}}/yang-ext:mount/o-ran-sc-du-hello-world:network-function/performance-measurement-jobs=pm-1
PM Job deletion
NETCONF
A PM Job can be deleted, thus the generation of new VES PM events associated with that job will be stopped. An example edit-config NETCONF operation that deletes a PM job:
<?xml version="1.0" encoding="utf-8"?> <rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id=""> <edit-config> <target> <running/> </target> <config> <duhw:network-function xmlns:duhw="urn:o-ran-sc:yang:o-ran-sc-du-hello-world"> <duhw:performance-measurement-jobs xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" nc:operation="delete"> <duhw:id>pm1</duhw:id> </duhw:performance-measurement-jobs> </duhw:network-function> </config> </edit-config> </rpc>
RESTCONF
### @name deletePerformanceMeasurementJobs # baseUrl needs to be replaced by the OAM IP address and port of the SDN Controller RESTCONF interface # node needs to be replaced by the name of the O-DU (e.g. O-DU-1211) curl -X DELETE -H "Content-Type: application/yang-data+json" -H "Accept: application/yang-data+json" -u admin:Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U {{baseUrl}}/rests/data/network-topology:network-topology/topology=topology-netconf/node={{node}}/yang-ext:mount/o-ran-sc-du-hello-world:network-function/performance-measurement-jobs=pm-1
Example VES PM stndDefined
This is an example JSON VES PM stndDefined message generated by the O-DU Simulator:
[2021-12-08|17:26:10|http_client.c:103] POST-ing cURL to url="https://10.20.11.121:8443/eventListener/v7" with body="{ "event": { "commonEventHeader": { "domain": "stndDefined", "eventId": "pm1_1638984365", "eventName": "stndDefined_performanceMeasurementStreaming", "eventType": "performanceMeasurementStreaming", "sequence": 24, "priority": "Low", "reportingEntityId": "", "reportingEntityName": "O-RAN-O-DU-1", "sourceId": "", "sourceName": "O-RAN-O-DU-1", "startEpochMicrosec": 1638984365000000, "lastEpochMicrosec": 1638984370000000, "nfNamingCode": "SIM-O-DU", "nfVendorName": "O-RAN-SC SIM Project", "stndDefinedNamespace": "o-ran-sc-du-hello-world-pm-streaming-oas3", "timeZoneOffset": "+00:00", "version": "4.1", "vesEventListenerVersion": "7.2.1" }, "stndDefinedFields": { "stndDefinedFieldsVersion": "1.0", "schemaReference": "https://gerrit.o-ran-sc.org/r/gitweb?p=scp/oam/modeling.git;a=blob_plain;f=data-model/oas3/experimental/o-ran-sc-du-hello-world-pm-streaming-oas3.yaml", "data": { "id": "pm1_1638984365", "start-time": "2021-12-08T17:26:05.0Z", "administrative-state": "unlocked", "operational-state": "enabled", "user-label": "pm-1", "job-tag": "", "granularity-period": 5, "measurements": [{"measurement-type-instance-reference": "/o-ran-sc-du-hello-world:network-function/distributed-unit-functions[id='O-DU-1211']/cell[id='cell-1']/supported-measurements[performance-measurement-type='user-equipment-average-throughput-downlink']","value": 12355,"unit": "kbit/s"} ] } } } }"