exchanging new version yang models on firmware upgrade
[oam/tr069-adapter.git] / netconf-server / src / main / java / org / commscope / tr069adapter / netconf / server / NetconfServerStarter.java
index 39e4e3b..392b693 100644 (file)
@@ -24,10 +24,13 @@ import java.io.FileReader;
 import java.io.IOException;\r
 import java.util.Arrays;\r
 import java.util.Collections;\r
+import java.util.HashMap;\r
 import java.util.List;\r
+import java.util.Map;\r
 import java.util.concurrent.TimeUnit;\r
 import java.util.regex.Matcher;\r
 import java.util.regex.Pattern;\r
+import org.commscope.tr069adapter.common.deviceversion.DeviceVersionManager;\r
 import org.commscope.tr069adapter.netconf.config.NetConfServerProperties;\r
 import org.commscope.tr069adapter.netconf.operations.CustomOperationsCreator;\r
 import org.opendaylight.netconf.test.tool.NetconfDeviceSimulator;\r
@@ -41,24 +44,33 @@ import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;\r
 import com.google.common.base.Preconditions;\r
 \r
+\r
 @Component\r
 @Scope("singleton")\r
 public class NetconfServerStarter {\r
 \r
   private static final Logger LOG = LoggerFactory.getLogger(NetconfServerStarter.class);\r
 \r
+  private static Map<String, NetconfDevice> serversMap = new HashMap<>();\r
+\r
   @Autowired\r
   NetConfServerProperties config;\r
 \r
-  public boolean startServer(String netConfPort, String macID) {\r
+  @Autowired\r
+  DeviceVersionManager versionManager;\r
+\r
+  public boolean startServer(String netConfPort, String macID, String swVersion, String hwVersion) {\r
 \r
     if (netConfPort == null) {\r
       LOG.error("Invalid NETCONF port for deviceID: {}, port is null.", macID);\r
       return false;\r
     }\r
 \r
-    LOG.debug("Starting Netconf server for MACID :{}, on port :{}", macID, netConfPort);\r
-    boolean result = startServer(netConfPort, config.getSchemaDirPath(), macID);\r
+    LOG.debug(\r
+        "Starting Netconf server for MACID :{}, on port :{}, softwareVersion {}, hardwareVersion {}",\r
+        macID, netConfPort, swVersion, hwVersion);\r
+    boolean result =\r
+        startServer(netConfPort, config.getSchemaDirPath(), macID, swVersion, hwVersion);\r
     LOG.debug("Completed starting Netconf server for MACID :{} , on port :{}, server status={}",\r
         macID, netConfPort, result);\r
 \r
@@ -66,11 +78,12 @@ public class NetconfServerStarter {
   }\r
 \r
   @SuppressWarnings({"resource", "deprecation"})\r
-  private boolean startServer(String portStr, String schemaDirPath, String macID) {\r
+  private boolean startServer(String portStr, String schemaDirPath, String macID, String swVersion,\r
+      String hwVersion) {\r
 \r
     // creating configuration for the netconf instance\r
     final Configuration configuration = new ConfigurationBuilder().build();\r
-    OperationsCreator operationsCreator = new CustomOperationsCreator(macID);\r
+    OperationsCreator operationsCreator = new CustomOperationsCreator(macID, swVersion, hwVersion);\r
     configuration.setOperationsCreator(operationsCreator);\r
     configuration.setGenerateConfigsTimeout((int) TimeUnit.MINUTES.toMillis(30));\r
     if (portStr != null) {\r
@@ -84,24 +97,30 @@ public class NetconfServerStarter {
     }\r
     configuration.setDeviceCount(1);\r
     configuration.setSsh(Boolean.TRUE);\r
-    File schemaDir = new File(schemaDirPath);\r
-    configuration.setSchemasDir(schemaDir);\r
     configuration.setCapabilities(Configuration.DEFAULT_BASE_CAPABILITIES_EXI);\r
     configuration.setIp("0.0.0.0");\r
 \r
-    boolean isSchemaLoaded = loadSchemas(schemaDir);\r
-    if (!isSchemaLoaded) {\r
-      LOG.debug("Failed to load schema for netconf server instance {}", macID);\r
+    String versionPath = versionManager.getNetconfYangSchemaPath(swVersion, hwVersion);\r
+    if (versionPath == null && swVersion != null) {\r
+      LOG.error("Failed to get version path for software version {}, calling base version",\r
+          swVersion);\r
+      versionPath = versionManager.getBaseNetconfYangSchemaPath();\r
+    } else if (swVersion == null) {\r
+      LOG.error("Software version is null {}", swVersion);\r
       return false;\r
     }\r
+    String schemaVerPath = schemaDirPath + File.separator + versionPath;\r
+    File schemaVerDir = new File(schemaVerPath);\r
+    configuration.setSchemasDir(schemaVerDir);\r
 \r
-    try(final NetconfDevice netconfDevice = new NetconfDevice(configuration)){\r
+    try (final NetconfDevice netconfDevice = new NetconfDevice(configuration)) {\r
       final List<Integer> openDevices = netconfDevice.start();\r
       if (openDevices.isEmpty()) {\r
         LOG.debug("Failed to start netconf server instance {}", macID);\r
         return false;\r
       }\r
       netconfDevice.setAutoClose(false);\r
+      serversMap.put(macID, netconfDevice);\r
     } catch (RuntimeException e) {\r
       LOG.error("Unhandled exception. Failed to start the server", e);\r
       return false;\r
@@ -110,7 +129,24 @@ public class NetconfServerStarter {
     return true;\r
   }\r
 \r
-  private boolean loadSchemas(File schemasDir) {\r
+  public boolean stopServer(String macID) {\r
+    try {\r
+      LOG.debug("Stopping Netconf server for MACID {}", macID);\r
+      NetconfDevice netconf = serversMap.get(macID);\r
+      netconf.setAutoClose(true);\r
+      netconf.close();\r
+      serversMap.remove(macID);\r
+      LOG.debug("Completed stopping Netconf server for MACID {}", macID);\r
+      return true;\r
+    } catch (Exception e) {\r
+      LOG.debug("Error while stopping Netconf server for MACID {}; error message {}", macID,\r
+          e.getMessage());\r
+    }\r
+\r
+    return false;\r
+  }\r
+\r
+  protected boolean loadSchemas(File schemasDir) {\r
     if (schemasDir != null) {\r
       if (!schemasDir.exists() || !schemasDir.isDirectory() || !schemasDir.canRead()) {\r
         LOG.error("Failed to load schema. schema location is not valid.");\r
@@ -142,6 +178,14 @@ public class NetconfServerStarter {
     return true;\r
   }\r
 \r
+  public boolean isNetConfServerRunning(String deviceId) {\r
+    NetconfDevice nc = serversMap.get(deviceId);\r
+    if (null != nc)\r
+      return true;\r
+    else\r
+      return false;\r
+  }\r
+\r
   private void loadSchemaPattren(String line, File file, Pattern revisionregex) {\r
     if (line != null) {\r
       final Matcher m = revisionregex.matcher(line);\r