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.apache.commons.io.FileUtils;\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
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
}\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
}\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
+ \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
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
+ 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