diff options
59 files changed, 1929 insertions, 238 deletions
diff --git a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/HtUserdataManagerBase.java b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/HtUserdataManagerBase.java index e015dd29f..d6ad35488 100644 --- a/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/HtUserdataManagerBase.java +++ b/sdnr/wt/data-provider/dblib/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/sqldb/data/HtUserdataManagerBase.java @@ -24,6 +24,7 @@ package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.data; import java.io.File; import java.io.IOException; import java.nio.file.Files; +import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtUserdataManager; @@ -68,25 +69,115 @@ public abstract class HtUserdataManagerBase implements HtUserdataManager { @Override public String getUserdata(String username, String key) { + final String EMPTY_JSON_OBJECT = "{}"; JSONObject o = new JSONObject(this.getUserdata(username)); - return o.has(key) ? o.get(key).toString() : "{}"; + if(key==null || !key.contains(".")) + return o.has(key) ? o.get(key).toString() : EMPTY_JSON_OBJECT; + final String[] keys = key.split("\\."); + Object tmp; + for (int i=0;i<keys.length-1;i++){ + if(!o.has(keys[i])){ + return EMPTY_JSON_OBJECT; + } + tmp = o.get(keys[i]); + if(!(tmp instanceof JSONObject)) { + return EMPTY_JSON_OBJECT; + } + o = (JSONObject)tmp; + } + tmp= o.has(keys[keys.length-1])? o.get(keys[keys.length-1]):EMPTY_JSON_OBJECT; + if(tmp instanceof JSONObject){ + return ((JSONObject)tmp).toString(); + } + if(tmp instanceof JSONArray){ + return ((JSONArray)tmp).toString(); + } + if( tmp instanceof String){ + return String.format("\"%s\"",tmp); + } + return String.valueOf(tmp); } @Override public boolean setUserdata(String username, String key, String data) { + if(key == null || data == null){ + return false; + } JSONObject o = new JSONObject(this.getUserdata(username)); - o.put(key, new JSONObject(data)); + if(!key.contains(".")) { + o.put(key, new JSONObject(data)); + } + else{ + final String[] keys = key.split("\\."); + JSONObject tmp = o; + Object tmpObject; + for(int i=0;i<keys.length-1;i++){ + if(!tmp.has(keys[i])){ + tmp.put(keys[i], new JSONObject()); + } + tmpObject = tmp.get(keys[i]); + if(!(tmpObject instanceof JSONObject)){ + return false; + } + tmp = (JSONObject) tmpObject; + } + if(data.startsWith("{")){ + tmp.put(keys[keys.length-1], new JSONObject(data)); + } + else if (data.startsWith("[")){ + tmp.put(keys[keys.length-1], new JSONArray(data)); + } + else if(data.startsWith("\"") && data.endsWith("\"")){ + tmp.put(keys[keys.length-1],data.substring(1,data.length()-1)); + } + else if("true".equals(data) || "false".equals(data)){ + tmp.put(keys[keys.length-1],"true".equals(data)); + } + else { + try { + tmp.put(keys[keys.length - 1], Double.parseDouble(data)); + } catch (NumberFormatException e) { + return false; + } + } + } return this.setUserdata(username, o.toString()); } @Override public boolean removeUserdata(String username, String key) { + if(key == null){ + return false; + } JSONObject o = new JSONObject(this.getUserdata(username)); - if (o.has(key)) { - o.remove(key); + if(!key.contains(".")) { + if (o.has(key)) { + o.remove(key); + return this.setUserdata(username, o.toString()); + } + } + else { + final String[] keys = key.split("\\."); + JSONObject tmp = o; + Object tmpObject; + for(int i=0;i<keys.length-1;i++){ + if(!tmp.has(keys[i])){ + return false; + } + tmpObject = tmp.get(keys[i]); + if(!(tmpObject instanceof JSONObject)){ + return false; + } + tmp = (JSONObject) tmpObject; + } + if(!tmp.has(keys[keys.length-1])){ + return false; + } + tmp.remove(keys[keys.length-1]); return this.setUserdata(username, o.toString()); + } - return true; + return false; } protected static JSONObject mergeData(JSONObject o, String key, JSONObject subObject) { diff --git a/sdnr/wt/data-provider/dblib/test2.properties b/sdnr/wt/data-provider/dblib/test2.properties deleted file mode 100644 index e3485ea95..000000000 --- a/sdnr/wt/data-provider/dblib/test2.properties +++ /dev/null @@ -1,7 +0,0 @@ -[mariadb] -url=${SDNRDBURL} -username=${SDNRDBUSERNAME} -password=${SDNRDBPASSWORD} -controllerId=null -suffix= - diff --git a/sdnr/wt/data-provider/installer/pom.xml b/sdnr/wt/data-provider/installer/pom.xml index 2de56eff3..596c38afc 100755 --- a/sdnr/wt/data-provider/installer/pom.xml +++ b/sdnr/wt/data-provider/installer/pom.xml @@ -22,6 +22,7 @@ ~ ============LICENSE_END======================================================= ~ --> + <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> @@ -43,7 +44,17 @@ <application.name>sdnr-wt-data-provider</application.name> <include.transitive.dependencies>false</include.transitive.dependencies> </properties> - + <dependencyManagement> + <dependencies> + <dependency> + <groupId>org.onap.ccsdk.parent</groupId> + <artifactId>installed-odl-bom</artifactId> + <version>2.6.0</version> + <type>pom</type> + <scope>import</scope> + </dependency> + </dependencies> + </dependencyManagement> <dependencies> <dependency> <groupId>${project.groupId}</groupId> diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/UserdataHttpServlet.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/UserdataHttpServlet.java index 92bccce6f..1346e7e44 100644 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/UserdataHttpServlet.java +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/UserdataHttpServlet.java @@ -47,7 +47,7 @@ public class UserdataHttpServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static final Logger LOG = LoggerFactory.getLogger(UserdataHttpServlet.class); - private static final String REGEX = "^\\/userdata[\\/]?([a-zA-Z0-9]+)?$"; + private static final String REGEX = "^\\/userdata[\\/]?([a-zA-Z0-9\\.]+)?$"; private static final Pattern PATTERN = Pattern.compile(REGEX); private static final String JWT_PAYLOAD_USERNAME_PROPERTYKEY = "sub"; private static HtUserdataManager dbUserManager; diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestUserdata.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestUserdata.java index ce4044780..79c4dd185 100644 --- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestUserdata.java +++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestUserdata.java @@ -21,10 +21,12 @@ */ package org.onap.ccsdk.features.sdnr.wt.dataprovider.test; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; import java.io.IOException; import org.apache.sshd.common.util.io.IoUtils; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import org.junit.BeforeClass; import org.junit.Test; import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; @@ -36,6 +38,8 @@ import org.onap.ccsdk.features.sdnr.wt.dataprovider.test.util.HostInfoForTest; public class TestUserdata { private static final String USERNAME = "admin132"; + private static final String USERNAME2 = "admin133"; + private static HtDatabaseClient dbRawProvider; private static HtUserdataManagerImpl userDbProvider; @@ -45,6 +49,7 @@ public class TestUserdata { HostInfo[] hosts = HostInfoForTest.get(); dbRawProvider = HtDatabaseClient.getClient(hosts); userDbProvider = new HtUserdataManagerImpl(dbRawProvider); + } public static void trySleep(long ms) { @@ -89,6 +94,55 @@ public class TestUserdata { JSONAssert.assertEquals(mergedContent, userdata, false); } + @Test + public void test2() { + String fullContent = ""; + boolean success = false; + try { + fullContent = getFileContent("/userdata/full.json"); + success = userDbProvider.setUserdata(USERNAME2, fullContent); + } catch (IOException e) { + e.printStackTrace(); + fail(e.getMessage()); + } + assertTrue("problem writing data into db",success); + + trySleep(2000); + // read with complex key + String userdata = userDbProvider.getUserdata(USERNAME2, "networkMap.styling"); + JSONAssert.assertEquals("{\"theme\": \"dark\"}", userdata, false); + userdata = userDbProvider.getUserdata(USERNAME2, "networkMap.startupPosition.longitude"); + assertEquals("\"13.35\"", userdata); + userdata = userDbProvider.getUserdata(USERNAME2, "networkMap.tileOpacity"); + assertEquals("\"26\"", userdata); + + // write with complex key => forbidden + success = userDbProvider.setUserdata(USERNAME2,"networkMap.styling.theme",null); + assertFalse(success); + success = userDbProvider.setUserdata(USERNAME2,"networkMap.themes.key","\"abc\""); + assertFalse(success); + // write with complex key => allowed + success = userDbProvider.setUserdata(USERNAME2,"networkMap.styling.theme","\"test\""); + assertTrue(success); + userdata = userDbProvider.getUserdata(USERNAME2, "networkMap.styling.theme"); + assertEquals("\"test\"",userdata); + success = userDbProvider.setUserdata(USERNAME2,"networkMap.styling.theme","{\"test\":\"abc\"}"); + assertTrue(success); + userdata = userDbProvider.getUserdata(USERNAME2, "networkMap.styling.theme"); + assertEquals("{\"test\":\"abc\"}",userdata); + + // delete with complex key => forbidden + success = userDbProvider.removeUserdata(USERNAME2,"networkMap.styling.theme2"); + assertFalse(success); + // delete with complex key => allowed + success = userDbProvider.removeUserdata(USERNAME2,"networkMap.styling.theme"); + assertTrue(success); + userdata = userDbProvider.getUserdata(USERNAME2, "networkMap.styling"); + assertEquals("{}",userdata); + + + } + private static String getFileContent(String filename) throws IOException { return String.join("\n", IoUtils.readAllLines(TestUserdata.class.getResourceAsStream(filename))); } diff --git a/sdnr/wt/data-provider/provider/src/test/resources/userdata/full.json b/sdnr/wt/data-provider/provider/src/test/resources/userdata/full.json index c5b41ec21..4206ddc31 100644 --- a/sdnr/wt/data-provider/provider/src/test/resources/userdata/full.json +++ b/sdnr/wt/data-provider/provider/src/test/resources/userdata/full.json @@ -8,6 +8,13 @@ "zoom": "10", "longitude": "13.35" }, + "themes": [ + { + "key": "light", + "padding": 10, + "mainColor": "#ff0000" + } + ], "tileOpacity": "26" } }
\ No newline at end of file diff --git a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/data/DatabaseInfo7.java b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/data/DatabaseInfo7.java index 87fc07ef9..8a7f03040 100644 --- a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/data/DatabaseInfo7.java +++ b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/data/DatabaseInfo7.java @@ -27,20 +27,33 @@ package org.onap.ccsdk.features.sdnr.wt.dataprovider.setup.data; */ public class DatabaseInfo7 extends DatabaseInfo { + private boolean disableMapping; + public DatabaseInfo7(String alias, String doctype, String mapping) { super(alias, alias, doctype, mapping); + this.disableMapping = false; } public DatabaseInfo7(String alias, String doctype, String mapping, String settingsformat) { super(alias, alias, doctype, mapping, settingsformat); + this.disableMapping = false; } public DatabaseInfo7(String index, String alias, String doctype, String mapping, String settingsformat) { super(index, alias, doctype, mapping, settingsformat); + this.disableMapping = false; } @Override public String getMapping(boolean useStrict) { + if(this.disableMapping){ + return "{\"enabled\": false}"; + } return this.mapping == null ? null : String.format("{%s\"properties\":%s}", useStrict ? "\"dynamic\": false," : "\"dynamic\": true,", this.mapping); } + + public DatabaseInfo disableMapping() { + this.disableMapping = true; + return this; + } } diff --git a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/istanbul/IstanbulReleaseInformation.java b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/istanbul/IstanbulReleaseInformation.java index 6148e21d5..ba39a81b3 100644 --- a/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/istanbul/IstanbulReleaseInformation.java +++ b/sdnr/wt/data-provider/setup/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/setup/istanbul/IstanbulReleaseInformation.java @@ -170,7 +170,7 @@ public class IstanbulReleaseInformation extends ReleaseInformation { public static Map<ComponentName, DatabaseInfo> createDBMap() { Map<ComponentName, DatabaseInfo> map = HonoluluReleaseInformation.createDBMap(); - map.put(ComponentName.USERDATA, new DatabaseInfo7("userdata", "userdata", "{}")); + map.put(ComponentName.USERDATA, new DatabaseInfo7("userdata", "userdata", "").disableMapping()); map.put(ComponentName.REQUIRED_NETWORKELEMENT, new DatabaseInfo7("networkelement-connection", "networkelement-connection", "{\"node-id\": {\"type\": \"keyword\"},\"host\": {\"type\": \"keyword\"},\"port\": " diff --git a/sdnr/wt/devicemanager-core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/ne/factory/DevicemanagerNature.java b/sdnr/wt/devicemanager-core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/ne/factory/DevicemanagerNature.java new file mode 100644 index 000000000..53c34a7e0 --- /dev/null +++ b/sdnr/wt/devicemanager-core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/ne/factory/DevicemanagerNature.java @@ -0,0 +1,57 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2023 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.ne.factory; + +public class DevicemanagerNature implements Comparable<DevicemanagerNature> { + + /** Specific devicemanager */ + public static final DevicemanagerNature SPECIFIC = new DevicemanagerNature(10); + /** Priority of mid specfic types */ + public static final DevicemanagerNature NORMAL = new DevicemanagerNature(100); + /** Common devicemanager with basic functionality for standard */ + public static final DevicemanagerNature COMMON = new DevicemanagerNature(250); + /** Priority of "NetworkElementFactory" types */ + public static final DevicemanagerNature NETWORKELEMENT_FACTORY_DEFAULT = new DevicemanagerNature(Integer.MAX_VALUE); + + //Low numbers have the highest priority for devicemanager selection + private final int nature; + + private DevicemanagerNature(int nature) { + super(); + this.nature = nature; + } + + @Override + public int compareTo(DevicemanagerNature o) { + return Integer.compare(nature, o.nature); + } + + public static DevicemanagerNature getDefaultDevicemanagerNature(NetworkElementFactory a) { + return (a instanceof NetworkElementFactory2) ? ((NetworkElementFactory2) a).getDevicemanagerNature() + : NETWORKELEMENT_FACTORY_DEFAULT; + } + + public static int compareTo(NetworkElementFactory a, NetworkElementFactory b) { + return getDefaultDevicemanagerNature(a).compareTo(getDefaultDevicemanagerNature(b)); + } + +} diff --git a/sdnr/wt/devicemanager-core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/ne/factory/NetworkElementFactory2.java b/sdnr/wt/devicemanager-core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/ne/factory/NetworkElementFactory2.java new file mode 100644 index 000000000..c0ca8c84a --- /dev/null +++ b/sdnr/wt/devicemanager-core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/ne/factory/NetworkElementFactory2.java @@ -0,0 +1,29 @@ +/* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2023 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.ne.factory; + +public interface NetworkElementFactory2 extends NetworkElementFactory { + + /** + * Provide the nature of the devicemanager for list ordering + * @return nature definition of devicemanager + */ + DevicemanagerNature getDevicemanagerNature(); + +} diff --git a/sdnr/wt/devicemanager-core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/service/VESCollectorService.java b/sdnr/wt/devicemanager-core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/service/VESCollectorService.java index f93b599bf..ab016f74f 100644 --- a/sdnr/wt/devicemanager-core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/service/VESCollectorService.java +++ b/sdnr/wt/devicemanager-core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/service/VESCollectorService.java @@ -28,6 +28,7 @@ import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESFaultFieldsPOJO; import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESMessage; import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESNotificationFieldsPOJO; import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESPNFRegistrationFieldsPOJO; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESStndDefinedFieldsPOJO; /** * Interface used for publishing VES messages to the VES Collector @@ -97,4 +98,14 @@ public interface VESCollectorService extends DeviceManagerService { */ VESMessage generateVESEvent(VESCommonEventHeaderPOJO commonEventHeader, VESPNFRegistrationFieldsPOJO faultFields) throws JsonProcessingException; + /** + * Generates VES Event JSON containing commonEventHeader and stndDefined fields + * + * @param commonEventHeader + * @param stndDefinedFields + * @return VESMessage - representing the VES Event JSON + * @throws JsonProcessingException + */ + VESMessage generateVESEvent(VESCommonEventHeaderPOJO commonEventHeader, VESStndDefinedFieldsPOJO stndDefinedFields) throws JsonProcessingException; + } diff --git a/sdnr/wt/devicemanager-core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/types/VESStndDefinedFieldsPOJO.java b/sdnr/wt/devicemanager-core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/types/VESStndDefinedFieldsPOJO.java new file mode 100644 index 000000000..65bb48302 --- /dev/null +++ b/sdnr/wt/devicemanager-core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/types/VESStndDefinedFieldsPOJO.java @@ -0,0 +1,54 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2023 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.types; + +public class VESStndDefinedFieldsPOJO { + + private String schemaReference; + private String stndDefinedFieldsVersion = "1.0"; + private Object data; + + public String getSchemaReference() { + return schemaReference; + } + + public void setSchemaReference(String schemaReference) { + this.schemaReference = schemaReference; + } + + public String getStndDefinedFieldsVersion() { + return stndDefinedFieldsVersion; + } + + public void setStndDefinedFieldsVersion(String stndDefinedFieldsVersion) { + this.stndDefinedFieldsVersion = stndDefinedFieldsVersion; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + +} diff --git a/sdnr/wt/devicemanager-core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerImpl.java b/sdnr/wt/devicemanager-core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerImpl.java index 881f6b415..4c8003b17 100644 --- a/sdnr/wt/devicemanager-core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerImpl.java +++ b/sdnr/wt/devicemanager-core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerImpl.java @@ -38,6 +38,7 @@ */ package org.onap.ccsdk.features.sdnr.wt.devicemanager.impl; +import java.util.Collections; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import org.eclipse.jdt.annotation.NonNull; @@ -60,8 +61,10 @@ import org.onap.ccsdk.features.sdnr.wt.devicemanager.housekeeping.ResyncNetworkE import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.WebSocketServiceClientImpl; import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.WebSocketServiceClientInternal; import org.onap.ccsdk.features.sdnr.wt.devicemanager.maintenance.impl.MaintenanceServiceImpl; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.factory.DevicemanagerNature; import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.factory.FactoryRegistration; import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.factory.NetworkElementFactory; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.factory.NetworkElementFactory2; import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.service.NetworkElement; import org.onap.ccsdk.features.sdnr.wt.devicemanager.performancemanager.impl.PerformanceManagerImpl; import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.AaiService; @@ -274,11 +277,12 @@ public class DeviceManagerImpl implements NetconfNetworkElementService, DeviceMa } @Override - public @NonNull <L extends NetworkElementFactory> FactoryRegistration<L> registerBindingNetworkElementFactory( + synchronized public @NonNull <L extends NetworkElementFactory> FactoryRegistration<L> registerBindingNetworkElementFactory( @NonNull final L factory) { LOG.debug("Factory registration {}", factory.getClass().getName()); factoryList.add(factory); + Collections.sort(factoryList, (a,b) -> DevicemanagerNature.compareTo(a, b) ); factory.init(getServiceProvider()); return new FactoryRegistration<L>() { @@ -295,7 +299,11 @@ public class DeviceManagerImpl implements NetconfNetworkElementService, DeviceMa }; } - @SuppressWarnings("null") + private DevicemanagerNature getNature(NetworkElementFactory a) { + return (a instanceof NetworkElementFactory2) ? ((NetworkElementFactory2)a).getDevicemanagerNature() + : DevicemanagerNature.NETWORKELEMENT_FACTORY_DEFAULT; + } + @Override public @NonNull DataProvider getDataProvider() { return this.dataProvider; diff --git a/sdnr/wt/devicemanager-core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerNetconfConnectHandler.java b/sdnr/wt/devicemanager-core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerNetconfConnectHandler.java index 5d9a7dbb7..e9c5f7ab0 100644 --- a/sdnr/wt/devicemanager-core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerNetconfConnectHandler.java +++ b/sdnr/wt/devicemanager-core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerNetconfConnectHandler.java @@ -89,14 +89,11 @@ public class DeviceManagerNetconfConnectHandler extends DeviceManagerNetconfNotC // update db with connect status NetconfNode netconfNode = acessor.getNetconfNode(); sendUpdateNotification(acessor.getNodeId(), netconfNode.getConnectionStatus(), netconfNode); - - for (NetworkElementFactory f : getFactoryList()) { - Optional<NetworkElement> optionalNe = f.create(acessor, getServiceProvider()); - if (optionalNe.isPresent()) { - // sendUpdateNotification(mountPointNodeName, nNode.getConnectionStatus(), nNode); - handleNeStartup(acessor.getNodeId(), optionalNe.get()); - break; // Use the first provided - } + // Start devicemanager if possible + Optional<NetworkElement> optionalNe = createNetworkElement(acessor); + // Startup device + if (optionalNe.isPresent()) { + handleNeStartup(acessor.getNodeId(), optionalNe.get()); } } @@ -136,6 +133,23 @@ public class DeviceManagerNetconfConnectHandler extends DeviceManagerNetconfNotC */ /** + * Get the NetworkElement from list + * + * @param accessor + * @return Optional<NetowrkElement> + */ + private Optional<NetworkElement> createNetworkElement(NetconfAccessor accessor) { + Optional<NetworkElement> optionalNe = Optional.empty(); + for (NetworkElementFactory f : getFactoryList()) { + optionalNe = f.create(accessor, getServiceProvider()); + if (optionalNe.isPresent()) { + return optionalNe; // Use the first provided + } + } + return Optional.empty(); + } + + /** * Do all tasks necessary to move from mountpoint state connected -> connecting * * @param mountPointNodeName provided diff --git a/sdnr/wt/devicemanager-core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/vescollectorconnector/impl/VESCollectorServiceImpl.java b/sdnr/wt/devicemanager-core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/vescollectorconnector/impl/VESCollectorServiceImpl.java index 945d42550..a2e6c9a13 100644 --- a/sdnr/wt/devicemanager-core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/vescollectorconnector/impl/VESCollectorServiceImpl.java +++ b/sdnr/wt/devicemanager-core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/vescollectorconnector/impl/VESCollectorServiceImpl.java @@ -44,6 +44,7 @@ import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESFaultFieldsPOJO; import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESMessage; import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESNotificationFieldsPOJO; import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESPNFRegistrationFieldsPOJO; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESStndDefinedFieldsPOJO; import org.onap.ccsdk.features.sdnr.wt.devicemanager.vescollectorconnector.impl.config.VESCollectorCfgImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -204,4 +205,23 @@ public class VESCollectorServiceImpl implements VESCollectorService, IConfigChan return new VESMessage(objMapper.writeValueAsString(outerEvent)); } + /** + * Generates VES Event JSON containing commonEventHeader and stndDefined fields + * + * @param commonEventHeader + * @param stndDefinedFields + * @return VESMessage - representing the VES Event JSON + * @throws JsonProcessingException + */ + @Override + public VESMessage generateVESEvent(VESCommonEventHeaderPOJO commonEventHeader, + VESStndDefinedFieldsPOJO stndDefinedFields) throws JsonProcessingException { + Map<String, Object> innerEvent = new HashMap<String, Object>(); + innerEvent.put("commonEventHeader", commonEventHeader); + innerEvent.put("stndDefinedFields", stndDefinedFields); + + Map<String, Object> outerEvent = new HashMap<String, Object>(); + outerEvent.put("event", innerEvent); + return new VESMessage(objMapper.writeValueAsString(outerEvent)); + } } diff --git a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/config/ORanDMConfig.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/config/ORanDMConfig.java new file mode 100644 index 000000000..11a68e5fa --- /dev/null +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/config/ORanDMConfig.java @@ -0,0 +1,83 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2023 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.config; + +import org.onap.ccsdk.features.sdnr.wt.common.configuration.Configuration; +import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation; + +public class ORanDMConfig implements Configuration { + + private static final String SECTION_MARKER_ORAN_SUPERVISION = "ORAN-SUPERVISION"; + private static final String PROPERTY_KEY_SUPERVISION_NOTIFICATION_INTERVAL = "supervision-notification-interval"; + private static final String PROPERTY_KEY_GUARD_TIMER_OVERHEAD = "guard-timer-overhead"; + + private static final String DEFAULT_SUPERVISION_NOTIFICATION_INTERVAL = "${O_RU_SUPERVISION_NOTIFICATION_INTERVAL}"; + private static final String DEFAULT_GUARD_TIMER_OVERHEAD = "${O_RU_GUARD_TIMER_OVERHEAD}"; + + private static final int DEFAULT_SUPERVISION_NOTIFICATION_INTERVAL_VAL = 60; + private static final int DEFAULT_GUARD_TIMER_OVERHEAD_VAL = 10; + + private ConfigurationFileRepresentation configuration; + + public ORanDMConfig(ConfigurationFileRepresentation configuration) { + this.configuration = configuration; + this.configuration.addSection(SECTION_MARKER_ORAN_SUPERVISION); + defaults(); + } + + @Override + public String getSectionName() { + return SECTION_MARKER_ORAN_SUPERVISION; + } + + @Override + public void defaults() { + configuration.setPropertyIfNotAvailable(this.getSectionName(), PROPERTY_KEY_SUPERVISION_NOTIFICATION_INTERVAL, + DEFAULT_SUPERVISION_NOTIFICATION_INTERVAL); + configuration.setPropertyIfNotAvailable(this.getSectionName(), PROPERTY_KEY_GUARD_TIMER_OVERHEAD, + DEFAULT_GUARD_TIMER_OVERHEAD); + } + + public int getNotificationInterval() { + String v = this.configuration.getProperty(SECTION_MARKER_ORAN_SUPERVISION, + PROPERTY_KEY_SUPERVISION_NOTIFICATION_INTERVAL); + return (v == null || v.equals("null") || v.isEmpty() || !isNumeric(v)) + ? DEFAULT_SUPERVISION_NOTIFICATION_INTERVAL_VAL + : Integer.parseInt(v); + } + + public int getWatchdogTimer() { + String v = this.configuration.getProperty(SECTION_MARKER_ORAN_SUPERVISION, PROPERTY_KEY_GUARD_TIMER_OVERHEAD); + return (v == null || v.equals("null") || v.isEmpty() || !isNumeric(v)) ? DEFAULT_GUARD_TIMER_OVERHEAD_VAL + : Integer.parseInt(v); + } + + private boolean isNumeric(String v) { + try { + int i = Integer.parseInt(v); + } catch (NumberFormatException nfe) { + return false; + } + return true; + } + +} diff --git a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/ORanDOMToInternalDataModel.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/dataprovider/ORanDOMToInternalDataModel.java index 25a54f013..4b55f1681 100644 --- a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/ORanDOMToInternalDataModel.java +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/dataprovider/ORanDOMToInternalDataModel.java @@ -19,7 +19,7 @@ * ============LICENSE_END========================================================= * */ -package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; +package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.dataprovider; import java.time.Instant; import java.util.ArrayList; @@ -28,9 +28,16 @@ import java.util.Date; import java.util.List; import java.util.Objects; import java.util.Optional; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.NetconfTimeStamp; import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.NetconfTimeStampImpl; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDMDOMUtility; +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.opendaylight.mdsal.dom.api.DOMEvent; import org.opendaylight.mdsal.dom.api.DOMNotification; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri; @@ -52,6 +59,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.MapNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; +import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -195,12 +203,12 @@ public class ORanDOMToInternalDataModel { * @param sys * @return */ - public static Optional<Guicutthrough> getGuicutthrough(@Nullable NormalizedNode sys) { - AugmentationNode onapSys = (AugmentationNode) sys; - if (onapSys != null) { - String name = ORanDMDOMUtility.getLeafValue(onapSys, ORanDeviceManagerQNames.ONAP_SYSTEM_NAME); + public static Optional<Guicutthrough> getGuicutthrough(@Nullable AugmentationNode onapSysAugData, @NonNull OnapSystem onapSys) { + + if (onapSysAugData != null) { + String name = ORanDMDOMUtility.getLeafValue(onapSysAugData, onapSys.getName()); @Nullable - Uri uri = new Uri(ORanDMDOMUtility.getLeafValue(onapSys, ORanDeviceManagerQNames.ONAP_SYSTEM_WEB_UI)); + Uri uri = new Uri(ORanDMDOMUtility.getLeafValue(onapSysAugData, onapSys.getWebUi())); if (uri.getValue() != null) { GuicutthroughBuilder gcBuilder = new GuicutthroughBuilder(); if (name != null) { @@ -219,27 +227,58 @@ public class ORanDOMToInternalDataModel { * Convert fault notification into data-provider FaultLogEntity * * @param notification with O-RAN notification + * @param oranfm * @param nodeId of node to handle * @param counter to be integrated into data * @return FaultlogEntity with data */ - public static FaultlogEntity getFaultLog(DOMNotification notification, NodeId nodeId, Integer counter) { + public static FaultlogEntity getFaultLog(DOMNotification notification, @NonNull ORANFM oranfm, NodeId nodeId, Integer counter) { ContainerNode cn = notification.getBody(); FaultlogBuilder faultAlarm = new FaultlogBuilder(); faultAlarm.setNodeId(nodeId.getValue()); - faultAlarm.setObjectId(ORanDMDOMUtility.getLeafValue(cn, ORanDeviceManagerQNames.ORAN_FM_FAULT_SOURCE)); - faultAlarm.setProblem(ORanDMDOMUtility.getLeafValue(cn, ORanDeviceManagerQNames.ORAN_FM_FAULT_TEXT)); + faultAlarm.setObjectId(ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultSourceQName())); + faultAlarm.setProblem(ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultTextQName())); faultAlarm.setSeverity(getSeverityType( - ORanDMDOMUtility.getLeafValue(cn, ORanDeviceManagerQNames.ORAN_FM_FAULT_SEVERITY), - ORanDMDOMUtility.getLeafValue(cn, ORanDeviceManagerQNames.ORAN_FM_FAULT_IS_CLEARED).equals("true"))); + ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultSeverityQName()), + ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultIsClearedQName()).equals("true"))); faultAlarm.setCounter(counter); - faultAlarm.setId(ORanDMDOMUtility.getLeafValue(cn, ORanDeviceManagerQNames.ORAN_FM_FAULT_ID)); + faultAlarm.setId(ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultIdQName())); faultAlarm.setSourceType(SourceType.Netconf); faultAlarm.setTimestamp(getEventTime(notification)); return faultAlarm.build(); } - public static DateAndTime getEventTime(DOMNotification notification) { + public static FaultlogEntity getFaultLog(UnkeyedListEntryNode activeAlarmEntry, ORANFM oranfm, NodeId nodeId, Integer counter) { + FaultlogBuilder faultAlarm = new FaultlogBuilder(); + faultAlarm.setNodeId(nodeId.getValue()); + faultAlarm.setObjectId(getObjectId( + ORanDMDOMUtility.getLeafValue(activeAlarmEntry, oranfm.getFaultSourceQName()))); + faultAlarm.setProblem( + ORanDMDOMUtility.getLeafValue(activeAlarmEntry, oranfm.getFaultTextQName())); + faultAlarm.setSeverity(getSeverityType( + ORanDMDOMUtility.getLeafValue(activeAlarmEntry, oranfm.getFaultSeverityQName()), + ORanDMDOMUtility.getLeafValue(activeAlarmEntry, oranfm.getFaultIsClearedQName()) + .equals("true"))); + faultAlarm.setCounter(counter); + faultAlarm.setId(ORanDMDOMUtility.getLeafValue(activeAlarmEntry, oranfm.getFaultIdQName())); + faultAlarm.setSourceType(SourceType.Netconf); + faultAlarm.setTimestamp(NetconfTimeStampImpl.getConverter().getTimeStamp( + ORanDMDOMUtility.getLeafValue(activeAlarmEntry, oranfm.getFaultEventTimeQName()))); + return faultAlarm.build(); + + } + + /** + * Convert Instant to NETCONF DateAndTime + * @param eventTimeInstant + * @return DateAndTime + */ + public static DateAndTime getDateAndTimeOfInstant(Instant eventTimeInstant) { + Date eventDate = Date.from(eventTimeInstant); + return new DateAndTime(NETCONFTIME_CONVERTER.getTimeStamp(eventDate)); + } + + private static DateAndTime getEventTime(DOMNotification notification) { DateAndTime eventTime; Instant notificationEventTime = null; if (notification instanceof DOMEvent) { @@ -259,7 +298,7 @@ public class ORanDOMToInternalDataModel { * @return data-provider severity type * @throws IllegalArgumentException if conversion not possible. */ - public static SeverityType getSeverityType(@Nullable String faultSeverity, @Nullable Boolean isCleared) + private static SeverityType getSeverityType(@Nullable String faultSeverity, @Nullable Boolean isCleared) throws IllegalArgumentException { if (isCleared != null && isCleared) { return SeverityType.NonAlarmed; @@ -280,14 +319,14 @@ public class ORanDOMToInternalDataModel { + " faultSeverity=" + faultSeverity); } - /** - * Convert Instant to NETCONF DataAndTime - * @param eventTimeInstant - * @return DateAndTime - */ - public static DateAndTime getDateAndTimeOfInstant(Instant eventTimeInstant) { - Date eventDate = Date.from(eventTimeInstant); - return new DateAndTime(NETCONFTIME_CONVERTER.getTimeStamp(eventDate)); + private static String getObjectId(String leafValue) { + // fault-source = /ietf-hardware:hardware/component[name='slot0-logical0'] + Pattern p = Pattern.compile("\\/ietf-hardware:hardware\\/component\\[name=\\'(.*)\\']"); + Matcher m = p.matcher(leafValue); + if (m.find()) { + return m.group(1); + } + return leafValue; } } diff --git a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/DeviceManagerORanImpl.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/DeviceManagerORanImpl.java index de018ba4e..fd9ed2afa 100644 --- a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/DeviceManagerORanImpl.java +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/DeviceManagerORanImpl.java @@ -17,8 +17,10 @@ */ package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; +import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation; import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.factory.FactoryRegistration; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.config.ORanDMConfig; import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.NetconfNetworkElementService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,7 +29,6 @@ public class DeviceManagerORanImpl implements AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(DeviceManagerORanImpl.class); private static final String APPLICATION_NAME = "DeviceManagerORan"; - @SuppressWarnings("unused") private static final String CONFIGURATIONFILE = "etc/devicemanager-oran.properties"; @@ -36,6 +37,7 @@ public class DeviceManagerORanImpl implements AutoCloseable { private HtDatabaseClient htDatabaseClient; private Boolean devicemanagerInitializationOk = false; private FactoryRegistration<ORanNetworkElementFactory> resORan; + private ORanDMConfig oranSupervisionConfig; // Blueprint begin public DeviceManagerORanImpl() { @@ -51,8 +53,11 @@ public class DeviceManagerORanImpl implements AutoCloseable { LOG.info("Session Initiated start {}", APPLICATION_NAME); - resORan = netconfNetworkElementService.registerBindingNetworkElementFactory(new ORanNetworkElementFactory()); + ConfigurationFileRepresentation configFileRepresentation = + new ConfigurationFileRepresentation(CONFIGURATIONFILE); + oranSupervisionConfig = new ORanDMConfig(configFileRepresentation); + resORan = netconfNetworkElementService.registerBindingNetworkElementFactory(new ORanNetworkElementFactory(configFileRepresentation, oranSupervisionConfig)); netconfNetworkElementService.writeToEventLog(APPLICATION_NAME, "startup", "done"); this.devicemanagerInitializationOk = true; diff --git a/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 b/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 index 5e25ce8b1..72cda1679 100644 --- a/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 +++ b/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 @@ -22,7 +22,6 @@ package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; import com.fasterxml.jackson.core.JsonProcessingException; -import com.google.common.collect.Sets; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -30,10 +29,23 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; -import org.eclipse.jdt.annotation.Nullable; +import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation; +import org.onap.ccsdk.features.sdnr.wt.common.configuration.filechange.IConfigChangedListener; 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.ne.service.NetworkElementService; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.config.ORanDMConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.dataprovider.ORanDOMToInternalDataModel; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.notification.ORanDOMChangeNotificationListener; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.notification.ORanDOMFaultNotificationListener; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.notification.ORanDOMSupervisionNotificationListener; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.notification.ORanNotificationObserverImpl; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.rpc.ORanSupervisionRPCImpl; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDMDOMUtility; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDeviceManagerQNames; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.vesmapper.ORanRegistrationToVESpnfRegistrationMapper; +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.service.DeviceManagerServiceProvider; import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.FaultService; import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.NotificationService; @@ -52,17 +64,19 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.pro import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.InstanceIdentifierBuilder; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; +import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.MapNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; +import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode; +import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class ORanDOMNetworkElement implements NetworkElement { +public class ORanDOMNetworkElement implements NetworkElement, IConfigChangedListener { private static final Logger LOG = LoggerFactory.getLogger(ORanDOMNetworkElement.class); @@ -72,11 +86,16 @@ public class ORanDOMNetworkElement implements NetworkElement { private final @NonNull NotificationService notificationService; private final @NonNull ORanDOMChangeNotificationListener oranDomChangeNotificationListener; private final @NonNull ORanDOMFaultNotificationListener oranDomFaultNotificationListener; + private final @NonNull ORanDOMSupervisionNotificationListener oranDomSupervisionNotificationListener; private final @NonNull VESCollectorService vesCollectorService; private final @NonNull ORanRegistrationToVESpnfRegistrationMapper mapper; + private final Optional<OnapSystem> onapSystem; + private final Optional<ORANFM> oranfm; + private ORanDMConfig oranSupervisionConfig; public ORanDOMNetworkElement(@NonNull NetconfDomAccessor netconfDomAccessor, - @NonNull DeviceManagerServiceProvider serviceProvider) { + @NonNull DeviceManagerServiceProvider serviceProvider, ORanDMConfig oranSupervisionConfig, + ConfigurationFileRepresentation configFileRepresentation) { LOG.debug("Create {}", ORanDOMNetworkElement.class.getSimpleName()); this.netconfDomAccessor = Objects.requireNonNull(netconfDomAccessor); Objects.requireNonNull(serviceProvider); @@ -84,14 +103,21 @@ public class ORanDOMNetworkElement implements NetworkElement { this.vesCollectorService = serviceProvider.getVESCollectorService(); this.faultService = serviceProvider.getFaultService(); this.notificationService = serviceProvider.getNotificationService(); + this.onapSystem = OnapSystem.getModule(netconfDomAccessor); + this.oranfm = ORANFM.getModule(netconfDomAccessor); + this.oranSupervisionConfig = oranSupervisionConfig; + configFileRepresentation.registerConfigChangedListener(this); this.oranDomChangeNotificationListener = new ORanDOMChangeNotificationListener(netconfDomAccessor, vesCollectorService, databaseService); this.oranDomFaultNotificationListener = - new ORanDOMFaultNotificationListener(netconfDomAccessor, vesCollectorService, + new ORanDOMFaultNotificationListener(netconfDomAccessor, this.oranfm, vesCollectorService, serviceProvider.getFaultService(), serviceProvider.getWebsocketService(), databaseService); + this.oranDomSupervisionNotificationListener = new ORanDOMSupervisionNotificationListener(netconfDomAccessor, + vesCollectorService, databaseService, oranSupervisionConfig); + this.mapper = new ORanRegistrationToVESpnfRegistrationMapper(netconfDomAccessor, vesCollectorService); } @@ -106,13 +132,28 @@ public class ORanDOMNetworkElement implements NetworkElement { ORanDeviceManagerQNames.IETF_NETCONF_NOTIFICATIONS_NETCONF_SESSION_END, ORanDeviceManagerQNames.IETF_NETCONF_NOTIFICATIONS_NETCONF_CAPABILITY_CHANGE}; netconfDomAccessor.doRegisterNotificationListener(oranDomChangeNotificationListener, notifications); - QName[] faultNotification = {ORanDeviceManagerQNames.ORAN_FM_ALARM_NOTIF}; + + QName[] faultNotification = {oranfm.get().getAlarmNotifQName()}; netconfDomAccessor.doRegisterNotificationListener(oranDomFaultNotificationListener, faultNotification); + + Capabilities x = netconfDomAccessor.getCapabilites(); + if (x.isSupportingNamespaceAndRevision(ORanDeviceManagerQNames.ORAN_SUPERVISION_MODULE)) { + LOG.debug("Device {} supports oran-supervision", netconfDomAccessor.getNodeId().getValue()); + oranDomSupervisionNotificationListener.setComponentList(componentList); + QName[] supervisionNotification = {ORanDeviceManagerQNames.ORAN_SUPERVISION_NOTIFICATION}; + netconfDomAccessor.doRegisterNotificationListener(oranDomSupervisionNotificationListener, + supervisionNotification); + } // Output notification streams to LOG @SuppressWarnings("unused") Map<StreamKey, Stream> streams = netconfDomAccessor.getNotificationStreamsAsMap(); // Register to default stream netconfDomAccessor.invokeCreateSubscription(); + if (x.isSupportingNamespaceAndRevision(ORanDeviceManagerQNames.ORAN_SUPERVISION_MODULE)) { + ORanSupervisionRPCImpl.invokeWatchdogReset(netconfDomAccessor, oranSupervisionConfig); + oranDomSupervisionNotificationListener.registerForNotificationReceivedEvent( + new ORanNotificationObserverImpl(netconfDomAccessor, oranSupervisionConfig)); + } } public Collection<MapEntryNode> initialReadFromNetworkElement() { @@ -133,9 +174,16 @@ public class ORanDOMNetworkElement implements NetworkElement { componentMapEntries = Collections.emptyList(); } - Optional<Guicutthrough> oGuicutthrough = ORanDOMToInternalDataModel.getGuicutthrough(getOnapSystemData()); - if (oGuicutthrough.isPresent()) { - databaseService.writeGuiCutThroughData(oGuicutthrough.get(), netconfDomAccessor.getNodeId().getValue()); + if (oranfm.isPresent()) { + getActiveAlarms(); + } + if (onapSystem.isPresent()) { + AugmentationNode gcData = (AugmentationNode) onapSystem.get().getOnapSystemData(); + Optional<Guicutthrough> oGuicutthrough = + ORanDOMToInternalDataModel.getGuicutthrough(gcData, onapSystem.get()); + if (oGuicutthrough.isPresent()) { + databaseService.writeGuiCutThroughData(oGuicutthrough.get(), netconfDomAccessor.getNodeId().getValue()); + } } return componentMapEntries; } @@ -192,36 +240,6 @@ public class ORanDOMNetworkElement implements NetworkElement { return null; } - // Read from device - /** - * Read system data with GUI cut through information from device if ONAP_SYSTEM YANG is supported. - * - * @return NormalizedNode data with GUI cut through information or null if not available. - */ - private @Nullable NormalizedNode getOnapSystemData() { - LOG.debug("Get System1 for mountpoint {}", netconfDomAccessor.getNodeId().getValue()); - @NonNull - InstanceIdentifierBuilder ietfSystemIID = - YangInstanceIdentifier.builder().node(ORanDeviceManagerQNames.IETF_SYSTEM_CONTAINER); - @NonNull - AugmentationIdentifier onapSystemIID = YangInstanceIdentifier.AugmentationIdentifier - .create(Sets.newHashSet(ORanDeviceManagerQNames.ONAP_SYSTEM_NAME, - ORanDeviceManagerQNames.ONAP_SYSTEM_WEB_UI, ORanDeviceManagerQNames.ONAP_SYSTEM_GEOLOCATION)); - InstanceIdentifierBuilder augmentedOnapSystem = - YangInstanceIdentifier.builder(ietfSystemIID.build()).node(onapSystemIID); - Capabilities x = netconfDomAccessor.getCapabilites(); - LOG.debug("Capabilites: {}", x); - if (x.isSupportingNamespace(ORanDeviceManagerQNames.ONAP_SYSTEM_QNAME)) { - Optional<NormalizedNode> res = - netconfDomAccessor.readDataNode(LogicalDatastoreType.OPERATIONAL, augmentedOnapSystem.build()); - LOG.debug("Result of System1 = {}", res); - return res.isPresent() ? res.get() : null; - } else { - LOG.debug("No GUI cut through support"); - return null; - } - } - // VES related private void publishMountpointToVES(Collection<MapEntryNode> componentList) { /* @@ -280,4 +298,27 @@ public class ORanDOMNetworkElement implements NetworkElement { return false; } + private void getActiveAlarms() { + InstanceIdentifierBuilder activeAlarmListBuilder = + YangInstanceIdentifier.builder().node(oranfm.get().getFaultActiveAlarmListQName()); + Optional<NormalizedNode> oData = + netconfDomAccessor.readDataNode(LogicalDatastoreType.OPERATIONAL, activeAlarmListBuilder.build()); + if (oData.isPresent()) { + ContainerNode cn = (ContainerNode) oData.get(); + UnkeyedListNode activeAlarmsList = + (UnkeyedListNode) cn.childByArg(new NodeIdentifier(oranfm.get().getFaultActiveAlarmsQName())); + int counter = 0; + for (UnkeyedListEntryNode activeAlarmEntry : activeAlarmsList.body()) + faultService.faultNotification(ORanDOMToInternalDataModel.getFaultLog(activeAlarmEntry, oranfm.get(), + netconfDomAccessor.getNodeId(), Integer.valueOf(counter++))); + } + + } + + @Override + public void onConfigChanged() { + LOG.info("O-RU Supervision Watchdog timers changed, resetting in O-RU via RPC"); + ORanSupervisionRPCImpl.invokeWatchdogReset(netconfDomAccessor, oranSupervisionConfig); + } + } diff --git a/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 b/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 index 05561d2ca..1f0fa06fb 100644 --- a/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 +++ b/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 @@ -21,8 +21,11 @@ package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; import java.util.Optional; +import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation; 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.service.DeviceManagerServiceProvider; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.Capabilities; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfAccessor; @@ -37,6 +40,13 @@ public class ORanNetworkElementFactory implements NetworkElementFactory { //Workaround private static final QName OneCell = QName.create("urn:onf:otcc:wireless:yang:radio-access:commscope-onecell", "2020-06-22", "onecell").intern(); + private ORanDMConfig oranSupervisionConfig; + private ConfigurationFileRepresentation configFileRepresentation; + + public ORanNetworkElementFactory(ConfigurationFileRepresentation configFileRepresentation, ORanDMConfig oranSupervisionConfig) { + this.configFileRepresentation = configFileRepresentation; + this.oranSupervisionConfig = oranSupervisionConfig; + } @Override public Optional<NetworkElement> create(NetconfAccessor accessor, DeviceManagerServiceProvider serviceProvider) { @@ -44,11 +54,9 @@ public class ORanNetworkElementFactory implements NetworkElementFactory { if (!capabilites.isSupportingNamespace(OneCell)) { if (capabilites.isSupportingNamespace(ORanDeviceManagerQNames.ORAN_HW_COMPONENT)) { log.info("Create device {} ", ORanDOMNetworkElement.class.getName()); - //Optional<NetconfBindingAccessor> bindingAccessor = accessor.getNetconfBindingAccessor(); Optional<NetconfDomAccessor> domAccessor = accessor.getNetconfDomAccessor(); if (domAccessor.isPresent()) { - //return Optional.of(new ORanNetworkElement(bindingAccessor.get(), serviceProvider)); - return Optional.of(new ORanDOMNetworkElement(domAccessor.get(), serviceProvider)); + return Optional.of(new ORanDOMNetworkElement(domAccessor.get(), serviceProvider, oranSupervisionConfig, configFileRepresentation)); } } } diff --git a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/ORanDOMChangeNotificationListener.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanDOMChangeNotificationListener.java index f8e8b6da2..b4f0fe010 100644 --- a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/ORanDOMChangeNotificationListener.java +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanDOMChangeNotificationListener.java @@ -19,13 +19,14 @@ * ============LICENSE_END========================================================= * */ -package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; +package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.notification; import com.fasterxml.jackson.core.JsonProcessingException; import java.time.Instant; import org.eclipse.jdt.annotation.NonNull; import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider; import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.NetconfTimeStampImpl; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDeviceManagerQNames; import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.VESCollectorService; import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESCommonEventHeaderPOJO; import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESNotificationFieldsPOJO; @@ -51,7 +52,7 @@ public class ORanDOMChangeNotificationListener implements DOMNotificationListene private final NetconfDomAccessor netconfDomAccessor; private final DataProvider databaseService; private @NonNull VESCollectorService vesCollectorService; - private final DOMNotificationToXPath domNotificationXPath; + private final ORanDOMNotificationToXPath domNotificationXPath; private ORanDOMNotifToVESEventAssembly mapper = null; private static int sequenceNo = 0; @@ -60,7 +61,7 @@ public class ORanDOMChangeNotificationListener implements DOMNotificationListene this.netconfDomAccessor = netconfDomAccessor; this.databaseService = databaseService; this.vesCollectorService = vesCollectorService; - domNotificationXPath = new DOMNotificationToXPath(); + domNotificationXPath = new ORanDOMNotificationToXPath(); } @Override diff --git a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/ORanDOMFaultNotificationListener.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanDOMFaultNotificationListener.java index 3e6921272..3e99bcd6d 100644 --- a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/ORanDOMFaultNotificationListener.java +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanDOMFaultNotificationListener.java @@ -19,17 +19,23 @@ * ============LICENSE_END========================================================= * */ -package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; +package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.notification; import com.fasterxml.jackson.core.JsonProcessingException; import java.time.Instant; import java.time.format.DateTimeParseException; import java.util.Collection; import java.util.Objects; +import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; import org.json.JSONException; import org.json.JSONObject; import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.dataprovider.ORanDOMToInternalDataModel; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDMDOMUtility; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDeviceManagerQNames; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.vesmapper.ORanDOMFaultToVESFaultMapper; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.yangspecs.ORANFM; import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.FaultService; import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.VESCollectorService; import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESCommonEventHeaderPOJO; @@ -55,10 +61,11 @@ public class ORanDOMFaultNotificationListener implements DOMNotificationListener private final @NonNull FaultService faultService; private final @NonNull WebsocketManagerService websocketManagerService; private final @NonNull DataProvider databaseService; + private final @NonNull ORANFM oranfm; private Integer counter; //Local counter is assigned to Notifications - public ORanDOMFaultNotificationListener(@NonNull NetconfDomAccessor netconfDomAccessor, + public ORanDOMFaultNotificationListener(@NonNull NetconfDomAccessor netconfDomAccessor, Optional<ORANFM> oranfm, @NonNull VESCollectorService vesCollectorService, @NonNull FaultService faultService, @NonNull WebsocketManagerService websocketManagerService, @NonNull DataProvider databaseService) { this.netconfDomAccessor = Objects.requireNonNull(netconfDomAccessor); @@ -66,7 +73,7 @@ public class ORanDOMFaultNotificationListener implements DOMNotificationListener this.faultService = Objects.requireNonNull(faultService); this.websocketManagerService = Objects.requireNonNull(websocketManagerService); this.databaseService = Objects.requireNonNull(databaseService); - + this.oranfm = oranfm.get(); this.mapper = new ORanDOMFaultToVESFaultMapper(netconfDomAccessor.getNodeId(), vesCollectorService, "AlarmNotif"); this.counter = 0; @@ -105,18 +112,18 @@ public class ORanDOMFaultNotificationListener implements DOMNotificationListener // Send devicemanager specific notification for database and ODLUX Instant eventTimeInstant = ORanDMDOMUtility.getNotificationInstant(notification); faultService.faultNotification( - ORanDOMToInternalDataModel.getFaultLog(notification, netconfDomAccessor.getNodeId(), counter)); + ORanDOMToInternalDataModel.getFaultLog(notification, oranfm, netconfDomAccessor.getNodeId(), counter)); // Send model specific notification to WebSocketManager - websocketManagerService.sendNotification(notification, netconfDomAccessor.getNodeId(), ORanDeviceManagerQNames.ORAN_FM_ALARM_NOTIF); + websocketManagerService.sendNotification(notification, netconfDomAccessor.getNodeId(), oranfm.getAlarmNotifQName()); try { if (vesCollectorService.getConfig().isVESCollectorEnabled()) { VESCommonEventHeaderPOJO header = mapper.mapCommonEventHeader(notification, eventTimeInstant, counter); - VESFaultFieldsPOJO body = mapper.mapFaultFields(notification); + VESFaultFieldsPOJO body = mapper.mapFaultFields(notification, oranfm); VESMessage vesMsg = vesCollectorService.generateVESEvent(header, body); vesCollectorService.publishVESMessage(vesMsg); LOG.debug("VES Message is {}", vesMsg.getMessage()); - writeToEventLog(vesMsg.getMessage(), eventTimeInstant, ORanDeviceManagerQNames.ORAN_FM_ALARM_NOTIF.getLocalName(), counter); + writeToEventLog(vesMsg.getMessage(), eventTimeInstant, oranfm.getAlarmNotifQName().getLocalName(), counter); } } catch (JsonProcessingException | DateTimeParseException e) { LOG.debug("Can not convert event into VES message {}", notification, e); diff --git a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/ORanDOMNotifToVESEventAssembly.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanDOMNotifToVESEventAssembly.java index 7a2cd43cf..6c572f35c 100644 --- a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/ORanDOMNotifToVESEventAssembly.java +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanDOMNotifToVESEventAssembly.java @@ -19,7 +19,7 @@ * ============LICENSE_END========================================================= * */ -package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; +package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.notification; import java.time.Instant; import java.util.ArrayList; diff --git a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/DOMNotificationToXPath.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanDOMNotificationToXPath.java index 3d7353328..697265f01 100644 --- a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/DOMNotificationToXPath.java +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanDOMNotificationToXPath.java @@ -19,7 +19,7 @@ * ============LICENSE_END========================================================= * */ -package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; +package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.notification; import com.google.common.base.VerifyException; import java.time.Instant; @@ -44,8 +44,8 @@ import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class DOMNotificationToXPath { - private static final Logger LOG = LoggerFactory.getLogger(DOMNotificationToXPath.class); +public class ORanDOMNotificationToXPath { + private static final Logger LOG = LoggerFactory.getLogger(ORanDOMNotificationToXPath.class); public HashMap<String, String> convertDomNotifToXPath(@NonNull DOMNotification domNotification) { @NonNull diff --git a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanDOMSupervisionNotificationListener.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanDOMSupervisionNotificationListener.java new file mode 100644 index 000000000..a0a075d0b --- /dev/null +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanDOMSupervisionNotificationListener.java @@ -0,0 +1,105 @@ +package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.notification; + +import com.fasterxml.jackson.core.JsonProcessingException; +import java.time.Instant; +import java.time.format.DateTimeParseException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import org.eclipse.jdt.annotation.NonNull; +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.dataprovider.ORanDOMToInternalDataModel; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDMDOMUtility; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDeviceManagerQNames; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.vesmapper.ORanDOMSupervisionNotifToVESMapper; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.VESCollectorService; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESCommonEventHeaderPOJO; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESMessage; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESStndDefinedFieldsPOJO; +import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfDomAccessor; +import org.opendaylight.mdsal.dom.api.DOMNotification; +import org.opendaylight.mdsal.dom.api.DOMNotificationListener; +import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ORanDOMSupervisionNotificationListener implements DOMNotificationListener, ORanNotificationReceivedService { + private static final Logger LOG = LoggerFactory.getLogger(ORanDOMSupervisionNotificationListener.class); + + private @NonNull NetconfDomAccessor netconfDomAccessor; + private @NonNull DataProvider databaseService; + private @NonNull VESCollectorService vesCollectorService; + private List<ORanNotificationObserver> notificationObserverList; + private Integer counter; //Local counter is assigned to Notifications + + private @NonNull ORanDOMSupervisionNotifToVESMapper mapper; + + public ORanDOMSupervisionNotificationListener(@NonNull NetconfDomAccessor netconfDomAccessor, + @NonNull VESCollectorService vesCollectorService, @NonNull DataProvider databaseService, + ORanDMConfig oranSupervisionConfig) { + this.netconfDomAccessor = netconfDomAccessor; + this.databaseService = databaseService; + this.vesCollectorService = vesCollectorService; + this.mapper = new ORanDOMSupervisionNotifToVESMapper(netconfDomAccessor.getNodeId(), vesCollectorService, "o-ran-supervision"); + notificationObserverList = new ArrayList<>(); + this.counter = 0; + } + + public void setComponentList(Collection<MapEntryNode> componentList) { + for (MapEntryNode component : ORanDOMToInternalDataModel.getRootComponents(componentList)) { + mapper.setMfgName( + ORanDMDOMUtility.getLeafValue(component, ORanDeviceManagerQNames.IETF_HW_COMPONENT_LIST_MFG_NAME)); + mapper.setUuid(ORanDMDOMUtility.getLeafValue(component, + ORanDeviceManagerQNames.IETF_HW_COMPONENT_LIST_UUID) != null + ? ORanDMDOMUtility.getLeafValue(component, + ORanDeviceManagerQNames.IETF_HW_COMPONENT_LIST_UUID) + : netconfDomAccessor.getNodeId().getValue()); + mapper.setModelName(ORanDMDOMUtility.getLeafValue(component, + ORanDeviceManagerQNames.IETF_HW_COMPONENT_LIST_MODEL_NAME)); + } + } + + @Override + public void onNotification(@NonNull DOMNotification notification) { + LOG.trace("Notification Type = {}", notification.getType().toString()); + notifyObservers(); + Instant eventTimeInstant = ORanDMDOMUtility.getNotificationInstant(notification); + try { + if (vesCollectorService.getConfig().isVESCollectorEnabled()) { + VESCommonEventHeaderPOJO header = mapper.mapCommonEventHeader(notification, eventTimeInstant, counter); + VESStndDefinedFieldsPOJO body = mapper.mapStndDefinedFields(eventTimeInstant); + VESMessage vesMsg = vesCollectorService.generateVESEvent(header, body); + vesCollectorService.publishVESMessage(vesMsg); + LOG.debug("VES Message is {}", vesMsg.getMessage()); + } + } catch (JsonProcessingException | DateTimeParseException e) { + LOG.debug("Cannot convert event into VES message {}", notification, e); + } + } + + private void notifyObservers() { + Iterator<ORanNotificationObserver> it = notificationObserverList.iterator(); + while (it.hasNext()) { + ORanNotificationObserver o = it.next(); + new Thread() { + @Override + public void run() { + o.observer(); + } + }.start(); + } + } + + @Override + public void registerForNotificationReceivedEvent(ORanNotificationObserver o) { + notificationObserverList.add(o); + } + + @Override + public void deregisterNotificationReceivedEvent(ORanNotificationObserver o) { + notificationObserverList.remove(o); + } + +} diff --git a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanNotificationObserver.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanNotificationObserver.java new file mode 100644 index 000000000..ea56c983e --- /dev/null +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanNotificationObserver.java @@ -0,0 +1,31 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2023 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========================================================= + * + */ + +/* + * Interface to be implemented by those interested in knowing the occurrence of Notifications + */ +package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.notification; + +public interface ORanNotificationObserver { + + public void observer(); +} diff --git a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanNotificationObserverImpl.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanNotificationObserverImpl.java new file mode 100644 index 000000000..f7f840c90 --- /dev/null +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanNotificationObserverImpl.java @@ -0,0 +1,43 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2023 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.notification; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.config.ORanDMConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.rpc.ORanSupervisionRPCImpl; +import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfDomAccessor; + +public class ORanNotificationObserverImpl implements ORanNotificationObserver { + + private NetconfDomAccessor netconfDomAccessor; + private ORanDMConfig oruSupervisionConfig; + + public ORanNotificationObserverImpl(NetconfDomAccessor netconfDomAccessor, ORanDMConfig oruSupervisionConfig) { + this.netconfDomAccessor = netconfDomAccessor; + this.oruSupervisionConfig = oruSupervisionConfig; + } + + @Override + public void observer() { + ORanSupervisionRPCImpl.invokeWatchdogReset(netconfDomAccessor, oruSupervisionConfig); + } + +} diff --git a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanNotificationReceivedService.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanNotificationReceivedService.java new file mode 100644 index 000000000..9c52c2daf --- /dev/null +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanNotificationReceivedService.java @@ -0,0 +1,33 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2023 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.notification; + +/* + * Interface for registering and de-registering for listening of occurrence of notifications + */ +public interface ORanNotificationReceivedService { + + void registerForNotificationReceivedEvent(ORanNotificationObserver o); + + void deregisterNotificationReceivedEvent(ORanNotificationObserver o); + +} diff --git a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/rpc/ORanSupervisionRPCImpl.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/rpc/ORanSupervisionRPCImpl.java new file mode 100644 index 000000000..30d413828 --- /dev/null +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/rpc/ORanSupervisionRPCImpl.java @@ -0,0 +1,82 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2023 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.rpc; + +import com.google.common.util.concurrent.ListenableFuture; +import java.util.concurrent.TimeUnit; +import org.eclipse.jdt.annotation.NonNull; +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.netconfnodestateservice.NetconfDomAccessor; +import org.opendaylight.mdsal.dom.api.DOMRpcResult; +import org.opendaylight.mdsal.dom.api.DOMRpcService; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; +import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; +import org.opendaylight.yangtools.yang.data.impl.schema.Builders; +import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ORanSupervisionRPCImpl { + + private static final Logger LOG = LoggerFactory.getLogger(ORanSupervisionRPCImpl.class); + private static NodeIdentifier inputNodeIdentifier = + NodeIdentifier.create(QName.create(ORanDeviceManagerQNames.ORAN_SUPERVISION_MODULE, "input")); + private static NodeIdentifier supervisionNotificationIntervalIdentifier = NodeIdentifier + .create(QName.create(ORanDeviceManagerQNames.ORAN_SUPERVISION_MODULE, "supervision-notification-interval")); + private static NodeIdentifier guardTimerOverheadIdentifier = NodeIdentifier + .create(QName.create(ORanDeviceManagerQNames.ORAN_SUPERVISION_MODULE, "guard-timer-overhead")); + + public static void invokeWatchdogReset(@NonNull NetconfDomAccessor netconfDomAccessor, + ORanDMConfig oruSupervisionConfig) { + + LOG.debug( + "Resetting suppervision-notification-interval and guard-timer-overhead watchdog timers with values {} and {} respectively", + oruSupervisionConfig.getNotificationInterval(), oruSupervisionConfig.getWatchdogTimer()); + ContainerNode rpcInputNode = Builders.containerBuilder().withNodeIdentifier(inputNodeIdentifier) + .withChild(ImmutableNodes.leafNode(supervisionNotificationIntervalIdentifier, + oruSupervisionConfig.getNotificationInterval())) + .withChild( + ImmutableNodes.leafNode(guardTimerOverheadIdentifier, oruSupervisionConfig.getWatchdogTimer())) + .build(); + + try { + DOMRpcService rpcService = netconfDomAccessor.getRpcService(); + QName supervisionWatchdogResetQN = + QName.create(ORanDeviceManagerQNames.ORAN_SUPERVISION_MODULE, "supervision-watchdog-reset"); + + ListenableFuture<? extends DOMRpcResult> result = + rpcService.invokeRpc(supervisionWatchdogResetQN, rpcInputNode); + DOMRpcResult rpcResult = result.get(60000, TimeUnit.MILLISECONDS); + if (rpcResult.value() != null) { + ContainerNode rpcResultCn = (ContainerNode) rpcResult.value(); + LOG.debug("Result of Supervision-Watchdog-Reset = {}", rpcResultCn.prettyTree()); + } + } catch (Exception e) { + LOG.error("{}", e); + } + return; + + } + +} diff --git a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/ORanDMDOMUtility.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/util/ORanDMDOMUtility.java index a3bd14e3e..708ba8a47 100644 --- a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/ORanDMDOMUtility.java +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/util/ORanDMDOMUtility.java @@ -19,16 +19,14 @@ * ============LICENSE_END========================================================= * */ -package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; +package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util; +import com.google.common.base.VerifyException; import java.time.Instant; -import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; -import java.util.List; import java.util.Set; - import org.opendaylight.mdsal.dom.api.DOMEvent; import org.opendaylight.mdsal.dom.api.DOMNotification; import org.opendaylight.yangtools.yang.common.QName; @@ -42,8 +40,6 @@ import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.VerifyException; - public class ORanDMDOMUtility { public static final Logger LOG = LoggerFactory.getLogger(ORanDMDOMUtility.class); diff --git a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/ORanDeviceManagerQNames.java b/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 index 9949a6ffc..e2ad092dc 100644 --- a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/ORanDeviceManagerQNames.java +++ b/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 @@ -19,7 +19,7 @@ * ============LICENSE_END========================================================= * */ -package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; +package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.common.QName; @@ -33,17 +33,6 @@ public class ORanDeviceManagerQNames { QName.create(IETF_SYSTEM_NS, IETF_SYSTEM_REVISION, "ietf-system"); public static final @NonNull QName IETF_SYSTEM_CONTAINER = QName.create(IETF_SYSTEM_QNAME, "system"); - // onap-system.yang - public static final String ONAP_SYSTEM_NS = "urn:onap:system"; - public static final String ONAP_SYSTEM_REVISION = "2022-11-04"; - public static final @NonNull QName ONAP_SYSTEM_QNAME = - QName.create(ONAP_SYSTEM_NS, ONAP_SYSTEM_REVISION, "onap-system"); -// public static final @NonNull QName ONAP_SYSTEM_QNAME = -// QName.create(ONAP_SYSTEM_NS, "onap-system"); - public static final @NonNull QName ONAP_SYSTEM_NAME = QName.create(ONAP_SYSTEM_QNAME, "name"); - public static final @NonNull QName ONAP_SYSTEM_WEB_UI = QName.create(ONAP_SYSTEM_QNAME, "web-ui"); - public static final @NonNull QName ONAP_SYSTEM_GEOLOCATION = QName.create(ONAP_SYSTEM_QNAME, "geographical-location"); - //ietf-hardware.yang public static final String IETF_HW_NS = "urn:ietf:params:xml:ns:yang:ietf-hardware"; public static final String IETF_HW_REVISION = "2018-03-13"; @@ -85,18 +74,6 @@ public class ORanDeviceManagerQNames { 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"); - //o-ran-fm.yang - public static final String ORAN_FM_NS = "urn:o-ran:fm:1.0"; - //public static final String ORAN_FM_REVISION = "2019-02-04"; - public static final String ORAN_FM_REVISION = "2022-08-15"; - public static final @NonNull QName ORAN_FM_MODULE = QName.create(ORAN_FM_NS, ORAN_FM_REVISION, "o-ran-fm"); - public static final @NonNull QName ORAN_FM_ALARM_NOTIF = QName.create(ORAN_FM_MODULE, "alarm-notif"); - public static final @NonNull QName ORAN_FM_FAULT_ID = QName.create(ORAN_FM_MODULE, "fault-id"); - public static final @NonNull QName ORAN_FM_FAULT_SOURCE = QName.create(ORAN_FM_MODULE, "fault-source"); - public static final @NonNull QName ORAN_FM_FAULT_SEVERITY = QName.create(ORAN_FM_MODULE, "fault-severity"); - public static final @NonNull QName ORAN_FM_FAULT_TEXT = QName.create(ORAN_FM_MODULE, "fault-text"); - public static final @NonNull QName ORAN_FM_FAULT_IS_CLEARED = QName.create(ORAN_FM_MODULE, "is-cleared"); - //ietf-netconf-notifications.yang public static final String IETF_NETCONF_NOTIFICATIONS_NS = "urn:ietf:params:xml:ns:yang:ietf-netconf-notifications"; public static final String IETF_NETCONF_NOTIFICATIONS_REVISION = "2012-02-06"; @@ -115,4 +92,10 @@ public class ORanDeviceManagerQNames { public static final @NonNull QName IETF_NETCONF_NOTIFICATIONS_TARGET = QName.create(IETF_NETCONF_NOTIFICATIONS_MODULE, "target"); public static final @NonNull QName IETF_NETCONF_NOTIFICATIONS_DATASTORE = QName.create(IETF_NETCONF_NOTIFICATIONS_MODULE, "datastore"); + //o-ran-supervision.yang + public static final String ORAN_SUPERVISION_NS = "urn:o-ran:supervision:1.0"; + public static final String ORAN_SUPERVISION_REVISION = "2022-12-05"; + public static final @NonNull QName ORAN_SUPERVISION_MODULE = QName.create(ORAN_SUPERVISION_NS, ORAN_SUPERVISION_REVISION, "o-ran-supervision"); + public static final @NonNull QName ORAN_SUPERVISION_NOTIFICATION = QName.create(ORAN_SUPERVISION_MODULE, "supervision-notification"); + } diff --git a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/ORanDOMFaultToVESFaultMapper.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/vesmapper/ORanDOMFaultToVESFaultMapper.java index 77bd82d12..fabe26463 100644 --- a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/ORanDOMFaultToVESFaultMapper.java +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/vesmapper/ORanDOMFaultToVESFaultMapper.java @@ -19,9 +19,11 @@ * ============LICENSE_END========================================================= * */ -package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; +package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.vesmapper; import java.time.Instant; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDMDOMUtility; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.yangspecs.ORANFM; import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.VESCollectorService; import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESCommonEventHeaderPOJO; import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESFaultFieldsPOJO; @@ -129,23 +131,20 @@ public class ORanDOMFaultToVESFaultMapper { return vesCEH; } - public VESFaultFieldsPOJO mapFaultFields(DOMNotification alarmNotif) { + public VESFaultFieldsPOJO mapFaultFields(DOMNotification alarmNotif, ORANFM oranfm) { VESFaultFieldsPOJO vesFaultFields = new VESFaultFieldsPOJO(); ContainerNode cn = alarmNotif.getBody(); - vesFaultFields.setAlarmCondition(ORanDMDOMUtility.getLeafValue(cn, ORanDeviceManagerQNames.ORAN_FM_FAULT_ID)); - vesFaultFields - .setAlarmInterfaceA(ORanDMDOMUtility.getLeafValue(cn, ORanDeviceManagerQNames.ORAN_FM_FAULT_SOURCE)); + vesFaultFields.setAlarmCondition(ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultIdQName())); + vesFaultFields.setAlarmInterfaceA(ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultSourceQName())); vesFaultFields.setEventCategory(VES_EVENT_CATEGORY); - if (ORanDMDOMUtility.getLeafValue(cn, ORanDeviceManagerQNames.ORAN_FM_FAULT_IS_CLEARED).equals("true")) { + if (ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultIsClearedQName()).equals("true")) { vesFaultFields.setEventSeverity("NORMAL"); } else { - vesFaultFields.setEventSeverity( - ORanDMDOMUtility.getLeafValue(cn, ORanDeviceManagerQNames.ORAN_FM_FAULT_SEVERITY)); + vesFaultFields.setEventSeverity(ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultSeverityQName())); } vesFaultFields.setEventSourceType(modelName); vesFaultFields.setFaultFieldsVersion(VES_FAULT_FIELDS_VERSION); - vesFaultFields - .setSpecificProblem(ORanDMDOMUtility.getLeafValue(cn, ORanDeviceManagerQNames.ORAN_FM_FAULT_TEXT)); + vesFaultFields.setSpecificProblem(ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultTextQName())); vesFaultFields.setVfStatus(VES_FAULT_FIELDS_VFSTATUS); return vesFaultFields; diff --git a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/vesmapper/ORanDOMSupervisionNotifToVESMapper.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/vesmapper/ORanDOMSupervisionNotifToVESMapper.java new file mode 100644 index 000000000..b87b93d80 --- /dev/null +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/vesmapper/ORanDOMSupervisionNotifToVESMapper.java @@ -0,0 +1,206 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2023 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.vesmapper; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.time.Instant; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.dataprovider.ORanDOMToInternalDataModel; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.VESCollectorService; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESCommonEventHeaderPOJO; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESStndDefinedFieldsPOJO; +import org.opendaylight.mdsal.dom.api.DOMNotification; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; + +/* + * { + "event": { + "stndDefinedFields": { + "schemaReference": "https://gerrit.o-ran-sc.org/r/gitweb?p=scp/oam/modeling.git;a=blob_plain;f=data-model/yang/published/o-ran/ru-fh/o-ran-supervision.yang#components/schemas/ofhm-event-stream", + "stndDefinedFieldsVersion": "1.0", + "data": { + "ietf:notification": { + "eventTime": "2023-06-28T07:28:55.098Z", + "o-ran-supervision:supervision-notification": { + "session-id": 999999 + } + } + } + }, + "commonEventHeader": { + "domain": "stndDefined", + "eventType": "o-ran-supervision:supervision-notification", + "eventId": "pnf2_o-ran-supervision:supervision-notification_fed2ab31f6e1da56", + "eventName": "stndDefined_o-ran-supervision:supervision-notification", + "sequence": 1687937335098, + "priority": "Low", + "reportingEntityId": "c2b7d6e9-ee35-459a-ab8e-717a6fc1fde6", + "reportingEntityName": "flows", + "sourceId": "378e9904-6d39-40ea-9994-0596fe2235a3", + "sourceName": "O-RAN-SC-OAM-Test-Component-01", + "startEpochMicrosec": 1687937335098000, + "lastEpochMicrosec": 1687937335098000, + "nfNamingCode": "pnf2", + "nfVendorName": "O-RAN-SC-OAM-Project", + "timeZoneOffset": "+00:00", + "stndDefinedNamespace": "o-ran-supervision:supervision-notification", + "version": "4.1", + "vesEventListenerVersion": "7.2.1" + } + } +} + */ +public class ORanDOMSupervisionNotifToVESMapper { + + private static final String VES_EVENT_DOMAIN = "stndDefined"; + private static final String VES_EVENTTYPE = "o-ran-supervision:supervision-notification"; + private static final String VES_EVENT_PRIORITY = "Low"; + private static final String O_RU_SUPERVISION_SCHEMA_REFERENCE = + "https://gerrit.o-ran-sc.org/r/gitweb?p=scp/oam/modeling.git;a=blob_plain;f=data-model/yang/published/o-ran/ru-fh/o-ran-supervision.yang#components/schemas/ofhm-event-stream"; + private final VESCollectorService vesProvider; + private final String notifName; + private final String nodeIdString; + //Initialized during registration + private String mfgName; + private String uuid; + private String modelName; + + public ORanDOMSupervisionNotifToVESMapper(NodeId nodeId, VESCollectorService vesCollectorService, + String notifName) { + this.nodeIdString = nodeId.getValue(); + this.vesProvider = vesCollectorService; + this.notifName = notifName; + } + + public void setMfgName(String mfgName) { + this.mfgName = mfgName; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public void setModelName(String modelName) { + this.modelName = modelName; + } + + public VESCommonEventHeaderPOJO mapCommonEventHeader(DOMNotification notification, Instant eventTime, + int sequenceNo) { + VESCommonEventHeaderPOJO vesCEH = new VESCommonEventHeaderPOJO(); + vesCEH.setDomain(VES_EVENT_DOMAIN); + vesCEH.setEventName(VES_EVENT_DOMAIN + "_" + VES_EVENTTYPE); + vesCEH.setEventType(VES_EVENTTYPE); + vesCEH.setPriority(VES_EVENT_PRIORITY); + + String eventId = notifName + "-" + Long.toUnsignedString(sequenceNo); + + vesCEH.setEventId(eventId); + vesCEH.setStartEpochMicrosec(eventTime.toEpochMilli() * 1000); + vesCEH.setLastEpochMicrosec(eventTime.toEpochMilli() * 1000); + vesCEH.setNfVendorName(mfgName); + vesCEH.setReportingEntityName(vesProvider.getConfig().getReportingEntityName()); + vesCEH.setSequence(sequenceNo); + vesCEH.setSourceId(uuid); + vesCEH.setSourceName(nodeIdString); + + return vesCEH; + } + + public VESStndDefinedFieldsPOJO mapStndDefinedFields(Instant eventTimeInstant) { + VESStndDefinedFieldsPOJO vesStndDefFields = new VESStndDefinedFieldsPOJO(); + vesStndDefFields.setSchemaReference(O_RU_SUPERVISION_SCHEMA_REFERENCE); + vesStndDefFields.setData(getSupervisionData(eventTimeInstant)); + + return vesStndDefFields; + } + + private DataObject getSupervisionData(Instant eventTimeInstant) { + ORanSupervisionNotification oruSuperNotif = new ORanSupervisionNotification(); + oruSuperNotif.setSessionId(999999); // Hardcoded due to limitation in NTS Simulator. Ideally should be NETCONF Session ID + + IetfNotification ietfNotif = new IetfNotification(); + ietfNotif.setOranSupervisionNotif(oruSuperNotif); + ietfNotif.setEventTime(ORanDOMToInternalDataModel.getDateAndTimeOfInstant(eventTimeInstant).getValue()); + + DataObject data = new DataObject(); + data.setIetfNotification(ietfNotif); + return data; + } + +} + +/* Classes for serialization of stndDefinedFields "data" object */ +class DataObject { + @JsonProperty("ietf:notification") + IetfNotification ietfNotification; + + public DataObject() {} + + public IetfNotification getIetfNotification() { + return ietfNotification; + } + + public void setIetfNotification(IetfNotification ietfNotification) { + this.ietfNotification = ietfNotification; + } +} + + +class IetfNotification { + String eventTime; + @JsonProperty("o-ran-supervision:supervision-notification") + ORanSupervisionNotification oranSupervisionNotif; + + public IetfNotification() {} + + public String getEventTime() { + return eventTime; + } + + public void setEventTime(String eventTime) { + this.eventTime = eventTime; + } + + public ORanSupervisionNotification getOranSupervisionNotif() { + return oranSupervisionNotif; + } + + public void setOranSupervisionNotif(ORanSupervisionNotification oranSupervisionNotif) { + this.oranSupervisionNotif = oranSupervisionNotif; + } + +} + + +class ORanSupervisionNotification { + @JsonProperty("session-id") + int sessionId; + + public ORanSupervisionNotification() {} + + public int getSessionId() { + return sessionId; + } + + public void setSessionId(int sessionId) { + this.sessionId = sessionId; + } +} diff --git a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/ORanRegistrationToVESpnfRegistrationMapper.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/vesmapper/ORanRegistrationToVESpnfRegistrationMapper.java index 5cad5881c..9cbb45d55 100644 --- a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/ORanRegistrationToVESpnfRegistrationMapper.java +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/vesmapper/ORanRegistrationToVESpnfRegistrationMapper.java @@ -19,10 +19,12 @@ * ============LICENSE_END========================================================= * */ -package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; +package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.vesmapper; import java.time.Instant; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDMDOMUtility; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDeviceManagerQNames; import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.VESCollectorService; import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESCommonEventHeaderPOJO; import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESPNFRegistrationFieldsPOJO; diff --git a/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 b/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 new file mode 100644 index 000000000..5be18e75b --- /dev/null +++ b/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 @@ -0,0 +1,113 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2023 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 ORANFM extends YangModule { + + public static final String NAMESPACE = "urn:o-ran:fm:1.0"; + public static final QNameModule ORANFM_2019_02_04 = + QNameModule.create(XMLNamespace.of(NAMESPACE), Revision.of("2019-02-04")); + public static final QNameModule ORANFM_2022_08_15 = + QNameModule.create(XMLNamespace.of(NAMESPACE), Revision.of("2022-08-15")); + private static final List<QNameModule> MODULES = Arrays.asList(ORANFM_2019_02_04, ORANFM_2022_08_15); +// private final QName ORAN_FM_ALARM_NOTIF; +// private final QName ORAN_FM_FAULT_ID; +// private final QName ORAN_FM_FAULT_SOURCE; +// private final QName ORAN_FM_FAULT_SEVERITY; +// private final QName ORAN_FM_FAULT_TEXT; +// private final QName ORAN_FM_FAULT_IS_CLEARED; + + + + ORANFM(NetconfDomAccessor netconfDomAccessor, QNameModule module) { + super(netconfDomAccessor, module); +// ORAN_FM_ALARM_NOTIF = QName.create(module, "alarm-notif"); +// ORAN_FM_FAULT_ID = QName.create(module, "fault-id"); +// ORAN_FM_FAULT_SOURCE = QName.create(module, "fault-source"); +// ORAN_FM_FAULT_SEVERITY = QName.create(module, "fault-severity"); +// ORAN_FM_FAULT_TEXT = QName.create(module, "fault-text"); +// ORAN_FM_FAULT_IS_CLEARED = QName.create(module, "is-cleared"); + } + + public QName getFaultSourceQName() { + return getQName("fault-source"); + } + + public QName getFaultIdQName() { + return getQName("fault-id"); + } + + public QName getFaultSeverityQName() { + return getQName("fault-severity"); + } + + public QName getFaultTextQName() { + return getQName("fault-text"); + } + + public QName getAlarmNotifQName() { + return getQName("alarm-notif"); + } + + public QName getFaultIsClearedQName() { + return getQName("is-cleared"); + } + + public QName getFaultEventTimeQName() { + return getQName("event-time"); + } + + public QName getFaultActiveAlarmListQName() { + return getQName("active-alarm-list"); + } + + public QName getFaultActiveAlarmsQName() { + return getQName("active-alarms"); + } + + /** + * Get specific instance, depending on capabilities + * + * @param capabilities + * @return + */ + public static Optional<ORANFM> getModule(NetconfDomAccessor netconfDomAccessor) { + Capabilities capabilities = netconfDomAccessor.getCapabilites(); + for (QNameModule module : MODULES) { + if (capabilities.isSupportingNamespaceAndRevision(module)) { + return Optional.of(new ORANFM(netconfDomAccessor, module)); + } + } + return Optional.empty(); + } + +} diff --git a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/yangspecs/OnapSystem.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/yangspecs/OnapSystem.java new file mode 100644 index 000000000..03ed89111 --- /dev/null +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/yangspecs/OnapSystem.java @@ -0,0 +1,127 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2023 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 com.google.common.collect.Sets; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDeviceManagerQNames; +import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.Capabilities; +import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfDomAccessor; +import org.opendaylight.mdsal.common.api.LogicalDatastoreType; +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; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.InstanceIdentifierBuilder; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + + +public class OnapSystem extends YangModule { + + private static final Logger LOG = LoggerFactory.getLogger(OnapSystem.class); + public static final String NAMESPACE = "urn:onap:system"; + public static final QNameModule ONAPSYSTEM_2020_10_26 = + QNameModule.create(XMLNamespace.of(NAMESPACE), Revision.of("2020-10-26")); + public static final QNameModule ONAPSYSTEM_2022_11_04 = + QNameModule.create(XMLNamespace.of(NAMESPACE), Revision.of("2022-11-04")); + private static final List<QNameModule> MODULES = Arrays.asList(ONAPSYSTEM_2020_10_26, ONAPSYSTEM_2022_11_04); + + private final QName NAME; + private final QName WEB_UI; + private final QName GEOGRAPHICAL_LOCATION; + + OnapSystem(NetconfDomAccessor netconfDomAccessor, QNameModule module) { + super(netconfDomAccessor, module); + + NAME = QName.create(module, "name"); + WEB_UI = QName.create(module, "web-ui"); + GEOGRAPHICAL_LOCATION = QName.create(module, "geographical-location"); + } + + public QName getName() { + return NAME; + } + + public QName getWebUi() { + return WEB_UI; + } + + public QName getGeoLocation() { + return GEOGRAPHICAL_LOCATION; + } + + // Read from device + /** + * Read system data with GUI cut through information from device if ONAP_SYSTEM YANG is supported. + * + * @return NormalizedNode data with GUI cut through information or null if not available. + */ + public @Nullable NormalizedNode getOnapSystemData() { + LOG.debug("Get System1 for mountpoint {}", netconfDomAccessor.getNodeId().getValue()); + @NonNull + InstanceIdentifierBuilder ietfSystemIID = + YangInstanceIdentifier.builder().node(ORanDeviceManagerQNames.IETF_SYSTEM_CONTAINER); + @NonNull + AugmentationIdentifier onapSystemIID = null; + if (netconfDomAccessor.getCapabilites().isSupportingNamespaceAndRevision(ONAPSYSTEM_2020_10_26)) + onapSystemIID = YangInstanceIdentifier.AugmentationIdentifier.create(Sets.newHashSet(NAME, WEB_UI)); + else if (netconfDomAccessor.getCapabilites().isSupportingNamespaceAndRevision(ONAPSYSTEM_2022_11_04)) + onapSystemIID = YangInstanceIdentifier.AugmentationIdentifier + .create(Sets.newHashSet(NAME, WEB_UI, GEOGRAPHICAL_LOCATION)); + + InstanceIdentifierBuilder augmentedOnapSystem = + YangInstanceIdentifier.builder(ietfSystemIID.build()).node(onapSystemIID); + + Optional<NormalizedNode> res = + netconfDomAccessor.readDataNode(LogicalDatastoreType.OPERATIONAL, augmentedOnapSystem.build()); + LOG.debug("Result of System1 = {}", res); + return res.isPresent() ? res.get() : null; + + } + + /** + * Get specific instance, depending on capabilities + * + * @param capabilities + * @return + */ + public static Optional<OnapSystem> getModule(NetconfDomAccessor netconfDomAccessor) { + Capabilities capabilities = netconfDomAccessor.getCapabilites(); + for (QNameModule module : MODULES) { + if (capabilities.isSupportingNamespaceAndRevision(module)) { + return Optional.of(new OnapSystem(netconfDomAccessor, module)); + } + } + return Optional.empty(); + } + + +} diff --git a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/yangspecs/YangModule.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/yangspecs/YangModule.java new file mode 100644 index 000000000..31010ab1d --- /dev/null +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/yangspecs/YangModule.java @@ -0,0 +1,51 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2023 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 org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfDomAccessor; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.common.QNameModule; + +public class YangModule { + + protected final NetconfDomAccessor netconfDomAccessor; + protected final QNameModule module; + + YangModule(NetconfDomAccessor netconfDomAccessor, QNameModule module) { + super(); + this.netconfDomAccessor = netconfDomAccessor; + this.module = module; + } + + NetconfDomAccessor getNetconfDomAccessor() { + return netconfDomAccessor; + } + + public QNameModule getQNameModule() { + return module; + } + + public QName getQName(String localName) { + return QName.create(module, localName); + } + +} diff --git a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/TestORanDOMFaultNotificationListener.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/TestORanDOMFaultNotificationListener.java index 89ff6dc90..de19bf1a2 100644 --- a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/TestORanDOMFaultNotificationListener.java +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/TestORanDOMFaultNotificationListener.java @@ -22,6 +22,7 @@ package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import com.google.common.io.Files; @@ -29,6 +30,7 @@ import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.time.Instant; +import java.util.Optional; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -37,17 +39,22 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; 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.notification.ORanDOMFaultNotificationListener; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.yangspecs.ORANFM; 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; import org.onap.ccsdk.features.sdnr.wt.devicemanager.vescollectorconnector.impl.VESCollectorServiceImpl; +import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.Capabilities; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfDomAccessor; import org.onap.ccsdk.features.sdnr.wt.websocketmanager.model.WebsocketManagerService; import org.opendaylight.mdsal.dom.api.DOMEvent; import org.opendaylight.mdsal.dom.api.DOMNotification; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultlogEntity; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; -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; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.impl.schema.Builders; @@ -89,6 +96,8 @@ public class TestORanDOMFaultNotificationListener { @Mock DataProvider databaseService; VESCollectorService vesCollectorService; + static Optional<ORANFM> oranfm; + private Capabilities capabilities; @After @Before @@ -98,6 +107,11 @@ public class TestORanDOMFaultNotificationListener { LOG.info("Remove {}", f.getAbsolutePath()); f.delete(); } + capabilities = mock(Capabilities.class); + when(domAccessor.getCapabilites()).thenReturn(capabilities); + when(capabilities.isSupportingNamespaceAndRevision( + QNameModule.create(XMLNamespace.of(ORANFM.NAMESPACE), Revision.of("2022-08-15")))).thenReturn(true); + oranfm = ORANFM.getModule(domAccessor); } @Test @@ -105,7 +119,7 @@ public class TestORanDOMFaultNotificationListener { Files.asCharSink(new File(TESTFILENAME), StandardCharsets.UTF_8).write(TESTCONFIG_CONTENT); vesCollectorService = new VESCollectorServiceImpl(new ConfigurationFileRepresentation(TESTFILENAME)); when(domAccessor.getNodeId()).thenReturn(new NodeId("nSky")); - ORanDOMFaultNotificationListener faultListener = new ORanDOMFaultNotificationListener(domAccessor, + ORanDOMFaultNotificationListener faultListener = new ORanDOMFaultNotificationListener(domAccessor, oranfm, vesCollectorService, faultService, websocketManagerService, databaseService); NetconfDeviceNotification ndn = new NetconfDeviceNotification(createORANDOMFault(), Instant.now()); faultListener.onNotification(ndn); @@ -114,20 +128,14 @@ public class TestORanDOMFaultNotificationListener { } public static ContainerNode createORANDOMFault() { - final QName fault_id = QName.create(ORanDeviceManagerQNames.ORAN_FM_ALARM_NOTIF, "fault-id"); - final QName fault_source = QName.create(ORanDeviceManagerQNames.ORAN_FM_ALARM_NOTIF, "fault-source"); - final QName fault_severity = QName.create(ORanDeviceManagerQNames.ORAN_FM_ALARM_NOTIF, "fault-severity"); - final QName is_cleared = QName.create(ORanDeviceManagerQNames.ORAN_FM_ALARM_NOTIF, "is-cleared"); - final QName fault_text = QName.create(ORanDeviceManagerQNames.ORAN_FM_ALARM_NOTIF, "fault-text"); - return Builders.containerBuilder().withNodeIdentifier(NodeIdentifier.create(ORanDeviceManagerQNames.ORAN_FM_ALARM_NOTIF)) - .withChild(ImmutableNodes.leafNode(fault_id, "47")) - .withChild(ImmutableNodes.leafNode(fault_source, "Slot-2-Port-B")) - .withChild(ImmutableNodes.leafNode(fault_severity, "MAJOR")) - .withChild(ImmutableNodes.leafNode(is_cleared, "true")) - .withChild(ImmutableNodes.leafNode(fault_text, "CPRI Port Down")).build(); + return Builders.containerBuilder().withNodeIdentifier(NodeIdentifier.create(oranfm.get().getAlarmNotifQName())) + .withChild(ImmutableNodes.leafNode(oranfm.get().getFaultIdQName(), "47")) + .withChild(ImmutableNodes.leafNode(oranfm.get().getFaultSourceQName(), "Slot-2-Port-B")) + .withChild(ImmutableNodes.leafNode(oranfm.get().getFaultSeverityQName(), "MAJOR")) + .withChild(ImmutableNodes.leafNode(oranfm.get().getFaultIsClearedQName(), "true")) + .withChild(ImmutableNodes.leafNode(oranfm.get().getFaultTextQName(), "CPRI Port Down")).build(); } - public static class NetconfDeviceNotification implements DOMNotification, DOMEvent { private final ContainerNode content; private final Absolute schemaPath; diff --git a/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 b/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 index 283d122b0..7fd947211 100644 --- a/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 +++ b/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 @@ -21,17 +21,25 @@ */ package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import com.google.common.io.Files; +import java.io.File; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; import org.junit.BeforeClass; 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.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.service.DeviceManagerServiceProvider; import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.FaultService; import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.NotificationProxyParser; @@ -43,12 +51,15 @@ import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfDomAccesso import org.onap.ccsdk.features.sdnr.wt.websocketmanager.model.WebsocketManagerService; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; 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 TestORanDOMNetworkElement { private static final QName OneCell = QName.create("urn:onf:otcc:wireless:yang:radio-access:commscope-onecell", "2020-06-22", "onecell").intern(); - private static final @NonNull QName OnapSystem = + private static final @NonNull QName OnapSystem1 = QName.create("urn:onap:system", "2020-10-26", "onap-system").intern(); private static String NODEIDSTRING = "nSky"; private static NodeId nodeId = new NodeId(NODEIDSTRING); @@ -61,6 +72,16 @@ public class TestORanDOMNetworkElement { private static NotificationProxyParser notificationProxyParser; private static VESCollectorCfgService vesCfgService; private static WebsocketManagerService websocketManagerService; + private static ORanDMConfig oranDmConfig; + private static ConfigurationFileRepresentation oranCfg; + + private static String fileName = "test1.properties"; + // @formatter:off + private static final String TESTCONFIG_CONTENT = "[ORAN-SUPERVISION]\n" + + "supervision-notification-interval=60\n" + + "guard-timer-overhead=10\n" + + ""; + // @formatter:on @BeforeClass public static void init() throws InterruptedException, IOException { @@ -72,6 +93,7 @@ public class TestORanDOMNetworkElement { notificationProxyParser = mock(NotificationProxyParser.class); vesCfgService = mock(VESCollectorCfgService.class); websocketManagerService = mock(WebsocketManagerService.class); + oranDmConfig = mock(ORanDMConfig.class); when(accessor.getCapabilites()).thenReturn(capabilities); when(accessor.getNodeId()).thenReturn(nodeId); @@ -79,6 +101,10 @@ public class TestORanDOMNetworkElement { when(domAccessor.getNodeId()).thenReturn(nodeId); when(domAccessor.getCapabilites()).thenReturn(capabilities); when(vesCollectorService.getNotificationProxyParser()).thenReturn(notificationProxyParser); + when(capabilities.isSupportingNamespaceAndRevision( + QNameModule.create(XMLNamespace.of(ORANFM.NAMESPACE), Revision.of("2022-08-15")))).thenReturn(true); + when(capabilities.isSupportingNamespaceAndRevision( + QNameModule.create(XMLNamespace.of(OnapSystem.NAMESPACE), Revision.of("2022-11-04")))).thenReturn(true); DataProvider dataProvider = mock(DataProvider.class); FaultService faultService = mock(FaultService.class); @@ -89,6 +115,8 @@ public class TestORanDOMNetworkElement { when(vesCollectorService.getConfig()).thenReturn(vesCfgService); when(vesCfgService.isVESCollectorEnabled()).thenReturn(true); + Files.asCharSink(new File(fileName), StandardCharsets.UTF_8).write(TESTCONFIG_CONTENT); + oranCfg = new ConfigurationFileRepresentation(fileName); } @Test @@ -96,9 +124,9 @@ public class TestORanDOMNetworkElement { Optional<NetworkElement> oRanNe; when(capabilities.isSupportingNamespace(ORanDeviceManagerQNames.ORAN_HW_COMPONENT)).thenReturn(true); when(capabilities.isSupportingNamespace(OneCell)).thenReturn(false); - when(capabilities.isSupportingNamespace(OnapSystem)).thenReturn(false); + when(capabilities.isSupportingNamespace(OnapSystem1)).thenReturn(false); - ORanNetworkElementFactory factory = new ORanNetworkElementFactory(); + ORanNetworkElementFactory factory = new ORanNetworkElementFactory(oranCfg, oranDmConfig); oRanNe = factory.create(accessor, serviceProvider); assertTrue(factory.create(accessor, serviceProvider).isPresent()); oRanNe.get().register(); diff --git a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/TestORanDOMNotification.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/TestORanDOMNotification.java index 1665ac1ad..96983b1ba 100644 --- a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/TestORanDOMNotification.java +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/TestORanDOMNotification.java @@ -29,6 +29,8 @@ import java.time.Instant; import org.junit.BeforeClass; import org.junit.Test; import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.notification.ORanDOMChangeNotificationListener; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDeviceManagerQNames; import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.VESCollectorCfgService; import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.VESCollectorService; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfDomAccessor; @@ -141,7 +143,6 @@ public class TestORanDOMNotification { @Test public void test() { ContainerNode cn = createDOMNotificationBody(); - System.out.println(cn.toString()); NetconfDeviceNotification ndn = new NetconfDeviceNotification(cn, Instant.now()); ORanDOMChangeNotificationListener changeListener = new ORanDOMChangeNotificationListener(domAccessor, vesCollectorService, databaseService); changeListener.onNotification(ndn); diff --git a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/TestORanDOMToInternalDataModel.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/TestORanDOMToInternalDataModel.java index 5ce758210..01502e49c 100644 --- a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/TestORanDOMToInternalDataModel.java +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/TestORanDOMToInternalDataModel.java @@ -22,6 +22,8 @@ package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import com.google.common.collect.Sets; import java.io.IOException; import java.io.InputStream; @@ -33,9 +35,13 @@ import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import org.junit.AfterClass; import org.junit.BeforeClass; -import org.junit.Ignore; import org.junit.Test; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.dataprovider.ORanDOMToInternalDataModel; import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom.util.TestYangParserUtil; +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.netconfnodestateservice.Capabilities; +import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfDomAccessor; import org.opendaylight.mdsal.dom.api.DOMEvent; import org.opendaylight.mdsal.dom.api.DOMNotification; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultlogEntity; @@ -48,10 +54,12 @@ import org.opendaylight.yangtools.yang.common.QNameModule; import org.opendaylight.yangtools.yang.common.Revision; import org.opendaylight.yangtools.yang.common.XMLNamespace; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; +import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; +import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode; +import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.data.codec.xml.XmlParserStream; import org.opendaylight.yangtools.yang.data.impl.schema.Builders; @@ -73,9 +81,18 @@ public class TestORanDOMToInternalDataModel { QNameModule.create(XMLNamespace.of("urn:ietf:params:xml:ns:yang:ietf-system"), Revision.of("2014-08-06")); private static final QName IETF_CONTAINER = QName.create(IETF_SYSTEM_MODULE, "system"); + private static final QNameModule ORAN_MODULE = + QNameModule.create(XMLNamespace.of("urn:o-ran:fm:1.0"), Revision.of("2022-08-15")); + private static final QName ORAN_ACTIVE_ALARM_CONTAINER = QName.create(ORAN_MODULE, "active-alarm-list"); + private static EffectiveModelContext schemaContext; private static Inference hwContainerSchema; private static Inference systemSchema; + private static Inference activeAlarmSchema; + private static Capabilities capabilities; + private static Optional<OnapSystem> onapSystem; + private static Optional<ORANFM> oranfm; + private static NetconfDomAccessor domAccessor; private static final NodeId nodeId = new NodeId("nSky"); @@ -84,6 +101,18 @@ public class TestORanDOMToInternalDataModel { schemaContext = TestYangParserUtil.parseYangResourceDirectory("/"); hwContainerSchema = Inference.ofDataTreePath(schemaContext, HW_CONTAINER); systemSchema = Inference.ofDataTreePath(schemaContext, IETF_CONTAINER); + activeAlarmSchema = Inference.ofDataTreePath(schemaContext, ORAN_ACTIVE_ALARM_CONTAINER); + + capabilities = mock(Capabilities.class); + domAccessor = mock(NetconfDomAccessor.class); + when(domAccessor.getCapabilites()).thenReturn(capabilities); + when(capabilities.isSupportingNamespaceAndRevision( + QNameModule.create(XMLNamespace.of(OnapSystem.NAMESPACE), Revision.of("2022-11-04")))).thenReturn(true); + onapSystem = OnapSystem.getModule(domAccessor); + when(capabilities.isSupportingNamespaceAndRevision( + QNameModule.create(XMLNamespace.of(ORANFM.NAMESPACE), Revision.of("2022-08-15")))).thenReturn(true); + oranfm = ORANFM.getModule(domAccessor); + } @AfterClass @@ -91,12 +120,14 @@ public class TestORanDOMToInternalDataModel { schemaContext = null; hwContainerSchema = null; systemSchema = null; + activeAlarmSchema = null; } @Test public void testIetfHardwareFromXML() throws XMLStreamException, URISyntaxException, IOException, SAXException { - final InputStream resourceAsStream = TestORanDOMToInternalDataModel.class.getResourceAsStream("/ietf-hardware.xml"); + final InputStream resourceAsStream = + TestORanDOMToInternalDataModel.class.getResourceAsStream("/ietf-hardware.xml"); /* * final XMLInputFactory factory = XMLInputFactory.newInstance(); @@ -121,11 +152,11 @@ public class TestORanDOMToInternalDataModel { inventoryList.stream().filter(inventory -> inventory.getTreeLevel() == null).count()); } - @Ignore //TODO @Test public void testIetfSystemFromXML() throws XMLStreamException, URISyntaxException, IOException, SAXException { - final InputStream resourceAsStream = TestORanDOMToInternalDataModel.class.getResourceAsStream("/onap-system.xml"); + final InputStream resourceAsStream = + TestORanDOMToInternalDataModel.class.getResourceAsStream("/onap-system.xml"); final XMLStreamReader reader = UntrustedXML.createXMLStreamReader(resourceAsStream); @@ -140,9 +171,10 @@ public class TestORanDOMToInternalDataModel { NormalizedNode transformedInput = result.getResult(); ContainerNode cn = (ContainerNode) transformedInput; - AugmentationIdentifier onapSystemIID = YangInstanceIdentifier.AugmentationIdentifier.create( - Sets.newHashSet(ORanDeviceManagerQNames.ONAP_SYSTEM_NAME, ORanDeviceManagerQNames.ONAP_SYSTEM_WEB_UI)); - Optional<Guicutthrough> gc = ORanDOMToInternalDataModel.getGuicutthrough(cn.getChildByArg(onapSystemIID)); + AugmentationNode gcData = (AugmentationNode) cn.childByArg( + YangInstanceIdentifier.AugmentationIdentifier.create(Sets.newHashSet(onapSystem.get().getName(), + onapSystem.get().getWebUi(), onapSystem.get().getGeoLocation()))); + Optional<Guicutthrough> gc = ORanDOMToInternalDataModel.getGuicutthrough(gcData, onapSystem.get()); assertEquals(gc.isPresent(), true); } @@ -151,23 +183,40 @@ public class TestORanDOMToInternalDataModel { public void testORANFault() { ContainerNode cn = createORANDOMFault(); NetconfDeviceNotification faultNotif = new NetconfDeviceNotification(cn, Instant.now()); - FaultlogEntity fle = ORanDOMToInternalDataModel.getFaultLog(faultNotif, nodeId, 1); + FaultlogEntity fle = ORanDOMToInternalDataModel.getFaultLog(faultNotif, oranfm.get(), nodeId, 1); assertEquals(fle.getId(), "47"); } + @Test + public void testORANActiveAlarms() throws XMLStreamException, URISyntaxException, IOException, SAXException { + final InputStream resourceAsStream = + TestORanDOMToInternalDataModel.class.getResourceAsStream("/oran-fm-active-alarm.xml"); + + final XMLStreamReader reader = UntrustedXML.createXMLStreamReader(resourceAsStream); + final NormalizedNodeResult result = new NormalizedNodeResult(); + final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result); + + final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, activeAlarmSchema); + xmlParser.parse(reader); + + xmlParser.flush(); + xmlParser.close(); + NormalizedNode transformedInput = result.getResult(); + ContainerNode cn = (ContainerNode) transformedInput; + + UnkeyedListNode activeAlarmsList = + (UnkeyedListNode) cn.childByArg(new NodeIdentifier(oranfm.get().getFaultActiveAlarmsQName())); + for (UnkeyedListEntryNode activeAlarmEntry : activeAlarmsList.body()) + ORanDOMToInternalDataModel.getFaultLog(activeAlarmEntry, oranfm.get(), new NodeId("nSky"), Integer.valueOf(0)); + } + public static ContainerNode createORANDOMFault() { - final QName fault_id = QName.create(ORanDeviceManagerQNames.ORAN_FM_FAULT_ID, "fault-id"); - final QName fault_source = QName.create(ORanDeviceManagerQNames.ORAN_FM_FAULT_SOURCE, "fault-source"); - final QName fault_severity = QName.create(ORanDeviceManagerQNames.ORAN_FM_FAULT_SEVERITY, "fault-severity"); - final QName is_cleared = QName.create(ORanDeviceManagerQNames.ORAN_FM_FAULT_IS_CLEARED, "is-cleared"); - final QName fault_text = QName.create(ORanDeviceManagerQNames.ORAN_FM_FAULT_TEXT, "fault-text"); - return Builders.containerBuilder() - .withNodeIdentifier(NodeIdentifier.create(ORanDeviceManagerQNames.ORAN_FM_ALARM_NOTIF)) - .withChild(ImmutableNodes.leafNode(fault_id, "47")) - .withChild(ImmutableNodes.leafNode(fault_source, "Slot-2-Port-B")) - .withChild(ImmutableNodes.leafNode(fault_severity, "MAJOR")) - .withChild(ImmutableNodes.leafNode(is_cleared, "true")) - .withChild(ImmutableNodes.leafNode(fault_text, "CPRI Port Down")).build(); + return Builders.containerBuilder().withNodeIdentifier(NodeIdentifier.create(oranfm.get().getAlarmNotifQName())) + .withChild(ImmutableNodes.leafNode(oranfm.get().getFaultIdQName(), "47")) + .withChild(ImmutableNodes.leafNode(oranfm.get().getFaultSourceQName(), "Slot-2-Port-B")) + .withChild(ImmutableNodes.leafNode(oranfm.get().getFaultSeverityQName(), "MAJOR")) + .withChild(ImmutableNodes.leafNode(oranfm.get().getFaultIsClearedQName(), "true")) + .withChild(ImmutableNodes.leafNode(oranfm.get().getFaultTextQName(), "CPRI Port Down")).build(); } public static class NetconfDeviceNotification implements DOMNotification, DOMEvent { diff --git a/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 b/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 2ca2ee445..cad0994cc 100644 --- a/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 +++ b/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 @@ -17,83 +17,110 @@ */ package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import com.google.common.io.Files; +import java.io.File; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.Optional; import org.junit.After; import org.junit.BeforeClass; 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.service.DeviceManagerServiceProvider; import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.FaultService; import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.VESCollectorService; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.Capabilities; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfAccessor; -import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfBindingAccessor; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfDomAccessor; -import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.TransactionUtils; import org.onap.ccsdk.features.sdnr.wt.websocketmanager.model.WebsocketManagerService; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; +import org.opendaylight.yangtools.yang.common.QNameModule; +import org.opendaylight.yangtools.yang.common.Revision; +import org.opendaylight.yangtools.yang.common.XMLNamespace; public class TestORanNetworkElementFactory { private static String NODEIDSTRING = "nSky"; private static NetconfAccessor accessor; + private static NetconfDomAccessor domAccessor; private static DeviceManagerServiceProvider serviceProvider; private static Capabilities capabilities; private static VESCollectorService vesCollectorService; private static FaultService faultService; private static WebsocketManagerService notificationService; private static DataProvider databaseService; + private static ORanDMConfig oranDmConfig; + private static ConfigurationFileRepresentation oranCfg; private static NodeId nodeId = new NodeId(NODEIDSTRING); - @BeforeClass - public static void init() throws InterruptedException, IOException { - NetconfBindingAccessor bindingAccessor = mock(NetconfBindingAccessor.class); - when(bindingAccessor.getTransactionUtils()).thenReturn(mock(TransactionUtils.class)); - when(bindingAccessor.getNodeId()).thenReturn(nodeId); + private static String fileName = "test1.properties"; + // @formatter:off + private static final String TESTCONFIG_CONTENT = "[ORAN-SUPERVISION]\n" + + "supervision-notification-interval=60\n" + + "guard-timer-overhead=10\n" + + ""; + // @formatter:on - NetconfDomAccessor domAccessor = mock(NetconfDomAccessor.class); - when(domAccessor.getNodeId()).thenReturn(nodeId); - capabilities = mock(Capabilities.class); - //accessor = mock(NetconfBindingAccessor.class); + @BeforeClass + public static void init() throws InterruptedException, IOException { accessor = mock(NetconfAccessor.class); + domAccessor = mock(NetconfDomAccessor.class); + capabilities = mock(Capabilities.class); serviceProvider = mock(DeviceManagerServiceProvider.class); vesCollectorService = mock(VESCollectorService.class); faultService = mock(FaultService.class); notificationService = mock(WebsocketManagerService.class); databaseService = mock(DataProvider.class); + oranDmConfig = mock(ORanDMConfig.class); + when(domAccessor.getCapabilites()).thenReturn(capabilities); + when(domAccessor.getNodeId()).thenReturn(nodeId); when(accessor.getCapabilites()).thenReturn(capabilities); - when(accessor.getNetconfBindingAccessor()).thenReturn(Optional.of(bindingAccessor)); when(accessor.getNetconfDomAccessor()).thenReturn(Optional.of(domAccessor)); when(serviceProvider.getFaultService()).thenReturn(faultService); when(serviceProvider.getWebsocketService()).thenReturn(notificationService); when(serviceProvider.getDataProvider()).thenReturn(databaseService); when(serviceProvider.getVESCollectorService()).thenReturn(vesCollectorService); + when(capabilities.isSupportingNamespaceAndRevision( + QNameModule.create(XMLNamespace.of(ORANFM.NAMESPACE), Revision.of("2022-08-15")))).thenReturn(true); + when(capabilities.isSupportingNamespaceAndRevision( + QNameModule.create(XMLNamespace.of(OnapSystem.NAMESPACE), Revision.of("2022-11-04")))).thenReturn(true); + Files.asCharSink(new File(fileName), StandardCharsets.UTF_8).write(TESTCONFIG_CONTENT); + oranCfg = new ConfigurationFileRepresentation(fileName); } @Test public void testCreateORANHWComponent() throws Exception { - when(accessor.getCapabilites().isSupportingNamespace(ORanDeviceManagerQNames.ORAN_HW_COMPONENT)).thenReturn(true); - ORanNetworkElementFactory factory = new ORanNetworkElementFactory(); + when(domAccessor.getCapabilites().isSupportingNamespace(ORanDeviceManagerQNames.ORAN_HW_COMPONENT)).thenReturn(true); + ORanNetworkElementFactory factory = new ORanNetworkElementFactory(oranCfg, oranDmConfig); assertTrue((factory.create(accessor, serviceProvider)).isPresent()); } @Test public void testCreateNone() throws Exception { - when(accessor.getCapabilites().isSupportingNamespace(ORanDeviceManagerQNames.ORAN_HW_COMPONENT)).thenReturn(false); - ORanNetworkElementFactory factory = new ORanNetworkElementFactory(); + when(domAccessor.getCapabilites().isSupportingNamespace(ORanDeviceManagerQNames.ORAN_HW_COMPONENT)).thenReturn(false); + ORanNetworkElementFactory factory = new ORanNetworkElementFactory(oranCfg, oranDmConfig); assertTrue(!(factory.create(accessor, serviceProvider).isPresent())); } @After public void cleanUp() throws Exception { + File file = new File(fileName); + if (file.exists()) { + System.out.println("File exists, Deleting it"); + file.delete(); + } } } diff --git a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/TestORanRegistrationToVESpnfRegistration.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/TestORanRegistrationToVESpnfRegistration.java index b46595293..ad1fcede3 100644 --- a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/TestORanRegistrationToVESpnfRegistration.java +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/dom/TestORanRegistrationToVESpnfRegistration.java @@ -22,12 +22,13 @@ package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; import org.mockito.junit.MockitoJUnitRunner; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.vesmapper.ORanRegistrationToVESpnfRegistrationMapper; import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.VESCollectorCfgService; import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.VESCollectorService; import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESCommonEventHeaderPOJO; diff --git a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/resources/o-ran-fm@2022-08-15.yang b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/resources/o-ran-fm@2022-08-15.yang new file mode 100644 index 000000000..2abcc1ecc --- /dev/null +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/resources/o-ran-fm@2022-08-15.yang @@ -0,0 +1,153 @@ +module o-ran-fm { + yang-version 1.1; + namespace "urn:o-ran:fm:1.0"; + prefix o-ran-fm; + + import ietf-yang-types { + prefix yang; + revision-date 2013-07-15; + } + + organization + "O-RAN Alliance"; + contact + "www.o-ran.org"; + description + "This module defines alarm reporting mechanism. + + Copyright 2019 the O-RAN Alliance. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the above disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the above disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the Members of the O-RAN Alliance nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission."; + + revision 2022-08-15 { + description + "version 1.0.0 + + 1) imported model from xRAN + 2) changed namespace and reference from xran to o-ran"; + reference + "ORAN-WG4.M.0-v01.00"; + } + + grouping alarm { + description + "Gropuping which can uniquely identify alarm"; + leaf fault-id { + type uint16; + mandatory true; + description + "Fault specific Id that identifies the fault."; + } + + leaf fault-source { + type string { + length "1..255"; + } + mandatory true; + description + "Represents the Object or source that is suspected to be faulty."; + } + + list affected-objects { + min-elements 1; + max-elements 100; + description + "List of affected-objects"; + leaf name { + type string { + length "1..255"; + } + mandatory true; + description + "Represents the Object or source that is suspected to be affected by this fault"; + } + } + + leaf fault-severity { + type enumeration { + enum "CRITICAL" { + description + "Critical alarm means that this device is not able to perform any further service"; + } + enum "MAJOR" { + description + "Major alarm appeared on the device"; + } + enum "MINOR" { + description + "Minor alarm appeared on the device"; + } + enum "WARNING" { + description + "Warning is being reported by the device"; + } + } + mandatory true; + description + "Fault severity defines the severity level of the fault. A notification, whose fault severity has the value 'warning', + is a special type of an alarm notification. For these alarm notifications, + the Master Agent does not expect to receive a clear alarm notification."; + } + + leaf is-cleared { + type boolean; + mandatory true; + description + "Fault state determines the type of the event. Not used if faultSeverity is WARNING."; + } + + leaf fault-text { + type string { + length "0..255"; + } + description + "Textual description of the fault."; + } + + leaf event-time { + type yang:date-and-time; + mandatory true; + description + "Timestamp to indicate the time when the fault is detected/cleared."; + } + } + + container active-alarm-list { + config false; + description + "List of currently active alarms. An alarm is removed from this table when the state transitions to clear."; + list active-alarms { + description + "List of currenty active alarms"; + uses alarm; + } + } + + notification alarm-notif { + description + "Notification sent on initial alarm creation, as well as any time the alarm changes state, including clear"; + uses alarm; + } +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/resources/oran-fm-active-alarm.xml b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/resources/oran-fm-active-alarm.xml new file mode 100644 index 000000000..263a75856 --- /dev/null +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/resources/oran-fm-active-alarm.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> +<active-alarm-list xmlns="urn:o-ran:fm:1.0"> + <active-alarms> + <fault-id>10001</fault-id> + <is-cleared>false</is-cleared> + <event-time>2021-03-18T19:51:50.4Z</event-time> + <affected-objects> + <name>slot0-logical0</name> + </affected-objects> + <fault-severity>MAJOR</fault-severity> + <fault-source>/ietf-hardware:hardware/component[name='slot0-logical0']</fault-source> + <fault-text>cpriPortDown</fault-text> + </active-alarms> + <active-alarms> + <fault-id>10002</fault-id> + <is-cleared>false</is-cleared> + <event-time>2021-03-18T19:52:50.4Z</event-time> + <affected-objects> + <name>slot2-logical2</name> + </affected-objects> + <fault-severity>MAJOR</fault-severity> + <fault-source>/ietf-hardware:hardware/component[name='slot2-logical2']</fault-source> + <fault-text>cpriPortDown</fault-text> + </active-alarms> +</active-alarm-list> diff --git a/sdnr/wt/netconfnode-state-service/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/Capabilities.java b/sdnr/wt/netconfnode-state-service/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/Capabilities.java index 7448c9fb7..08b2df6d3 100644 --- a/sdnr/wt/netconfnode-state-service/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/Capabilities.java +++ b/sdnr/wt/netconfnode-state-service/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/Capabilities.java @@ -28,12 +28,14 @@ import java.util.Date; import java.util.List; import java.util.Optional; import javax.annotation.Nullable; +import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev221225.connection.oper.AvailableCapabilities; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev221225.connection.oper.UnavailableCapabilities; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev221225.connection.oper.available.capabilities.AvailableCapability; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev221225.connection.oper.unavailable.capabilities.UnavailableCapability; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev221225.NetconfNode; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.common.QNameModule; import org.opendaylight.yangtools.yang.common.Revision; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -152,6 +154,19 @@ public class Capabilities { } /** + * check if the namespace and its revision of module are supported by the given capabilities + * + * @param module + * @return true if supporting the model AND revision<br> + * false if revision not available or both not found. + */ + public boolean isSupportingNamespaceAndRevision(QNameModule module) { + String namespace = module.getNamespace().toString(); + @NonNull Optional<Revision> revision = module.getRevision(); + return revision.isEmpty() ? false : isSupportingNamespaceAndRevision(namespace, revision.get().toString()); + } + + /** * Provide namespace and its revision as String. * * @param qCapability capability from the model diff --git a/sdnr/wt/netconfnode-state-service/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/DomContext.java b/sdnr/wt/netconfnode-state-service/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/DomContext.java new file mode 100644 index 000000000..fe016a917 --- /dev/null +++ b/sdnr/wt/netconfnode-state-service/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/DomContext.java @@ -0,0 +1,38 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2023 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.netconfnodestateservice; + +import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer; +import org.opendaylight.yangtools.yang.parser.api.YangParserFactory; + +public interface DomContext { + + /** + * @return BindingNormalizedNodeSerializer + */ + public BindingNormalizedNodeSerializer getBindingNormalizedNodeSerializer(); + + /** + * @return YangParserFactory + */ + public YangParserFactory getYangParserFactory(); +} diff --git a/sdnr/wt/netconfnode-state-service/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/NetconfDomAccessor.java b/sdnr/wt/netconfnode-state-service/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/NetconfDomAccessor.java index b7eba42b8..2a36cfd96 100644 --- a/sdnr/wt/netconfnode-state-service/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/NetconfDomAccessor.java +++ b/sdnr/wt/netconfnode-state-service/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/NetconfDomAccessor.java @@ -29,6 +29,7 @@ import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.mdsal.dom.api.DOMMountPoint; import org.opendaylight.mdsal.dom.api.DOMNotificationListener; import org.opendaylight.mdsal.dom.api.DOMRpcResult; +import org.opendaylight.mdsal.dom.api.DOMRpcService; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.CreateSubscriptionInput; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.create.subscription.input.Filter; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netmod.notification.rev080714.netconf.streams.Stream; @@ -52,10 +53,20 @@ public interface NetconfDomAccessor extends NetconfAccessor { /** * @return the MDSAL Mountpoint service - **/ + */ DOMMountPoint getMountpoint(); /** + * @return DOMRpcService + */ + DOMRpcService getRpcService(); + + /** + * @return DomContext + */ + DomContext getDomContext(); + + /** * Deliver the data into a class * * @param <T> DataObject type diff --git a/sdnr/wt/netconfnode-state-service/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/impl/NetconfNodeStateServiceImpl.java b/sdnr/wt/netconfnode-state-service/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/impl/NetconfNodeStateServiceImpl.java index a420867b5..c4ec06ff8 100644 --- a/sdnr/wt/netconfnode-state-service/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/impl/NetconfNodeStateServiceImpl.java +++ b/sdnr/wt/netconfnode-state-service/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/impl/NetconfNodeStateServiceImpl.java @@ -30,6 +30,7 @@ import org.onap.ccsdk.features.sdnr.wt.common.threading.GenericRunnableFactory; import org.onap.ccsdk.features.sdnr.wt.common.threading.KeyBasedThreadpool; import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.IEntityDataProvider; import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.StatusChangedHandler.StatusKey; +import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.DomContext; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfAccessor; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfNodeConnectListener; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfNodeStateListener; @@ -37,7 +38,7 @@ import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfNodeStateS import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.VesNotificationListener; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.access.NetconfAccessorManager; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.access.NetconfCommunicatorManager; -import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.access.dom.DomContext; +import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.access.dom.DomContextImpl; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.conf.NetconfStateConfig; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.conf.odlAkka.AkkaConfig; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.conf.odlAkka.ClusterConfig; @@ -74,6 +75,7 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology. import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.parser.api.YangParserException; import org.opendaylight.yangtools.yang.parser.api.YangParserFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -226,7 +228,7 @@ public class NetconfNodeStateServiceImpl public void init() { LOG.info("Session Initiated start {}", APPLICATION_NAME); - this.domContext = new DomContext(this.yangParserFactory, this.bindingNormalizedNodeSerializer); + this.domContext = new DomContextImpl(this.yangParserFactory, this.bindingNormalizedNodeSerializer); this.netconfCommunicatorManager = new NetconfCommunicatorManager(mountPointService, domMountPointService, domContext); this.accessorManager = new NetconfAccessorManager(netconfCommunicatorManager, domContext, this); diff --git a/sdnr/wt/netconfnode-state-service/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/impl/access/NetconfAccessorImpl.java b/sdnr/wt/netconfnode-state-service/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/impl/access/NetconfAccessorImpl.java index d2a3be7b9..f1d1c3a0d 100644 --- a/sdnr/wt/netconfnode-state-service/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/impl/access/NetconfAccessorImpl.java +++ b/sdnr/wt/netconfnode-state-service/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/impl/access/NetconfAccessorImpl.java @@ -20,11 +20,11 @@ package org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.access; import java.util.Objects; import java.util.Optional; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.Capabilities; +import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.DomContext; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfAccessor; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfBindingAccessor; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfDomAccessor; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.NetconfNodeStateServiceImpl; -import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.access.dom.DomContext; import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev221225.ConnectionOper.ConnectionStatus; diff --git a/sdnr/wt/netconfnode-state-service/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/impl/access/NetconfAccessorManager.java b/sdnr/wt/netconfnode-state-service/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/impl/access/NetconfAccessorManager.java index 80be69480..2a97ec1d2 100644 --- a/sdnr/wt/netconfnode-state-service/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/impl/access/NetconfAccessorManager.java +++ b/sdnr/wt/netconfnode-state-service/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/impl/access/NetconfAccessorManager.java @@ -20,9 +20,9 @@ package org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.access; import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; import org.eclipse.jdt.annotation.NonNull; +import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.DomContext; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfAccessor; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.NetconfNodeStateServiceImpl; -import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.access.dom.DomContext; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev221225.NetconfNode; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev221225.network.topology.topology.topology.types.TopologyNetconf; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology; diff --git a/sdnr/wt/netconfnode-state-service/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/impl/access/NetconfCommunicatorManager.java b/sdnr/wt/netconfnode-state-service/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/impl/access/NetconfCommunicatorManager.java index ba4e3207e..cb5743e7f 100644 --- a/sdnr/wt/netconfnode-state-service/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/impl/access/NetconfCommunicatorManager.java +++ b/sdnr/wt/netconfnode-state-service/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/impl/access/NetconfCommunicatorManager.java @@ -23,10 +23,10 @@ package org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.access; import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; +import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.DomContext; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfBindingAccessor; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfDomAccessor; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.access.binding.NetconfBindingAccessorImpl; -import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.access.dom.DomContext; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.access.dom.NetconfDomAccessorImpl; import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.MountPoint; diff --git a/sdnr/wt/netconfnode-state-service/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/impl/access/dom/DomContext.java b/sdnr/wt/netconfnode-state-service/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/impl/access/dom/DomContextImpl.java index 602b2987f..56fc9e91b 100644 --- a/sdnr/wt/netconfnode-state-service/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/impl/access/dom/DomContext.java +++ b/sdnr/wt/netconfnode-state-service/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/impl/access/dom/DomContextImpl.java @@ -22,27 +22,30 @@ package org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.access.dom; import java.util.Objects; +import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.DomContext; import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer; import org.opendaylight.yangtools.yang.parser.api.YangParserFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class DomContext { +public class DomContextImpl implements DomContext { @SuppressWarnings("unused") - private static final Logger LOG = LoggerFactory.getLogger(DomContext.class); + private static final Logger LOG = LoggerFactory.getLogger(DomContextImpl.class); private final YangParserFactory yangParserFactory; private final BindingNormalizedNodeSerializer bindingNormalizedNodeSerializer; - public DomContext(YangParserFactory yangParserFactory, BindingNormalizedNodeSerializer bindingNormalizedNodeSerializer) { + public DomContextImpl(YangParserFactory yangParserFactory, BindingNormalizedNodeSerializer bindingNormalizedNodeSerializer) { this.yangParserFactory = Objects.requireNonNull(yangParserFactory); this.bindingNormalizedNodeSerializer = Objects.requireNonNull(bindingNormalizedNodeSerializer); } + @Override public BindingNormalizedNodeSerializer getBindingNormalizedNodeSerializer() { return bindingNormalizedNodeSerializer; } + @Override public YangParserFactory getYangParserFactory() { return yangParserFactory; } diff --git a/sdnr/wt/netconfnode-state-service/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/impl/access/dom/NetconfDomAccessorImpl.java b/sdnr/wt/netconfnode-state-service/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/impl/access/dom/NetconfDomAccessorImpl.java index 00f743d33..f862a77bf 100644 --- a/sdnr/wt/netconfnode-state-service/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/impl/access/dom/NetconfDomAccessorImpl.java +++ b/sdnr/wt/netconfnode-state-service/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/impl/access/dom/NetconfDomAccessorImpl.java @@ -39,6 +39,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; +import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.DomContext; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfDomAccessor; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.access.NetconfAccessorImpl; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.mdsal.MdsalApi; @@ -109,6 +110,16 @@ public class NetconfDomAccessorImpl extends NetconfAccessorImpl implements Netco } @Override + public DOMRpcService getRpcService() { + return rpcService; + } + + @Override + public DomContext getDomContext() { + return domContext; + } + + @Override public <T extends DataObject> Optional<T> readData(LogicalDatastoreType dataStoreType, YangInstanceIdentifier path, Class<T> clazz) { LOG.debug("Read to object datastore:{} path:{}", dataStoreType, path); diff --git a/sdnr/wt/netconfnode-state-service/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/test/TestNetconfAccessorImpl.java b/sdnr/wt/netconfnode-state-service/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/test/TestNetconfAccessorImpl.java index 72a6f7b06..422c3bcf6 100644 --- a/sdnr/wt/netconfnode-state-service/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/test/TestNetconfAccessorImpl.java +++ b/sdnr/wt/netconfnode-state-service/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/test/TestNetconfAccessorImpl.java @@ -36,7 +36,7 @@ import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.NetconfNodeS import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.access.NetconfAccessorImpl; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.access.NetconfCommunicatorManager; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.access.binding.NetconfBindingAccessorImpl; -import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.access.dom.DomContext; +import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.access.dom.DomContextImpl; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.access.dom.NetconfDomAccessorImpl; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.test.example.TestNetconfHelper; import org.opendaylight.mdsal.binding.api.DataBroker; @@ -64,7 +64,7 @@ public class TestNetconfAccessorImpl extends Mockito { @Test public void testConstruct() { NetconfCommunicatorManager netconfCommunicatorManager = mock(NetconfCommunicatorManager.class); - DomContext domContext = mock(DomContext.class); + DomContextImpl domContext = mock(DomContextImpl.class); String nodeIdString = "Test"; String capabilityStringForNetworkElement = "network-element"; NodeId nodeId = new NodeId(nodeIdString); @@ -147,7 +147,7 @@ public class TestNetconfAccessorImpl extends Mockito { public void testNetconfDomNotification() { DOMDataBroker domDataBroker = mock(DOMDataBroker.class); - DomContext domContext = mock(DomContext.class); + DomContextImpl domContext = mock(DomContextImpl.class); DOMRpcService domRpcService = mock(DOMRpcService.class); NetconfAccessorImpl netconfAccessor = TestNetconfHelper.getNetconfAcessorImpl(); DOMNotificationService domNotificationService = mock(DOMNotificationService.class); diff --git a/sdnr/wt/netconfnode-state-service/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/test/example/ExampleConfig.java b/sdnr/wt/netconfnode-state-service/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/test/example/ExampleConfig.java index 9630897fb..caf7d9c1b 100644 --- a/sdnr/wt/netconfnode-state-service/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/test/example/ExampleConfig.java +++ b/sdnr/wt/netconfnode-state-service/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/test/example/ExampleConfig.java @@ -24,7 +24,7 @@ package org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.test.example; import java.io.IOException; import java.net.URI; import java.util.Objects; -import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.access.dom.DomContext; +import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.DomContext; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.access.dom.DomParser; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.config.rev201208.Configuration; import org.opendaylight.yangtools.yang.common.QName; @@ -34,6 +34,7 @@ import org.opendaylight.yangtools.yang.common.XMLNamespace; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; +import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; import org.opendaylight.yangtools.yang.parser.api.YangParser; import org.opendaylight.yangtools.yang.parser.api.YangParserException; import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; diff --git a/sdnr/wt/netconfnode-state-service/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/test/example/TestNetconfHelper.java b/sdnr/wt/netconfnode-state-service/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/test/example/TestNetconfHelper.java index 4a061709a..5b7104621 100644 --- a/sdnr/wt/netconfnode-state-service/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/test/example/TestNetconfHelper.java +++ b/sdnr/wt/netconfnode-state-service/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/test/example/TestNetconfHelper.java @@ -26,7 +26,7 @@ import org.mockito.Mockito; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.NetconfNodeStateServiceImpl; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.access.NetconfAccessorImpl; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.access.NetconfCommunicatorManager; -import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.access.dom.DomContext; +import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.access.dom.DomContextImpl; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev221225.ConnectionOper.ConnectionStatus; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev221225.connection.oper.AvailableCapabilitiesBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev221225.connection.oper.available.capabilities.AvailableCapabilityBuilder; @@ -65,7 +65,7 @@ public class TestNetconfHelper extends Mockito { */ public static NetconfAccessorImpl getNetconfAcessorImpl() { NetconfCommunicatorManager netconfCommunicatorManager = mock(NetconfCommunicatorManager.class); - DomContext domContext = mock(DomContext.class); + DomContextImpl domContext = mock(DomContextImpl.class); String nodeIdString = "Test"; String capabilityStringForNetworkElement = "network-element"; NodeId nodeId = new NodeId(nodeIdString); diff --git a/sdnr/wt/odlux/apps/configurationApp/src/views/configurationApplication.tsx b/sdnr/wt/odlux/apps/configurationApp/src/views/configurationApplication.tsx index 0f143d818..d7f59d61c 100644 --- a/sdnr/wt/odlux/apps/configurationApp/src/views/configurationApplication.tsx +++ b/sdnr/wt/odlux/apps/configurationApp/src/views/configurationApplication.tsx @@ -919,6 +919,7 @@ class ConfigurationApplicationComponent extends React.Component<ConfigurationApp } render() { + console.log('ConfigurationApplication.render()', this.props); return this.props.collectingData || !this.state.viewData ? this.renderCollectingData() : this.props.listSpecification diff --git a/sdnr/wt/odlux/apps/configurationApp/src/yang/yangParser.ts b/sdnr/wt/odlux/apps/configurationApp/src/yang/yangParser.ts index 2dbbae274..85eeb41a4 100644 --- a/sdnr/wt/odlux/apps/configurationApp/src/yang/yangParser.ts +++ b/sdnr/wt/odlux/apps/configurationApp/src/yang/yangParser.ts @@ -492,20 +492,6 @@ export class YangParser { public postProcess() { - // execute all post processes like resolving in proper order - this._unionsToResolve.forEach(cb => { - try { cb(); } catch (error) { - console.warn(error.message); - } - }); - - // process all groupings - this._groupingsToResolve.filter(vs => vs.uses && vs.uses[ResolveFunction]).forEach(vs => { - try { vs.uses![ResolveFunction] !== undefined && vs.uses![ResolveFunction]!('|'); } catch (error) { - console.warn(`Error resolving: [${vs.name}] [${error.message}]`); - } - }); - /** * This is to fix the issue for sequential execution of modules based on their child and parent relationship * We are sorting the module object based on their augment status @@ -622,6 +608,20 @@ export class YangParser { } }); + // execute all post processes like resolving in proper order + this._unionsToResolve.forEach(cb => { + try { cb(); } catch (error) { + console.warn(error.message); + } + }); + + // process all groupings + this._groupingsToResolve.filter(vs => vs.uses && vs.uses[ResolveFunction]).forEach(vs => { + try { vs.uses![ResolveFunction] !== undefined && vs.uses![ResolveFunction]!('|'); } catch (error) { + console.warn(`Error resolving: [${vs.name}] [${error.message}]`); + } + }); + // resolve readOnly const resolveReadOnly = (view: ViewSpecification, parentConfig: boolean) => { |