Support o-ran-hardware revision - 2024-04-15 09/15209/3
authorRavi Pendurty <ravi.pendurty@highstreet-technologies.com>
Mon, 10 Nov 2025 11:28:47 +0000 (16:58 +0530)
committerRavi Pendurty <ravi.pendurty@highstreet-technologies.com>
Mon, 10 Nov 2025 12:58:44 +0000 (18:28 +0530)
Support backward compatibility also

Issue-ID: OAM-530
Change-Id: Ia91d4e93dcdf06219b55ce939069d77554900fe8
Signed-off-by: Ravi Pendurty <ravi.pendurty@highstreet-technologies.com>
features/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/ORanDOMNetworkElement.java
features/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/ORanNetworkElementFactory.java
features/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/util/ORanDeviceManagerQNames.java
features/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/yangspecs/ORANFM.java
features/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/yangspecs/OranHardware.java [new file with mode: 0644]
features/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/TestORanDOMNetworkElement.java
features/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/TestORanNetworkElementFactory.java

index 4a4883d..61752a7 100644 (file)
@@ -111,6 +111,7 @@ public class ORanDOMNetworkElement implements NetworkElement, IConfigChangedList
         this.oranDomChangeNotificationListener =
                 new ORanDOMChangeNotificationListener(netconfDomAccessor, vesCollectorService, databaseService);
         if(oranfm.isEmpty()) {
+            LOG.error("unable to detect ORAN FM module version");
             throw new RuntimeException("unable to detect ORAN FM module version");
         }
         this.oranDomFaultNotificationListener =
index 1f0fa06..f3a21a7 100644 (file)
@@ -25,7 +25,7 @@ import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRep
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.factory.NetworkElementFactory;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.service.NetworkElement;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.config.ORanDMConfig;
-import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDeviceManagerQNames;
+import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.yangspecs.OranHardware;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.DeviceManagerServiceProvider;
 import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.Capabilities;
 import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfAccessor;
