From 94bf6cb9d8a780b38b860acab89d32e50ce16391 Mon Sep 17 00:00:00 2001 From: Sandeep Shah Date: Sat, 15 Aug 2020 20:21:18 -0500 Subject: RAN Slice YANG Model and Associated Feature code This includes YANG models to be used for RAN Slice use case/POC in Gulian, and associated ranSlice Karaf feature code. Issue-ID: CCSDK-2661 SIgned-off-by: SandeepLinux Change-Id: I75ab8860c67bd25b7fdbcb5da734d705bfdce1b6 --- sdnr/northbound/pom.xml | 1 + sdnr/northbound/ranSlice/feature/pom.xml | 47 + sdnr/northbound/ranSlice/installer/pom.xml | 116 ++ .../src/assembly/assemble_mvnrepo_zip.xml | 47 + sdnr/northbound/ranSlice/model/pom.xml | 48 + .../src/main/yang/ran-network@2020-08-06.yang | 1880 ++++++++++++++++++++ .../src/main/yang/ran-slice-api@2020-08-06.yang | 466 +++++ sdnr/northbound/ranSlice/pom.xml | 50 + sdnr/northbound/ranSlice/provider/derby.log | 13 + sdnr/northbound/ranSlice/provider/pom.xml | 167 ++ .../sdnr/northbound/ranSlice/RANSliceClient.java | 99 ++ .../sdnr/northbound/ranSlice/RANSliceProvider.java | 480 +++++ .../northbound/ranSlice/RANSliceResponseCode.java | 51 + .../ranSlice/RANSliceRpcInvocationException.java | 25 + .../OSGI-INF/blueprint/impl-blueprint.xml | 52 + .../org/opendaylight/blueprint/impl-blueprint.xml | 52 + .../northbound/ranSlice/RANSliceProviderTest.java | 366 ++++ .../TestRANSliceRpcInvocationException.java | 42 + .../test/resources/graphs/ranSlice/graph.versions | 10 + .../ran-slice-api_activateRANSliceInstance.xml | 30 + .../ranSlice/ran-slice-api_configNotification.xml | 30 + .../graphs/ranSlice/ran-slice-api_configureCU.xml | 30 + .../graphs/ranSlice/ran-slice-api_configureDU.xml | 30 + .../ranSlice/ran-slice-api_configureNearRTRIC.xml | 30 + .../ran-slice-api_configureRANSliceInstance.xml | 30 + .../ran-slice-api_deactivateRANSliceInstance.xml | 30 + .../ran-slice-api_determineRANSliceResources.xml | 30 + .../ranSlice/ran-slice-api_instantiateRANSlice.xml | 30 + .../ran-slice-api_terminateRANSliceInstance.xml | 30 + .../src/test/resources/simplelogger.properties | 22 + .../src/test/resources/svclogic.properties | 27 + 31 files changed, 4361 insertions(+) create mode 100644 sdnr/northbound/ranSlice/feature/pom.xml create mode 100644 sdnr/northbound/ranSlice/installer/pom.xml create mode 100644 sdnr/northbound/ranSlice/installer/src/assembly/assemble_mvnrepo_zip.xml create mode 100644 sdnr/northbound/ranSlice/model/pom.xml create mode 100644 sdnr/northbound/ranSlice/model/src/main/yang/ran-network@2020-08-06.yang create mode 100644 sdnr/northbound/ranSlice/model/src/main/yang/ran-slice-api@2020-08-06.yang create mode 100644 sdnr/northbound/ranSlice/pom.xml create mode 100644 sdnr/northbound/ranSlice/provider/derby.log create mode 100644 sdnr/northbound/ranSlice/provider/pom.xml create mode 100644 sdnr/northbound/ranSlice/provider/src/main/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceClient.java create mode 100644 sdnr/northbound/ranSlice/provider/src/main/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceProvider.java create mode 100644 sdnr/northbound/ranSlice/provider/src/main/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceResponseCode.java create mode 100644 sdnr/northbound/ranSlice/provider/src/main/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceRpcInvocationException.java create mode 100644 sdnr/northbound/ranSlice/provider/src/main/resources/OSGI-INF/blueprint/impl-blueprint.xml create mode 100644 sdnr/northbound/ranSlice/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml create mode 100644 sdnr/northbound/ranSlice/provider/src/test/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceProviderTest.java create mode 100644 sdnr/northbound/ranSlice/provider/src/test/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/TestRANSliceRpcInvocationException.java create mode 100644 sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/graph.versions create mode 100644 sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_activateRANSliceInstance.xml create mode 100644 sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configNotification.xml create mode 100644 sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configureCU.xml create mode 100644 sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configureDU.xml create mode 100644 sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configureNearRTRIC.xml create mode 100644 sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configureRANSliceInstance.xml create mode 100644 sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_deactivateRANSliceInstance.xml create mode 100644 sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_determineRANSliceResources.xml create mode 100644 sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_instantiateRANSlice.xml create mode 100644 sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_terminateRANSliceInstance.xml create mode 100644 sdnr/northbound/ranSlice/provider/src/test/resources/simplelogger.properties create mode 100644 sdnr/northbound/ranSlice/provider/src/test/resources/svclogic.properties diff --git a/sdnr/northbound/pom.xml b/sdnr/northbound/pom.xml index 311e4da9b..52ccbf71b 100644 --- a/sdnr/northbound/pom.xml +++ b/sdnr/northbound/pom.xml @@ -45,6 +45,7 @@ oofpcipoc a1Adapter CMNotify + ranSlice features diff --git a/sdnr/northbound/ranSlice/feature/pom.xml b/sdnr/northbound/ranSlice/feature/pom.xml new file mode 100644 index 000000000..fef1ece3c --- /dev/null +++ b/sdnr/northbound/ranSlice/feature/pom.xml @@ -0,0 +1,47 @@ + + + + + 4.0.0 + + + org.onap.ccsdk.parent + single-feature-parent + 2.0.1-SNAPSHOT + + + + org.onap.ccsdk.features.sdnr.northbound + ranSlice-feature + 1.0.1-SNAPSHOT + feature + + ccsdk-features :: sdnr-northbound :: ${project.artifactId} + + + + ${project.groupId} + ranSlice-provider + ${project.version} + + + diff --git a/sdnr/northbound/ranSlice/installer/pom.xml b/sdnr/northbound/ranSlice/installer/pom.xml new file mode 100644 index 000000000..c454d7017 --- /dev/null +++ b/sdnr/northbound/ranSlice/installer/pom.xml @@ -0,0 +1,116 @@ + + + + + 4.0.0 + + + org.onap.ccsdk.parent + odlparent-lite + 2.0.1-SNAPSHOT + + + + org.onap.ccsdk.features.sdnr.northbound + ranSlice-installer + 1.0.1-SNAPSHOT + pom + + ccsdk-features :: sdnr-northbound :: ${project.artifactId} + + + ranSlice + false + + + + + + org.onap.ccsdk.features.sdnr.northbound + ${application.name}-feature + ${project.version} + xml + features + + + * + * + + + + + ${project.groupId} + ranSlice-provider + ${project.version} + + + + + + + maven-assembly-plugin + + + maven-repo-zip + + single + + package + + true + stage/${application.name}-${project.version} + + src/assembly/assemble_mvnrepo_zip.xml + + true + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-dependencies + + copy-dependencies + + prepare-package + + false + ${project.build.directory}/assembly/system + false + true + true + true + false + false + ranSlice-model,ranSlice-provider,ranSlice-feature + provided + + + + + + + diff --git a/sdnr/northbound/ranSlice/installer/src/assembly/assemble_mvnrepo_zip.xml b/sdnr/northbound/ranSlice/installer/src/assembly/assemble_mvnrepo_zip.xml new file mode 100644 index 000000000..dfe5060bf --- /dev/null +++ b/sdnr/northbound/ranSlice/installer/src/assembly/assemble_mvnrepo_zip.xml @@ -0,0 +1,47 @@ + + + + + + repo + + zip + + + + false + + + + target/assembly/ + . + + + + + + diff --git a/sdnr/northbound/ranSlice/model/pom.xml b/sdnr/northbound/ranSlice/model/pom.xml new file mode 100644 index 000000000..84d3b5020 --- /dev/null +++ b/sdnr/northbound/ranSlice/model/pom.xml @@ -0,0 +1,48 @@ + + + + + 4.0.0 + + + org.onap.ccsdk.parent + binding-parent + 2.0.1-SNAPSHOT + + + + org.onap.ccsdk.features.sdnr.northbound + ranSlice-model + 1.0.1-SNAPSHOT + bundle + + ccsdk-features :: sdnr-northbound :: ${project.artifactId} + + + + org.opendaylight.mdsal.binding.model.ietf + rfc6991 + + + + + diff --git a/sdnr/northbound/ranSlice/model/src/main/yang/ran-network@2020-08-06.yang b/sdnr/northbound/ranSlice/model/src/main/yang/ran-network@2020-08-06.yang new file mode 100644 index 000000000..f45bd7cbe --- /dev/null +++ b/sdnr/northbound/ranSlice/model/src/main/yang/ran-network@2020-08-06.yang @@ -0,0 +1,1880 @@ +module ran-network { + yang-version 1.1; + namespace "org:onap:ccsdk:features:sdnr:northbound:ran-network"; + prefix rn; + + import ietf-inet-types { + prefix inet; + } + import ietf-yang-types { + prefix yang; + } + + organization + "Open Network Automation Platform - ONAP + "; + contact + "Editors: + Sandeep Shah + + + Swaminathan Seetharaman + "; + description + "This module contains a collection of YANG definitions for managing + radio access network (RAN) managed network functions. + This YANG model is used solely for POC's in the ONAP and O-RAN communities + + Copyright 2020 the O-RAN Alliance. + + Licensed under the Apache License, Version 2.0 (the 'License'); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an 'AS IS' BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License."; + + revision 2020-08-06 { + description + "RAN Network YANG Model for ONAP/O-RAN POC"; + reference + "https://wiki.onap.org/display/DW/E2E+Network+Slicing+Use+Case+in+R7+Guilin"; + } + + typedef usageState { + type enumeration { + enum IDLE { + description + "TODO"; + } + enum ACTIVE { + description + "TODO"; + } + enum BUSY { + description + "TODO"; + } + } + description + "It describes whether or not the resource is actively in + use at a specific instant, and if so, whether or not it has spare + capacity for additional users at that instant. The value is READ-ONLY."; + reference + "ITU T Recommendation X.731"; + } + + typedef Mcc { + type string; + description + "The mobile country code consists of three decimal digits, + The first digit of the mobile country code identifies the geographic + region (the digits 1 and 8 are not used):"; + reference + "3GPP TS 23.003 subclause 2.2 and 12.1"; + } + + typedef Mnc { + type string; + description + "The mobile network code consists of two or three + decimal digits (for example: MNC of 001 is not the same as MNC of 01)"; + reference + "3GPP TS 23.003 subclause 2.2 and 12.1"; + } + + typedef Nci { + type string; + description + "NR Cell Identity. The NCI shall be of fixed length of 36 bits + and shall be coded using full hexadecimal representation. + The exact coding of the NCI is the responsibility of each PLMN operator"; + reference + "TS 23.003"; + } + + typedef OperationalState { + type enumeration { + enum DISABLED { + value 0; + description + "The resource is totally inoperable."; + } + enum ENABLED { + value 1; + description + "The resource is partially or fully operable."; + } + } + description + "TODO"; + reference + "3GPP TS 28.625 and ITU-T X.731"; + } + + typedef AdministrativeState { + type enumeration { + enum LOCKED { + value 0; + description + "The resource is administratively prohibited from performing + services for its users."; + } + enum UNLOCKED { + value 1; + description + "The resource is administratively permitted to perform + services for its users. This is independent of its inherent + operability."; + } + enum SHUTTINGDOWN { + value 2; + description + "Use of the resource is administratively permitted to + existing instances of use only. While the system remains in + the shutting down state the manager or the managed element + may at any time cause the resource to transition to the + locked state."; + } + } + description + "TODO"; + reference + "3GPP TS 28.625 and ITU-T X.731"; + } + + typedef AvailabilityStatus { + type enumeration { + enum IN_TEST { + description + "TODO"; + } + enum FAILED { + description + "TODO"; + } + enum POWER_OFF { + description + "TODO"; + } + enum OFF_LINE { + description + "TODO"; + } + enum OFF_DUTY { + description + "TODO"; + } + enum DEPENDENCY { + description + "TODO"; + } + enum DEGRADED { + description + "TODO"; + } + enum NOT_INSTALLED { + description + "TODO"; + } + enum LOG_FULL { + description + "TODO"; + } + } + description + "TODO"; + reference + "TODO"; + } + + typedef CellState { + type enumeration { + enum IDLE { + description + "TODO"; + } + enum INACTIVE { + description + "TODO"; + } + enum ACTIVE { + description + "TODO"; + } + } + description + "TODO"; + reference + "TODO"; + } + + typedef SNssai { + type uint32; + description + "Single Network Slice Selection Assistance Information."; + reference + "TS 23.501 clause 5.15.2"; + } + + typedef Sst { + type uint8; + description + "TODO"; + reference + "TODO"; + } + + typedef Nrpci { + type uint32; + description + "Physical Cell Identity (PCI) of the NR cell."; + reference + "TS 36.211 subclause 6.11"; + } + + typedef Tac { + type int32 { + range "0..16777215"; + } + description + "Tracking Area Code"; + reference + "TS 23.003 clause 19.4.2.3"; + } + + typedef AmfRegionId { + type string; + description + ""; + reference + "clause 2.10.1 of 3GPP TS 23.003"; + } + + typedef AmfSetId { + type string; + description + ""; + reference + "clause 2.10.1 of 3GPP TS 23.003"; + } + + typedef AmfPointer { + type string; + description + ""; + reference + "clause 2.10.1 of 3GPP TS 23.003"; + } + + // type definitions especially for core NFs + + typedef NfType { + type enumeration { + enum NRF { + description + "TODO"; + } + enum UDM { + description + "TODO"; + } + enum AMF { + description + "TODO"; + } + enum SMF { + description + "TODO"; + } + enum AUSF { + description + "TODO"; + } + enum NEF { + description + "TODO"; + } + enum PCF { + description + "TODO"; + } + enum SMSF { + description + "TODO"; + } + enum NSSF { + description + "TODO"; + } + enum UDR { + description + "TODO"; + } + enum LMF { + description + "TODO"; + } + enum GMLC { + description + "TODO"; + } + enum 5G_EIR { + description + "TODO"; + } + enum SEPP { + description + "TODO"; + } + enum UPF { + description + "TODO"; + } + enum N3IWF { + description + "TODO"; + } + enum AF { + description + "TODO"; + } + enum UDSF { + description + "TODO"; + } + enum BSF { + description + "TODO"; + } + enum CHF { + description + "TODO"; + } + } + description + "TODO"; + } + + typedef NotificationType { + type enumeration { + enum N1_MESSAGES { + description + "TODO"; + } + enum N2_INFORMATION { + description + "TODO"; + } + enum LOCATION_NOTIFICATION { + description + "TODO"; + } + } + description + "TODO"; + } + + typedef Load { + type uint8 { + range "0..100"; + } + description + "Latest known load information of the NF, percentage "; + } + + typedef N1MessageClass { + type enumeration { + enum 5GMM { + description + "TODO"; + } + enum SM { + description + "TODO"; + } + enum LPP { + description + "TODO"; + } + enum SMS { + description + "TODO"; + } + } + description + "TODO"; + } + + typedef N2InformationClass { + type enumeration { + enum SM { + description + "TODO"; + } + enum NRPPA { + description + "TODO"; + } + enum PWS { + description + "TODO"; + } + enum PWS_BCAL { + description + "TODO"; + } + enum PWS_RF { + description + "TODO"; + } + } + description + "TODO"; + reference + "TODO"; + } + + typedef NsiId { + type string; + description + "TODO"; + } + + typedef UeMobilityLevel { + type enumeration { + enum STATIONARY { + description + "TODO"; + } + enum NOMADIC { + description + "TODO"; + } + enum RESTRICTED_MOBILITY { + description + "TODO"; + } + enum FULLY_MOBILITY { + description + "TODO"; + } + } + description + "TODO"; + reference + "TODO"; + } + + typedef ResourceSharingLevel { + type enumeration { + enum SHARED { + description + "TODO"; + } + enum NOT_SHARED { + description + "TODO"; + } + } + description + "TODO"; + reference + "TODO"; + } + + typedef TxDirection { + type enumeration { + enum DL { + description + "TODO"; + } + enum UL { + description + "TODO"; + } + enum DL_AND_UL { + description + "TODO"; + } + } + description + "TODO"; + reference + "TODO"; + } + + typedef DistinguishedName { // TODO is this equivalent to TS 32.300 ? + type string; + description + "Represents the international standard for the representation + of Distinguished Name (RFC 4512). + The format of the DistinguishedName REGEX is: + {AttributeType = AttributeValue} + + AttributeType consists of alphanumeric and hyphen (OIDs not allowed). + All other characters are restricted. + The Attribute value cannot contain control characters or the + following characters : \\ > < ; \" + , (Comma) and White space + The Attribute value can contain the following characters if they + are excaped : \\ > < ; \" + , (Comma) and White space + The Attribute value can contain control characters if its an escaped + double digit hex number. + Examples could be + UID=nobody@example.com,DC=example,DC=com + CN=John Smith,OU=Sales,O=ACME Limited,L=Moab,ST=Utah,C=US"; + reference + "RFC 4512 Lightweight Directory Access Protocol (LDAP): + Directory Information Models"; + } // recheck regexp it doesn't handle posix [:cntrl:] + + typedef QOffsetRange { + type int8; + units "dB"; + description + "TODO"; + reference + "TODO"; + } + + typedef QuotaType { + type enumeration { + enum STRICT { + description + "TODO"; + } + enum FLOAT { + description + "TODO"; + } + } + description + "TODO"; + } + + typedef CyclicPrefix { + type enumeration { + enum NORMAL { + description + "TODO"; + } + enum EXTENDED { + description + "TODO"; + } + } + description + "TODO"; + } + + grouping PLMNInfo { + description + "The PLMNInfo data type define a S-NSSAI member in a specific PLMNId, and it have + two attributes PLMNId and S-NSSAI (PLMNId, S-NSSAI). The PLMNId represents a data type that + is comprised of mcc (mobile country code) and mnc (mobile network code), (See TS 23.003 + subclause 2.2 and 12.1) and S-NSSAI represents an data type, that is comprised of an SST + (Slice/Service type) and an optional SD (Slice Differentiator) field, (See TS 23.003 [13])."; + uses PLMNId; + leaf sNssai { + type SNssai; + description + "TODO"; + } + } + + grouping ManagedNFProfile { + description + "Defines profile for managed NF"; + reference + "3GPP TS 23.501"; + leaf idx { + type uint32; + description + "TODO"; + reference + "3GPP TS 23.501"; + } + leaf nfInstanceID { + type yang:uuid; + config false; + mandatory true; + description + "This parameter defines profile for managed NF. + The format of the NF Instance ID shall be a + Universally Unique Identifier (UUID) version 4, + as described in IETF RFC 4122 "; + } + leaf-list nfType { + type NfType; + config false; + min-elements 1; + description + "Type of the Network Function"; + } + leaf hostAddr { + type inet:host; + mandatory true; + description + "Host address of a NF"; + } + leaf authzInfo { + type string; + description + "This parameter defines NF Specific Service authorization + information. It shall include the NF type (s) and NF realms/origins + allowed to consume NF Service(s) of NF Service Producer."; + reference + "See TS 23.501"; + } + leaf location { + type string; + description + "Information about the location of the NF instance + (e.g. geographic location, data center) defined by operator"; + reference + "TS 29.510"; + } + leaf capacity { + type uint16; + mandatory true; + description + "This parameter defines static capacity information + in the range of 0-65535, expressed as a weight relative to other + NF instances of the same type; if capacity is also present in the + nfServiceList parameters, those will have precedence over this value."; + reference + "TS 29.510"; + } + leaf nFSrvGroupId { + type string; + description + "This parameter defines identity of the group that is + served by the NF instance. + May be config false or true depending on the ManagedFunction. + Config=true for Udrinfo. Config=false for UdmInfo and AusfInfo. + Shall be present if ../nfType = UDM or AUSF or UDR. "; + reference + "TS 29.510"; + } + leaf-list supportedDataSetIds { + type enumeration { + enum SUBSCRIPTION { + description + "TODO"; + } + enum POLICY { + description + "TODO"; + } + enum EXPOSURE { + description + "TODO"; + } + enum APPLICATION { + description + "TODO"; + } + } + description + "List of supported data sets in the UDR instance. + May be present if ../nfType = UDR"; + reference + "TS 29.510"; + } + leaf-list smfServingAreas { + type string; + description + "Defines the SMF service area(s) the UPF can serve. + Shall be present if ../nfType = UPF"; + reference + "TS 29.510"; + } + leaf priority { + type uint16; + description + "This parameter defines Priority (relative to other NFs + of the same type) in the range of 0-65535, to be used for NF selection; + lower values indicate a higher priority. If priority is also present + in the nfServiceList parameters, those will have precedence over + this value. Shall be present if ../nfType = AMF "; + reference + "TS 29.510"; + } + } + + grouping SAP { + description + "Service access point."; + reference + "TS 28.622"; + leaf host { + type inet:host; + mandatory true; + description + "TODO"; + } + leaf port { + type inet:port-number; + mandatory true; + description + "TODO"; + } + } + + grouping PLMNId { + description + "TODO"; + reference + "TS 23.658"; + leaf mcc { + type Mcc; + mandatory true; + description + "TODO"; + } + leaf mnc { + type Mnc; + mandatory true; + description + "TODO"; + } + } + + grouping AmfIdentifier { + description + "The AMFI is constructed from an AMF Region ID, + an AMF Set ID and an AMF Pointer. + The AMF Region ID identifies the region, + the AMF Set ID uniquely identifies the AMF Set within the AMF Region, and + the AMF Pointer uniquely identifies the AMF within the AMF Set. "; + leaf amfRegionId { + type AmfRegionId; + description + "TODO"; + } + leaf amfSetId { + type AmfSetId; + description + "TODO"; + } + leaf amfPointer { + type AmfPointer; + description + "TODO"; + } + } + + grouping DefaultNotificationSubscription { + description + "TODO"; + leaf notificationType { + type NotificationType; + description + "TODO"; + } + leaf callbackUri { + type inet:uri; + description + "TODO"; + } + leaf n1MessageClass { + type N1MessageClass; + description + "TODO"; + } + leaf n2InformationClass { + type N2InformationClass; + description + "TODO"; + } + } + + grouping Ipv4AddressRange { + description + "TODO"; + leaf start { + type inet:ipv4-address; + description + "TODO"; + } + leaf end { + type inet:ipv4-address; + description + "TODO"; + } + } + + grouping Ipv6PrefixRange { + description + "TODO"; + leaf start { + type inet:ipv6-prefix; + description + "TODO"; + } + leaf end { + type inet:ipv6-prefix; + description + "TODO"; + } + } + + grouping AddressWithVlan { + description + "TODO"; + leaf ipAddress { + type inet:ip-address; + description + "TODO"; + } + leaf vlanId { + type uint16; + description + "TODO"; + } + } + + grouping ManagedElementGroup { + description + "Abstract class representing telecommunications resources."; + leaf dnPrefix { + type DistinguishedName; + description + "Provides naming context and splits the DN into a DN Prefix and Local DN"; + } + leaf userLabel { + type string; + description + "A user-friendly name of this object."; + } + leaf locationName { + type string; + config false; + description + "The physical location (e.g. an address) of an entity"; + } + leaf-list managedBy { + type DistinguishedName; + config false; + description + "Relates to the role played by ManagementSystem"; + } + leaf-list managedElementTypeList { + type string; + config false; + min-elements 1; + description + "The type of functionality provided by the ManagedElement. + It may represent one ME functionality or a combination of + Two examples of allowed values are: + - NodeB; + - HLR, VLR."; + } + } // Managed Element grouping + + grouping NearRTRICGroup { + description + "Abstract class representing Near RT RIC."; + leaf near-rt-ric-url { + type inet:uri; + description + "URL for the near RT RIC. String representing IP addr:port"; + } + leaf dnPrefix { + type DistinguishedName; + description + "Provides naming context and splits the DN into a DN Prefix and Local DN"; + } + leaf userLabel { + type string; + description + "A user-friendly name of this object."; + } + leaf locationName { + type string; + config false; + description + "The physical location (e.g. an address) of an entity"; + } + leaf-list managedBy { + type DistinguishedName; + config false; + description + "Relates to the role played by ManagementSystem"; + } + } // Near RT RIC grouping + + grouping GNBDUFunctionGroup { + description + "Represents the GNBDUFunction IOC."; + reference + "3GPP TS 28.541"; + leaf gNBId { + type int64 { + range "0..4294967295"; + } + config false; + mandatory true; + description + "Identifies a gNB within a PLMN. The gNB Identifier (gNB ID) + is part of the NR Cell Identifier (NCI) of the gNB cells."; + reference + "gNB ID in 3GPP TS 38.300, Global gNB ID in 3GPP TS 38.413"; + } + leaf gNBIdLength { + type int32 { + range "22..32"; + } + mandatory true; + description + "Indicates the number of bits for encoding the gNB ID."; + reference + "gNB ID in 3GPP TS 38.300, Global gNB ID in 3GPP TS 38.413"; + } + leaf gNBDUId { + type int64 { + range "0..68719476735"; + } + mandatory true; + description + "Uniquely identifies the DU at least within a gNB."; + reference + "3GPP TS 38.473"; + } + leaf gNBDUName { + type string { + length "1..150"; + } + description + "Identifies the Distributed Unit of an NR node"; + reference + "3GPP TS 38.473"; + } + leaf aggressorSetID { + type uint32 { + range "0..4194304"; + } + config false; + description + "Indicates the associated aggressor gNB Set ID of the cell + Valid when Remote Interference Management function is supported."; + reference + "3GPP TS 38.211 subclause 7.4.1.6"; + } + leaf victimSetID { + type uint32 { + range "0..4194304"; + } + config false; + description + "Indicates the associated victim gNB Set ID of the cell + Valid when Remote Interference Management function is supported."; + reference + "3GPP TS 38.211 subclause 7.4.1.6"; + } + } + + grouping NRCellDUGroup { + description + "Represents the NRCellDU IOC."; + reference + "3GPP TS 28.541"; + uses RRMPolicy_Group; + leaf cellLocalId { + type int32 { + range "0..16383"; + } + mandatory true; + description + "Identifies an NR cell of a gNB. Together with the + corresponding gNB identifier in forms the NR Cell Identity (NCI)."; + reference + "NCI in 3GPP TS 38.300"; + } + leaf operationalState { + type OperationalState; + config false; + description + "Operational state of the NRCellDU instance. Indicates + whether the resource is installed and partially or fully operable + (ENABLED) or the resource is not installed or not operable + (DISABLED)."; + } + leaf administrativeState { + type AdministrativeState; + default "LOCKED"; + description + "Administrative state of the NRCellDU. Indicates the + permission to use or prohibition against using the cell, imposed + through the OAM services."; + } + leaf cellState { + type CellState; + config false; + description + "Cell state of the NRCellDU instance. Indicates whether the + cell is not currently in use (IDLE), or currently in use but not + configured to carry traffic (INACTIVE), or currently in use and is + configured to carry traffic (ACTIVE)."; + } + list pLMNInfoList { + key "mcc mnc"; + min-elements 1; + description + "The PLMNInfoList is a list of PLMNInfo data type. It defines which PLMNs that + can be served by the NR cell, and which S-NSSAIs that can be supported by the NR cell for + corresponding PLMN in case of network slicing feature is supported. The plMNId of the first + entry of the list is the PLMNId used to construct the nCGI for the NR cell."; + uses PLMNInfo; + } + leaf nRPCI { + type int32 { + range "0..1007"; + } + mandatory true; + description + "The Physical Cell Identity (PCI) of the NR cell."; + reference + "3GPP TS 36.211"; + } + leaf nRTAC { + type Tac; + description + "The common 5GS Tracking Area Code for the PLMNs."; + reference + "3GPP TS 23.003, 3GPP TS 38.473"; + } + leaf arfcnDL { + type int32; + mandatory true; + description + "NR Absolute Radio Frequency Channel Number (NR-ARFCN) for + downlink."; + reference + "3GPP TS 38.104"; + } + leaf arfcnUL { + type int32; + description + "NR Absolute Radio Frequency Channel Number (NR-ARFCN) for + uplink."; + reference + "3GPP TS 38.104"; + } + leaf arfcnSUL { + type int32; + description + "NR Absolute Radio Frequency Channel Number (NR-ARFCN) for + supplementary uplink."; + reference + "3GPP TS 38.104"; + } + leaf bSChannelBwDL { + type int32; + units "MHz"; + description + "Base station channel bandwidth for downlink."; + reference + "3GPP TS 38.104"; + } + leaf bSChannelBwUL { + type int32; + units "MHz"; + description + "Base station channel bandwidth for uplink."; + reference + "3GPP TS 38.104"; + } + leaf bSChannelBwSUL { + type int32; + units "MHz"; + description + "Base station channel bandwidth for supplementary uplink."; + reference + "3GPP TS 38.104"; + } + leaf ssbFrequency { + type int32 { + range "0..3279165"; + } + mandatory true; + description + "Indicates cell defining SSB frequency domain position. + Frequency (in terms of NR-ARFCN) of the cell defining SSB transmission. + The frequency identifies the position of resource element RE=#0 + (subcarrier #0) of resource block RB#10 of the SS block. The frequency + must be positioned on the NR global frequency raster, as defined in + 3GPP TS 38.101, and within bSChannelBwDL."; + } + leaf ssbPeriodicity { + type int32 { + range "5 | 10 | 20 | 40 | 80 | 160"; + } + units "subframes (ms)"; + mandatory true; + description + "Indicates cell defined SSB periodicity. The SSB periodicity + is used for the rate matching purpose."; + } + leaf ssbSubCarrierSpacing { + type int32 { + range "15 | 30 | 120 | 240"; + } + units "kHz"; + mandatory true; + description + "Subcarrier spacing of SSB. Only the values 15 kHz or 30 kHz + (< 6 GHz), 120 kHz or 240 kHz (> 6 GHz) are applicable."; + reference + "3GPP TS 38.211"; + } + leaf ssbOffset { + type int32 { + range "0..159"; + } + units "subframes (ms)"; + mandatory true; + description + "Indicates cell defining SSB time domain position. Defined + as the offset of the measurement window, in which to receive SS/PBCH + blocks, where allowed values depend on the ssbPeriodicity + (ssbOffset < ssbPeriodicity)."; + } + leaf ssbDuration { + type int32 { + range "1..5"; + } + units "subframes (ms)"; + mandatory true; + description + "Duration of the measurement window in which to receive + SS/PBCH blocks."; + reference + "3GPP TS 38.213"; + } + leaf-list nRSectorCarrierRef { + type DistinguishedName; + min-elements 1; + description + "Reference to corresponding NRSectorCarrier instance."; + } + leaf-list bWPRef { + type DistinguishedName; + // min-elements 0; + description + "Reference to corresponding BWP instance."; + } + leaf-list nRFrequencyRef { + type DistinguishedName; + // min-elements 0; + description + "Reference to corresponding NRFrequency instance."; + } + } // grouping + + grouping rRMPolicyMemberGroup { + description + "TODO"; + uses PLMNId; + leaf sNSSAI { + type SNssai; + description + "This data type represents an RRM Policy member that will be part of a + rRMPolicyMemberList. A RRMPolicyMember is defined by its pLMNId and sNSSAI (S-NSSAI). + The members in a rRMPolicyMemberList are assigned a specific amount of RRM resources + based on settings in RRMPolicy."; + } + } + + grouping RRMPolicy_Group { + description + "This IOC represents the properties of an abstract RRMPolicy. The RRMPolicy_ IOC + needs to be subclassed to be instantiated. It defines two attributes apart from those + inherited from Top IOC, the resourceType attribute defines type of resource (PRB, RRC + connected users, DRB usage etc.) and the rRMPolicyMemberList attribute defines the + RRMPolicyMember(s)that are subject to this policy. An RRM resource (defined in resourceType + attribute) is located in NRCellDU, NRCellCU, GNBDUFunction, GNBCUCPFunction or in + GNBCUUPFunction. The RRMPolicyRatio IOC is one realization of a RRMPolicy_ IOC, see the + inheritance in TS 28.541 Figure 4.2.1.2-1. This RRM framework allows adding new policies, + both standardized (like RRMPolicyRatio) or as vendor specific, by inheriting from the + abstract RRMPolicy_ IOC."; + leaf resourceType { + type string; + mandatory true; + description + "The resourceType attribute defines type of resource (PRB, RRC connected users, + DRB usage etc.) that is subject to policy. Valid values are 'PRB', 'RRC' or 'DRB'"; + } + list rRMPolicyMemberList { + key "idx"; + min-elements 1; + description + "It represents the list of RRMPolicyMember (s) that the managed object + is supporting. A RRMPolicyMember <> include the PLMNId <> + and S-NSSAI <>."; + leaf idx { + type uint32; + description + "TODO"; + } + uses rRMPolicyMemberGroup; + } + } // grouping + + grouping GNBCUUPFunctionGroup { + description + "Represents the GNBCUUPFunction IOC."; + reference + "3GPP TS 28.541"; + uses RRMPolicy_Group; + leaf gNBCUUPId { + type uint64 { + range "0..68719476735"; + } + config false; + mandatory true; + description + "Identifies the gNB-CU-UP at least within a gNB-CU-CP"; + reference + "'gNB-CU-UP ID' in subclause 9.3.1.15 of 3GPP TS 38.463"; + } + leaf gNBId { + type int32 { + range "22..32"; + } + mandatory true; + description + "Indicates the number of bits for encoding the gNB Id."; + reference + "gNB Id in 3GPP TS 38.300, Global gNB ID in 3GPP TS 38.413"; + } + list pLMNInfoList { + key "mcc mnc"; + description + "The PLMNInfoList is a list of PLMNInfo data type. It defines which PLMNs that + can be served by the GNBCUUPFunction and which S-NSSAIs can be supported by the + GNBCUUPFunction for corresponding PLMN in case of network slicing feature is supported"; + uses PLMNInfo; + } + } // grouping + + grouping GNBCUCPFunctionGroup { + description + "Represents the GNBCUCPFunction IOC."; + reference + "3GPP TS 28.541"; + uses RRMPolicy_Group; + leaf gNBId { + type int64 { + range "0..4294967295"; + } + mandatory true; + description + "Identifies a gNB within a PLMN. The gNB Identifier (gNB ID) + is part of the NR Cell Identifier (NCI) of the gNB cells."; + reference + "gNB ID in 3GPP TS 38.300, Global gNB ID in 3GPP TS 38.413"; + } + leaf gNBIdLength { + type int32 { + range "22..32"; + } + mandatory true; + description + "Indicates the number of bits for encoding the gNB ID."; + reference + "gNB ID in 3GPP TS 38.300, Global gNB ID in 3GPP TS 38.413"; + } + leaf gNBCUName { + type string { + length "1..150"; + } + mandatory true; + description + "Identifies the Central Unit of an gNB."; + reference + "3GPP TS 38.473"; + } + list pLMNId { + key "mcc mnc"; + min-elements 1; + max-elements 1; + description + "The PLMN identifier to be used as part of the global RAN + node identity."; + uses PLMNId; + } + leaf-list x2BlackList { + type DistinguishedName; + description + "List of nodes to which X2 connections are prohibited."; + } + leaf-list x2WhiteList { + type DistinguishedName; + description + "List of nodes to which X2 connections are enforced."; + } + leaf-list xnBlackList { + type DistinguishedName; + description + "List of nodes to which Xn connections are prohibited."; + } + leaf-list xnWhiteList { + type DistinguishedName; + description + "List of nodes to which X2 connections are enforced."; + } + leaf-list x2XnHOBlackList { + type DistinguishedName; + description + "List of nodes to which handovers over X2 or Xn are prohibited."; + } + } // grouping + + grouping NRCellCUGroup { + description + "Represents the NRCellCU IOC."; + reference + "3GPP TS 28.541"; + leaf cellLocalId { + type int32 { + range "0..16383"; + } + mandatory true; + description + "Identifies an NR cell of a gNB. Together with corresponding + gNB ID it forms the NR Cell Identifier (NCI)."; + } + list pLMNInfoList { + key "mcc mnc"; + min-elements 1; + description + "The PLMNInfoList is a list of PLMNInfo data type. It defines which PLMNs + that can be served by the NR cell, and which S-NSSAIs that can be supported by the + NR cell for corresponding PLMN in case of network slicing feature is supported."; + uses PLMNInfo; + // Note: Whether the attribute pLMNId in the pLMNInfo can be writable depends on the implementation. + } + leaf nRFrequencyRef { + type DistinguishedName; + config false; + description + "Reference to corresponding NRFrequency instance."; + } + } // grouping + + grouping NRCellRelationGroup { + description + "Represents the NRCellRelation IOC."; + reference + "3GPP TS 28.541"; + leaf nRTCI { + type uint64; + description + "Target NR Cell Identifier. It consists of NR Cell + Identifier (NCI) and Physical Cell Identifier of the target NR cell + (nRPCI)."; + } + container cellIndividualOffset { + description + "A set of offset values for the neighbour cell. Used when + UE is in connected mode. Defined for rsrpOffsetSSB, rsrqOffsetSSB, + sinrOffsetSSB, rsrpOffsetCSI-RS, rsrqOffsetCSI-RS and + sinrOffsetCSI-RS."; + reference + "cellIndividualOffset in MeasObjectNR in 3GPP TS 38.331"; + leaf rsrpOffsetSsb { + type QOffsetRange; + default "0"; + description + "Offset value of rsrpOffsetSSB."; + } + leaf rsrqOffsetSsb { + type QOffsetRange; + default "0"; + description + "Offset value of rsrqOffsetSSB."; + } + leaf sinrOffsetSsb { + type QOffsetRange; + default "0"; + description + "Offset value of sinrOffsetSSB."; + } + leaf rsrpOffsetCsiRs { + type QOffsetRange; + default "0"; + description + "Offset value of rsrpOffsetCSI-RS."; + } + leaf rsrqOffsetCsiRs { + type QOffsetRange; + default "0"; + description + "Offset value of rsrqOffsetCSI-RS."; + } + leaf sinrOffsetCsiRs { + type QOffsetRange; + default "0"; + description + "Offset value of sinrOffsetCSI-RS."; + } + } + leaf nRFreqRelationRef { + type DistinguishedName; + mandatory true; + description + "Reference to a corresponding NRFreqRelation instance."; + } + leaf adjacentNRCellRef { + type DistinguishedName; + mandatory true; + description + "Reference to an adjacent NR cell (NRCellCU or + ExternalNRCellCU)."; + } + leaf isRemoveAllowed { + type boolean; + default "true"; + description + "True if the ANR function in the node is allowed to remove this relation."; + } + leaf isHOAllowed { + type boolean; + default "true"; + description + "True if handovers are allowed over this relation."; + } + } // grouping + + grouping NRFreqRelationGroup { + description + "Represents the NRFreqRelation IOC."; + reference + "3GPP TS 28.541"; + container offsetMO { + description + "A set of offset values applicable to all measured cells + with reference signal(s) indicated in corresponding MeasObjectNR. It + is used to indicate a cell, beam or measurement object specific offset + to be applied when evaluating candidates for cell re-selection or when + evaluating triggering conditions for measurement reporting. It is + defined for rsrpOffsetSSB, rsrqOffsetSSB, sinrOffsetSSB, + rsrpOffsetCSI-RS, rsrqOffsetCSI-RS and sinrOffsetCSI-RS."; + reference + "offsetMO in MeasObjectNR in 3GPP TS 38.331"; + leaf rsrpOffsetSsb { + type QOffsetRange; + default "0"; + description + "Offset value of rsrpOffsetSSB."; + } + leaf rsrqOffsetSsb { + type QOffsetRange; + default "0"; + description + "Offset value of rsrqOffsetSSB."; + } + leaf sinrOffsetSsb { + type QOffsetRange; + default "0"; + description + "Offset value of sinrOffsetSSB."; + } + leaf rsrpOffsetCsiRs { + type QOffsetRange; + default "0"; + description + "Offset value of rsrpOffsetCSI-RS."; + } + leaf rsrqOffsetCsiRs { + type QOffsetRange; + default "0"; + description + "Offset value of rsrqOffsetCSI-RS."; + } + leaf sinrOffsetCsiRs { + type QOffsetRange; + default "0"; + description + "Offset value of sinrOffsetCSI-RS."; + } + } + leaf-list blackListEntry { + type uint16 { + range "0..1007"; + } + // min-elements 0; + description + "A list of Physical Cell Identities (PCIs) that are + blacklisted in NR measurements."; + reference + "3GPP TS 38.331"; + } + leaf-list blackListEntryIdleMode { + type uint16 { + range "0..1007"; + } + // min-elements 0; + description + "A list of Physical Cell Identities (PCIs) that are + blacklisted in SIB4 and SIB5."; + } + leaf cellReselectionPriority { + type uint32; + default "0"; + description + "The absolute priority of the carrier frequency used by the + cell reselection procedure. Value 0 means lowest priority. The value + must not already used by other RAT, i.e. equal priorities between RATs + are not supported. The UE behaviour when no value is entered is + specified in subclause 5.2.4.1 of 3GPP TS 38.304."; + reference + "CellReselectionPriority in 3GPP TS 38.331, priority in + 3GPP TS 38.304"; + } + leaf cellReselectionSubPriority { + type uint8 { + range "2 | 4 | 6 | 8"; + } + units "0.1"; + description + "Indicates a fractional value to be added to the value of + cellReselectionPriority to obtain the absolute priority of the + concerned carrier frequency for E-UTRA and NR."; + reference + "3GPP TS 38.331"; + } + leaf pMax { + type int32 { + range "-30..33"; + } + units "dBm"; + // mandatory false; + description + "Used for calculation of the parameter Pcompensation + (defined in 3GPP TS 38.304), at cell reselection to a cell."; + reference + "PEMAX in 3GPP TS 38.101"; + } + leaf qOffsetFreq { + type QOffsetRange; + default "0"; + // mandatory false; + description + "The frequency specific offset applied when evaluating + candidates for cell reselection."; + } + leaf qQualMin { + type int32 { + range "-34..-3 | 0"; + } + units "dB"; + default "0"; + description + "Indicates the minimum required quality level in the cell. + Value 0 means that it is not sent and UE applies in such case the + (default) value of negative infinity for Qqualmin. Sent in SIB3 or + SIB5."; + reference + "3GPP TS 38.304"; + } + leaf qRxLevMin { + type int32 { + range "-140..-44"; + } + units "dBm"; + mandatory true; + description + "Indicates the required minimum received Reference Symbol + Received Power (RSRP) level in the NR frequency for cell reselection. + Broadcast in SIB3 or SIB5, depending on whether the related frequency + is intra- or inter-frequency. Resolution is 2."; + reference + "3GPP TS 38.304"; + } + leaf threshXHighP { + type int32 { + range "0..62"; + } + units "dB"; + mandatory true; + description + "Specifies the Srxlev threshold used by the UE when + reselecting towards a higher priority RAT/frequency than the current + serving frequency. Each frequency of NR and E-UTRAN might have a + specific threshold. Resolution is 2."; + reference + "ThreshX, HighP in 3GPP TS 38.304"; + } + leaf threshXHighQ { + type int32 { + range "0..31"; + } + units "dB"; + mandatory true; + description + "Specifies the Squal threshold used by the UE when + reselecting towards a higher priority RAT/frequency than the current + serving frequency. Each frequency of NR and E-UTRAN might have a + specific threshold."; + reference + "ThreshX, HighQ in 3GPP TS 38.304"; + } + leaf threshXLowP { + type int32 { + range "0..62"; + } + units "dB"; + mandatory true; + description + "Specifies the Srxlev threshold used by the UE when + reselecting towards a lower priority RAT/frequency than the current + serving frequency. Each frequency of NR and E-UTRAN might have a + specific threshold. Resolution is 2."; + reference + "ThreshX, LowP in 3GPP TS 38.304"; + } + leaf threshXLowQ { + type int32 { + range "0..31"; + } + units "dB"; + mandatory true; + description + "Specifies the Squal threshold used by the UE when + reselecting towards a lower priority RAT/frequency than the current + serving frequency. Each frequency of NR and E-UTRAN might have a + specific threshold."; + reference + "ThreshX, LowQ in 3GPP TS 38.304"; + } + leaf tReselectionNR { + type int32 { + range "0..7"; + } + units "s"; + mandatory true; + description + "Cell reselection timer for NR."; + reference + "TreselectionRAT for NR in 3GPP TS 38.331"; + } + leaf tReselectionNRSfHigh { + type uint8 { + range "25 | 50 | 75 | 100"; + } + units "%"; + mandatory true; + description + "The attribute tReselectionNr (parameter TreselectionNR in + 3GPP TS 38.304) is multiplied with this scaling factor if the UE is + in high mobility state."; + reference + "Speed dependent ScalingFactor for TreselectionNR for high + mobility state in 3GPP TS 38.304"; + } + leaf tReselectionNRSfMedium { + type uint8 { + range "25 | 50 | 75 | 100"; + } + units "%"; + mandatory true; + description + "The attribute tReselectionNr (parameter TreselectionNR in + 3GPP TS 38.304) multiplied with this scaling factor if the UE is in + medium mobility state."; + reference + "Speed dependent ScalingFactor for TreselectionNR for medium + mobility state in 3GPP TS 38.304"; + } + leaf nRFrequencyRef { + type DistinguishedName; + mandatory true; + description + "Reference to a corresponding NRFrequency instance."; + } + } // grouping + + grouping ManagedNFServiceGroup { + description + "A ManagedNFService representing a Network Function (NF) service."; + reference + "Clause 7 of 3GPP TS 23.501."; + leaf userLabel { + type string; + description + "A user-friendly (and user assignable) name of this object."; + } + list sAP { + key "host port"; + min-elements 1; + max-elements 1; + description + "The service access point of the managed NF service instance"; + uses SAP; + } + } // grouping + + // container for RAN Network + + container ran-network { + description + "Represents telecommunications equipment or + TMN entities within the telecommunications network providing support + and/or service to the subscriber."; + list NearRTRIC { + key "idNearRTRIC"; // list GNBCUCPFunction + description + "A list of expected near-real-time RIC O-RAN managed functions."; + leaf idNearRTRIC { + type string; + description + "Key leaf (namingAttribute) for a class/list. + Should be used as a key leaf for lists representing + stage 2 classes."; + reference + "3GPP TS 32.300 Name convention for managed objects"; + } + container attributes { + description + "TODO"; + uses NearRTRICGroup; + } + list GNBDUFunction { + key "idGNBDUFunction"; + description + "Represents the logical function DU of gNB or en-gNB."; + reference + "3GPP TS 28.541"; + leaf idGNBDUFunction { + type string; + description + "TODO"; + } + container attributes { + description + "TODO"; + uses GNBDUFunctionGroup; + uses ManagedNFServiceGroup; + } + list NRCellDU { + key "idNRCellDU"; + description + "Represents the information of a cell known by DU."; + reference + "3GPP TS 28.541"; + leaf idNRCellDU { + type string; + description + "TODO"; + } + container attributes { + description + "TODO"; + uses NRCellDUGroup; + uses ManagedNFServiceGroup; + } + } // list NRCellDU + } // list GNBDUFunction + list GNBCUUPFunction { + key "idGNBCUUPFunction"; + description + "TODO"; + leaf idGNBCUUPFunction { + type string; + description + "TODO"; + } + container attributes { + description + "TODO"; + uses GNBCUUPFunctionGroup; + uses ManagedNFServiceGroup; + } + } // list GNBCUUPFunction + list GNBCUCPFunction { + key "idGNBCUCPFunction"; // list NRCellCU + description + "Represents the logical function CU-CP of gNB and en-gNB."; + reference + "3GPP TS 28.541"; + leaf idGNBCUCPFunction { + type string; + description + "TODO"; + } + container attributes { + description + "TODO"; + uses GNBCUCPFunctionGroup; + uses ManagedNFServiceGroup; + } + list NRCellCU { + key "idNRCellCU"; + description + "Represents the information required by CU that is + responsible for the management of inter-cell mobility and neighbour + relations via ANR."; + reference + "3GPP TS 28.541"; + leaf idNRCellCU { + type string; + description + "TODO"; + } + container attributes { + description + "TODO"; + uses NRCellCUGroup; + uses ManagedNFServiceGroup; + } + list NRCellRelation { + key "idNRCellRelation"; + description + "Represents a neighbour cell relation from a source cell + to a target cell, where the target cell is an NRCellCU or + ExternalNRCellCU instance."; + reference + "3GPP TS 28.541"; + leaf idNRCellRelation { + type string; + description + "TODO"; + } + container attributes { + description + "TODO"; + uses NRCellRelationGroup; + uses ManagedNFServiceGroup; + } + } // list NRCellRelation + list NRFreqRelation { + key "idNRFreqRelation"; + description + "Together with the target NRFrequency, it represents the + frequency properties applicable to the referencing NRFreqRelation."; + reference + "3GPP TS 28.541"; + leaf idNRFreqRelation { + type string; + description + "TODO"; + } + container attributes { + description + "TODO"; + uses NRFreqRelationGroup; + uses ManagedNFServiceGroup; + } + } // list NRFreqRelation + } + } + } // list ManagedElement + } +} diff --git a/sdnr/northbound/ranSlice/model/src/main/yang/ran-slice-api@2020-08-06.yang b/sdnr/northbound/ranSlice/model/src/main/yang/ran-slice-api@2020-08-06.yang new file mode 100644 index 000000000..3253a015c --- /dev/null +++ b/sdnr/northbound/ranSlice/model/src/main/yang/ran-slice-api@2020-08-06.yang @@ -0,0 +1,466 @@ +/* + * Yang model for the RANSLice Northbound API's + * + */ +module ran-slice-api { + yang-version 1.1; + namespace "org:onap:ccsdk"; + prefix rs; + + organization + "Open Network Automation Platform - ONAP + "; + contact + "Editors: + Sandeep Shah + + + Swaminathan Seetharaman + "; + description + "This module defines the services and request/response requirements for + RAN Slice Management. + This YANG model is used solely for POC's in the ONAP and O-RAN communities + + Copyright 2020 the O-RAN Alliance. + + Licensed under the Apache License, Version 2.0 (the 'License'); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an 'AS IS' BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License."; + + revision 2020-08-06 { + description + "RANSlice API YANG Model"; + reference + "https://wiki.onap.org/display/DW/E2E+Network+Slicing+Use+Case+in+R7+Guilin"; + } + + /********************************************************************************** + * Data type definitions + * + * The following data type definitions are used to define common data structures, + * define constraints, or to impart special meanings to data objects related to the + * SDN-R controller functions. + **********************************************************************************/ + + typedef ZULU { + type string { + length "16..28"; + pattern '[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}T[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}.[0-9]{1,6}Z'; + } + description + "Define a common definition of a time stamp (expressed as a formatted + string) as follows yyyy-MM-ddTHH:mm:ss.SSSSSSSSZ"; + } + + typedef payload { + type string; + description + "The payload can be any valid JSON string value. Json escape characters + need to be added when required to include an inner json within the + payload to make it a valid json string value"; + } + + typedef action { + type enumeration { + enum allocate { + description + "TODO"; + } + enum modify { + description + "TODO"; + } + enum modify-allocate { + description + "TODO"; + } + enum modify-deallocate { + description + "TODO"; + } + enum deallocate { + description + "TODO"; + } + enum activate { + description + "TODO"; + } + enum deactivate { + description + "TODO"; + } + enum reconfigure { + description + "TODO"; + } + } + description + "The action to be taken by SDN-R for invoked RPC."; + } + + typedef ranSlice-action-status { + type enumeration { + enum IN_PROGRESS { + description + "TODO"; + } + enum SUCCESSFUL { + description + "TODO"; + } + enum FAILED { + description + "TODO"; + } + enum NOT_FOUND { + description + "TODO"; + } + enum ABORTED { + description + "TODO"; + } + enum MULTIPLE_REQUESTS_FOUND { + description + "TODO"; + } + } + description + "The status of the requested RANSlice action"; + } + + /********************************************************************************** + * All requests will include this standard header + * + * The standard request header is used to define a correlation identification for + * the request that is returned on all responses. This correlation identifier + * (called the service-request-id) is meaningful to the caller and is included on + * all responses from the services. + **********************************************************************************/ + + /********************************************************************************** + * All responses will include this standard header + * + * The standard response header includes the time of completion as well as a + * success|failure indication + **********************************************************************************/ + + grouping common-header { + description + "A common header for all SDN-R requests"; + container common-header { + description + "A common header for all SDN-R requests"; + leaf timestamp { + type ZULU; + mandatory true; + description + "timestamp is in ISO 8601 timestamp format ZULU offset"; + } + leaf api-ver { + type string; + mandatory true; + description + "api-ver is the API version identifier. A given release of APPC + should support all previous versions of APPC API (correlate with + general requirements)"; + } + leaf originator-id { + type string; + mandatory true; + description + "originator-id an identifier of the calling system which can be + used addressing purposes, i.e. returning asynchronous response + to the proper destination over DMaaP (especially in case of multiple + consumers of SDN-R APIs)"; + } + leaf request-id { + type string; + mandatory true; + description + "UUID for the request ID. An OSS/BSS identifier for the request + that caused the current action. Multiple API calls may be made + with the same request-id The request-id shall be recorded throughout + the operations on a single request"; + } + leaf sub-request-id { + type string; + description + "Uniquely identifies a specific RANSlice action. It is persistent over + the life-cycle of a single request"; + } + + /********************************************************************************** + * Flags are generic flags that apply to any and all commands, all are optional + * force = TRUE/FALSE - Execute command even if target is in unstable (i.e. locked, transiting, etc) + * state. Specific behaviour of forced commands varies, but implies cancellation + * of previous command and an override by the new command. The FALSE value is + * used by default. + * ttl = <0....N> - The timeout value for command execution, expressed in seconds + * mode = EXCLUSIVE/NORMAL - defines execution mode as follows: + * - EXCLUSIVE ? on encountering an exclusive command, the SDN-R will: + * * Cease accepting additional command requests + * * Complete execution of outstanding commands + * * Execute the exclusive command to completion + * * Optionally report the result of the command + * * Optionally resume command acceptance and processing + * - NORMAL - Obverse of EXCLUSIVE, the default one. + **********************************************************************************/ + container flags { + description + "Flags are generic flags that apply to any and all commands, all are optional"; + leaf mode { + type enumeration { + enum EXCLUSIVE { + description + "TODO"; + } + enum NORMAL { + description + "TODO"; + } + } + description + "EXCLUSIVE (accept no queued requests on this VNF while processing) + or NORMAL (queue other requests until complete)"; + } + leaf force { + type enumeration { + enum TRUE { + description + "TODO"; + } + enum FALSE { + description + "TODO"; + } + } + description + "TRUE/FALSE - Execute action even if target is in unstable (i.e. + locked, transiting, etc.) state"; + } + leaf ttl { + type uint16; + description + "<0....N> - The timeout value (expressed in seconds) for action + execution, between action being received by APPC and action initiation"; + } + } + } + } + + grouping status { + description + "The specific response codes are to be aligned with SDC reference doc + (main table removed to avoid duplication and digression from main table). + See SDC and ECOMP Distribution Consumer Interface Agreement"; + container status { + description + "The specific response codes are to be aligned with SDC reference doc + (main table removed to avoid duplication and digression from main table). + See SDC and ECOMP Distribution Consumer Interface Agreement"; + leaf code { + type uint16; + mandatory true; + description + "Response code"; + } + leaf message { + type string; + mandatory true; + description + "Response message"; + } + } + } + + grouping abstract-rpc-input { + uses common-header; + leaf action { + type action; + mandatory true; + description + "TODO"; + } + leaf payload { + type payload; + description + "TODO"; + } + description + "An abstract rpc output defintion."; + } + grouping abstract-rpc-input-payload-required { + uses common-header; + leaf action { + type action; + mandatory true; + description + "TODO"; + } + leaf payload { + type payload; + mandatory true; + description + "TODO"; + } + description + "An abstract rpc output defintion."; + } + grouping abstract-rpc-output { + uses common-header; + uses status; + description + "An abstract rpc output defintion."; + } + /********************************************************************************** + * Define the configureNearRTRIC service + **********************************************************************************/ + rpc configureNearRTRIC { + description + "An operation to configure Near-Time RIC in the preparation phase"; + input { + uses abstract-rpc-input; + } + output { + uses abstract-rpc-output; + } + } + + /********************************************************************************** + * Define the instantiateRANSlice service + **********************************************************************************/ + rpc instantiateRANSlice { + description + "An operation to instantiate RAN slice. Includes both allocation and configuration of RAN slice resources"; + input { + uses abstract-rpc-input; + } + output { + uses abstract-rpc-output; + } + } + + /********************************************************************************** + * Define the configureRANSliceInstance service + **********************************************************************************/ + rpc configureRANSliceInstance { + description + "An operation to configure RAN slice NSSI in CU and DU"; + input { + uses abstract-rpc-input; + } + output { + uses abstract-rpc-output; + } + } + + /********************************************************************************** + * Define the configureCU service + **********************************************************************************/ + rpc configureCU { + description + "An operation to configure CU in the preparation phase"; + input { + uses abstract-rpc-input; + } + output { + uses abstract-rpc-output; + } + } + + /********************************************************************************** + * Define the configureDU service + **********************************************************************************/ + rpc configureDU { + description + "An operation to configure DU in the preparation phase"; + input { + uses abstract-rpc-input; + } + output { + uses abstract-rpc-output; + } + } + + /********************************************************************************** + * Define the activateRANSliceInstance service ... needed to enable traffic flow + **********************************************************************************/ + rpc activateRANSliceInstance { + description + "An operation to reallocate RAN Slice resources"; + input { + uses abstract-rpc-input; + } + output { + uses abstract-rpc-output; + } + } + + /********************************************************************************** + * Define the deactivateRANSliceInstance service ... needed to disable traffic flow + **********************************************************************************/ + rpc deactivateRANSliceInstance { + description + "An operation to reallocate RAN Slice resources"; + input { + uses abstract-rpc-input; + } + output { + uses abstract-rpc-output; + } + } + + /********************************************************************************** + * Define the terminateRANSliceInstance service + **********************************************************************************/ + rpc terminateRANSliceInstance { + description + "An operation to terminate RAN slide instance"; + input { + uses abstract-rpc-input; + } + output { + uses abstract-rpc-output; + } + } + + + /********************************************************************************** + * Define the determineRANSliceResources service + **********************************************************************************/ + rpc determineRANSliceResources { + description + "An operation to determine RAN slice resources"; + input { + uses abstract-rpc-input; + } + output { + uses abstract-rpc-output; + } + } + + /********************************************************************************** + * Define the configNotification service + **********************************************************************************/ + rpc configNotification { + description + "CM Notify event triggered by DMAAP VES message"; + input { + uses abstract-rpc-input; + } + output { + uses abstract-rpc-output; + } + } +} diff --git a/sdnr/northbound/ranSlice/pom.xml b/sdnr/northbound/ranSlice/pom.xml new file mode 100644 index 000000000..75bd9a78b --- /dev/null +++ b/sdnr/northbound/ranSlice/pom.xml @@ -0,0 +1,50 @@ + + + + + 4.0.0 + + + org.onap.ccsdk.parent + odlparent-lite + 2.0.1-SNAPSHOT + + + + org.onap.ccsdk.features.sdnr.northbound + ranSlice + 1.0.1-SNAPSHOT + pom + + ccsdk-features :: sdnr-northbound :: ${project.artifactId} + + + model + feature + provider + installer + + + + ranSlice + + diff --git a/sdnr/northbound/ranSlice/provider/derby.log b/sdnr/northbound/ranSlice/provider/derby.log new file mode 100644 index 000000000..33ad15cc7 --- /dev/null +++ b/sdnr/northbound/ranSlice/provider/derby.log @@ -0,0 +1,13 @@ +---------------------------------------------------------------- +Mon Aug 17 21:43:27 CDT 2020: +Booting Derby version The Apache Software Foundation - Apache Derby - 10.14.2.0 - (1828579): instance a816c00e-0173-ff73-3522-00001953d118 +on database directory memory:/home/sandeepos/SON-ONAP-ATT/Gulian/FINAL-GULIAN-AUG15-USE/ccsdk/features/sdnr/northbound/ranSlice/provider/sdnctl with class loader sun.misc.Launcher$AppClassLoader@18b4aac2 +Loaded from file:/home/sandeepos/.m2/repository/org/apache/derby/derby/10.14.2.0/derby-10.14.2.0.jar +java.vendor=Private Build +java.runtime.version=1.8.0_265-8u265-b01-0ubuntu2~16.04-b01 +user.dir=/home/sandeepos/SON-ONAP-ATT/Gulian/FINAL-GULIAN-AUG15-USE/ccsdk/features/sdnr/northbound/ranSlice/provider +os.name=Linux +os.arch=amd64 +os.version=4.15.0-112-generic +derby.system.home=null +Database Class Loader started - derby.database.classpath='' diff --git a/sdnr/northbound/ranSlice/provider/pom.xml b/sdnr/northbound/ranSlice/provider/pom.xml new file mode 100644 index 000000000..ba92a0a9a --- /dev/null +++ b/sdnr/northbound/ranSlice/provider/pom.xml @@ -0,0 +1,167 @@ + + + + + 4.0.0 + + + org.onap.ccsdk.parent + binding-parent + 2.0.1-SNAPSHOT + + + + org.onap.ccsdk.features.sdnr.northbound + ranSlice-provider + 1.0.1-SNAPSHOT + bundle + + ccsdk-features :: sdnr-northbound :: ${project.artifactId} + + + + + org.opendaylight.controller + mdsal-artifacts + 1.6.1 + pom + import + + + org.onap.ccsdk.sli.core + sli-core-artifacts + ${ccsdk.sli.core.version} + pom + import + + + + + + org.onap.ccsdk.features.sdnr.northbound + ranSlice-model + ${project.version} + + + + org.opendaylight.controller + sal-binding-api + + + org.opendaylight.controller + sal-common-util + + + org.opendaylight.controller + sal-core-api + + + org.opendaylight.controller + sal-binding-broker-impl + + + org.opendaylight.yangtools + yang-data-impl + + + junit + junit + test + + + org.testng + testng + test + + + org.mockito + mockito-core + test + + + org.apache.derby + derby + test + + + org.onap.ccsdk.sli.core + sli-common + provided + + + org.onap.ccsdk.sli.core + sli-provider + provided + + + org.onap.ccsdk.sli.core + utils-provider + + + + org.osgi + org.osgi.core + test + + + org.onap.ccsdk.sli.core + sli-provider-base + ${ccsdk.sli.core.version} + + + + + + + + org.eclipse.m2e + lifecycle-mapping + 1.0.0 + + + + + + org.codehaus.mojo + properties-maven-plugin + [1.0.0,) + + set-system-properties + + + + + + + + + + + + + + diff --git a/sdnr/northbound/ranSlice/provider/src/main/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceClient.java b/sdnr/northbound/ranSlice/provider/src/main/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceClient.java new file mode 100644 index 000000000..f3d2a7da7 --- /dev/null +++ b/sdnr/northbound/ranSlice/provider/src/main/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceClient.java @@ -0,0 +1,99 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * Modifications Copyright © 2018 IBM. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.ccsdk.features.sdnr.northbound.ranSlice; + + +import java.util.Properties; + +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.provider.SvcLogicService; +import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class RANSliceClient { + + private static final Logger LOG = LoggerFactory.getLogger(RANSliceClient.class); + + private final SvcLogicService svcLogicService; + + private String ErrorCode = "error-code"; + + public RANSliceClient(final SvcLogicService svcLogicService) { + this.svcLogicService = svcLogicService; + } + + public boolean hasGraph(String module, String rpc, String version, String mode) throws SvcLogicException + { + return svcLogicService.hasGraph(module, rpc, version, mode); + } + + + public Properties execute(String module, String rpc, String version, String mode, Properties parms, DOMDataBroker dataBroker) + throws SvcLogicException { + + + if (LOG.isDebugEnabled()) + { + LOG.debug("Parameters passed to SLI"); + + for (Object key : parms.keySet()) { + String parmName = (String) key; + String parmValue = parms.getProperty(parmName); + + LOG.debug(parmName+" = "+parmValue); + + } + } + + Properties respProps = svcLogicService.execute(module, rpc, version, mode, parms, dataBroker); + + if (LOG.isDebugEnabled()) + { + LOG.debug("Parameters returned by SLI"); + + for (Object key : respProps.keySet()) { + String parmName = (String) key; + String parmValue = respProps.getProperty(parmName); + + LOG.debug(parmName+" = "+parmValue); + + } + } + + if ("failure".equalsIgnoreCase(respProps.getProperty("SvcLogic.status"))) { + + if (!respProps.containsKey(ErrorCode)) { + respProps.setProperty(ErrorCode, "500"); + } + } else { + if (!respProps.containsKey(ErrorCode)) { + respProps.setProperty(ErrorCode, "200"); + } + } + + + return respProps; + } + +} diff --git a/sdnr/northbound/ranSlice/provider/src/main/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceProvider.java b/sdnr/northbound/ranSlice/provider/src/main/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceProvider.java new file mode 100644 index 000000000..a88595bfb --- /dev/null +++ b/sdnr/northbound/ranSlice/provider/src/main/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceProvider.java @@ -0,0 +1,480 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * Modifications Copyright © 2018 IBM. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.ccsdk.features.sdnr.northbound.ranSlice; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Properties; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import org.onap.ccsdk.sli.core.sli.provider.MdsalHelper; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService; +import org.opendaylight.controller.md.sal.binding.impl.AbstractForwardedDataBroker; +import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; +import org.opendaylight.controller.sal.binding.api.BindingAwareBroker; +import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; +import org.opendaylight.yang.gen.v1.org.onap.ccsdk.rev200806.*; +import org.opendaylight.yang.gen.v1.org.onap.ccsdk.rev200806.common.header.CommonHeaderBuilder; +import org.opendaylight.yang.gen.v1.org.onap.ccsdk.rev200806.status.StatusBuilder; +import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; + +import org.onap.ccsdk.features.sdnr.northbound.ranSlice.RANSliceResponseCode.*; + +/** + * Defines a base implementation for your provider. This class extends from a + * helper class which provides storage for the most commonly used components of + * the MD-SAL. Additionally the base class provides some basic logging and + * initialization / clean up methods. + * + */ +public class RANSliceProvider implements AutoCloseable, RanSliceApiService { + + private class CommonRANSliceFields { + private StatusBuilder statusBuilder; + private CommonHeaderBuilder commonHeaderBuilder; + private Payload payload; + + public CommonRANSliceFields(StatusBuilder statusBuilder, CommonHeaderBuilder commonHeaderBuilder) { + this.statusBuilder = statusBuilder; + this.commonHeaderBuilder = commonHeaderBuilder; + this.payload = null; + } + + public CommonRANSliceFields(StatusBuilder statusBuilder, CommonHeaderBuilder commonHeaderBuilder, Payload payload) { + this.statusBuilder = statusBuilder; + this.commonHeaderBuilder = commonHeaderBuilder; + this.payload = payload; + } + + public StatusBuilder getStatusBuilder() { + return statusBuilder; + } + + public CommonHeaderBuilder getCommonHeaderBuilder() { + return commonHeaderBuilder; + } + + public Payload getPayload() { + return payload; + } + } + + private static final Logger LOG = LoggerFactory.getLogger(RANSliceProvider.class); + + private static final String exceptionMessage = "Caught exception"; + + private static final String APPLICATION_NAME = "RANSlice"; + + private final ExecutorService executor; + protected DataBroker dataBroker; + protected DOMDataBroker domDataBroker; + protected NotificationPublishService notificationService; + protected RpcProviderRegistry rpcRegistry; + private final RANSliceClient RANSliceClient; + + protected BindingAwareBroker.RpcRegistration rpcRegistration; + + public RANSliceProvider(final DataBroker dataBroker, final NotificationPublishService notificationPublishService, + final RpcProviderRegistry rpcProviderRegistry, final RANSliceClient rANSliceClient) { + + LOG.info("Creating provider for {}", APPLICATION_NAME); + executor = Executors.newFixedThreadPool(1); + this.dataBroker = dataBroker; + if (dataBroker instanceof AbstractForwardedDataBroker) { + domDataBroker = ((AbstractForwardedDataBroker) dataBroker).getDelegate(); + } + notificationService = notificationPublishService; + rpcRegistry = rpcProviderRegistry; + this.RANSliceClient = rANSliceClient; + initialize(); + } + + public void initialize() { + LOG.info("Initializing {} for {}", this.getClass().getName(), APPLICATION_NAME); + + if (rpcRegistration == null) { + if (rpcRegistry != null) { + rpcRegistration = rpcRegistry.addRpcImplementation(RanSliceApiService.class, this); + LOG.info("Initialization complete for {}", APPLICATION_NAME); + } else { + LOG.warn("Error initializing {} : rpcRegistry unset", APPLICATION_NAME); + } + } + } + + protected void initializeChild() { + // Override if you have custom initialization intelligence + } + + @Override + public void close() throws Exception { + LOG.info("Closing provider for " + APPLICATION_NAME); + executor.shutdown(); + rpcRegistration.close(); + LOG.info("Successfully closed provider for " + APPLICATION_NAME); + } + + +//RPC configureNearRTRIC + + @Override + public ListenableFuture> configureNearRTRIC(ConfigureNearRTRICInput input) { + ConfigureNearRTRICInputBuilder iBuilder = new ConfigureNearRTRICInputBuilder(input); + ConfigureNearRTRICOutputBuilder oBuilder = new ConfigureNearRTRICOutputBuilder(); + + try { + CommonRANSliceFields retval = callDG("configureNearRTRIC", iBuilder.build()); + oBuilder.setStatus(retval.getStatusBuilder().build()); + oBuilder.setCommonHeader(retval.getCommonHeaderBuilder().build()); + } catch (RANSliceRpcInvocationException e) { + LOG.debug(exceptionMessage, e); + oBuilder.setCommonHeader(e.getCommonHeader()); + oBuilder.setStatus(e.getStatus()); + } + + RpcResult rpcResult = + RpcResultBuilder. status(true).withResult(oBuilder.build()).build(); + // return error + return Futures.immediateFuture(rpcResult); + + } + + //RPC instantiateRANSlice + + @Override + public ListenableFuture> instantiateRANSlice(InstantiateRANSliceInput input) { + InstantiateRANSliceInputBuilder iBuilder = new InstantiateRANSliceInputBuilder(input); + InstantiateRANSliceOutputBuilder oBuilder = new InstantiateRANSliceOutputBuilder(); + + try { + CommonRANSliceFields retval = callDG("instantiateRANSlice", iBuilder.build()); + oBuilder.setStatus(retval.getStatusBuilder().build()); + oBuilder.setCommonHeader(retval.getCommonHeaderBuilder().build()); + } catch (RANSliceRpcInvocationException e) { + LOG.debug(exceptionMessage, e); + oBuilder.setCommonHeader(e.getCommonHeader()); + oBuilder.setStatus(e.getStatus()); + } + + RpcResult rpcResult = + RpcResultBuilder. status(true).withResult(oBuilder.build()).build(); + // return error + return Futures.immediateFuture(rpcResult); + + } + + + + //RPC configureRANSliceInstance + + @Override + public ListenableFuture> configureRANSliceInstance(ConfigureRANSliceInstanceInput input) { + ConfigureRANSliceInstanceInputBuilder iBuilder = new ConfigureRANSliceInstanceInputBuilder(input); + ConfigureRANSliceInstanceOutputBuilder oBuilder = new ConfigureRANSliceInstanceOutputBuilder(); + + try { + CommonRANSliceFields retval = callDG("configureRANSliceInstance", iBuilder.build()); + oBuilder.setStatus(retval.getStatusBuilder().build()); + oBuilder.setCommonHeader(retval.getCommonHeaderBuilder().build()); + } catch (RANSliceRpcInvocationException e) { + LOG.debug(exceptionMessage, e); + oBuilder.setCommonHeader(e.getCommonHeader()); + oBuilder.setStatus(e.getStatus()); + } + + RpcResult rpcResult = + RpcResultBuilder. status(true).withResult(oBuilder.build()).build(); + // return error + return Futures.immediateFuture(rpcResult); + + } + + //RPC configureCU + + @Override + public ListenableFuture> configureCU(ConfigureCUInput input) { + ConfigureCUInputBuilder iBuilder = new ConfigureCUInputBuilder(input); + ConfigureCUOutputBuilder oBuilder = new ConfigureCUOutputBuilder(); + + try { + CommonRANSliceFields retval = callDG("configureCU", iBuilder.build()); + oBuilder.setStatus(retval.getStatusBuilder().build()); + oBuilder.setCommonHeader(retval.getCommonHeaderBuilder().build()); + } catch (RANSliceRpcInvocationException e) { + LOG.debug(exceptionMessage, e); + oBuilder.setCommonHeader(e.getCommonHeader()); + oBuilder.setStatus(e.getStatus()); + } + + RpcResult rpcResult = + RpcResultBuilder. status(true).withResult(oBuilder.build()).build(); + // return error + return Futures.immediateFuture(rpcResult); + + } + + //RPC configureDU + + @Override + public ListenableFuture> configureDU(ConfigureDUInput input) { + ConfigureDUInputBuilder iBuilder = new ConfigureDUInputBuilder(input); + ConfigureDUOutputBuilder oBuilder = new ConfigureDUOutputBuilder(); + + try { + CommonRANSliceFields retval = callDG("configureDU", iBuilder.build()); + oBuilder.setStatus(retval.getStatusBuilder().build()); + oBuilder.setCommonHeader(retval.getCommonHeaderBuilder().build()); + } catch (RANSliceRpcInvocationException e) { + LOG.debug(exceptionMessage, e); + oBuilder.setCommonHeader(e.getCommonHeader()); + oBuilder.setStatus(e.getStatus()); + } + + RpcResult rpcResult = + RpcResultBuilder. status(true).withResult(oBuilder.build()).build(); + // return error + return Futures.immediateFuture(rpcResult); + + } + + //RPC activateRANSliceInstance + + @Override + public ListenableFuture> activateRANSliceInstance(ActivateRANSliceInstanceInput input) { + ActivateRANSliceInstanceInputBuilder iBuilder = new ActivateRANSliceInstanceInputBuilder(input); + ActivateRANSliceInstanceOutputBuilder oBuilder = new ActivateRANSliceInstanceOutputBuilder(); + + try { + CommonRANSliceFields retval = callDG("activateRANSliceInstance", iBuilder.build()); + oBuilder.setStatus(retval.getStatusBuilder().build()); + oBuilder.setCommonHeader(retval.getCommonHeaderBuilder().build()); + } catch (RANSliceRpcInvocationException e) { + LOG.debug(exceptionMessage, e); + oBuilder.setCommonHeader(e.getCommonHeader()); + oBuilder.setStatus(e.getStatus()); + } + + RpcResult rpcResult = + RpcResultBuilder. status(true).withResult(oBuilder.build()).build(); + // return error + return Futures.immediateFuture(rpcResult); + + } + + + //RPC deactivateRANSliceInstance + + @Override + public ListenableFuture> deactivateRANSliceInstance(DeactivateRANSliceInstanceInput input) { + DeactivateRANSliceInstanceInputBuilder iBuilder = new DeactivateRANSliceInstanceInputBuilder(input); + DeactivateRANSliceInstanceOutputBuilder oBuilder = new DeactivateRANSliceInstanceOutputBuilder(); + + try { + CommonRANSliceFields retval = callDG("deactivateRANSliceInstance", iBuilder.build()); + oBuilder.setStatus(retval.getStatusBuilder().build()); + oBuilder.setCommonHeader(retval.getCommonHeaderBuilder().build()); + } catch (RANSliceRpcInvocationException e) { + LOG.debug(exceptionMessage, e); + oBuilder.setCommonHeader(e.getCommonHeader()); + oBuilder.setStatus(e.getStatus()); + } + + RpcResult rpcResult = + RpcResultBuilder. status(true).withResult(oBuilder.build()).build(); + // return error + return Futures.immediateFuture(rpcResult); + + } + + //RPC terminateRANSliceInstance + + @Override + public ListenableFuture> terminateRANSliceInstance(TerminateRANSliceInstanceInput input) { + TerminateRANSliceInstanceInputBuilder iBuilder = new TerminateRANSliceInstanceInputBuilder(input); + TerminateRANSliceInstanceOutputBuilder oBuilder = new TerminateRANSliceInstanceOutputBuilder(); + + try { + CommonRANSliceFields retval = callDG("terminateRANSliceInstance", iBuilder.build()); + oBuilder.setStatus(retval.getStatusBuilder().build()); + oBuilder.setCommonHeader(retval.getCommonHeaderBuilder().build()); + } catch (RANSliceRpcInvocationException e) { + LOG.debug(exceptionMessage, e); + oBuilder.setCommonHeader(e.getCommonHeader()); + oBuilder.setStatus(e.getStatus()); + } + + RpcResult rpcResult = + RpcResultBuilder. status(true).withResult(oBuilder.build()).build(); + // return error + return Futures.immediateFuture(rpcResult); + + } + + //RPC determineRANSliceResources + + @Override + public ListenableFuture> determineRANSliceResources(DetermineRANSliceResourcesInput input) { + DetermineRANSliceResourcesInputBuilder iBuilder = new DetermineRANSliceResourcesInputBuilder(input); + DetermineRANSliceResourcesOutputBuilder oBuilder = new DetermineRANSliceResourcesOutputBuilder(); + + try { + CommonRANSliceFields retval = callDG("determineRANSliceResources", iBuilder.build()); + oBuilder.setStatus(retval.getStatusBuilder().build()); + oBuilder.setCommonHeader(retval.getCommonHeaderBuilder().build()); + } catch (RANSliceRpcInvocationException e) { + LOG.debug(exceptionMessage, e); + oBuilder.setCommonHeader(e.getCommonHeader()); + oBuilder.setStatus(e.getStatus()); + } + + RpcResult rpcResult = + RpcResultBuilder. status(true).withResult(oBuilder.build()).build(); + // return error + return Futures.immediateFuture(rpcResult); + + } + + //RPC cm-notify + + @Override + public ListenableFuture> configNotification(ConfigNotificationInput input) { + + ConfigNotificationInputBuilder iBuilder = new ConfigNotificationInputBuilder(input); + ConfigNotificationOutputBuilder oBuilder = new ConfigNotificationOutputBuilder(); + + try { + CommonRANSliceFields retval = callDG("configNotification", iBuilder.build()); + oBuilder.setStatus(retval.getStatusBuilder().build()); + oBuilder.setCommonHeader(retval.getCommonHeaderBuilder().build()); + } catch (RANSliceRpcInvocationException e) { + LOG.debug(exceptionMessage, e); + oBuilder.setCommonHeader(e.getCommonHeader()); + oBuilder.setStatus(e.getStatus()); + } + + RpcResult rpcResult = + RpcResultBuilder. status(true).withResult(oBuilder.build()).build(); + // return error + return Futures.immediateFuture(rpcResult); + + } + + + private CommonRANSliceFields callDG(String rpcName, Object input) throws RANSliceRpcInvocationException { + + StatusBuilder statusBuilder = new StatusBuilder(); + + if (input == null) { + LOG.debug("Rejecting " +rpcName+ " because of invalid input"); + statusBuilder.setCode(RANSliceResponseCode.REJECT_INVALID_INPUT.getValue()); + statusBuilder.setMessage("REJECT - INVALID INPUT. Missing input"); + CommonHeaderBuilder hBuilder = new CommonHeaderBuilder(); + hBuilder.setApiVer("1"); + hBuilder.setOriginatorId("unknown"); + hBuilder.setRequestId("unset"); + hBuilder.setTimestamp(new ZULU(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(new Date()))); + throw new RANSliceRpcInvocationException(statusBuilder.build(), hBuilder.build()); + } + + CommonHeaderBuilder hBuilder = new CommonHeaderBuilder(((CommonHeader)input).getCommonHeader()); + + // add input to parms + LOG.info("Adding INPUT data for "+ rpcName +" input: " + input.toString()); + Properties inputProps = new Properties(); + MdsalHelper.toProperties(inputProps, input); + + LOG.info("Printing SLI parameters to be passed"); + + // iterate properties file to get key-value pairs + for (String key : inputProps.stringPropertyNames()) { + String value = inputProps.getProperty(key); + LOG.info("The SLI parameter in " + key + " is: " + value); + } + + Properties respProps = new Properties(); + + // Call SLI sync method + try + { + if (RANSliceClient.hasGraph("ran-slice-api", rpcName , null, "sync")) + { + try + { + respProps = RANSliceClient.execute("ran-slice-api", rpcName, null, "sync", inputProps, domDataBroker); + } + catch (Exception e) + { + LOG.error("Caught exception executing service logic for "+ rpcName, e); + statusBuilder.setCode(RANSliceResponseCode.FAILURE_DG_FAILURE.getValue()); + statusBuilder.setMessage("FAILURE - DG FAILURE ("+e.getMessage()+")"); + throw new RANSliceRpcInvocationException(statusBuilder.build(), hBuilder.build()); + } + } else { + LOG.error("No service logic active for RANSlice: '" + rpcName + "'"); + + statusBuilder.setCode(RANSliceResponseCode.REJECT_DG_NOT_FOUND.getValue()); + statusBuilder.setMessage("FAILURE - DG not found for action "+rpcName); + throw new RANSliceRpcInvocationException(statusBuilder.build(), hBuilder.build()); + } + } + catch (Exception e) + { + LOG.error("Caught exception looking for service logic", e); + + statusBuilder.setCode(RANSliceResponseCode.FAILURE_DG_FAILURE.getValue()); + statusBuilder.setMessage("FAILURE - Unexpected error looking for DG ("+e.getMessage()+")"); + throw new RANSliceRpcInvocationException(statusBuilder.build(), hBuilder.build()); + } + + + StatusBuilder sBuilder = new StatusBuilder(); + MdsalHelper.toBuilder(respProps, sBuilder); + MdsalHelper.toBuilder(respProps, hBuilder); + + Payload payload = null; + String payloadValue = respProps.getProperty("payload"); + if (payloadValue != null) { + payload = new Payload(payloadValue); + } + + String statusCode = sBuilder.getCode().toString(); + + if (!"400".equals(statusCode)) { + LOG.error("Returned FAILED for "+rpcName+" error code: '" + statusCode + "'"); + } else { + LOG.info("Returned SUCCESS for "+rpcName+" "); + } + + return new CommonRANSliceFields(sBuilder, hBuilder, payload); + + } + +} diff --git a/sdnr/northbound/ranSlice/provider/src/main/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceResponseCode.java b/sdnr/northbound/ranSlice/provider/src/main/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceResponseCode.java new file mode 100644 index 000000000..814b27e64 --- /dev/null +++ b/sdnr/northbound/ranSlice/provider/src/main/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceResponseCode.java @@ -0,0 +1,51 @@ +package org.onap.ccsdk.features.sdnr.northbound.ranSlice; + +public enum RANSliceResponseCode { + + // Accepted category + ACCEPT_ACCEPTED(100), + // Error category + ERROR_UNEXPECTED_ERROR(200), + // Rejected category + REJECT_REJECTED(300), + REJECT_INVALID_INPUT(301), + REJECT_MISSING_PARAM(302), + REJECT_PARSING_FAILED(303), + REJECT_NO_TRANSITION(304), + REJECT_ACTION_NOT_SUPPORTED(305), + REJECT_VNF_NOT_FOUND(306), + REJECT_DG_NOT_FOUND(307), + REJECT_WORKFLOW_NOT_FOUND(308), + REJECT_UNSTABLE_VNF(309), + REJECT_LOCKING_FAILURE(310), + REJECT_EXPIRED_REQUEST(311), + REJECT_DUPLICATE_REQUEST(312), + REJECT_MISSING_AAI_DATA(313), + REJECT_MULTIPLE_REQUESTS_FOR_SEARCH(315), + REJECT_POLICY_VALIDATION_FAILURE(316), + // Success category + SUCCESS(400), + // Failure category + FAILURE_DG_FAILURE(401), + FAILURE_NO_TRANSITION(402), + FAILURE_AAI_FAILURE(403), + FAILURE_EXPIRED_REQUEST(404), + FAILURE_UNEXPECTED_FAILURE(405), + FAILURE_UNSTABLE_VNF(406), + FAILURE_REQUEST_NOT_SUPPORTED(450), + // Partial success + PARTIAL_SUCCESS(500); + + + + private int value; + private RANSliceResponseCode(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + + +} diff --git a/sdnr/northbound/ranSlice/provider/src/main/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceRpcInvocationException.java b/sdnr/northbound/ranSlice/provider/src/main/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceRpcInvocationException.java new file mode 100644 index 000000000..18b66312d --- /dev/null +++ b/sdnr/northbound/ranSlice/provider/src/main/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceRpcInvocationException.java @@ -0,0 +1,25 @@ +package org.onap.ccsdk.features.sdnr.northbound.ranSlice; + +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.opendaylight.yang.gen.v1.org.onap.ccsdk.rev200806.common.header.CommonHeader; +import org.opendaylight.yang.gen.v1.org.onap.ccsdk.rev200806.status.Status; + +public class RANSliceRpcInvocationException extends SvcLogicException { + + private Status status; + private CommonHeader commonHeader; + + public RANSliceRpcInvocationException(Status status, CommonHeader commonHeader) { + this.status = status; + this.commonHeader = commonHeader; + } + + public Status getStatus() { + return status; + } + + public CommonHeader getCommonHeader() { + return commonHeader; + } + +} diff --git a/sdnr/northbound/ranSlice/provider/src/main/resources/OSGI-INF/blueprint/impl-blueprint.xml b/sdnr/northbound/ranSlice/provider/src/main/resources/OSGI-INF/blueprint/impl-blueprint.xml new file mode 100644 index 000000000..57ebfbfcc --- /dev/null +++ b/sdnr/northbound/ranSlice/provider/src/main/resources/OSGI-INF/blueprint/impl-blueprint.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sdnr/northbound/ranSlice/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml b/sdnr/northbound/ranSlice/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml new file mode 100644 index 000000000..57ebfbfcc --- /dev/null +++ b/sdnr/northbound/ranSlice/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sdnr/northbound/ranSlice/provider/src/test/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceProviderTest.java b/sdnr/northbound/ranSlice/provider/src/test/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceProviderTest.java new file mode 100644 index 000000000..f1e1524ec --- /dev/null +++ b/sdnr/northbound/ranSlice/provider/src/test/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/RANSliceProviderTest.java @@ -0,0 +1,366 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.ccsdk.features.sdnr.northbound.ranSlice; + + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.fail; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.io.InputStream; +import java.net.URL; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Properties; +import java.util.concurrent.ExecutionException; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.onap.ccsdk.sli.core.sli.SvcLogicLoader; +import org.onap.ccsdk.sli.core.sli.SvcLogicStore; +import org.onap.ccsdk.sli.core.sli.SvcLogicStoreFactory; +import org.onap.ccsdk.sli.core.sli.provider.SvcLogicClassResolver; +import org.onap.ccsdk.sli.core.sli.provider.SvcLogicPropertiesProviderImpl; +import org.onap.ccsdk.sli.core.sli.provider.SvcLogicServiceImpl; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService; +import org.opendaylight.controller.sal.binding.api.BindingAwareBroker; +import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; +import org.opendaylight.yang.gen.v1.org.onap.ccsdk.rev200806.*; +import org.opendaylight.yang.gen.v1.org.onap.ccsdk.rev200806.common.header.CommonHeaderBuilder; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class RANSliceProviderTest { + + Logger LOG = LoggerFactory.getLogger(RANSliceProvider.class); + private RANSliceProvider provider; + + /** + * @throws java.lang.Exception + */ + @Before + public void setUp() throws Exception { + DataBroker dataBroker = mock(DataBroker.class); + NotificationPublishService notifyService = mock(NotificationPublishService.class); + RpcProviderRegistry rpcRegistry = mock(RpcProviderRegistry.class); + BindingAwareBroker.RpcRegistration rpcRegistration = (BindingAwareBroker.RpcRegistration) mock(BindingAwareBroker.RpcRegistration.class); + when(rpcRegistry.addRpcImplementation(any(Class.class), any(RanSliceApiService.class))).thenReturn(rpcRegistration); + + + // Load svclogic.properties and get a SvcLogicStore + InputStream propStr = RANSliceProviderTest.class.getResourceAsStream("/svclogic.properties"); + Properties svcprops = new Properties(); + svcprops.load(propStr); + + SvcLogicStore store = SvcLogicStoreFactory.getSvcLogicStore(svcprops); + + assertNotNull(store); + + URL graphUrl = RANSliceProviderTest.class.getClassLoader().getResource("graphs"); + LOG.info("Graph URL:" + graphUrl); + + + if (graphUrl == null) { + fail("Cannot find graphs directory"); + } + + SvcLogicLoader loader = new SvcLogicLoader(graphUrl.getPath(), store); + loader.loadAndActivate(); + + // Create a ServiceLogicService + SvcLogicServiceImpl svc = new SvcLogicServiceImpl(new SvcLogicPropertiesProviderImpl(), + new SvcLogicClassResolver()); + + // Finally ready to create sliapiProvider + RANSliceClient client = new RANSliceClient(svc); + provider = new RANSliceProvider(dataBroker, notifyService, rpcRegistry, client); + } + + /** + * @throws java.lang.Exception + */ + @After + public void tearDown() throws Exception { + provider.close(); + } + + + @Test + public void testConfigureNearRTRIC() { + ConfigureNearRTRICInputBuilder builder = new ConfigureNearRTRICInputBuilder(); + + CommonHeaderBuilder hdrBuilder = new CommonHeaderBuilder(); + hdrBuilder.setApiVer("1"); + hdrBuilder.setFlags(null); + hdrBuilder.setOriginatorId("jUnit"); + hdrBuilder.setRequestId("123"); + hdrBuilder.setTimestamp(new ZULU(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(new Date()))); + builder.setCommonHeader(hdrBuilder.build()); + + builder.setAction(Action.Reconfigure); + + try { + ConfigureNearRTRICOutput results = provider.configureNearRTRIC(builder.build()).get().getResult(); + LOG.info("configureNearRTRIC returned status {} : {}", results.getStatus().getCode(), results.getStatus().getMessage()); + assert(results.getStatus().getCode() == 400); + } catch (InterruptedException | ExecutionException e) { + LOG.error("Caught exception", e); + fail("configureNearRTRIC threw exception"); + } + + } + + + @Test + public void testInstantiateRANSlice() { + InstantiateRANSliceInputBuilder builder = new InstantiateRANSliceInputBuilder(); + + CommonHeaderBuilder hdrBuilder = new CommonHeaderBuilder(); + hdrBuilder.setApiVer("1"); + hdrBuilder.setFlags(null); + hdrBuilder.setOriginatorId("jUnit"); + hdrBuilder.setRequestId("123"); + hdrBuilder.setTimestamp(new ZULU(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(new Date()))); + builder.setCommonHeader(hdrBuilder.build()); + + builder.setAction(Action.Reconfigure); + + try { + InstantiateRANSliceOutput results = provider.instantiateRANSlice(builder.build()).get().getResult(); + LOG.info("instantiateRANSlice returned status {} : {}", results.getStatus().getCode(), results.getStatus().getMessage()); + assert(results.getStatus().getCode() == 400); + } catch (InterruptedException | ExecutionException e) { + LOG.error("Caught exception", e); + fail("instantiateRANSlice threw exception"); + } + + } + + + @Test + public void testConfigureRANSliceInstance() { + ConfigureRANSliceInstanceInputBuilder builder = new ConfigureRANSliceInstanceInputBuilder(); + + CommonHeaderBuilder hdrBuilder = new CommonHeaderBuilder(); + hdrBuilder.setApiVer("1"); + hdrBuilder.setFlags(null); + hdrBuilder.setOriginatorId("jUnit"); + hdrBuilder.setRequestId("123"); + hdrBuilder.setTimestamp(new ZULU(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(new Date()))); + builder.setCommonHeader(hdrBuilder.build()); + + builder.setAction(Action.Reconfigure); + + try { + ConfigureRANSliceInstanceOutput results = provider.configureRANSliceInstance(builder.build()).get().getResult(); + LOG.info("configureRANSliceInstance returned status {} : {}", results.getStatus().getCode(), results.getStatus().getMessage()); + assert(results.getStatus().getCode() == 400); + } catch (InterruptedException | ExecutionException e) { + LOG.error("Caught exception", e); + fail("configureRANSliceInstance threw exception"); + } + + } + + @Test + public void testConfigureCU() { + ConfigureCUInputBuilder builder = new ConfigureCUInputBuilder(); + + CommonHeaderBuilder hdrBuilder = new CommonHeaderBuilder(); + hdrBuilder.setApiVer("1"); + hdrBuilder.setFlags(null); + hdrBuilder.setOriginatorId("jUnit"); + hdrBuilder.setRequestId("123"); + hdrBuilder.setTimestamp(new ZULU(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(new Date()))); + builder.setCommonHeader(hdrBuilder.build()); + + builder.setAction(Action.Reconfigure); + + try { + ConfigureCUOutput results = provider.configureCU(builder.build()).get().getResult(); + LOG.info("configureCU returned status {} : {}", results.getStatus().getCode(), results.getStatus().getMessage()); + assert(results.getStatus().getCode() == 400); + } catch (InterruptedException | ExecutionException e) { + LOG.error("Caught exception", e); + fail("configureCU threw exception"); + } + + } + + + @Test + public void testConfigureDU() { + ConfigureDUInputBuilder builder = new ConfigureDUInputBuilder(); + + CommonHeaderBuilder hdrBuilder = new CommonHeaderBuilder(); + hdrBuilder.setApiVer("1"); + hdrBuilder.setFlags(null); + hdrBuilder.setOriginatorId("jUnit"); + hdrBuilder.setRequestId("123"); + hdrBuilder.setTimestamp(new ZULU(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(new Date()))); + builder.setCommonHeader(hdrBuilder.build()); + + builder.setAction(Action.Reconfigure); + + try { + ConfigureDUOutput results = provider.configureDU(builder.build()).get().getResult(); + LOG.info("configureDU returned status {} : {}", results.getStatus().getCode(), results.getStatus().getMessage()); + assert(results.getStatus().getCode() == 400); + } catch (InterruptedException | ExecutionException e) { + LOG.error("Caught exception", e); + fail("configureDU threw exception"); + } + + } + + @Test + public void testActivateRANSliceInstance() { + ActivateRANSliceInstanceInputBuilder builder = new ActivateRANSliceInstanceInputBuilder(); + + CommonHeaderBuilder hdrBuilder = new CommonHeaderBuilder(); + hdrBuilder.setApiVer("1"); + hdrBuilder.setFlags(null); + hdrBuilder.setOriginatorId("jUnit"); + hdrBuilder.setRequestId("123"); + hdrBuilder.setTimestamp(new ZULU(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(new Date()))); + builder.setCommonHeader(hdrBuilder.build()); + + builder.setAction(Action.Reconfigure); + + try { + ActivateRANSliceInstanceOutput results = provider.activateRANSliceInstance(builder.build()).get().getResult(); + LOG.info("activateRANSliceInstance returned status {} : {}", results.getStatus().getCode(), results.getStatus().getMessage()); + assert(results.getStatus().getCode() == 400); + } catch (InterruptedException | ExecutionException e) { + LOG.error("Caught exception", e); + fail("activateRANSliceInstance threw exception"); + } + + } + + + @Test + public void testDeactivateRANSliceInstance() { + DeactivateRANSliceInstanceInputBuilder builder = new DeactivateRANSliceInstanceInputBuilder(); + + CommonHeaderBuilder hdrBuilder = new CommonHeaderBuilder(); + hdrBuilder.setApiVer("1"); + hdrBuilder.setFlags(null); + hdrBuilder.setOriginatorId("jUnit"); + hdrBuilder.setRequestId("123"); + hdrBuilder.setTimestamp(new ZULU(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(new Date()))); + builder.setCommonHeader(hdrBuilder.build()); + + builder.setAction(Action.Reconfigure); + + try { + DeactivateRANSliceInstanceOutput results = provider.deactivateRANSliceInstance(builder.build()).get().getResult(); + LOG.info("deactivateRANSliceInstance returned status {} : {}", results.getStatus().getCode(), results.getStatus().getMessage()); + assert(results.getStatus().getCode() == 400); + } catch (InterruptedException | ExecutionException e) { + LOG.error("Caught exception", e); + fail("deactivateRANSliceInstance threw exception"); + } + + } + + @Test + public void testTerminateRANSliceInstance() { + TerminateRANSliceInstanceInputBuilder builder = new TerminateRANSliceInstanceInputBuilder(); + + CommonHeaderBuilder hdrBuilder = new CommonHeaderBuilder(); + hdrBuilder.setApiVer("1"); + hdrBuilder.setFlags(null); + hdrBuilder.setOriginatorId("jUnit"); + hdrBuilder.setRequestId("123"); + hdrBuilder.setTimestamp(new ZULU(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(new Date()))); + builder.setCommonHeader(hdrBuilder.build()); + + builder.setAction(Action.Reconfigure); + + try { + TerminateRANSliceInstanceOutput results = provider.terminateRANSliceInstance(builder.build()).get().getResult(); + LOG.info("terminateRANSliceInstance returned status {} : {}", results.getStatus().getCode(), results.getStatus().getMessage()); + assert(results.getStatus().getCode() == 400); + } catch (InterruptedException | ExecutionException e) { + LOG.error("Caught exception", e); + fail("terminateRANSliceInstance threw exception"); + } + + } + + @Test + public void testDetermineRANSliceResources() { + DetermineRANSliceResourcesInputBuilder builder = new DetermineRANSliceResourcesInputBuilder(); + + CommonHeaderBuilder hdrBuilder = new CommonHeaderBuilder(); + hdrBuilder.setApiVer("1"); + hdrBuilder.setFlags(null); + hdrBuilder.setOriginatorId("jUnit"); + hdrBuilder.setRequestId("123"); + hdrBuilder.setTimestamp(new ZULU(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(new Date()))); + builder.setCommonHeader(hdrBuilder.build()); + + builder.setAction(Action.Reconfigure); + + try { + DetermineRANSliceResourcesOutput results = provider.determineRANSliceResources(builder.build()).get().getResult(); + LOG.info("determineRANSliceResources returned status {} : {}", results.getStatus().getCode(), results.getStatus().getMessage()); + assert(results.getStatus().getCode() == 400); + } catch (InterruptedException | ExecutionException e) { + LOG.error("Caught exception", e); + fail("determineRANSliceResources threw exception"); + } + + } + + + @Test + public void testConfigNotification() { + ConfigNotificationInputBuilder builder = new ConfigNotificationInputBuilder(); + + CommonHeaderBuilder hdrBuilder = new CommonHeaderBuilder(); + hdrBuilder.setApiVer("1"); + hdrBuilder.setFlags(null); + hdrBuilder.setOriginatorId("jUnit"); + hdrBuilder.setRequestId("123"); + hdrBuilder.setTimestamp(new ZULU(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(new Date()))); + builder.setCommonHeader(hdrBuilder.build()); + + builder.setAction(Action.Reconfigure); + + try { + ConfigNotificationOutput results = provider.configNotification(builder.build()).get().getResult(); + LOG.info("configNotification returned status {} : {}", results.getStatus().getCode(), results.getStatus().getMessage()); + assert(results.getStatus().getCode() == 400); + } catch (InterruptedException | ExecutionException e) { + LOG.error("Caught exception", e); + fail("configNotification threw exception"); + } + + } + + + } diff --git a/sdnr/northbound/ranSlice/provider/src/test/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/TestRANSliceRpcInvocationException.java b/sdnr/northbound/ranSlice/provider/src/test/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/TestRANSliceRpcInvocationException.java new file mode 100644 index 000000000..4c32c22bf --- /dev/null +++ b/sdnr/northbound/ranSlice/provider/src/test/java/org/onap/ccsdk/features/sdnr/northbound/ranSlice/TestRANSliceRpcInvocationException.java @@ -0,0 +1,42 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + + +package org.onap.ccsdk.features.sdnr.northbound.ranSlice; + +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.opendaylight.yang.gen.v1.org.onap.ccsdk.rev200806.common.header.CommonHeader; +import org.opendaylight.yang.gen.v1.org.onap.ccsdk.rev200806.status.Status; + + +public class TestRANSliceRpcInvocationException { + + @Test(expected = SvcLogicException.class) + public void testRANSliceRpcInvocationException() throws SvcLogicException{ + Status status = null; + CommonHeader commonHeader = null; + RANSliceRpcInvocationException exception = new RANSliceRpcInvocationException(status, commonHeader); + assert(exception.getStatus() == status); + assert(exception.getCommonHeader() == commonHeader); + throw exception; + } +} diff --git a/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/graph.versions b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/graph.versions new file mode 100644 index 000000000..e9642a45f --- /dev/null +++ b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/graph.versions @@ -0,0 +1,10 @@ +ran-slice-api configureNearRTRIC 1.0.1 sync +ran-slice-api instantiateRANSlice 1.0.1 sync +ran-slice-api configureRANSliceInstance 1.0.1 sync +ran-slice-api configureCU 1.0.1 sync +ran-slice-api configureDU 1.0.1 sync +ran-slice-api activateRANSliceInstance 1.0.1 sync +ran-slice-api deactivateRANSliceInstance 1.0.1 sync +ran-slice-api terminateRANSliceInstance 1.0.1 sync +ran-slice-api determineRANSliceResources 1.0.1 sync +ran-slice-api configNotification 1.0.1 sync diff --git a/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_activateRANSliceInstance.xml b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_activateRANSliceInstance.xml new file mode 100644 index 000000000..b7ab247ba --- /dev/null +++ b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_activateRANSliceInstance.xml @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configNotification.xml b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configNotification.xml new file mode 100644 index 000000000..bad05304c --- /dev/null +++ b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configNotification.xml @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configureCU.xml b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configureCU.xml new file mode 100644 index 000000000..f1e52ea75 --- /dev/null +++ b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configureCU.xml @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configureDU.xml b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configureDU.xml new file mode 100644 index 000000000..097376580 --- /dev/null +++ b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configureDU.xml @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configureNearRTRIC.xml b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configureNearRTRIC.xml new file mode 100644 index 000000000..eadcf768a --- /dev/null +++ b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configureNearRTRIC.xml @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configureRANSliceInstance.xml b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configureRANSliceInstance.xml new file mode 100644 index 000000000..08242f4b3 --- /dev/null +++ b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_configureRANSliceInstance.xml @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_deactivateRANSliceInstance.xml b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_deactivateRANSliceInstance.xml new file mode 100644 index 000000000..e7b5c00b9 --- /dev/null +++ b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_deactivateRANSliceInstance.xml @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_determineRANSliceResources.xml b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_determineRANSliceResources.xml new file mode 100644 index 000000000..7b7a69786 --- /dev/null +++ b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_determineRANSliceResources.xml @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_instantiateRANSlice.xml b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_instantiateRANSlice.xml new file mode 100644 index 000000000..71f8655cc --- /dev/null +++ b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_instantiateRANSlice.xml @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_terminateRANSliceInstance.xml b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_terminateRANSliceInstance.xml new file mode 100644 index 000000000..372f3ae0b --- /dev/null +++ b/sdnr/northbound/ranSlice/provider/src/test/resources/graphs/ranSlice/ran-slice-api_terminateRANSliceInstance.xml @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/sdnr/northbound/ranSlice/provider/src/test/resources/simplelogger.properties b/sdnr/northbound/ranSlice/provider/src/test/resources/simplelogger.properties new file mode 100644 index 000000000..001dfd427 --- /dev/null +++ b/sdnr/northbound/ranSlice/provider/src/test/resources/simplelogger.properties @@ -0,0 +1,22 @@ +### +# ============LICENSE_START======================================================= +# ONAP : CCSDK +# ================================================================================ +# Copyright (C) 2017 AT&T Intellectual Property. All rights +# reserved. +# ================================================================================ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============LICENSE_END========================================================= +### + +org.slf4j.simpleLogger.defaultLogLevel=debug diff --git a/sdnr/northbound/ranSlice/provider/src/test/resources/svclogic.properties b/sdnr/northbound/ranSlice/provider/src/test/resources/svclogic.properties new file mode 100644 index 000000000..426960f76 --- /dev/null +++ b/sdnr/northbound/ranSlice/provider/src/test/resources/svclogic.properties @@ -0,0 +1,27 @@ +### +# ============LICENSE_START======================================================= +# ONAP : CCSDK +# ================================================================================ +# Copyright (C) 2017 AT&T Intellectual Property. All rights +# reserved. +# ================================================================================ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============LICENSE_END========================================================= +### + +org.onap.ccsdk.sli.dbtype = jdbc +org.onap.ccsdk.sli.jdbc.url=jdbc:derby:memory:sdnctl;create=true +org.onap.ccsdk.sli.jdbc.driver=org.apache.derby.jdbc.EmbeddedDriver +org.onap.ccsdk.sli.jdbc.database = sdnctl +org.onap.ccsdk.sli.jdbc.user = test +org.onap.ccsdk.sli.jdbc.password = test -- cgit 1.2.3-korg