@@ -42,22 +42,26 @@ public class ORanNetworkElementFactory implements NetworkElementFactory {
             QName.create("urn:onf:otcc:wireless:yang:radio-access:commscope-onecell", "2020-06-22", "onecell").intern();
     private ORanDMConfig oranSupervisionConfig;
     private ConfigurationFileRepresentation configFileRepresentation;
+    private Optional<OranHardware> oranhw = Optional.empty();
 
-    public ORanNetworkElementFactory(ConfigurationFileRepresentation configFileRepresentation, ORanDMConfig oranSupervisionConfig) {
+    public ORanNetworkElementFactory(ConfigurationFileRepresentation configFileRepresentation,
+            ORanDMConfig oranSupervisionConfig) {
         this.configFileRepresentation = configFileRepresentation;
         this.oranSupervisionConfig = oranSupervisionConfig;
     }
 
     @Override
     public Optional<NetworkElement> create(NetconfAccessor accessor, DeviceManagerServiceProvider serviceProvider) {
+        Optional<NetconfDomAccessor> domAccessor = accessor.getNetconfDomAccessor();
+        if (domAccessor.isPresent()) {
+            this.oranhw = OranHardware.getModule(accessor.getNetconfDomAccessor().get());
+        }
         Capabilities capabilites = accessor.getCapabilites();
         if (!capabilites.isSupportingNamespace(OneCell)) {
-            if (capabilites.isSupportingNamespace(ORanDeviceManagerQNames.ORAN_HW_COMPONENT)) {
+            if (this.oranhw.isPresent()) {
                 log.info("Create device {} ", ORanDOMNetworkElement.class.getName());
-                Optional<NetconfDomAccessor> domAccessor = accessor.getNetconfDomAccessor();
-                if (domAccessor.isPresent()) {
-                    return Optional.of(new ORanDOMNetworkElement(domAccessor.get(), serviceProvider, oranSupervisionConfig, configFileRepresentation));
-                }
+                return Optional.of(new ORanDOMNetworkElement(domAccessor.get(), serviceProvider, oranSupervisionConfig,
+                        configFileRepresentation));
             }
         }
         return Optional.empty();
index e2ad092..1b67266 100644 (file)
@@ -69,10 +69,10 @@ public class ORanDeviceManagerQNames {
             QName.create(CALLHOME_SERVER_MODULE, "unique-id");
 
     //o-ran-hardware.yang
-    public static final String ORAN_HW_NS = "urn:o-ran:hardware:1.0";
-    public static final String ORAN_HW_REVISION = "2019-03-28";
-    public static final @NonNull QName ORAN_HW_MODULE = QName.create(ORAN_HW_NS, ORAN_HW_REVISION, "o-ran-hardware").intern();
-    public static final @NonNull QName ORAN_HW_COMPONENT = QName.create(ORAN_HW_MODULE, "O-RAN-HW-COMPONENT");
+//    public static final String ORAN_HW_NS = "urn:o-ran:hardware:1.0";
+//    public static final String ORAN_HW_REVISION = "2024-04-15";
+//    public static final @NonNull QName ORAN_HW_MODULE = QName.create(ORAN_HW_NS, ORAN_HW_REVISION, "o-ran-hardware").intern();
+//    public static final @NonNull QName ORAN_HW_COMPONENT = QName.create(ORAN_HW_MODULE, "O-RAN-HW-COMPONENT");
 
     //ietf-netconf-notifications.yang
     public static final String IETF_NETCONF_NOTIFICATIONS_NS = "urn:ietf:params:xml:ns:yang:ietf-netconf-notifications";
index 474a621..a0611a8 100644 (file)
@@ -38,7 +38,9 @@ public class ORANFM extends YangModule {
             QNameModule.of(XMLNamespace.of(NAMESPACE), Revision.of("2019-02-04"));
     public static final QNameModule ORANFM_2022_08_15 =
             QNameModule.of(XMLNamespace.of(NAMESPACE), Revision.of("2022-08-15"));
-    private static final List<QNameModule> MODULES = Arrays.asList(ORANFM_2019_02_04, ORANFM_2022_08_15);
+    public static final QNameModule ORANFM_2024_08_12 =
+            QNameModule.of(XMLNamespace.of(NAMESPACE), Revision.of("2024-08-12"));
+    private static final List<QNameModule> MODULES = Arrays.asList(ORANFM_2019_02_04, ORANFM_2022_08_15, ORANFM_2024_08_12);
 
     ORANFM(NetconfDomAccessor netconfDomAccessor, QNameModule module) {
         super(netconfDomAccessor, module);
diff --git a/features/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/yangspecs/OranHardware.java b/features/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/yangspecs/OranHardware.java
new file mode 100644 (file)
index 0000000..a8e376b
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP : ccsdk features
+ * ================================================================================
+ * Copyright (C) 2025 highstreet technologies GmbH 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=========================================================
+ *
+ */
+package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.yangspecs;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.Capabilities;
+import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfDomAccessor;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.common.QNameModule;
+import org.opendaylight.yangtools.yang.common.Revision;
+import org.opendaylight.yangtools.yang.common.XMLNamespace;
+
+public class OranHardware extends YangModule {
+
+    public static final String NAMESPACE = "urn:o-ran:hardware:1.0";
+    public static final QNameModule ORANHW_2019_03_28 =
+            QNameModule.of(XMLNamespace.of(NAMESPACE), Revision.of("2019-03-28"));
+    public static final QNameModule ORANHW_2024_04_15 =
+            QNameModule.of(XMLNamespace.of(NAMESPACE), Revision.of("2024-04-15"));
+    private static final List<QNameModule> MODULES = Arrays.asList(ORANHW_2019_03_28, ORANHW_2024_04_15);
+
+    OranHardware(NetconfDomAccessor netconfDomAccessor, QNameModule module) {
+        super(netconfDomAccessor, module);
+    }
+
+    public QName getModuleQName() {
+        return getQName("o-ran-hardware");
+    }
+
+    public QName getComponentQName() {
+        return getQName("O-RAN-HW-COMPONENT");
+    }
+
+
+    /**
+     * Get specific instance, depending on capabilities
+     *
+     * @param netconfDomAccessor
+     * @return
+     */
+    public static Optional<OranHardware> getModule(NetconfDomAccessor netconfDomAccessor) {
+        Capabilities capabilities = netconfDomAccessor.getCapabilites();
+        for (QNameModule module : MODULES) {
+            if (capabilities.isSupportingNamespaceAndRevision(module)) {
+                return Optional.of(new OranHardware(netconfDomAccessor, module));
+            }
+        }
+        return Optional.empty();
+    }
+
+}
index 0653c6d..d9e98f4 100644 (file)
@@ -37,9 +37,9 @@ import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRep
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.service.NetworkElement;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.config.ORanDMConfig;
-import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDeviceManagerQNames;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.yangspecs.ORANFM;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.yangspecs.OnapSystem;
+import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.yangspecs.OranHardware;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.DeviceManagerServiceProvider;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.FaultService;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.NotificationProxyParser;
@@ -122,7 +122,8 @@ public class TestORanDOMNetworkElement {
     @Test
     public void test() {
         Optional<NetworkElement> oRanNe;
-        when(capabilities.isSupportingNamespace(ORanDeviceManagerQNames.ORAN_HW_COMPONENT)).thenReturn(true);
+        when(capabilities.isSupportingNamespaceAndRevision(
+                QNameModule.of(XMLNamespace.of(OranHardware.NAMESPACE), Revision.of("2019-03-28")))).thenReturn(true);
         when(capabilities.isSupportingNamespace(OneCell)).thenReturn(false);
         when(capabilities.isSupportingNamespace(OnapSystem1)).thenReturn(false);
 
index 4751118..9b76174 100644 (file)
@@ -31,9 +31,9 @@ import org.junit.Test;
 import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.config.ORanDMConfig;
-import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDeviceManagerQNames;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.yangspecs.ORANFM;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.yangspecs.OnapSystem;
+import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.yangspecs.OranHardware;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.DeviceManagerServiceProvider;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.FaultService;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.VESCollectorService;
@@ -102,14 +102,16 @@ public class TestORanNetworkElementFactory {
 
     @Test
     public void testCreateORANHWComponent() throws Exception {
-        when(domAccessor.getCapabilites().isSupportingNamespace(ORanDeviceManagerQNames.ORAN_HW_COMPONENT)).thenReturn(true);
+        when(capabilities.isSupportingNamespaceAndRevision(
+                QNameModule.of(XMLNamespace.of(OranHardware.NAMESPACE), Revision.of("2019-03-28")))).thenReturn(true);
         ORanNetworkElementFactory factory = new ORanNetworkElementFactory(oranCfg, oranDmConfig);
         assertTrue((factory.create(accessor, serviceProvider)).isPresent());
     }
 
     @Test
     public void testCreateNone() throws Exception {
-        when(domAccessor.getCapabilites().isSupportingNamespace(ORanDeviceManagerQNames.ORAN_HW_COMPONENT)).thenReturn(false);
+        when(capabilities.isSupportingNamespaceAndRevision(
+                QNameModule.of(XMLNamespace.of(OranHardware.NAMESPACE), Revision.of("2019-03-28")))).thenReturn(false);
         ORanNetworkElementFactory factory = new ORanNetworkElementFactory(oranCfg, oranDmConfig);
         assertTrue(!(factory.create(accessor, serviceProvider).isPresent()));
     }