summaryrefslogtreecommitdiffstats
path: root/adaptors
diff options
context:
space:
mode:
Diffstat (limited to 'adaptors')
-rw-r--r--adaptors/ansible-adaptor/ansible-adaptor-bundle/pom.xml31
-rw-r--r--adaptors/ansible-adaptor/ansible-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/ansible/impl/AnsibleAdaptorImpl.java10
-rw-r--r--adaptors/ansible-adaptor/ansible-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/ansible/impl/AnsibleAdaptorPropertiesProviderImpl.java10
-rw-r--r--adaptors/features/ccsdk-netconf-adaptor/pom.xml39
-rwxr-xr-xadaptors/features/pom.xml1
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/pom.xml206
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/ConnectionDetails.java66
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/HttpClient.java204
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/MockOperationalStateValidatorImpl.java47
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfAdaptorConstants.java69
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClient.java63
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClientFactory.java41
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClientRestconf.java67
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClientType.java30
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfConnectionDetails.java94
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfDataAccessService.java82
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/OperationalStateValidator.java35
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/OperationalStateValidatorFactory.java56
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/VNFOperationalStateValidatorImpl.java129
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/VnfType.java57
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/exception/DataAccessException.java47
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/exception/NetconfDAOException.java47
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/internal/NetconfAdaptor.java128
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/internal/NetconfAdaptor2.java127
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/internal/NetconfConstMessages.java59
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/internal/NetconfDataAccessServiceImpl.java146
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/internal/NetconfMessage.java97
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/JSchLogger.java64
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/NetconfClientJsch.java184
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/odlconnector/NetconfClientRestconfImpl.java246
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/resources/netconf-adaptor.properties43
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClientFactoryTest.java50
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClientTypeTest.java41
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfConnectionDetailsTest.java118
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/OperationalStateValidatorTest.java200
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/TestConnectionDetails.java46
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/TestVnfType.java42
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/VNFOperationalStateValidatorImplTest.java51
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/exception/DataAccessExceptionTest.java64
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/exception/NetconfDAOExceptionTest.java64
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/internal/TestNetconfAdaptor.java88
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/internal/TestNetconfAdaptor2.java103
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/internal/TestNetconfDataAccessServiceImpl.java139
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestGetRunningConfig.java59
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestJSchLogger.java55
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestModifyConfig.java92
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestModifyConfigMock.java92
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestModifyConfigRouterMock.java90
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestNetconfClientJsch.java191
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestOperationalStates.java86
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/odlconnector/NetconfClientRestconfImplTest.java207
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-installer/pom.xml141
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-installer/src/assembly/assemble_installer_zip.xml59
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-installer/src/assembly/assemble_mvnrepo_zip.xml49
-rw-r--r--adaptors/netconf-adaptor/netconf-adaptor-installer/src/main/resources/scripts/install-feature.sh50
-rw-r--r--adaptors/netconf-adaptor/pom.xml61
-rwxr-xr-xadaptors/pom.xml1
-rw-r--r--adaptors/saltstack-adaptor/saltstack-adaptor-provider/src/main/java/org/onap/ccsdk/sli/adaptors/saltstack/impl/SaltstackAdaptorImpl.java2
58 files changed, 4742 insertions, 24 deletions
diff --git a/adaptors/ansible-adaptor/ansible-adaptor-bundle/pom.xml b/adaptors/ansible-adaptor/ansible-adaptor-bundle/pom.xml
index be24ed12d..87cc609ee 100644
--- a/adaptors/ansible-adaptor/ansible-adaptor-bundle/pom.xml
+++ b/adaptors/ansible-adaptor/ansible-adaptor-bundle/pom.xml
@@ -1,18 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- ============LICENSE_START=======================================================
- ONAP : APPC ================================================================================
- Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
- ================================================================================
- Copyright (C) 2017 Amdocs =============================================================================
- 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. ECOMP is
- a trademark and service mark of AT&T Intellectual Property. ============LICENSE_END========================================================= -->
+<!--
+ ============LICENSE_START=======================================================
+ ONAP : APPC
+ ================================================================================
+ Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ ================================================================================
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ============LICENSE_END=========================================================
+ -->
<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>
diff --git a/adaptors/ansible-adaptor/ansible-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/ansible/impl/AnsibleAdaptorImpl.java b/adaptors/ansible-adaptor/ansible-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/ansible/impl/AnsibleAdaptorImpl.java
index 790b10f92..8c9c14e54 100644
--- a/adaptors/ansible-adaptor/ansible-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/ansible/impl/AnsibleAdaptorImpl.java
+++ b/adaptors/ansible-adaptor/ansible-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/ansible/impl/AnsibleAdaptorImpl.java
@@ -56,7 +56,7 @@ public class AnsibleAdaptorImpl implements AnsibleAdaptor {
* Adaptor Name
*/
private static final String Adaptor_NAME = "Ansible Adaptor";
- private static final String APPC_EXCEPTION_CAUGHT = "APPCException caught";
+ private static final String SVC_LOGIC_EXCEPTION_CAUGHT = "SvcLogicException caught";
/**
* The logger to be used
@@ -254,7 +254,7 @@ public class AnsibleAdaptorImpl implements AnsibleAdaptor {
ctx.setAttribute("AnsibleTimeout", timeout);
logger.info("Updated Payload = {} timeout = {}", payload, timeout);
} catch (SvcLogicException e) {
- logger.error(APPC_EXCEPTION_CAUGHT, e);
+ logger.error(SVC_LOGIC_EXCEPTION_CAUGHT, e);
doFailure(ctx, AnsibleResultCodes.INVALID_PAYLOAD.getValue(),
"Error constructing request for execution of playbook due to missing mandatory parameters. Reason = "
+ e.getMessage());
@@ -302,7 +302,7 @@ public class AnsibleAdaptorImpl implements AnsibleAdaptor {
doFailure(ctx, code, "Ansible Test result is null");
}
} catch (SvcLogicException e) {
- logger.error(APPC_EXCEPTION_CAUGHT, e);
+ logger.error(SVC_LOGIC_EXCEPTION_CAUGHT, e);
doFailure(ctx, AnsibleResultCodes.UNKNOWN_EXCEPTION.getValue(),
"Exception encountered when posting request for execution of playbook. Reason = " + e.getMessage());
}
@@ -418,7 +418,7 @@ public class AnsibleAdaptorImpl implements AnsibleAdaptor {
}
logger.info("Got uri {}", reqUri);
} catch (SvcLogicException e) {
- logger.error(APPC_EXCEPTION_CAUGHT, e);
+ logger.error(SVC_LOGIC_EXCEPTION_CAUGHT, e);
doFailure(ctx, AnsibleResultCodes.INVALID_PAYLOAD.getValue(),
"Error constructing request to retrieve result due to missing parameters. Reason = "
+ e.getMessage());
@@ -463,7 +463,7 @@ public class AnsibleAdaptorImpl implements AnsibleAdaptor {
}
logger.info("Request response = " + message);
} catch (SvcLogicException e) {
- logger.error(APPC_EXCEPTION_CAUGHT, e);
+ logger.error(SVC_LOGIC_EXCEPTION_CAUGHT, e);
ctx.setAttribute(RESULTS_ATTRIBUTE_NAME, results);
ctx.setAttribute(OUTPUT_ATTRIBUTE_NAME, finalResponse);
doFailure(ctx, AnsibleResultCodes.UNKNOWN_EXCEPTION.getValue(),
diff --git a/adaptors/ansible-adaptor/ansible-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/ansible/impl/AnsibleAdaptorPropertiesProviderImpl.java b/adaptors/ansible-adaptor/ansible-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/ansible/impl/AnsibleAdaptorPropertiesProviderImpl.java
index d33fdd855..1ee032a4f 100644
--- a/adaptors/ansible-adaptor/ansible-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/ansible/impl/AnsibleAdaptorPropertiesProviderImpl.java
+++ b/adaptors/ansible-adaptor/ansible-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/ansible/impl/AnsibleAdaptorPropertiesProviderImpl.java
@@ -63,7 +63,7 @@ public class AnsibleAdaptorPropertiesProviderImpl implements AnsibleAdaptorPrope
/**
* The name of the properties file for database configuration
*/
- private static final String ANSIBLE_Adaptor_PROPERTIES = "ansible-adaptor.properties";
+ private static final String ANSIBLE_ADAPTOR_PROPERTIES = "ansible-adaptor.properties";
/**
* A prioritized list of strategies for resolving sql-resource properties files.
@@ -102,7 +102,7 @@ public class AnsibleAdaptorPropertiesProviderImpl implements AnsibleAdaptorPrope
}
} else {
// Try to read properties as resource
- InputStream propStr = getClass().getResourceAsStream("/" + ANSIBLE_Adaptor_PROPERTIES);
+ InputStream propStr = getClass().getResourceAsStream("/" + ANSIBLE_ADAPTOR_PROPERTIES);
if (propStr != null) {
properties = new EnvProperties();
try {
@@ -115,7 +115,7 @@ public class AnsibleAdaptorPropertiesProviderImpl implements AnsibleAdaptorPrope
}
if (properties == null) {
reportFailure(new ConfigurationException(
- "Missing configuration properties resource(3): " + ANSIBLE_Adaptor_PROPERTIES));
+ "Missing configuration properties resource(3): " + ANSIBLE_ADAPTOR_PROPERTIES));
LOG.info("Defaulting org.onap.appc.adaptor.ansible.clientType to TRUST_ALL");
properties = new Properties();
properties.setProperty("org.onap.appc.adaptor.ansible.clientType", "TRUST_ALL");
@@ -137,7 +137,7 @@ public class AnsibleAdaptorPropertiesProviderImpl implements AnsibleAdaptorPrope
}
if (properties == null) {
reportFailure(new ConfigurationException(
- "Missing configuration properties resource(3): " + ANSIBLE_Adaptor_PROPERTIES));
+ "Missing configuration properties resource(3): " + ANSIBLE_ADAPTOR_PROPERTIES));
LOG.info("Defaulting org.onap.appc.adaptor.ansible.clientType to TRUST_ALL");
properties = new Properties();
properties.setProperty("org.onap.appc.adaptor.ansible.clientType", "TRUST_ALL");
@@ -196,7 +196,7 @@ public class AnsibleAdaptorPropertiesProviderImpl implements AnsibleAdaptorPrope
*/
File determinePropertiesFile() {
for (final PropertiesFileResolver propertiesFileResolver : ansibleAdaptorPropertiesFileResolvers) {
- final Optional<File> fileOptional = propertiesFileResolver.resolveFile(ANSIBLE_Adaptor_PROPERTIES);
+ final Optional<File> fileOptional = propertiesFileResolver.resolveFile(ANSIBLE_ADAPTOR_PROPERTIES);
if (fileOptional.isPresent()) {
return reportSuccess(propertiesFileResolver.getSuccessfulResolutionMessage(), fileOptional);
}
diff --git a/adaptors/features/ccsdk-netconf-adaptor/pom.xml b/adaptors/features/ccsdk-netconf-adaptor/pom.xml
new file mode 100644
index 000000000..f6cb86c10
--- /dev/null
+++ b/adaptors/features/ccsdk-netconf-adaptor/pom.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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>
+
+ <parent>
+ <groupId>org.onap.ccsdk.parent</groupId>
+ <artifactId>single-feature-parent</artifactId>
+ <version>2.2.0-SNAPSHOT</version>
+ <relativePath/>
+ </parent>
+
+ <groupId>org.onap.ccsdk.sli.adaptors</groupId>
+ <artifactId>ccsdk-netconf-adaptor</artifactId>
+ <version>1.3.0-SNAPSHOT</version>
+ <packaging>feature</packaging>
+
+ <name>ccsdk-sli-adaptors :: features :: ${project.artifactId}</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>odl-mdsal-broker</artifactId>
+ <type>xml</type>
+ <classifier>features</classifier>
+ </dependency>
+ <dependency>
+ <groupId>org.onap.ccsdk.sli.core</groupId>
+ <artifactId>ccsdk-dblib</artifactId>
+ <type>xml</type>
+ <classifier>features</classifier>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>netconf-adaptor-bundle</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ </dependencies>
+</project>
diff --git a/adaptors/features/pom.xml b/adaptors/features/pom.xml
index 74dd2c2d3..0239755c7 100755
--- a/adaptors/features/pom.xml
+++ b/adaptors/features/pom.xml
@@ -22,6 +22,7 @@
<module>ccsdk-ansible-adaptor</module>
<module>ccsdk-chef-adaptor</module>
+ <module>ccsdk-netconf-adaptor</module>
<module>ccsdk-saltstack-adaptor</module>
<module>ccsdk-ssh-adaptor</module>
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/pom.xml b/adaptors/netconf-adaptor/netconf-adaptor-bundle/pom.xml
new file mode 100644
index 000000000..ec71a4838
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/pom.xml
@@ -0,0 +1,206 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ============LICENSE_START=======================================================
+ ONAP : APPC
+ ================================================================================
+ Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ Copyright (C) 2017 Amdocs
+ ================================================================================
+ 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=========================================================
+ -->
+<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>
+ <parent>
+ <groupId>org.onap.ccsdk.parent</groupId>
+ <artifactId>binding-parent</artifactId>
+ <version>2.2.0-SNAPSHOT</version>
+ <relativePath/>
+ </parent>
+
+ <groupId>org.onap.ccsdk.sli.adaptors</groupId>
+ <artifactId>netconf-adaptor-bundle</artifactId>
+ <version>1.3.0-SNAPSHOT</version>
+ <packaging>bundle</packaging>
+
+ <name>ccsdk-sli-adaptors :: ${project.artifactId}</name>
+
+ <properties>
+ <exam.version>4.9.1</exam.version>
+ <url.version>1.6.0</url.version>
+ <sal-netconf-connector.version>1.3.1-Beryllium-SR1</sal-netconf-connector.version>
+ <cdp.pal.version>1.1.25.8-oss</cdp.pal.version>
+ </properties>
+
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>org.onap.ccsdk.sli.core</groupId>
+ <artifactId>sli-core-artifacts</artifactId>
+ <version>${project.version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>com.att.eelf</groupId>
+ <artifactId>eelf-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>commons-codec</groupId>
+ <artifactId>commons-codec</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.httpcomponents</groupId>
+ <artifactId>httpcore</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.httpcomponents</groupId>
+ <artifactId>httpclient</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.onap.ccsdk.sli.core</groupId>
+ <artifactId>sli-common</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.onap.ccsdk.sli.core</groupId>
+ <artifactId>sli-provider</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.onap.ccsdk.sli.core</groupId>
+ <artifactId>dblib-provider</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>javax</groupId>
+ <artifactId>javaee-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>jcl-over-slf4j</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.json</groupId>
+ <artifactId>json</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ </dependency>
+ <!--
+ <dependency>
+ <groupId>com.att.cdp</groupId>
+ <artifactId>cdp-pal-common</artifactId>
+ <version>${cdp.pal.version}</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.att.cdp</groupId>
+ <artifactId>cdp-pal-openstack</artifactId>
+ <version>${cdp.pal.version}</version>
+ <scope>compile</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>com.att.cdp</groupId>
+ <artifactId>cdp-pal-common</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ -->
+ <dependency>
+ <groupId>javax.ws.rs</groupId>
+ <artifactId>javax.ws.rs-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>javax.xml.bind</groupId>
+ <artifactId>jaxb-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.jcraft</groupId>
+ <artifactId>jsch</artifactId>
+ <version>0.1.54</version>
+ </dependency>
+
+ <!-- Needed to run test cases -->
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.hamcrest</groupId>
+ <artifactId>hamcrest-all</artifactId>
+ <version>1.3</version>
+ <scope>test</scope>
+ </dependency>
+ <!-- Specifically using mockito version 1.10.19 to make sure junit works -->
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ <version>1.10.19</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-reflect</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-api-mockito2</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-module-junit4</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Bundle-SymbolicName>netconf-adaptor</Bundle-SymbolicName>
+ <Export-Package>org.onap.ccsdk.sli.adaptors.netconf</Export-Package>
+ <Import-Package>
+ !org.slf4j.event,org.w3c.dom.*,com.sun.org.apache.xerces.*,javax.sql.*,javax.sql.rowset.*,javax.xml.*,javax.crypto.*,org.mariadb.*,org.onap.ccsdk.sli.core.sli.*,org.onap.ccsdk.sli.core.dblib,org.osgi.framework.*,org.slf4j.*,com.vmware.*,org.apache.xerces.*,javax.net.*,javax.net.ssl.*,org.xml.sax.*,javax.xml.bind.*,javax.naming.*
+ </Import-Package>
+ <Embed-Dependency>
+ *;scope=compile|runtime;artifactId=!dblib-provider|sli-common|org.eclipse.osgi|slf4j-api|jcl-over-slf4j|mariadb-java-client|xml-apis
+ </Embed-Dependency>
+ <Embed-Transitive>true</Embed-Transitive>
+ </instructions>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/ConnectionDetails.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/ConnectionDetails.java
new file mode 100644
index 000000000..d9a593d8f
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/ConnectionDetails.java
@@ -0,0 +1,66 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.sli.adaptors.netconf;
+
+
+public class ConnectionDetails {
+
+ private String host;
+ private int port;
+ private String username;
+ private String password;
+
+ public String getHost() {
+ return host;
+ }
+
+ public void setHost(String host) {
+ this.host = host;
+ }
+
+ public int getPort() {
+ return port;
+ }
+
+ public void setPort(int port) {
+ this.port = port;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/HttpClient.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/HttpClient.java
new file mode 100644
index 000000000..e665db62f
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/HttpClient.java
@@ -0,0 +1,204 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.sli.adaptors.netconf;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.auth.AuthScope;
+import org.apache.http.auth.UsernamePasswordCredentials;
+import org.apache.http.client.CredentialsProvider;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.BasicCredentialsProvider;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.onap.ccsdk.sli.core.sli.SvcLogicException;
+import org.onap.ccsdk.sli.core.utils.configuration.Configuration;
+import org.onap.ccsdk.sli.core.utils.configuration.ConfigurationFactory;
+
+public class HttpClient {
+
+ private static final EELFLogger logger = EELFManager.getInstance().getLogger(HttpClient.class);
+
+ private static final Configuration configuration = ConfigurationFactory.getConfiguration();
+
+ @SuppressWarnings("deprecation")
+ public static int postMethod(String protocol, String ip, int port, String path, String payload,
+ String contentType) throws SvcLogicException {
+
+ logger.info("Sending POST request to " + path);
+
+ HttpPost post;
+ try {
+
+ URL serviceUrl = new URL(protocol, ip, port, path);
+ post = new HttpPost(serviceUrl.toExternalForm());
+ post.setHeader("Content-Type", contentType);
+
+ StringEntity entity = new StringEntity(payload);
+ entity.setContentType(contentType);
+ post.setEntity(new StringEntity(payload));
+ } catch (UnsupportedEncodingException | MalformedURLException e) {
+ throw new SvcLogicException(e.toString(), e);
+ }
+
+ logger.debug("Sending request " + post);
+
+ CredentialsProvider credsProvider = new BasicCredentialsProvider();
+ credsProvider.setCredentials(new AuthScope(ip, port), new UsernamePasswordCredentials(
+ configuration.getProperty("username"), configuration.getProperty("password")));
+ CloseableHttpClient client =
+ HttpClients.custom().setDefaultCredentialsProvider(credsProvider).build();
+
+ int httpCode;
+ try {
+ HttpResponse response = client.execute(post);
+ httpCode = response.getStatusLine().getStatusCode();
+ } catch (IOException e) {
+ throw new SvcLogicException(e.toString());
+ }
+ return httpCode;
+ }
+
+ @SuppressWarnings("deprecation")
+ public static int putMethod(String protocol, String ip, int port, String path, String payload,
+ String contentType) throws SvcLogicException {
+
+ logger.info("Sending PUT request to " + path);
+
+ HttpPut put;
+ try {
+
+ URL serviceUrl = new URL(protocol, ip, port, path);
+ put = new HttpPut(serviceUrl.toExternalForm());
+ put.setHeader("Content-Type", contentType);
+
+ StringEntity entity = new StringEntity(payload);
+ entity.setContentType(contentType);
+ put.setEntity(new StringEntity(payload));
+ } catch (UnsupportedEncodingException | MalformedURLException e) {
+ throw new SvcLogicException(e.toString());
+ }
+
+ logger.debug("Sending request " + put);
+
+ CredentialsProvider credsProvider = new BasicCredentialsProvider();
+ credsProvider.setCredentials(new AuthScope(ip, port), new UsernamePasswordCredentials(
+ configuration.getProperty("username"), configuration.getProperty("password")));
+ CloseableHttpClient client =
+ HttpClients.custom().setDefaultCredentialsProvider(credsProvider).build();
+
+ int httpCode;
+ try {
+ HttpResponse response = client.execute(put);
+ httpCode = response.getStatusLine().getStatusCode();
+ } catch (IOException e) {
+ throw new SvcLogicException(e.toString());
+ }
+ return httpCode;
+ }
+
+ @SuppressWarnings("deprecation")
+ public static String getMethod(String protocol, String ip, int port, String path,
+ String contentType) throws SvcLogicException {
+
+ logger.info("Sending GET request to " + path);
+
+ HttpGet get;
+ try {
+
+ URL serviceUrl = new URL(protocol, ip, port, path);
+ get = new HttpGet(serviceUrl.toExternalForm());
+ get.setHeader("Content-Type", contentType);
+ } catch (MalformedURLException e) {
+ throw new SvcLogicException(e.toString());
+ }
+
+ logger.debug("Sending request " + get);
+
+ CredentialsProvider credsProvider = new BasicCredentialsProvider();
+ credsProvider.setCredentials(new AuthScope(ip, port), new UsernamePasswordCredentials(
+ configuration.getProperty("username"), configuration.getProperty("password")));
+ CloseableHttpClient client =
+ HttpClients.custom().setDefaultCredentialsProvider(credsProvider).build();
+
+ int httpCode;
+ String result;
+
+ try {
+ HttpResponse response = client.execute(get);
+ httpCode = response.getStatusLine().getStatusCode();
+ result = (httpCode == HttpStatus.SC_OK) ? response.getEntity().toString() : null;
+ } catch (IOException e) {
+ throw new SvcLogicException(e.toString());
+ }
+
+ return result;
+ }
+
+ @SuppressWarnings("deprecation")
+ public static int deleteMethod(String protocol, String ip, int port, String path,
+ String contentType) throws SvcLogicException {
+
+ logger.info("Sending DELETE request to " + path);
+
+ HttpDelete delete;
+ try {
+
+ URL serviceUrl = new URL(protocol, ip, port, path);
+ delete = new HttpDelete(serviceUrl.toExternalForm());
+ delete.setHeader("Content-Type", contentType);
+ } catch (MalformedURLException e) {
+ throw new SvcLogicException(e.toString());
+ }
+
+ logger.debug("Sending request " + delete);
+
+ CredentialsProvider credsProvider = new BasicCredentialsProvider();
+ credsProvider.setCredentials(new AuthScope(ip, port), new UsernamePasswordCredentials(
+ configuration.getProperty("username"), configuration.getProperty("password")));
+ CloseableHttpClient client =
+ HttpClients.custom().setDefaultCredentialsProvider(credsProvider).build();
+
+ int httpCode;
+
+ try {
+ HttpResponse response = client.execute(delete);
+ httpCode = response.getStatusLine().getStatusCode();
+ } catch (IOException e) {
+ throw new SvcLogicException(e.toString());
+ }
+
+ return httpCode;
+ }
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/MockOperationalStateValidatorImpl.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/MockOperationalStateValidatorImpl.java
new file mode 100644
index 000000000..fceb4c3ce
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/MockOperationalStateValidatorImpl.java
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.sli.adaptors.netconf;
+
+import org.onap.ccsdk.sli.core.sli.SvcLogicException;
+
+public class MockOperationalStateValidatorImpl implements OperationalStateValidator {
+
+ @Override
+ public VnfType getVnfType() {
+ return VnfType.MOCK;
+ }
+
+ @Override
+ public String getConfigurationFileName() {
+ return OperationalStateValidatorFactory.configuration
+ .getProperty(this.getClass().getCanonicalName() + CONFIG_FILE_PROPERTY_SUFFIX);
+ }
+
+ @Override
+ public void validateResponse(String response) throws SvcLogicException {
+ if(response != null && response.toUpperCase().contains("INVALID")){
+ throw new SvcLogicException("INVALID");
+ }
+ }
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfAdaptorConstants.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfAdaptorConstants.java
new file mode 100644
index 000000000..1b41cada3
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfAdaptorConstants.java
@@ -0,0 +1,69 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.sli.adaptors.netconf;
+
+public class NetconfAdaptorConstants {
+
+ public static final String CONFIGURE_PATH = "/restconf/config/opendaylight-inventory:nodes/node/";
+ public static final String CONNECT_PATH = "/restconf/config/opendaylight-inventory:nodes/node/controller-config/yang-ext:mount/config:modules";
+ public static final String CHECK_CONNECTION_PATH = "/restconf/operational/opendaylight-inventory:nodes/node/";
+ public static final String DISCONNECT_PATH = "/restconf/config/opendaylight-inventory:nodes/node/controller-config/yang-ext:mount/config:modules/module/odl-sal-netconf-connector-cfg:sal-netconf-connector/";
+
+ public static final String CONTROLLER_IP = "127.0.0.1";
+ public static final int CONTROLLER_PORT = 8181;
+ public static final String PROTOCOL = "http";
+
+ // tables and fields
+ public static final String NETCONF_SCHEMA = "sdnctl";
+ public static final String DEVICE_AUTHENTICATION_TABLE_NAME = "DEVICE_AUTHENTICATION";
+ public static final String CONFIGFILES_TABLE_NAME = "CONFIGFILES";
+ public static final String DEVICE_INTERFACE_LOG_TABLE_NAME = "DEVICE_INTERFACE_LOG";
+ public static final String FILE_CONTENT_TABLE_FIELD_NAME = "FILE_CONTENT";
+ public static final String FILE_NAME_TABLE_FIELD_NAME = "FILE_NAME";
+ public static final String USER_NAME_TABLE_FIELD_NAME = "USER_NAME";
+ public static final String PASSWORD_TABLE_FIELD_NAME = "PASSWORD";
+ public static final String VM_HOST_TABLE_FIELD_NAME = "VM_HOST";
+ public static final String VM_NAME_TABLE_FIELD_NAME = "VM_NAME";
+ public static final String PORT_NUMBER_TABLE_FIELD_NAME = "PORT_NUMBER";
+ public static final String VNF_TYPE_TABLE_FIELD_NAME = "VNF_TYPE";
+ public static final String SERVICE_INSTANCE_ID_FIELD_NAME = "SERVICE_INSTANCE_ID";
+ public static final String REQUEST_ID_FIELD_NAME = "REQUEST_ID";
+ public static final String CREATION_DATE_FIELD_NAME = "CREATION_DATE";
+ public static final String LOG_FIELD_NAME = "LOG";
+
+ // input fields names
+ public static final String VNF_TYPE_FIELD_NAME = "org.onap.appc.vftype";
+ public static final String TARGET_VNF_TYPE = "target-vnf-type";
+ public static final String FILE_CONTENT_FIELD_NAME = "file-content";
+ public static final String CONNECTION_DETAILS_FIELD_NAME = "connection-details";
+ public static final String CONFIGURATION_FILE_FIELD_NAME = "configuration-file-name";
+ public static final String VNF_HOST_IP_ADDRESS_FIELD_NAME = "vnf-host-ip-address";
+ public static final String DG_ERROR_FIELD_NAME = "org.onap.appc.dg.error";
+ public static final String RESOURCEKEY = "resourceKey";
+ public static final String ATTRIBUTE_ERROR_MESSAGE = "error-message";
+ public static final String DG_OUTPUT_STATUS_MESSAGE = "output.status.message";
+
+ private NetconfAdaptorConstants() {
+ }
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClient.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClient.java
new file mode 100644
index 000000000..f9707e1fa
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClient.java
@@ -0,0 +1,63 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.sli.adaptors.netconf;
+
+import org.onap.ccsdk.sli.core.sli.SvcLogicException;
+
+
+
+public interface NetconfClient {
+
+ /**
+ * Open connection to netconf device.
+ *
+ * @param connectionDetails object providing details required for netconf connection
+ */
+ void connect(NetconfConnectionDetails connectionDetails) throws SvcLogicException;
+
+ /**
+ * Send Netconf message to device and receive response.
+ *
+ * @param message input netconf xml message
+ * @return output netconf xml message
+ */
+ String exchangeMessage(String message) throws SvcLogicException;
+
+ /**
+ * send configuration to Netconf server
+ *
+ * @param configuration - xml configuration payload
+ */
+ void configure(String configuration) throws SvcLogicException;
+
+ /**
+ * returns running configuration of Netconf server
+ */
+ String getConfiguration() throws SvcLogicException;
+
+ /**
+ * Disconnect from netconf device.
+ */
+ void disconnect() throws SvcLogicException;
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClientFactory.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClientFactory.java
new file mode 100644
index 000000000..d1e78a4cc
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClientFactory.java
@@ -0,0 +1,41 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.sli.adaptors.netconf;
+
+import org.onap.ccsdk.sli.adaptors.netconf.jsch.NetconfClientJsch;
+import org.onap.ccsdk.sli.adaptors.netconf.odlconnector.NetconfClientRestconfImpl;
+
+public class NetconfClientFactory {
+
+ public NetconfClient getNetconfClient(NetconfClientType type){
+
+ if(type==NetconfClientType.RESTCONF) {
+ return new NetconfClientRestconfImpl();
+ }else if(type == NetconfClientType.SSH){
+ return new NetconfClientJsch();
+ }
+
+ return null;
+ }
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClientRestconf.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClientRestconf.java
new file mode 100644
index 000000000..668d965e5
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClientRestconf.java
@@ -0,0 +1,67 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.sli.adaptors.netconf;
+
+import org.onap.ccsdk.sli.core.sli.SvcLogicException;
+
+
+
+public interface NetconfClientRestconf {
+
+ /*
+ mount device to controller
+ @param deviceMountPointName - the name of the mounting point in controller
+ @param payload - json data describing device info
+ */
+ void connect(String deviceMountPointName, String payload) throws SvcLogicException;
+
+ /*
+ check connection to device
+ @param deviceMountPointName - the name of the mounting point in controller
+ */
+ boolean checkConnection(String deviceMountPointName) throws SvcLogicException;
+
+ /*
+ send configuration to Netconf server
+ @param configuration - xml configuration payload
+ @param deviceMountPointName - the name of the mounting point in controller
+ @param moduleName - name of the yang model
+ @param nodeName - name of the node created in server
+ */
+ void configure(String configuration, String deviceMountPointName, String moduleName, String nodeName) throws SvcLogicException;
+
+ /*
+ returns configuration of Netconf server
+ @param deviceMountPointName - the name of the mounting point in controller
+ @param moduleName - name of the yang model
+ @param nodeName - name of the node created in server
+ */
+ String getConfiguration(String deviceName, String moduleName, String nodeName) throws SvcLogicException;
+
+ /*
+ unmount device
+ @param deviceMountPointName - the name of the mounting point in controller
+ */
+ void disconnect(String deviceMountPointName) throws SvcLogicException;
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClientType.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClientType.java
new file mode 100644
index 000000000..88d9f2cae
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClientType.java
@@ -0,0 +1,30 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.sli.adaptors.netconf;
+
+
+public enum NetconfClientType {
+ RESTCONF,
+ SSH
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfConnectionDetails.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfConnectionDetails.java
new file mode 100644
index 000000000..54b733b4d
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfConnectionDetails.java
@@ -0,0 +1,94 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.sli.adaptors.netconf;
+
+import java.util.List;
+import java.util.Properties;
+
+/**
+ * Provides details required for connecting to netconf device.
+ */
+public class NetconfConnectionDetails {
+
+ private String host;
+ private int port;
+ private String username;
+ private String password;
+
+ public static final int DEFAULT_PORT = 830;
+ private List<String> capabilities;
+ private Properties additionalProperties;
+
+ public NetconfConnectionDetails() {
+ super();
+ setPort(DEFAULT_PORT);
+ }
+ public String getHost() {
+ return host;
+ }
+
+ public void setHost(String host) {
+ this.host = host;
+ }
+
+ public int getPort() {
+ return port;
+ }
+
+ public void setPort(int port) {
+ this.port = port;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public List<String> getCapabilities() {
+ return capabilities;
+ }
+
+ public void setCapabilities(List<String> capabilities) {
+ this.capabilities = capabilities;
+ }
+
+ public Properties getAdditionalProperties() {
+ return additionalProperties;
+ }
+
+ public void setAdditionalProperties(Properties additionalProperties) {
+ this.additionalProperties = additionalProperties;
+ }
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfDataAccessService.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfDataAccessService.java
new file mode 100644
index 000000000..a5178c008
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfDataAccessService.java
@@ -0,0 +1,82 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.sli.adaptors.netconf;
+
+import org.onap.ccsdk.sli.adaptors.netconf.exception.DataAccessException;
+import org.onap.ccsdk.sli.core.dblib.DbLibService;
+
+
+@SuppressWarnings("JavaDoc")
+public interface NetconfDataAccessService {
+
+ /**
+ *
+ * @param schema
+ */
+ void setSchema(String schema);
+
+ /**
+ *
+ * @param dbLibService
+ */
+ void setDbLibService(DbLibService dbLibService);
+
+ /**
+ *
+ * @param xmlID
+ * @return
+ * @throws DataAccessException
+ */
+ String retrieveConfigFileName(String xmlID);
+
+ /**
+ *
+ * @param vnfType
+ * @param connectionDetails
+ * @return
+ * @throws DataAccessException
+ */
+ boolean retrieveConnectionDetails(String vnfType, ConnectionDetails connectionDetails);
+
+ /**
+ *
+ * @param vnfType
+ * @param connectionDetails
+ * @return
+ * @throws DataAccessException
+ */
+ boolean retrieveNetconfConnectionDetails(String vnfType, NetconfConnectionDetails connectionDetails);
+
+ /**
+ *
+ * @param instanceId
+ * @param requestId
+ * @param creationDate
+ * @param logText
+ * @return
+ * @throws DataAccessException
+ */
+ boolean logDeviceInteraction(String instanceId, String requestId, String creationDate, String logText);
+
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/OperationalStateValidator.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/OperationalStateValidator.java
new file mode 100644
index 000000000..3ffa20748
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/OperationalStateValidator.java
@@ -0,0 +1,35 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.sli.adaptors.netconf;
+
+import org.onap.ccsdk.sli.core.sli.SvcLogicException;
+
+
+public interface OperationalStateValidator {
+ public static final String CONFIG_FILE_PROPERTY_SUFFIX = "-CONFIG_FILE";
+ public VnfType getVnfType();
+ public String getConfigurationFileName();
+ public void validateResponse(String response) throws SvcLogicException;
+
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/OperationalStateValidatorFactory.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/OperationalStateValidatorFactory.java
new file mode 100644
index 000000000..52838252b
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/OperationalStateValidatorFactory.java
@@ -0,0 +1,56 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.sli.adaptors.netconf;
+
+import org.apache.commons.lang3.NotImplementedException;
+import org.onap.ccsdk.sli.core.utils.configuration.Configuration;
+import org.onap.ccsdk.sli.core.utils.configuration.ConfigurationFactory;
+
+public class OperationalStateValidatorFactory {
+ protected static final Configuration configuration = ConfigurationFactory.getConfiguration();
+
+ protected OperationalStateValidatorFactory() {}
+
+ public static OperationalStateValidator getOperationalStateValidator(String vnfType) {
+ VnfType vnfTypeEnum;
+ try {
+ vnfTypeEnum = VnfType.getVnfType(vnfType);
+ } catch (IllegalArgumentException e) {
+ throw new IllegalArgumentException("Illegal value in vnfType. vnfType="+vnfType,e);
+ }
+ return getOperationalStateValidator(vnfTypeEnum);
+ }
+
+ public static OperationalStateValidator getOperationalStateValidator(VnfType vnfType) {
+ switch (vnfType) {
+ case VNF:
+ case VNF_MOCK:
+ return new VNFOperationalStateValidatorImpl();
+ case MOCK:
+ return new MockOperationalStateValidatorImpl();
+ default:
+ throw new NotImplementedException("missing implementaion for the given vnfType:" + vnfType.name());
+ }
+ }
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/VNFOperationalStateValidatorImpl.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/VNFOperationalStateValidatorImpl.java
new file mode 100644
index 000000000..3a6b1428a
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/VNFOperationalStateValidatorImpl.java
@@ -0,0 +1,129 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.sli.adaptors.netconf;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.AbstractMap;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import org.apache.commons.lang3.StringUtils;
+import org.onap.ccsdk.sli.core.sli.SvcLogicException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+public class VNFOperationalStateValidatorImpl implements OperationalStateValidator {
+ private static final String OPERATIONAL_STATE_ELEMENT_NAME = "operationalState";
+
+ @Override
+ public VnfType getVnfType() {
+ return VnfType.VNF;
+ }
+
+ @Override
+ public String getConfigurationFileName() {
+ String configFileName = OperationalStateValidatorFactory.configuration
+ .getProperty(this.getClass().getCanonicalName() + CONFIG_FILE_PROPERTY_SUFFIX);
+ configFileName = configFileName == null ? "VnfGetOperationalStates" : configFileName;
+ return configFileName;
+ }
+
+ @Override
+ public void validateResponse(String response) throws SvcLogicException {
+ if(StringUtils.isEmpty(response)) {
+ throw new SvcLogicException("empty response");
+ }
+ try {
+ List<Map.Entry> operationalStateList = getOperationalStateList(response).orElseThrow(() ->
+ new SvcLogicException("response without any "+OPERATIONAL_STATE_ELEMENT_NAME+" element"));
+
+ if(operationalStateList.stream().anyMatch(this::isNotEnabled)) {
+ throw new SvcLogicException("at least one "+OPERATIONAL_STATE_ELEMENT_NAME+" is not in valid state. "
+ +operationalStateList.toString());
+ }
+
+ } catch (Exception e) {
+ throw new SvcLogicException(e.toString());
+ }
+ }
+
+ private boolean isNotEnabled(Map.Entry stateEntry) {
+ return !("ENABLED").equalsIgnoreCase((String)stateEntry.getValue());
+ }
+
+ private static Optional<List<Map.Entry>> getOperationalStateList(String xmlText) throws IOException, ParserConfigurationException, SAXException {
+ List<Map.Entry> entryList = null;
+
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ Document document = builder.parse(new ByteArrayInputStream(xmlText.getBytes(StandardCharsets.UTF_8)));
+
+ if(document != null) {
+ Element rootElement = document.getDocumentElement();
+ NodeList nodeList = rootElement.getElementsByTagName(OPERATIONAL_STATE_ELEMENT_NAME);
+ if (nodeList != null && nodeList.getLength() > 0) {
+ entryList = new ArrayList<>();
+ for (int i = 0; i < nodeList.getLength(); i++) {
+ Node node = nodeList.item(i);
+ String text = node.getTextContent();
+ String id = getElementID(node);
+ Map.Entry entry = new AbstractMap.SimpleEntry<>(id, text);
+ entryList.add(entry);
+ }
+ }
+ }
+ return Optional.ofNullable(entryList);
+ }
+
+ private static String getElementID(Node node) {
+ String id = null;
+ Node parentNode = node.getParentNode();
+ if (parentNode != null) {
+ if (node.getNodeType() == Node.ELEMENT_NODE) {
+ NodeList nodeList = ((Element) parentNode).getElementsByTagName("id");
+ if (nodeList != null && nodeList.getLength() > 0) {
+ Node idNode = nodeList.item(0);
+ id = idNode != null ? idNode.getTextContent() : null;
+ }
+ }else {
+ id = parentNode.getNodeValue()+"|"+parentNode.getTextContent();
+ }
+ }
+
+ id = StringUtils.isEmpty(id) ? null : StringUtils.normalizeSpace(id);
+ id = StringUtils.isBlank(id) ? null : id;
+ id = id != null ? id : "unknown-id";
+ return id;
+ }
+
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/VnfType.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/VnfType.java
new file mode 100644
index 000000000..7151899b3
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/VnfType.java
@@ -0,0 +1,57 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.sli.adaptors.netconf;
+
+public enum VnfType {
+ VNF("VNF"),
+ MOCK("MOCK"),
+ VNF_MOCK("MOCK"),
+ ;
+
+ String familyType;
+ String upperCaseName;
+ VnfType(String familyType) {
+ this.familyType = familyType;
+ this.upperCaseName = name().toUpperCase();
+ }
+
+ public VnfType getFamilyType() {
+ return VnfType.valueOf(familyType);
+ }
+
+ public String getUpperCaseName() {
+ return upperCaseName;
+ }
+
+ public static VnfType getVnfType(String inSensitiveCaseName){
+ String localUpperCaseName = inSensitiveCaseName.toUpperCase();
+ for(VnfType vnfType : VnfType.values()){
+ if(vnfType.getUpperCaseName().equals(localUpperCaseName)){
+ return vnfType;
+ }
+ }
+ throw new IllegalArgumentException(
+ "No enum with upperCaseName for this input value:" + inSensitiveCaseName );
+ }
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/exception/DataAccessException.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/exception/DataAccessException.java
new file mode 100644
index 000000000..37a129134
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/exception/DataAccessException.java
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.sli.adaptors.netconf.exception;
+
+
+public class DataAccessException extends RuntimeException {
+
+ private static final long serialVersionUID = -155423437162622414L;
+
+ public DataAccessException(){
+ // DataAccessException
+ }
+
+ public DataAccessException(String message){
+ super(message);
+ }
+
+ public DataAccessException(Throwable cause){
+ super(cause);
+ }
+
+ public DataAccessException(String message , Throwable cause){
+ super(message , cause);
+ }
+
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/exception/NetconfDAOException.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/exception/NetconfDAOException.java
new file mode 100644
index 000000000..35fbb29ae
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/exception/NetconfDAOException.java
@@ -0,0 +1,47 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.sli.adaptors.netconf.exception;
+
+public class NetconfDAOException extends RuntimeException {
+
+ private static final long serialVersionUID = -155423437162622414L;
+
+ public NetconfDAOException(){
+ // for NetconfDAOException
+ }
+
+ public NetconfDAOException(String message){
+ super(message);
+ }
+
+ public NetconfDAOException(Throwable cause){
+ super(cause);
+ }
+
+ public NetconfDAOException(String message , Throwable cause){
+ super(message , cause);
+ }
+
+
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/internal/NetconfAdaptor.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/internal/NetconfAdaptor.java
new file mode 100644
index 000000000..57903f6ad
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/internal/NetconfAdaptor.java
@@ -0,0 +1,128 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.sli.adaptors.netconf.internal;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import org.onap.ccsdk.sli.core.utils.configuration.ConfigurationFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Provides basic methods for exchanging netconf messages.
+ */
+public class NetconfAdaptor {
+
+ private static final Logger LOG = LoggerFactory.getLogger(NetconfAdaptor.class);
+ private static final long MAX_WAITING_TIME = 1800000;
+ private static final ExecutorService executor = Executors.newFixedThreadPool(5);
+
+ // device input stream
+ private final InputStream in;
+ // device output stream
+ private final OutputStream out;
+ private final long maxWaitingTime = ConfigurationFactory.getConfiguration().getLongProperty("org.onap.appc.netconf.recv.timeout", MAX_WAITING_TIME);
+
+ /**
+ * Constructor.
+ *
+ * @param in InputStream this instance will read netconf messages from
+ * @param out OutputStream this instance will write netconf messages to
+ *
+ * @throws IOException the io exception
+ */
+ public NetconfAdaptor(InputStream in, OutputStream out) throws IOException {
+ this.in = in;
+ this.out = out;
+ }
+
+ /**
+ * Receives netconf message from InputStream and return it's text (without netconf frame characters).
+ *
+ * @return text of message received from netconf device
+ *
+ * @throws IOException the io exception
+ */
+ public String receiveMessage() throws IOException {
+
+ final NetconfMessage message = new NetconfMessage();
+ final byte[] buf = new byte[1024];
+
+ // Read data with timeout
+ Callable<Boolean> readTask = () -> {
+ int c;
+ while ((c = in.read(buf)) > 0) {
+ message.append(buf, 0, c);
+ if (message.isCompleted()) {
+ break;
+ }
+ }
+
+ return c >= 0;
+ };
+
+ Future<Boolean> future = executor.submit(readTask);
+ Boolean status;
+ try {
+ status = future.get(maxWaitingTime, TimeUnit.MILLISECONDS);
+ } catch (Exception e) {
+ throw new IOException(e);
+ }
+
+ if (!status) {
+ throw new IOException("Failed to read netconf message");
+ }
+
+ String text = message.getText();
+ if (text != null) {
+ text = text.trim();
+ }
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Received message from netconf device:\n" + text);
+ }
+ return text;
+ }
+
+ /**
+ * Sends netconf message with provided text (adds netconf frame characters and sends the message).
+ *
+ * @param text text of message to be sent to netconf device
+ *
+ * @throws IOException the io exception
+ */
+ public void sendMessage(final String text) throws IOException {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Sending message to netconf device:\n" + text);
+ }
+ out.write(new NetconfMessage(text).getFrame());
+ out.flush();
+ }
+
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/internal/NetconfAdaptor2.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/internal/NetconfAdaptor2.java
new file mode 100644
index 000000000..54ea65fdb
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/internal/NetconfAdaptor2.java
@@ -0,0 +1,127 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.sli.adaptors.netconf.internal;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Provides basic methods for exchanging netconf messages.
+ */
+public class NetconfAdaptor2 {
+
+ private static final Logger LOG = LoggerFactory.getLogger(NetconfAdaptor2.class);
+
+ // device input pipe
+ private final PipedOutputStream pipedOutIn = new PipedOutputStream();
+ private final PipedInputStream in;
+ // device output pipe
+ private final PipedInputStream pipedInOut = new PipedInputStream();
+ private final PipedOutputStream out;
+
+ /**
+ * Constructor.
+ *
+ * @throws IOException the io exception
+ */
+ public NetconfAdaptor2() throws IOException {
+ in = new PipedInputStream(pipedOutIn);
+ out = new PipedOutputStream(pipedInOut);
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param in InputStream this instance will read netconf messages from
+ * @param out OutputStream this instance will write netconf messages to
+ *
+ * @throws IOException the io exception
+ */
+ public NetconfAdaptor2(PipedInputStream in, PipedOutputStream out) throws IOException {
+ this.in = in;
+ this.out = out;
+
+ }
+
+ /**
+ * Gets in.
+ *
+ * @return InputStream this instance will read netconf messages from.
+ */
+ public InputStream getIn() {
+ return in;
+ }
+
+ /**
+ * Gets out.
+ *
+ * @return OutputStream this instance will write netconf messages to.
+ */
+ public OutputStream getOut() {
+ return out;
+ }
+
+ /**
+ * Receives netconf message from InputStream and return it's text (without netconf frame characters).
+ *
+ * @return text of message received from netconf device
+ *
+ * @throws IOException the io exception
+ */
+ public String receiveMessage() throws IOException {
+ NetconfMessage message = new NetconfMessage();
+ byte[] buf = new byte[1024];
+ int c;
+ while((c = pipedInOut.read(buf)) > 0) {
+ message.append(buf, 0, c);
+ if (message.isCompleted()) {
+ break;
+ }
+ }
+ String text = message.getText();
+ if(LOG.isDebugEnabled()) {
+ LOG.debug("Received message from netconf device:\n" + text);
+ }
+ return text;
+ }
+
+ /**
+ * Sends netconf message with provided text (adds netconf frame characters and sends the message).
+ *
+ * @param text text of message to be sent to netconf device
+ *
+ * @throws IOException the io exception
+ */
+ public void sendMessage(final String text) throws IOException {
+ if(LOG.isDebugEnabled()) {
+ LOG.debug("Sending message to netconf device:\n" + text);
+ }
+ pipedOutIn.write(new NetconfMessage(text).getFrame());
+ }
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/internal/NetconfConstMessages.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/internal/NetconfConstMessages.java
new file mode 100644
index 000000000..fa1384f3e
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/internal/NetconfConstMessages.java
@@ -0,0 +1,59 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.sli.adaptors.netconf.internal;
+
+public class NetconfConstMessages {
+
+ private static final String XML_HEADER = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+
+ public static final String CAPABILITIES_START =
+ XML_HEADER +
+ "<hello xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n" +
+ " <capabilities>\n";
+
+ public static final String CAPABILITIES_BASE =
+ " <capability>urn:ietf:params:netconf:base:1.0</capability>\n";
+
+ public static final String CAPABILITIES_END =
+ " </capabilities>\n" +
+ "</hello>";
+
+ public static final String GET_RUNNING_CONFIG =
+ XML_HEADER +
+ "<rpc message-id=\"1\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n" +
+ " <get-config>\n" +
+ " <source>\n" +
+ " <running/>\n" +
+ " </source>\n" +
+ " </get-config>\n" +
+ "</rpc>";
+
+ public static final String CLOSE_SESSION =
+ XML_HEADER +
+ "<rpc message-id=\"terminateConnection\" xmlns:netconf=\"urn:ietf:params:xml:ns:netconf:base:1.0\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n" +
+ " <close-session/>\n" +
+ "</rpc>";
+
+ private NetconfConstMessages() {}
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/internal/NetconfDataAccessServiceImpl.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/internal/NetconfDataAccessServiceImpl.java
new file mode 100644
index 000000000..a56565d74
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/internal/NetconfDataAccessServiceImpl.java
@@ -0,0 +1,146 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * ================================================================================
+ * Modifications Copyright (C) 2019 Ericsson
+ * =============================================================================
+ * 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.sli.adaptors.netconf.internal;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import javax.sql.rowset.CachedRowSet;
+import org.onap.ccsdk.sli.adaptors.netconf.ConnectionDetails;
+import org.onap.ccsdk.sli.adaptors.netconf.NetconfAdaptorConstants;
+import org.onap.ccsdk.sli.adaptors.netconf.NetconfConnectionDetails;
+import org.onap.ccsdk.sli.adaptors.netconf.NetconfDataAccessService;
+import org.onap.ccsdk.sli.adaptors.netconf.exception.DataAccessException;
+import org.onap.ccsdk.sli.core.dblib.DbLibService;
+
+public class NetconfDataAccessServiceImpl implements NetconfDataAccessService {
+
+ private final EELFLogger logger = EELFManager.getInstance().getLogger(NetconfDataAccessServiceImpl.class);
+
+ private String schema;
+
+ private DbLibService dbLibService;
+
+ @Override
+ public void setSchema(String schema) {
+ this.schema = schema;
+ }
+
+ @Override
+ public void setDbLibService(DbLibService service) {dbLibService = service;}
+
+ @Override
+ public String retrieveConfigFileName(String xmlID) {
+ String fileContent = "";
+
+ String queryString = "select " + NetconfAdaptorConstants.FILE_CONTENT_TABLE_FIELD_NAME + " " +
+ "from " + NetconfAdaptorConstants.CONFIGFILES_TABLE_NAME + " " +
+ "where " + NetconfAdaptorConstants.FILE_NAME_TABLE_FIELD_NAME + " = ?";
+
+ ArrayList<String> argList = new ArrayList<>();
+ argList.add(xmlID);
+
+ try {
+ final CachedRowSet data = dbLibService.getData(queryString, argList, schema);
+ if (data.first()) {
+ fileContent = data.getString(NetconfAdaptorConstants.FILE_CONTENT_TABLE_FIELD_NAME);
+ }
+ } catch (Exception e) {
+ logger.error("Error Accessing Database " + e);
+ throw new DataAccessException(e);
+ }
+
+ return fileContent;
+ }
+
+ @Override
+ public boolean retrieveConnectionDetails(String vnfType, ConnectionDetails connectionDetails) {
+ boolean recordFound = false;
+
+ String queryString = "select " + NetconfAdaptorConstants.USER_NAME_TABLE_FIELD_NAME + "," +
+ NetconfAdaptorConstants.PASSWORD_TABLE_FIELD_NAME + "," + NetconfAdaptorConstants.PORT_NUMBER_TABLE_FIELD_NAME + " " +
+ "from " + NetconfAdaptorConstants.DEVICE_AUTHENTICATION_TABLE_NAME + " " +
+ "where " + NetconfAdaptorConstants.VNF_TYPE_TABLE_FIELD_NAME + " = ?";
+
+ ArrayList<String> argList = new ArrayList<>();
+ argList.add(vnfType);
+
+ try {
+ final CachedRowSet data = dbLibService.getData(queryString, argList, schema);
+ if (data.first()) {
+ connectionDetails.setUsername(data.getString(NetconfAdaptorConstants.USER_NAME_TABLE_FIELD_NAME));
+ connectionDetails.setPassword(data.getString(NetconfAdaptorConstants.PASSWORD_TABLE_FIELD_NAME));
+ connectionDetails.setPort(data.getInt(NetconfAdaptorConstants.PORT_NUMBER_TABLE_FIELD_NAME));
+ recordFound = true;
+ }
+ } catch (SQLException e) {
+ logger.error("Error Accessing Database " + e);
+ throw new DataAccessException(e);
+ }
+
+ return recordFound;
+ }
+
+ @Override
+ public boolean retrieveNetconfConnectionDetails(String vnfType, NetconfConnectionDetails connectionDetails) {
+ ConnectionDetails connDetails = new ConnectionDetails();
+ if(this.retrieveConnectionDetails(vnfType, connDetails))
+ {
+ connectionDetails.setHost(connDetails.getHost());
+ connectionDetails.setPort(connDetails.getPort());
+ connectionDetails.setUsername(connDetails.getUsername());
+ connectionDetails.setPassword(connDetails.getPassword());
+ }
+ return true;
+ }
+
+ @Override
+ public boolean logDeviceInteraction(String instanceId, String requestId, String creationDate, String logText) {
+ String queryString = "INSERT INTO " + NetconfAdaptorConstants.DEVICE_INTERFACE_LOG_TABLE_NAME + "(" +
+ NetconfAdaptorConstants.SERVICE_INSTANCE_ID_FIELD_NAME + "," +
+ NetconfAdaptorConstants.REQUEST_ID_FIELD_NAME + "," +
+ NetconfAdaptorConstants.CREATION_DATE_FIELD_NAME + "," +
+ NetconfAdaptorConstants.LOG_FIELD_NAME + ") ";
+ queryString += "values(?,?,?,?)";
+
+ ArrayList<String> argList = new ArrayList<>();
+ argList.add(instanceId);
+ argList.add(requestId);
+ argList.add(creationDate);
+ argList.add(logText);
+
+ try {
+ dbLibService.writeData(queryString, argList, schema);
+ } catch (SQLException e) {
+ logger.error("Logging Device interaction failed - " + queryString);
+ throw new DataAccessException(e);
+ }
+
+ return true;
+ }
+
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/internal/NetconfMessage.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/internal/NetconfMessage.java
new file mode 100644
index 000000000..800126a26
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/internal/NetconfMessage.java
@@ -0,0 +1,97 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.sli.adaptors.netconf.internal;
+
+import java.io.ByteArrayOutputStream;
+
+class NetconfMessage {
+
+ private static final String EOM = "]]>]]>";
+
+ private String text;
+ private MessageBuffer buffer = new MessageBuffer();
+ private int eomNotch;
+
+ NetconfMessage() {
+ }
+
+ NetconfMessage(String text) {
+ if(text == null) {
+ throw new NullPointerException("Netconf message payload is null");
+ }
+ append(text.getBytes(), 0, text.length());
+ if(this.text == null) {
+ this.text = text;
+ }
+ }
+
+ void append(byte[] bytes, int start, int finish) {
+ boolean eomFound = false;
+ int end = finish;
+ for(int i = start; i < end; i++) {
+ if(bytes[i] == EOM.charAt(eomNotch)) {
+ // advance notch
+ eomNotch++;
+ } else {
+ // reset notch
+ eomNotch = 0;
+ }
+ if(eomNotch == EOM.length()) {
+ // end of message found
+ eomFound = true;
+ end = i + 1;
+ break;
+ }
+ }
+ buffer.write(bytes, start, end);
+ if(eomFound) {
+ text = new String(buffer.getBytes(), 0, buffer.size() - EOM.length());
+ buffer.reset();
+ }
+ }
+
+ String getText() {
+ return text;
+ }
+
+ boolean isCompleted() {
+ return text != null;
+ }
+
+ byte[] getFrame() {
+ StringBuilder sb = new StringBuilder();
+ if(text != null) {
+ sb.append(text).append("\n");
+ }
+ sb.append(EOM);
+ return sb.toString().getBytes();
+ }
+
+ private class MessageBuffer extends ByteArrayOutputStream {
+
+ byte[] getBytes() {
+ return buf;
+ }
+ }
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/JSchLogger.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/JSchLogger.java
new file mode 100644
index 000000000..0084a1fb0
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/JSchLogger.java
@@ -0,0 +1,64 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.sli.adaptors.netconf.jsch;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * JSch logger implementation delegating to logback.
+ */
+public class JSchLogger implements com.jcraft.jsch.Logger {
+
+ private static final Logger LOG = LoggerFactory.getLogger(JSchLogger.class);
+
+ @Override
+ public boolean isEnabled(int level) {
+ return true;
+ }
+
+ @Override
+ public void log(int level, String message) {
+ switch(level) {
+ case com.jcraft.jsch.Logger.DEBUG:
+ LOG.debug(message);
+ break;
+
+ case com.jcraft.jsch.Logger.INFO:
+ LOG.info(message);
+ break;
+
+ case com.jcraft.jsch.Logger.WARN:
+ LOG.warn(message);
+ break;
+
+ case com.jcraft.jsch.Logger.ERROR:
+ case com.jcraft.jsch.Logger.FATAL:
+ LOG.error(message);
+ break;
+ default:
+ break;
+ }
+ }
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/NetconfClientJsch.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/NetconfClientJsch.java
new file mode 100644
index 000000000..210fb5835
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/NetconfClientJsch.java
@@ -0,0 +1,184 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * ================================================================================
+ * Modifications Copyright (C) 2018 Ericsson
+ * =============================================================================
+ * 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.sli.adaptors.netconf.jsch;
+
+import com.att.eelf.i18n.EELFResourceManager;
+import com.jcraft.jsch.Channel;
+import com.jcraft.jsch.ChannelSubsystem;
+import com.jcraft.jsch.JSch;
+import com.jcraft.jsch.Session;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+import java.util.Properties;
+import org.onap.ccsdk.sli.adaptors.netconf.NetconfClient;
+import org.onap.ccsdk.sli.adaptors.netconf.NetconfConnectionDetails;
+import org.onap.ccsdk.sli.adaptors.netconf.internal.NetconfAdaptor;
+import org.onap.ccsdk.sli.adaptors.netconf.internal.NetconfConstMessages;
+import org.onap.ccsdk.sli.core.sli.SvcLogicException;
+import org.onap.ccsdk.sli.core.utils.encryption.EncryptionTool;
+import org.onap.ccsdk.sli.core.utils.logging.Msg;
+
+/**
+ * Implementation of NetconfClient interface based on JCraft jsch library.
+ */
+public class NetconfClientJsch implements NetconfClient {
+
+ private static final int SESSION_CONNECT_TIMEOUT = 30000;
+ private static final int CHANNEL_CONNECT_TIMEOUT = 10000;
+
+ private Session session;
+ private Channel channel;
+ private NetconfAdaptor netconfAdaptor;
+
+
+ @Override
+ public void connect(NetconfConnectionDetails connectionDetails) throws SvcLogicException {
+ String host = connectionDetails.getHost();
+ int port = connectionDetails.getPort();
+ String username = connectionDetails.getUsername();
+ String password = connectionDetails.getPassword();
+ try {
+ JSch.setLogger(new JSchLogger());
+ JSch jsch = getJSch();
+ session = jsch.getSession(EncryptionTool.getInstance().decrypt(username), host, port);
+ session.setPassword(EncryptionTool.getInstance().decrypt(password));
+ session.setConfig("StrictHostKeyChecking", "no");
+
+ Properties additionalProps = connectionDetails.getAdditionalProperties();
+ if((additionalProps != null) && !additionalProps.isEmpty()) {
+ session.setConfig(additionalProps);
+ }
+
+ session.connect(SESSION_CONNECT_TIMEOUT);
+ session.setTimeout(10000);
+
+ createConnection(connectionDetails);
+
+ } catch(Exception e) {
+ String message = EELFResourceManager.format(Msg.CANNOT_ESTABLISH_CONNECTION, host, String.valueOf(port), username);
+ throw new SvcLogicException(message, e);
+ }
+ }
+
+ @Override
+ public String exchangeMessage(String message) throws SvcLogicException {
+ try {
+ netconfAdaptor.sendMessage(message);
+ return netconfAdaptor.receiveMessage();
+ } catch(IOException e) {
+ throw new SvcLogicException(e.toString());
+ }
+ }
+
+ @Override
+ public void configure(String configuration) throws SvcLogicException {
+ try {
+ isOk(exchangeMessage(configuration));
+ } catch(IOException e) {
+ throw new SvcLogicException(e.toString());
+ }
+ }
+
+ @Override
+ public String getConfiguration() throws SvcLogicException {
+ return exchangeMessage(NetconfConstMessages.GET_RUNNING_CONFIG);
+ }
+
+ @Override
+ public void disconnect() {
+ try {
+ if((channel != null) && !channel.isClosed()) {
+ netconfAdaptor.sendMessage(NetconfConstMessages.CLOSE_SESSION);
+ isOk(netconfAdaptor.receiveMessage());
+ }
+ } catch(IOException e) {
+ throw new RuntimeException("Error closing netconf device", e);
+ } finally {
+ netconfAdaptor = null;
+ if(channel != null) {
+ channel.disconnect();
+ channel = null;
+ }
+ if(session != null) {
+ session.disconnect();
+ session = null;
+ }
+ }
+ }
+
+ private void createConnection(NetconfConnectionDetails connectionDetails) throws SvcLogicException {
+ try {
+ channel = session.openChannel("subsystem");
+ ((ChannelSubsystem)channel).setSubsystem("netconf");
+ netconfAdaptor = getNetconfAdaptor(channel.getInputStream(), channel.getOutputStream());
+ channel.connect(CHANNEL_CONNECT_TIMEOUT);
+ hello(connectionDetails.getCapabilities());
+ } catch(Exception e) {
+ disconnect();
+ throw new SvcLogicException(e.toString());
+ }
+ }
+
+ private void hello(List<String> capabilities) throws IOException {
+ String helloIn = netconfAdaptor.receiveMessage();
+ if(helloIn == null) {
+ throw new IOException("Expected hello message, but nothing received from netconf device");
+ }
+ if(helloIn.contains("<rpc-error>")) {
+ throw new IOException("Expected hello message, but received error from netconf device:\n" + helloIn);
+ }
+ StringBuilder sb = new StringBuilder();
+ sb.append(NetconfConstMessages.CAPABILITIES_START);
+ sb.append(NetconfConstMessages.CAPABILITIES_BASE);
+ if(capabilities != null) {
+ for(String capability: capabilities) {
+ sb.append(" ").append(capability).append("\n");
+ }
+ }
+ sb.append(NetconfConstMessages.CAPABILITIES_END);
+ String helloOut = sb.toString();
+ netconfAdaptor.sendMessage(helloOut);
+ }
+
+ private void isOk(String response) throws IOException {
+ if(response == null) {
+ throw new IOException("No response from netconf device");
+ }
+ if(!response.contains("<ok/>")) {
+ throw new IOException("Error response from netconf device: \n" + response);
+ }
+ }
+
+ protected JSch getJSch() {
+ return new JSch();
+ }
+
+ protected NetconfAdaptor getNetconfAdaptor(InputStream inputStream, OutputStream outputStream) throws IOException {
+ return new NetconfAdaptor(inputStream, outputStream);
+ }
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/odlconnector/NetconfClientRestconfImpl.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/odlconnector/NetconfClientRestconfImpl.java
new file mode 100644
index 000000000..41590edce
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/odlconnector/NetconfClientRestconfImpl.java
@@ -0,0 +1,246 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * ================================================================================
+ * Modifications Copyright (C) 2019 Ericsson
+ * =============================================================================
+ * 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.sli.adaptors.netconf.odlconnector;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import java.util.Properties;
+import org.apache.http.HttpStatus;
+import org.onap.ccsdk.sli.adaptors.netconf.HttpClient;
+import org.onap.ccsdk.sli.adaptors.netconf.NetconfAdaptorConstants;
+import org.onap.ccsdk.sli.adaptors.netconf.NetconfClient;
+import org.onap.ccsdk.sli.adaptors.netconf.NetconfClientRestconf;
+import org.onap.ccsdk.sli.adaptors.netconf.NetconfConnectionDetails;
+import org.onap.ccsdk.sli.core.sli.SvcLogicException;
+
+public class NetconfClientRestconfImpl implements NetconfClient, NetconfClientRestconf {
+
+ private final EELFLogger logger = EELFManager.getInstance().getLogger(NetconfClientRestconfImpl.class);
+
+ private NetconfConnectionDetails connectionDetails;
+ private final String appFormat = "application/json";
+
+ public NetconfClientRestconfImpl(){
+ //constructor
+ }
+
+ //restconf client impl
+
+ @SuppressWarnings("deprecation")
+ @Override
+ public void configure(String configuration, String deviceMountPointName, String moduleName, String nodeName) throws SvcLogicException {
+
+ logger.info("Configuring device " + deviceMountPointName + " with configuration " + configuration);
+
+ int httpCode = HttpClient.putMethod(NetconfAdaptorConstants.PROTOCOL, NetconfAdaptorConstants.CONTROLLER_IP, NetconfAdaptorConstants.CONTROLLER_PORT,
+ getModuleConfigurePath(deviceMountPointName, moduleName, nodeName), configuration, appFormat);
+
+ if (httpCode != HttpStatus.SC_OK) {
+ logger.error("Configuration request failed. throwing Exception !");
+ throw new SvcLogicException("Error configuring node :" + nodeName + ", of Module :" + moduleName +
+ ", in device :" + deviceMountPointName);
+ }
+ }
+
+ @Override
+ public void connect(String deviceMountPointName, String payload) throws SvcLogicException{
+
+ logger.info("Connecting device " + deviceMountPointName);
+
+ int httpCode = HttpClient.postMethod(NetconfAdaptorConstants.PROTOCOL, NetconfAdaptorConstants.CONTROLLER_IP, NetconfAdaptorConstants.CONTROLLER_PORT,
+ getConnectPath(), payload, appFormat);
+
+ if(httpCode != HttpStatus.SC_NO_CONTENT){
+ logger.error("Connect request failed with code " + httpCode + ". throwing Exception !");
+ throw new SvcLogicException("Error connecting device :" + deviceMountPointName);
+ }
+ }
+
+ @Override
+ public boolean checkConnection(String deviceMountPointName) throws SvcLogicException {
+ logger.info("Checking device " + deviceMountPointName + " connectivity");
+
+ String result = HttpClient.getMethod(NetconfAdaptorConstants.PROTOCOL, NetconfAdaptorConstants.CONTROLLER_IP,
+ NetconfAdaptorConstants.CONTROLLER_PORT, getCheckConnectivityPath(deviceMountPointName), appFormat);
+
+ return result != null;
+ }
+
+ @Override
+ public void disconnect(String deviceMountPointName) throws SvcLogicException {
+ logger.info("Disconnecting " + deviceMountPointName);
+
+ int httpCode = HttpClient.deleteMethod(NetconfAdaptorConstants.PROTOCOL, NetconfAdaptorConstants.CONTROLLER_IP, NetconfAdaptorConstants.CONTROLLER_PORT,
+ getDisconnectPath(deviceMountPointName), appFormat);
+
+ if(httpCode != HttpStatus.SC_OK){
+ logger.error("Disconnection of device " + deviceMountPointName + " failed!");
+ throw new SvcLogicException("Disconnection of device " + deviceMountPointName + " failed!");
+ }
+ }
+
+ @Override
+ public String getConfiguration(String deviceMountPointName, String moduleName, String nodeName) throws SvcLogicException{
+ logger.info("Getting configuration of device " + deviceMountPointName);
+
+ String result = HttpClient.getMethod(NetconfAdaptorConstants.PROTOCOL, NetconfAdaptorConstants.CONTROLLER_IP, NetconfAdaptorConstants.CONTROLLER_PORT,
+ getModuleConfigurePath(deviceMountPointName, moduleName, nodeName), appFormat);
+
+ if (result == null) {
+ logger.error("Configuration request failed. throwing Exception !");
+ throw new SvcLogicException("Error getting configuration of node :" + nodeName + ", of Module :" + moduleName +
+ ", in device :" + deviceMountPointName);
+ }
+
+ return result;
+ }
+
+ //netconf client impl
+
+ @Override
+ public void connect(NetconfConnectionDetails connectionDetails) throws SvcLogicException {
+ if(connectionDetails == null){
+ throw new SvcLogicException("Invalid connection details - null value");
+ }
+ this.connectionDetails = connectionDetails;
+ this.connect(connectionDetails.getHost(), getPayload());
+ }
+
+ @Override
+ public String exchangeMessage(String message) throws SvcLogicException {
+ // TODO implement
+ return null;
+ }
+
+ @Override
+ public void configure(String configuration) throws SvcLogicException {
+ if(connectionDetails == null){
+ throw new SvcLogicException("Invalid connection details - null value");
+ }
+
+ Properties props = connectionDetails.getAdditionalProperties();
+ if(props == null || !props.containsKey("module.name") || !props.containsKey("node.name")) {
+ throw new SvcLogicException("Invalid properties!");
+ }
+
+ String moduleName = props.getProperty("module.name");
+ String nodeName = props.getProperty("node.name");
+ String deviceMountPointName = connectionDetails.getHost();
+
+ int httpCode = HttpClient.putMethod(NetconfAdaptorConstants.PROTOCOL, NetconfAdaptorConstants.CONTROLLER_IP, NetconfAdaptorConstants.CONTROLLER_PORT,
+ getModuleConfigurePath(deviceMountPointName, moduleName, nodeName), configuration, "application/xml");
+
+ if (httpCode != HttpStatus.SC_OK) {
+ logger.error("Configuration request failed. throwing Exception !");
+ throw new SvcLogicException("Error configuring node :" + nodeName + ", of Module :" + moduleName +
+ ", in device :" + deviceMountPointName);
+ }
+ }
+
+ @Override
+ public String getConfiguration() throws SvcLogicException {
+ if(connectionDetails == null){
+ throw new SvcLogicException("Invalid connection details - null value");
+ }
+
+ Properties props = connectionDetails.getAdditionalProperties();
+ if(props == null || !props.containsKey("module.name") || !props.containsKey("node.name")) {
+ throw new SvcLogicException("Invalid properties!");
+ }
+
+ return this.getConfiguration(connectionDetails.getHost(), props.getProperty("module.name"),
+ props.getProperty("node.name"));
+ }
+
+ @Override
+ public void disconnect() throws SvcLogicException {
+ if(connectionDetails == null){
+ throw new SvcLogicException("Invalid connection details - null value");
+ }
+ this.disconnect(connectionDetails.getHost());
+ }
+
+ //private methods
+ private String getModuleConfigurePath(String deviceMountPointName, String moduleName, String nodeName){
+
+ String deviceSpecificPath = deviceMountPointName + "/yang-ext:mount/" + moduleName + ":" + nodeName;
+
+ return NetconfAdaptorConstants.CONFIGURE_PATH + deviceSpecificPath;
+ }
+
+ private String getConnectPath(){
+
+ return NetconfAdaptorConstants.CONNECT_PATH;
+ }
+
+ private String getCheckConnectivityPath(String deviceMountPointName) {
+ return NetconfAdaptorConstants.CHECK_CONNECTION_PATH + deviceMountPointName;
+ }
+
+ private String getDisconnectPath(String deviceMountPointName) {
+ return NetconfAdaptorConstants.DISCONNECT_PATH + deviceMountPointName;
+ }
+
+ private String getPayload() {
+ return "{\n" +
+ " \"config:module\":\n" +
+ " {\n" +
+ " \"type\":\"odl-sal-netconf-connector-cfg:sal-netconf-connector\",\n" +
+ " \"netconf-northbound-ssh\\odl-sal-netconf-connector-cfg:name\":"+connectionDetails.getHost()+",\n" +
+ " \"odl-sal-netconf-connector-cfg:address\":"+connectionDetails.getHost()+",\n" +
+ " \"odl-sal-netconf-connector-cfg:port\":"+connectionDetails.getPort()+",\n" +
+ " \"odl-sal-netconf-connector-cfg:username\":"+connectionDetails.getUsername()+",\n" +
+ " \"odl-sal-netconf-connector-cfg:password\":"+connectionDetails.getPassword()+",\n" +
+ " \"tcp-only\":\"false\",\n" +
+ " \"odl-sal-netconf-connector-cfg:event-executor\":\n" +
+ " {\n" +
+ " \"type\":\"netty:netty-event-executor\",\n" +
+ " \"name\":\"global-event-executor\"\n" +
+ " },\n" +
+ " \"odl-sal-netconf-connector-cfg:binding-registry\":\n" +
+ " {\n" +
+ " \"type\":\"opendaylight-md-sal-binding:binding-broker-osgi-registry\",\n" +
+ " \"name\":\"binding-osgi-broker\"\n" +
+ " },\n" +
+ " \"odl-sal-netconf-connector-cfg:dom-registry\":\n" +
+ " {\n" +
+ " \"type\":\"opendaylight-md-sal-dom:dom-broker-osgi-registry\",\n" +
+ " \"name\":\"dom-broker\"\n" +
+ " },\n" +
+ " \"odl-sal-netconf-connector-cfg:client-dispatcher\":\n" +
+ " {\n" +
+ " \"type\":\"odl-netconf-cfg:netconf-client-dispatcher\",\n" +
+ " \"name\":\"global-netconf-dispatcher\"\n" +
+ " },\n" +
+ " \"odl-sal-netconf-connector-cfg:processing-executor\":\n" +
+ " {\n" +
+ " \"type\":\"threadpool:threadpool\",\n" +
+ " \"name\":\"global-netconf-processing-executor\"\n" +
+ " }\n" +
+ " }\n" +
+ "}";
+ }
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/resources/netconf-adaptor.properties b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/resources/netconf-adaptor.properties
new file mode 100644
index 000000000..7d0eb7cca
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/resources/netconf-adaptor.properties
@@ -0,0 +1,43 @@
+###
+# ============LICENSE_START=======================================================
+# ONAP : APPC
+# ================================================================================
+# Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Copyright (C) 2017 Amdocs
+# =============================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# ============LICENSE_END=========================================================
+###
+
+org.onap.appc.bootstrap.file=appc.properties
+org.onap.appc.bootstrap.path=/opt/onap/appc/data/properties,${user.home},.
+
+org.onap.appc.netconf.db.jdbc.driver=netconfctl
+org.onap.appc.netconf.db.url.netconfctl=jdbc:mysql://127.0.0.1:3306/test
+org.onap.appc.netconf.db.user.netconfctl=test
+org.onap.appc.netconf.db.pass.netconfctl=123456
+org.onap.appc.netconf.recv.timeout=1800000
+
+### ###
+### Properties commented out below provided in appc.properties ###
+### ###
+#event.pool.members=<DMAAP_IP>:3904
+event.topic.write=APPC-TEST1
+event.client.key=VIlbtVl6YLhNUrtU
+event.client.secret=64AG2hF4pYeG2pq7CT6XwUOT
+#restconf.user=<RESTCONF_USER>
+#restconf.pass=<RESTCONF_PASSWORD>
+
+VNFOperationalStateValidatorImpl-CONFIG_FILE=VnfGetOperationalStates
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClientFactoryTest.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClientFactoryTest.java
new file mode 100644
index 000000000..b3a1d8edb
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClientFactoryTest.java
@@ -0,0 +1,50 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2018 Nokia. All rights reserved.
+ * ================================================================================
+ * Modifications Copyright (C) 2019 Ericsson
+ * =============================================================================
+ * 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.sli.adaptors.netconf;
+
+import org.junit.Test;
+import org.onap.ccsdk.sli.adaptors.netconf.jsch.NetconfClientJsch;
+import org.onap.ccsdk.sli.adaptors.netconf.odlconnector.NetconfClientRestconfImpl;
+
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+public class NetconfClientFactoryTest {
+
+ @Test
+ public void getNetconfClient_shouldCreateRestClient_forRestClientType() {
+ NetconfClient netconfClient = new NetconfClientFactory().getNetconfClient(NetconfClientType.RESTCONF);
+ assertTrue(netconfClient instanceof NetconfClientRestconfImpl);
+ }
+
+ @Test
+ public void getNetconfClient_shouldCreateJschClient_forSshClientType() {
+ NetconfClient netconfClient = new NetconfClientFactory().getNetconfClient(NetconfClientType.SSH);
+ assertTrue(netconfClient instanceof NetconfClientJsch);
+ }
+
+ @Test
+ public void getNetconfClient_shouldReturnNullForInvalidClientType() {
+ NetconfClient netconfClient = new NetconfClientFactory().getNetconfClient(null);
+ assertNull(netconfClient);
+ }
+} \ No newline at end of file
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClientTypeTest.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClientTypeTest.java
new file mode 100644
index 000000000..cd862f9d9
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClientTypeTest.java
@@ -0,0 +1,41 @@
+/*
+* ============LICENSE_START=======================================================
+* ONAP : APPC
+* ================================================================================
+* Copyright 2018 TechMahindra
+* ================================================================================
+* Modifications Copyright (C) 2019 Ericsson
+*=================================================================================
+* 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.sli.adaptors.netconf;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class NetconfClientTypeTest {
+ private NetconfClientType netconfClientType = NetconfClientType.RESTCONF;
+
+ @Test
+ public void testName() {
+ Assert.assertEquals("RESTCONF", netconfClientType.name());
+ }
+
+ @Test
+ public void testEquals() {
+ Assert.assertTrue(netconfClientType.equals(NetconfClientType.RESTCONF));
+ Assert.assertFalse(netconfClientType.equals(null));
+ }
+
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfConnectionDetailsTest.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfConnectionDetailsTest.java
new file mode 100644
index 000000000..2d0bea92c
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfConnectionDetailsTest.java
@@ -0,0 +1,118 @@
+/*
+* ============LICENSE_START=======================================================
+* ONAP : APPC
+* ================================================================================
+* Copyright 2018 TechMahindra
+* ================================================================================
+* Modifications Copyright (C) 2019 Ericsson
+*=================================================================================
+* 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.sli.adaptors.netconf;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class NetconfConnectionDetailsTest {
+ private NetconfConnectionDetails netconfConnectionDetails;
+ private List<String> capabilities;
+ private Properties additionalProperties;
+
+ @Before
+ public void SetUp() {
+ netconfConnectionDetails = new NetconfConnectionDetails();
+ }
+
+ @Test
+ public void testGetHost() {
+ netconfConnectionDetails.setHost("host1");
+ Assert.assertNotNull(netconfConnectionDetails.getHost());
+ Assert.assertEquals("host1", netconfConnectionDetails.getHost());
+ }
+
+ @Test
+ public void testGetPort() {
+ netconfConnectionDetails.setPort(123);
+ Assert.assertNotNull(netconfConnectionDetails.getPort());
+ Assert.assertEquals(123, netconfConnectionDetails.getPort());
+ }
+
+ @Test
+ public void testGetUsername() {
+ netconfConnectionDetails.setUsername("ABC");
+ Assert.assertNotNull(netconfConnectionDetails.getUsername());
+ Assert.assertEquals("ABC", netconfConnectionDetails.getUsername());
+ }
+
+ @Test
+ public void testGetPassword() {
+ netconfConnectionDetails.setPassword("pass1");
+ Assert.assertNotNull(netconfConnectionDetails.getPassword());
+ Assert.assertEquals("pass1", netconfConnectionDetails.getPassword());
+ }
+
+ @Test
+ public void testNullCapabilities() {
+ capabilities = new ArrayList<String>();
+ Assert.assertNull(netconfConnectionDetails.getCapabilities());
+ }
+
+ @Test
+ public void testCapabilitiesWithValues() {
+ capabilities = new ArrayList<String>();
+ capabilities.add("capabilities1");
+ capabilities.add("capabilities2");
+ netconfConnectionDetails.setCapabilities(capabilities);
+ Assert.assertTrue(capabilities.contains("capabilities2"));
+ }
+
+ @Test
+ public void testCapabilities_Size() {
+ capabilities = new ArrayList<String>();
+ capabilities.add("capabilities1");
+ capabilities.add("capabilities2");
+ netconfConnectionDetails.setCapabilities(capabilities);
+ Assert.assertEquals(2, capabilities.size());
+ }
+
+ @Test
+ public void testAdditionalProperties() {
+ additionalProperties = new Properties();
+ Assert.assertNull(netconfConnectionDetails.getAdditionalProperties());
+ }
+
+ @Test
+ public void testAdditionalPropertiesWithValues() {
+ additionalProperties = new Properties();
+ additionalProperties.put("A", "a");
+ additionalProperties.put("B", "b");
+ netconfConnectionDetails.setAdditionalProperties(additionalProperties);
+ Assert.assertEquals("a", netconfConnectionDetails.getAdditionalProperties().get("A"));
+ }
+
+ @Test
+ public void testAdditionalProperties_Size() {
+ additionalProperties = new Properties();
+ additionalProperties.put("A", "a");
+ additionalProperties.put("B", "b");
+ additionalProperties.put("C", "c");
+ netconfConnectionDetails.setAdditionalProperties(additionalProperties);
+ Assert.assertNotNull(netconfConnectionDetails.getAdditionalProperties());
+ Assert.assertEquals(3, additionalProperties.size());
+ }
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/OperationalStateValidatorTest.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/OperationalStateValidatorTest.java
new file mode 100644
index 000000000..8b60373b1
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/OperationalStateValidatorTest.java
@@ -0,0 +1,200 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * ================================================================================
+ * Modifications Copyright (C) 2019 Ericsson
+ * =============================================================================
+ * 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.sli.adaptors.netconf;
+
+import org.junit.Test;
+import org.onap.ccsdk.sli.core.sli.SvcLogicException;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+
+public class OperationalStateValidatorTest {
+
+ @Test
+ public void testVNFValidResponse() {
+ String validResponse = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+ "<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"101\">\n" +
+ " <data>\n" +
+ " <ManagedElement xmlns=\"urn:org:onap:appc:Test\">\n" +
+ " <managedElementId>1</managedElementId>\n" +
+ " <VnfFunction xmlns=\"urn:org:onap:appc:Test\">\n" +
+ " <id>1</id>\n" +
+ " <ProcessorManagement>\n" +
+ " <id>1</id>\n" +
+ " <MatedPair>\n" +
+ " <id>1</id>\n" +
+ " <operationalState>ENABLED</operationalState>\n" +
+ " <PayloadProcessor>\n" +
+ " <id>processor_0_5</id>\n" +
+ " <operationalState>ENABLED</operationalState>\n" +
+ " </PayloadProcessor>\n" +
+ " <PayloadProcessor>\n" +
+ " <id>processor_0_7</id>\n" +
+ " <operationalState>ENABLED</operationalState>\n" +
+ " </PayloadProcessor>\n" +
+ " </MatedPair>\n" +
+ " <SystemController>\n" +
+ " <id>SC-1</id>\n" +
+ " <operationalState>ENABLED</operationalState>\n" +
+ " </SystemController>\n" +
+ " <SystemController>\n" +
+ " <id>SC-2</id>\n" +
+ " <operationalState>ENABLED</operationalState>\n" +
+ " </SystemController>\n" +
+ " </ProcessorManagement>\n" +
+ " </VnfFunction>\n" +
+ " </ManagedElement>\n" +
+ " </data>\n" +
+ "</rpc-reply>";
+ OperationalStateValidator operationalStateValidator = OperationalStateValidatorFactory.getOperationalStateValidator(VnfType.VNF);
+ assertValidResponse(validResponse, operationalStateValidator);
+ }
+
+ void assertInvalidResponse(String response, OperationalStateValidator operationalStateValidator) {
+ try {
+ operationalStateValidator.validateResponse(response);
+ fail("invalid response passed without exception!!!");
+ } catch (SvcLogicException e) {
+ assertNotNull(e.getMessage());
+ }
+ }
+
+ @Test
+ public void testVNFInvalidResponses() {
+
+ OperationalStateValidator operationalStateValidator = OperationalStateValidatorFactory.getOperationalStateValidator(VnfType.VNF);
+ assertInvalidResponse(null, operationalStateValidator);
+
+ assertInvalidResponse("", operationalStateValidator);
+
+ String response = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+ assertInvalidResponse(response, operationalStateValidator);
+
+ response = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+ "<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"101\">\n" +
+ "</rpc-reply>";
+ assertInvalidResponse(response, operationalStateValidator);
+
+ response = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+ "<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"101\">\n" +
+ " <data>\n" +
+ " <ManagedElement xmlns=\"urn:org:onap:appc:Test\">\n" +
+ " <managedElementId>1</managedElementId>\n" +
+ " <VnfFunction xmlns=\"urn:org:onap:appc:Test\">\n" +
+ " <id>1</id>\n" +
+ " <ProcessorManagement>\n" +
+ " <id>1</id>\n" +
+ " <MatedPair>\n" +
+ " <id>1</id>\n" +
+ " <operationalState>ENABLED</operationalState>\n" +
+ " <PayloadProcessor>\n" +
+ " <id>processor_0_5</id>\n" +
+ " <operationalState>ENABLED</operationalState>\n" +
+ " </PayloadProcessor>\n" +
+ " <PayloadProcessor>\n" +
+ " <id>processor_0_7</id>\n" +
+ " <operationalState>ENABLED</operationalState>\n" +
+ " </PayloadProcessor>\n" +
+ " </MatedPair>\n" +
+ " <SystemController>\n" +
+ " <id>SC-1</id>\n" +
+ " <operationalState>ENABLED</operationalState>\n" +
+ " </SystemController>\n" +
+ " <SystemController>\n" +
+ " <id>SC-2</id>\n" +
+ " <operationalState></operationalState>\n" +
+ " </SystemController>\n" +
+ " </ProcessorManagement>\n" +
+ " </VnfFunction>\n" +
+ " </ManagedElement>\n" +
+ " </data>\n" +
+ "</rpc-reply>";
+ assertInvalidResponse(response, operationalStateValidator);
+ }
+
+ void assertValidResponse(String response, OperationalStateValidator operationalStateValidator) {
+ try {
+ operationalStateValidator.validateResponse(response);
+ } catch (SvcLogicException e) {
+ fail("Got unexpected exception. Validation failed. " + e.getMessage());
+ }
+ }
+
+ @Test
+ public void testMockValidResponse() {
+ String response = "valid";
+ OperationalStateValidator operationalStateValidator = OperationalStateValidatorFactory.getOperationalStateValidator("mock");
+ assertValidResponse(response, operationalStateValidator);
+
+ response = "";
+ assertValidResponse(response, operationalStateValidator);
+
+ response = null;
+ assertValidResponse(response, operationalStateValidator);
+ }
+
+ @Test
+ public void testMockInValidResponse() {
+ String response = "anything InValid anything.. ";
+ OperationalStateValidator operationalStateValidator = OperationalStateValidatorFactory.getOperationalStateValidator(VnfType.MOCK);
+ assertInvalidResponse(response, operationalStateValidator);
+ }
+
+ @Test
+ public void testGetOperationalStateValidatorForInValidVnfType() {
+ try{
+ OperationalStateValidatorFactory.getOperationalStateValidator("wrongVnfType");
+ fail("invalid vnfType without exception!!!");
+ } catch (Exception e) {
+ assertNotNull(e.getMessage());
+ }
+ }
+
+ @Test
+ public void testGetOperationalStateValidatorForValidVnfType() {
+ String vnfType = VnfType.VNF.name().toLowerCase();
+ assertGettingValidatorForValidVnf(vnfType);
+
+ vnfType = VnfType.VNF.name().toUpperCase();
+ assertGettingValidatorForValidVnf(vnfType);
+
+ vnfType = VnfType.MOCK.name().toLowerCase();
+ assertGettingValidatorForValidVnf(vnfType);
+
+ vnfType = VnfType.MOCK.name().toUpperCase();
+ assertGettingValidatorForValidVnf(vnfType);
+ }
+
+ void assertGettingValidatorForValidVnf(String vnfType) {
+ try{
+ OperationalStateValidator operationalStateValidator = OperationalStateValidatorFactory.getOperationalStateValidator(vnfType);
+ assertNotNull(operationalStateValidator);
+ } catch (Exception e) {
+ fail("valid vnfType throw exception!!!");
+ }
+ }
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/TestConnectionDetails.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/TestConnectionDetails.java
new file mode 100644
index 000000000..9720732bf
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/TestConnectionDetails.java
@@ -0,0 +1,46 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.ccsdk.sli.adaptors.netconf;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class TestConnectionDetails {
+
+ @Test
+ public void testGetSetMethods() {
+ ConnectionDetails connectionDetails = new ConnectionDetails();
+ connectionDetails.setHost("host1");
+ assertEquals("host1", connectionDetails.getHost());
+
+ connectionDetails.setPort(123);
+ assertEquals(123, connectionDetails.getPort());
+
+ connectionDetails.setUsername("myname");
+ assertEquals("myname", connectionDetails.getUsername());
+
+ connectionDetails.setPassword("mypassword");
+ assertEquals("mypassword", connectionDetails.getPassword());
+ }
+
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/TestVnfType.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/TestVnfType.java
new file mode 100644
index 000000000..7c6373046
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/TestVnfType.java
@@ -0,0 +1,42 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2019 IBM.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.ccsdk.sli.adaptors.netconf;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class TestVnfType {
+ private VnfType vnfType;
+
+ @Before
+ public void setUp() {
+ vnfType = VnfType.VNF;
+ }
+
+ @Test
+ public void testGetFamilyType() {
+ assertEquals(VnfType.VNF, vnfType.getFamilyType());
+ }
+
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/VNFOperationalStateValidatorImplTest.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/VNFOperationalStateValidatorImplTest.java
new file mode 100644
index 000000000..098118252
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/VNFOperationalStateValidatorImplTest.java
@@ -0,0 +1,51 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2019 IBM.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.ccsdk.sli.adaptors.netconf;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class VNFOperationalStateValidatorImplTest {
+
+ private VNFOperationalStateValidatorImpl vnfOperationalStateValidatorImpl;
+
+ @Before
+ public void setUp()
+ {
+ vnfOperationalStateValidatorImpl= new VNFOperationalStateValidatorImpl();
+ }
+
+ @Test
+ public void testGetVnfType()
+ {
+ assertEquals(VnfType.VNF, vnfOperationalStateValidatorImpl.getVnfType());
+ }
+
+ @Test
+ public void testgetConfigurationFileName()
+ {
+ assertEquals("VnfGetOperationalStates", vnfOperationalStateValidatorImpl.getConfigurationFileName());
+ }
+
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/exception/DataAccessExceptionTest.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/exception/DataAccessExceptionTest.java
new file mode 100644
index 000000000..45fecf4f7
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/exception/DataAccessExceptionTest.java
@@ -0,0 +1,64 @@
+/*
+* ============LICENSE_START=======================================================
+* ONAP : APPC
+* ================================================================================
+* Copyright 2018 TechMahindra
+*=================================================================================
+* 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.sli.adaptors.netconf.exception;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class DataAccessExceptionTest {
+
+ @Test
+ public void testConstructorNoArgument() throws Exception {
+ DataAccessException dataAccessException = new DataAccessException();
+ Assert.assertTrue(dataAccessException.getCause() == null);
+ Assert.assertTrue(dataAccessException.getLocalizedMessage() == null);
+ Assert.assertTrue(dataAccessException.getMessage() == null);
+ }
+
+ @Test
+ public void testConstructorWithMessage() throws Exception {
+ String message = "testing message";
+ DataAccessException dataAccessException = new DataAccessException(message);
+ Assert.assertTrue(dataAccessException.getCause() == null);
+ Assert.assertEquals(message, dataAccessException.getLocalizedMessage());
+ Assert.assertEquals(message, dataAccessException.getMessage());
+ }
+
+ @Test
+ public void testConstructorWithThrowable() throws Exception {
+ String message = "testing message";
+ Throwable throwable = new Throwable(message);
+ DataAccessException dataAccessException = new DataAccessException(throwable);
+ Assert.assertEquals(throwable, dataAccessException.getCause());
+ Assert.assertTrue(dataAccessException.getLocalizedMessage().contains(message));
+ Assert.assertTrue(dataAccessException.getMessage().contains(message));
+ }
+
+ @Test
+ public void testConstructorWithMessageAndThrowable() throws Exception {
+ String message = "testing message";
+ String tMessage = "throwable message";
+ Throwable throwable = new Throwable(tMessage);
+ DataAccessException dataAccessException = new DataAccessException(message, throwable);
+ Assert.assertEquals(throwable, dataAccessException.getCause());
+ Assert.assertTrue(dataAccessException.getLocalizedMessage().contains(message));
+ Assert.assertTrue(dataAccessException.getMessage().contains(message));
+ }
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/exception/NetconfDAOExceptionTest.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/exception/NetconfDAOExceptionTest.java
new file mode 100644
index 000000000..70fb2eeb5
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/exception/NetconfDAOExceptionTest.java
@@ -0,0 +1,64 @@
+/*
+* ============LICENSE_START=======================================================
+* ONAP : APPC
+* ================================================================================
+* Copyright 2018 TechMahindra
+*=================================================================================
+* 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.sli.adaptors.netconf.exception;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class NetconfDAOExceptionTest {
+
+ @Test
+ public void testConstructorNoArgument() throws Exception {
+ NetconfDAOException netconfDAOException = new NetconfDAOException();
+ Assert.assertTrue(netconfDAOException.getCause() == null);
+ Assert.assertTrue(netconfDAOException.getLocalizedMessage() == null);
+ Assert.assertTrue(netconfDAOException.getMessage() == null);
+ }
+
+ @Test
+ public void testConstructorWithMessage() throws Exception {
+ String message = "testing message";
+ NetconfDAOException netconfDAOException = new NetconfDAOException(message);
+ Assert.assertTrue(netconfDAOException.getCause() == null);
+ Assert.assertEquals(message, netconfDAOException.getLocalizedMessage());
+ Assert.assertEquals(message, netconfDAOException.getMessage());
+ }
+
+ @Test
+ public void testConstructorWithThrowable() throws Exception {
+ String message = "testing message";
+ Throwable throwable = new Throwable(message);
+ NetconfDAOException netconfDAOException = new NetconfDAOException(throwable);
+ Assert.assertEquals(throwable, netconfDAOException.getCause());
+ Assert.assertTrue(netconfDAOException.getLocalizedMessage().contains(message));
+ Assert.assertTrue(netconfDAOException.getMessage().contains(message));
+ }
+
+ @Test
+ public void testConstructorWithMessageAndThrowable() throws Exception {
+ String message = "testing message";
+ String tMessage = "throwable message";
+ Throwable throwable = new Throwable(tMessage);
+ NetconfDAOException netconfDAOException = new NetconfDAOException(message, throwable);
+ Assert.assertEquals(throwable, netconfDAOException.getCause());
+ Assert.assertTrue(netconfDAOException.getLocalizedMessage().contains(message));
+ Assert.assertTrue(netconfDAOException.getMessage().contains(message));
+ }
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/internal/TestNetconfAdaptor.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/internal/TestNetconfAdaptor.java
new file mode 100644
index 000000000..757d767dd
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/internal/TestNetconfAdaptor.java
@@ -0,0 +1,88 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.sli.adaptors.netconf.internal;
+
+import java.io.IOException;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TestNetconfAdaptor {
+
+ private static final String EOM = "]]>]]>";
+
+ @Test
+ public void testReceiveMessage() throws IOException {
+ PipedOutputStream pos = new PipedOutputStream();
+ PipedInputStream is = new PipedInputStream(pos);
+
+ PipedInputStream pis = new PipedInputStream();
+ PipedOutputStream os = new PipedOutputStream(pis);
+
+ NetconfAdaptor netconfAdaptor = new NetconfAdaptor(is, os);
+
+ String request = "Hello, netconf!";
+ pos.write(request.getBytes());
+ pos.write(EOM.getBytes());
+ String response = netconfAdaptor.receiveMessage();
+ Assert.assertNotNull(response);
+ Assert.assertEquals(request, response.trim());
+ }
+
+ @Test
+ public void testSendMessage() throws IOException {
+ PipedOutputStream pos = new PipedOutputStream();
+ PipedInputStream is = new PipedInputStream(pos);
+
+ PipedInputStream pis = new PipedInputStream();
+ PipedOutputStream os = new PipedOutputStream(pis);
+
+ NetconfAdaptor netconfAdaptor = new NetconfAdaptor(is, os);
+
+ String request = "Hello, netconf!";
+ netconfAdaptor.sendMessage(request);
+ byte[] bytes = new byte[request.length()+EOM.length()+2];
+ int count = pis.read(bytes);
+ String response = new String(bytes, 0, count);
+ Assert.assertNotNull(response);
+ Assert.assertTrue(response.endsWith(EOM));
+ response = response.substring(0, response.length() - EOM.length()).trim();
+ Assert.assertEquals(request, response);
+ }
+
+ @Test
+ public void testSendReceive() throws IOException {
+ PipedOutputStream os = new PipedOutputStream();
+ PipedInputStream is = new PipedInputStream(os);
+
+ NetconfAdaptor netconfAdaptor = new NetconfAdaptor(is, os);
+
+ String request = "Hello, netconf!";
+ netconfAdaptor.sendMessage(request);
+ String response = netconfAdaptor.receiveMessage();
+ Assert.assertNotNull(response);
+ Assert.assertEquals(request, response.trim());
+ }
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/internal/TestNetconfAdaptor2.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/internal/TestNetconfAdaptor2.java
new file mode 100644
index 000000000..b276a0875
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/internal/TestNetconfAdaptor2.java
@@ -0,0 +1,103 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2018 Samsung
+ * ================================================================================
+ * 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.sli.adaptors.netconf.internal;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TestNetconfAdaptor2 {
+
+ private static final String EOM = "]]>]]>";
+
+ @Test (expected = IOException.class)
+ public void testReceiveMessage() throws IOException {
+ PipedOutputStream pos = new PipedOutputStream();
+ PipedInputStream is = new PipedInputStream(pos);
+
+ PipedInputStream pis = new PipedInputStream();
+ PipedOutputStream os = new PipedOutputStream(pis);
+
+ NetconfAdaptor2 netconfAdaptor = new NetconfAdaptor2(is, os);
+
+ String request = "Hello, netconf!";
+ pos.write(request.getBytes());
+ pos.write(EOM.getBytes());
+ String response = netconfAdaptor.receiveMessage();
+ Assert.assertNotNull(response);
+ Assert.assertEquals(request, response.trim());
+ }
+
+ @Test (expected = IOException.class)
+ public void testSendMessage() throws IOException {
+ PipedOutputStream pos = new PipedOutputStream();
+ PipedInputStream is = new PipedInputStream(pos);
+
+ PipedInputStream pis = new PipedInputStream();
+ PipedOutputStream os = new PipedOutputStream(pis);
+
+ NetconfAdaptor2 netconfAdaptor = new NetconfAdaptor2(is, os);
+
+ String request = "Hello, netconf!";
+ netconfAdaptor.sendMessage(request);
+ byte[] bytes = new byte[request.length()+EOM.length()+2];
+ int count = pis.read(bytes);
+ String response = new String(bytes, 0, count);
+ Assert.assertNotNull(response);
+ Assert.assertTrue(response.endsWith(EOM));
+ response = response.substring(0, response.length() - EOM.length()).trim();
+ Assert.assertEquals(request, response);
+ }
+
+ @Test (expected = IOException.class)
+ public void testSendReceive() throws IOException {
+ PipedOutputStream os = new PipedOutputStream();
+ PipedInputStream is = new PipedInputStream(os);
+
+ NetconfAdaptor2 netconfAdaptor = new NetconfAdaptor2(is, os);
+
+ String request = "Hello, netconf!";
+ netconfAdaptor.sendMessage(request);
+ String response = netconfAdaptor.receiveMessage();
+ Assert.assertNotNull(response);
+ Assert.assertEquals(request, response.trim());
+ }
+
+ @Test
+ public void testDefaultSendReceive() throws IOException {
+
+ NetconfAdaptor2 netconfAdaptor = new NetconfAdaptor2();
+
+ String request = "Hello, netconf!";
+ netconfAdaptor.sendMessage(request);
+
+ InputStream in = netconfAdaptor.getIn();
+ OutputStream out = netconfAdaptor.getOut();
+
+ Assert.assertNotNull(in);
+ Assert.assertNotNull(out);
+ }
+} \ No newline at end of file
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/internal/TestNetconfDataAccessServiceImpl.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/internal/TestNetconfDataAccessServiceImpl.java
new file mode 100644
index 000000000..0c5d49d2f
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/internal/TestNetconfDataAccessServiceImpl.java
@@ -0,0 +1,139 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2018 Samsung
+ * ================================================================================
+ * Modifications Copyright (C) 2019 Ericsson
+ * ================================================================================
+ * 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.sli.adaptors.netconf.internal;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.SQLFeatureNotSupportedException;
+import java.util.ArrayList;
+import java.util.logging.Logger;
+import javax.sql.rowset.CachedRowSet;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.onap.ccsdk.sli.adaptors.netconf.NetconfAdaptorConstants;
+import org.onap.ccsdk.sli.adaptors.netconf.NetconfConnectionDetails;
+import org.onap.ccsdk.sli.core.dblib.DbLibService;
+
+public class TestNetconfDataAccessServiceImpl {
+ NetconfDataAccessServiceImpl netconfDataAccessService;
+ private String schema;
+ private DbLibService dbLibServiceMocked;
+
+ @Before
+ public void SetUp() {
+ schema = "test-netconf-adaptor";
+ dbLibServiceMocked = new DbLibService() {
+ @Override
+ public CachedRowSet getData(String s, ArrayList<String> arrayList, String s1) throws SQLException {
+ CachedRowSet cachedRowSetMocked = Mockito.mock(CachedRowSet.class);
+ Mockito.when(cachedRowSetMocked.first()).thenReturn(true);
+ Mockito.when(cachedRowSetMocked.getString(NetconfAdaptorConstants.FILE_CONTENT_TABLE_FIELD_NAME)).thenReturn("File_Content");
+ return cachedRowSetMocked;
+ }
+
+ @Override
+ public boolean writeData(String s, ArrayList<String> arrayList, String s1) throws SQLException {
+ return false;
+ }
+
+ @Override
+ public boolean isActive() {
+ return false;
+ }
+
+ @Override
+ public Connection getConnection() throws SQLException {
+ return null;
+ }
+
+ @Override
+ public Connection getConnection(String username, String password) throws SQLException {
+ return null;
+ }
+
+ @Override
+ public <T> T unwrap(Class<T> iface) throws SQLException {
+ return null;
+ }
+
+ @Override
+ public boolean isWrapperFor(Class<?> iface) throws SQLException {
+ return false;
+ }
+
+ @Override
+ public PrintWriter getLogWriter() throws SQLException {
+ return null;
+ }
+
+ @Override
+ public void setLogWriter(PrintWriter out) throws SQLException {
+
+ }
+
+ @Override
+ public int getLoginTimeout() throws SQLException {
+ return 0;
+ }
+
+ @Override
+ public void setLoginTimeout(int seconds) throws SQLException {
+
+ }
+
+ @Override
+ public Logger getParentLogger() throws SQLFeatureNotSupportedException {
+ return null;
+ }
+ };
+
+ netconfDataAccessService = new NetconfDataAccessServiceImpl();
+ netconfDataAccessService.setSchema(schema);
+ netconfDataAccessService.setDbLibService(dbLibServiceMocked);
+ }
+
+ @Test
+ public void testRetrieveConfigFileName() throws IOException {
+ String response = netconfDataAccessService.retrieveConfigFileName("test");
+ Assert.assertEquals("File_Content", response);
+ }
+
+ @Test
+ public void testRetrieveNetconfConnectionDetails() throws IOException {
+ NetconfConnectionDetails netconfConnectionDetails = new NetconfConnectionDetails();
+ boolean response = netconfDataAccessService.retrieveNetconfConnectionDetails("test", netconfConnectionDetails);
+ Assert.assertEquals(true, response);
+ }
+
+ @Test
+ public void testLogDeviceInteraction() throws IOException {
+ boolean response = netconfDataAccessService.logDeviceInteraction("test", "",
+ "", "");
+ Assert.assertEquals(true, response);
+ }
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestGetRunningConfig.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestGetRunningConfig.java
new file mode 100644
index 000000000..2ad873f54
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestGetRunningConfig.java
@@ -0,0 +1,59 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.sli.adaptors.netconf.jsch;
+
+import java.util.Collections;
+import java.util.List;
+import org.onap.ccsdk.sli.adaptors.netconf.NetconfConnectionDetails;
+
+public class TestGetRunningConfig {
+
+ private static final String HOST = "192.168.1.2";
+ private static final String USER = "test";
+ private static final String PSWD = "test123";
+ private static final int PORT = 830;
+ private static final List<String> CAPABILITIES = Collections.singletonList("<capability>urn:org:onap:appc:capability:1.1.0</capability>");
+
+ public static void main(String[] args) {
+ try {
+ NetconfConnectionDetails connectionDetails = new NetconfConnectionDetails();
+ connectionDetails.setHost(HOST);
+ connectionDetails.setPort(PORT);
+ connectionDetails.setUsername(USER);
+ connectionDetails.setPassword(PSWD);
+ connectionDetails.setCapabilities(CAPABILITIES);
+ NetconfClientJsch netconfClientJsch = new NetconfClientJsch();
+ netconfClientJsch.connect(connectionDetails);
+ try {
+ System.out.println("=> Running get configuration...");
+ String configuration = netconfClientJsch.getConfiguration();
+ System.out.println("=> Configuration:\n" + configuration);
+ } finally {
+ netconfClientJsch.disconnect();
+ }
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestJSchLogger.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestJSchLogger.java
new file mode 100644
index 000000000..0a7bd5203
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestJSchLogger.java
@@ -0,0 +1,55 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2018 Samsung
+ * ================================================================================
+ * 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.sli.adaptors.netconf.jsch;
+
+import java.io.IOException;
+import org.junit.Assert;
+import org.junit.Test;
+
+import static org.junit.Assert.assertNotNull;
+
+public class TestJSchLogger {
+
+
+ @Test
+ public void testIsEnabled() throws IOException {
+ JSchLogger jSchLogger = new JSchLogger();
+
+ boolean response = jSchLogger.isEnabled(2);
+
+ Assert.assertEquals(true, response);
+ }
+
+ @Test
+ public void testLog() throws IOException {
+ JSchLogger jSchLogger = new JSchLogger();
+
+ jSchLogger.log(0, "test-debug");
+ jSchLogger.log(1, "test-info");
+ jSchLogger.log(2, "test-warn");
+ jSchLogger.log(3, "test-error");
+ jSchLogger.log(4, "test-fatal");
+ jSchLogger.log(5, "test-other");
+ assertNotNull(jSchLogger);
+
+ }
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestModifyConfig.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestModifyConfig.java
new file mode 100644
index 000000000..aaa74f5c9
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestModifyConfig.java
@@ -0,0 +1,92 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.sli.adaptors.netconf.jsch;
+
+import java.util.Collections;
+import java.util.List;
+import org.onap.ccsdk.sli.adaptors.netconf.NetconfConnectionDetails;
+
+public class TestModifyConfig {
+
+ private static final String HOST = "192.168.1.2";
+ private static final String USER = "test";
+ private static final String PSWD = "test123";
+ private static final int PORT = 830;
+ private static final List<String> CAPABILITIES = Collections.singletonList("<capability>urn:org:onap:appc:capability:1.1.0</capability>");
+ private static final String CONFIG =
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+ "<rpc xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"1\">\n" +
+ " <edit-config>\n" +
+ " <target>\n" +
+ " <running />\n" +
+ " </target>\n" +
+ " <default-operation>merge</default-operation>\n" +
+ " <config xmlns:xc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n" +
+ " <ManagedElement xmlns=\"urn:org.onap.appc:Test\">\n" +
+ " <managedElementId>1</managedElementId>\n" +
+ " <VnfFunction xmlns=\"urn:org:onap:appc:VnfFunction\">\n" +
+ " <id>1</id>\n" +
+ " <Interfaces>\n" +
+ " <id>1</id>\n" +
+ " <DiaRealmRf>\n" +
+ " <realm>example.com</realm>\n" +
+ " <reconnectTimer>60</reconnectTimer>\n" +
+ " </DiaRealmRf>\n" +
+ " </Interfaces>\n" +
+ " </VnfFunction>\n" +
+ " </ManagedElement>\n" +
+ " </config>\n" +
+ " </edit-config>\n" +
+ "</rpc>";
+
+ public static void main(String[] args) {
+ try {
+ NetconfConnectionDetails connectionDetails = new NetconfConnectionDetails();
+ connectionDetails.setHost(HOST);
+ connectionDetails.setPort(PORT);
+ connectionDetails.setUsername(USER);
+ connectionDetails.setPassword(PSWD);
+ connectionDetails.setCapabilities(CAPABILITIES);
+ NetconfClientJsch netconfClientJsch = new NetconfClientJsch();
+ netconfClientJsch.connect(connectionDetails);
+ try {
+ System.out.println("=> Running get configuration...");
+ String configuration = netconfClientJsch.getConfiguration();
+ System.out.println("=> Configuration:\n" + configuration);
+
+ System.out.println("=> Reconfiguring device...");
+ String outMessage = netconfClientJsch.exchangeMessage(CONFIG);
+ System.out.println("=> Reconfiguration response:\n" + outMessage);
+
+ System.out.println("=> Running get configuration...");
+ configuration = netconfClientJsch.getConfiguration();
+ System.out.println("=> Configuration:\n" + configuration);
+ } finally {
+ netconfClientJsch.disconnect();
+ }
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestModifyConfigMock.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestModifyConfigMock.java
new file mode 100644
index 000000000..eb6473854
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestModifyConfigMock.java
@@ -0,0 +1,92 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.sli.adaptors.netconf.jsch;
+
+import java.util.Collections;
+import java.util.List;
+import org.onap.ccsdk.sli.adaptors.netconf.NetconfConnectionDetails;
+
+public class TestModifyConfigMock {
+
+ private static final String HOST = "192.168.1.2";
+ private static final String USER = "test";
+ private static final String PSWD = "test123";
+ private static final int PORT = 830;
+ private static final List<String> CAPABILITIES = Collections.singletonList("<capability>urn:org:onap:appc:capability:1.1.0</capability>");
+ private static final String CONFIG =
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+ "<rpc xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"1\">\n" +
+ " <edit-config>\n" +
+ " <target>\n" +
+ " <running />\n" +
+ " </target>\n" +
+ " <default-operation>merge</default-operation>\n" +
+ " <config xmlns:xc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n" +
+ " <ManagedElement xmlns=\"urn:org.onap.appc:Test\">\n" +
+ " <managedElementId>1</managedElementId>\n" +
+ " <VnfFunction xmlns=\"urn:org:onap:appc:VnfFunction\">\n" +
+ " <id>1</id>\n" +
+ " <Interfaces>\n" +
+ " <id>1</id>\n" +
+ " <DiaRealmRf>\n" +
+ " <realm>example.com</realm>\n" +
+ " <reconnectTimer>60</reconnectTimer>\n" +
+ " </DiaRealmRf>\n" +
+ " </Interfaces>\n" +
+ " </VnfFunction>\n" +
+ " </ManagedElement>\n" +
+ " </config>\n" +
+ " </edit-config>\n" +
+ "</rpc>";
+
+ public static void main(String[] args) {
+ try {
+ NetconfConnectionDetails connectionDetails = new NetconfConnectionDetails();
+ connectionDetails.setHost(HOST);
+ connectionDetails.setPort(PORT);
+ connectionDetails.setUsername(USER);
+ connectionDetails.setPassword(PSWD);
+ connectionDetails.setCapabilities(CAPABILITIES);
+ NetconfClientJsch netconfClientJsch = new NetconfClientJsch();
+ netconfClientJsch.connect(connectionDetails);
+ try {
+ System.out.println("=> Running get configuration...");
+ String configuration = netconfClientJsch.getConfiguration();
+ System.out.println("=> Configuration:\n" + configuration);
+
+ System.out.println("=> Reconfiguring device...");
+ String outMessage = netconfClientJsch.exchangeMessage(CONFIG);
+ System.out.println("=> Reconfiguration response:\n" + outMessage);
+
+ System.out.println("=> Running get configuration...");
+ configuration = netconfClientJsch.getConfiguration();
+ System.out.println("=> Configuration:\n" + configuration);
+ } finally {
+ netconfClientJsch.disconnect();
+ }
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestModifyConfigRouterMock.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestModifyConfigRouterMock.java
new file mode 100644
index 000000000..7c209b9c2
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestModifyConfigRouterMock.java
@@ -0,0 +1,90 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.sli.adaptors.netconf.jsch;
+
+import java.util.Collections;
+import java.util.List;
+import org.onap.ccsdk.sli.adaptors.netconf.NetconfConnectionDetails;
+
+public class TestModifyConfigRouterMock {
+
+ private static final String HOST = "10.147.27.50"; // yuma netconf simulator
+ private static final int PORT = 830;
+ private static final String USER = "admin";
+ private static final String PSWD = "admin";
+ private static final List<String> CAPABILITIES = Collections.emptyList();
+ private static final String CONFIG =
+ "<rpc message-id=\"101\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n" +
+ " <edit-config>\n" +
+ " <target>\n" +
+ " <candidate/>\n" +
+ " </target>\n" +
+ " <config xmlns:xc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n" +
+ " <router xmlns=\"urn:sdnhub:odl:tutorial:router\">\n" +
+ " <ospf>\n" +
+ " <process-id>1</process-id>\n" +
+ " <networks>\n" +
+ " <subnet-ip>100.100.100.0/24</subnet-ip>\n" +
+ " <area-id>10</area-id>\n" +
+ " </networks>\n" +
+ " </ospf>\n" +
+ " <bgp>\n" +
+ " <as-number>1000</as-number>\n" +
+ " <router-id>10.10.1.1</router-id>\n" +
+ " <neighbors>\n" +
+ " <as-number>2000</as-number>\n" +
+ " <peer-ip>10.10.1.2</peer-ip>\n" +
+ " </neighbors>\n" +
+ " </bgp>\n" +
+ " </router>\n" +
+ " </config>\n" +
+ " </edit-config>\n" +
+ "</rpc>\n";
+
+ public static void main(String[] args) {
+ try {
+ NetconfConnectionDetails connectionDetails = new NetconfConnectionDetails();
+ connectionDetails.setHost(HOST);
+ connectionDetails.setPort(PORT);
+ connectionDetails.setUsername(USER);
+ connectionDetails.setPassword(PSWD);
+ connectionDetails.setCapabilities(CAPABILITIES);
+ NetconfClientJsch netconfClientJsch = new NetconfClientJsch();
+ netconfClientJsch.connect(connectionDetails);
+ try {
+ System.out.println("=> Running get configuration...");
+ String configuration = netconfClientJsch.getConfiguration();
+ System.out.println("=> Configuration:\n" + configuration);
+
+ System.out.println("=> Reconfiguring device...");
+ String outMessage = netconfClientJsch.exchangeMessage(CONFIG);
+ System.out.println("=> Reconfiguration response:\n" + outMessage);
+ } finally {
+ netconfClientJsch.disconnect();
+ }
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestNetconfClientJsch.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestNetconfClientJsch.java
new file mode 100644
index 000000000..22d3ec482
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestNetconfClientJsch.java
@@ -0,0 +1,191 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2018 Samsung
+ * ================================================================================
+ * Modifications Copyright (C) 2018 Ericsson
+ * ================================================================================
+ * 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.sli.adaptors.netconf.jsch;
+
+import com.jcraft.jsch.ChannelSubsystem;
+import com.jcraft.jsch.JSch;
+import com.jcraft.jsch.JSchException;
+import com.jcraft.jsch.Session;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Collections;
+import java.util.List;
+import java.util.Properties;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.mockito.Mockito;
+import org.onap.ccsdk.sli.adaptors.netconf.NetconfConnectionDetails;
+import org.onap.ccsdk.sli.adaptors.netconf.internal.NetconfAdaptor;
+import org.onap.ccsdk.sli.core.sli.SvcLogicException;
+import org.powermock.reflect.Whitebox;
+
+import static org.hamcrest.CoreMatchers.allOf;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.isA;
+import static org.hamcrest.beans.HasPropertyWithValue.hasProperty;
+import static org.junit.Assert.assertEquals;
+
+public class TestNetconfClientJsch {
+
+ NetconfClientJsch netconfClientJsch;
+ private ChannelSubsystem mockChannel;
+ private NetconfAdaptor mockNetconfAdaptor;
+
+ @Rule
+ public ExpectedException expectedEx = ExpectedException.none();
+
+ @Before
+ public void SetUp() {
+ netconfClientJsch = Mockito.spy(new NetconfClientJsch());
+ }
+
+ private void setupForConnectTests() throws JSchException, IOException {
+ Session mockSession = Mockito.mock(Session.class);
+ JSch mockJSch = Mockito.mock(JSch.class);
+ mockChannel = Mockito.mock(ChannelSubsystem.class);
+ InputStream mockInputStream = Mockito.mock(InputStream.class);
+ OutputStream mockOutputStream = Mockito.mock(OutputStream.class);
+ mockNetconfAdaptor = Mockito.mock(NetconfAdaptor.class);
+ Mockito.doReturn(mockJSch).when(netconfClientJsch).getJSch();
+ Mockito.doReturn(mockSession).when(mockJSch).getSession(Mockito.anyString(),
+ Mockito.anyString(), Mockito.anyInt());
+ Mockito.doReturn(mockChannel).when(mockSession).openChannel("subsystem");
+ Mockito.doReturn(mockInputStream).when(mockChannel).getInputStream();
+ Mockito.doReturn(mockOutputStream).when(mockChannel).getOutputStream();
+ Mockito.doReturn(mockNetconfAdaptor).when(netconfClientJsch)
+ .getNetconfAdaptor(Mockito.any(InputStream.class), Mockito.any(OutputStream.class));
+ }
+
+ @Test
+ public void testConnect() throws SvcLogicException, IOException, JSchException {
+ setupForConnectTests();
+ Mockito.doReturn("<hello>").when(mockNetconfAdaptor).receiveMessage();
+ NetconfConnectionDetails connectionDetails = new NetconfConnectionDetails();
+ connectionDetails.setHost("test");
+ connectionDetails.setPort(8080);
+ connectionDetails.setUsername("test");
+ connectionDetails.setPassword("test");
+ List<String> capabilities = Collections.singletonList(
+ "<capability>urn:ietf:params:netconf:base:1.1</capability>\r\n");
+ connectionDetails.setCapabilities(capabilities);
+ Properties additionalProperties = new Properties();
+ additionalProperties.setProperty("testKey1", "testParam1");
+ connectionDetails.setAdditionalProperties(additionalProperties);
+ netconfClientJsch.connect(connectionDetails);
+ Mockito.verify(mockNetconfAdaptor).sendMessage(
+ Mockito.contains("<capability>urn:ietf:params:netconf:base:1.1</capability>"));
+ }
+
+ @Test
+ public void testConnectNullMessage() throws JSchException, IOException, SvcLogicException {
+ setupForConnectTests();
+ NetconfConnectionDetails connectionDetails = new NetconfConnectionDetails();
+ expectedEx.expect(SvcLogicException.class);
+ //expectedEx.expectMessage("Cannot establish connection to server");
+ netconfClientJsch.connect(connectionDetails);
+ }
+
+ @Test
+ public void testConnectNullMessageNonNullResponse()
+ throws JSchException, IOException, SvcLogicException {
+ setupForConnectTests();
+ Mockito.doReturn("NOT NULL RESPONSE").when(mockNetconfAdaptor).receiveMessage();
+ Mockito.doThrow(new JSchException()).when(mockChannel).connect(10000);
+ NetconfConnectionDetails connectionDetails = new NetconfConnectionDetails();
+ expectedEx.expect(SvcLogicException.class);
+ expectedEx.expectCause(allOf(isA(RuntimeException.class),
+ hasProperty("message", is("Error closing netconf device"))));
+ netconfClientJsch.connect(connectionDetails);
+ }
+
+ @Test
+ public void testConnectErrorMessage() throws JSchException, IOException, SvcLogicException {
+ setupForConnectTests();
+ Mockito.doReturn("<rpc-error>").when(mockNetconfAdaptor).receiveMessage();
+ NetconfConnectionDetails connectionDetails = new NetconfConnectionDetails();
+ expectedEx.expect(SvcLogicException.class);
+ expectedEx
+ .expectCause(allOf(isA(RuntimeException.class),
+ hasProperty("cause", allOf(isA(IOException.class),
+ hasProperty("message",
+ containsString("Error response from netconf device:")),
+ hasProperty("message", containsString("<rpc-error>"))
+ ))));
+ netconfClientJsch.connect(connectionDetails);
+ }
+
+ @Test
+ public void testConnectWithSuccessfulDisconnect()
+ throws JSchException, IOException, SvcLogicException {
+ setupForConnectTests();
+ Mockito.doThrow(new JSchException()).when(mockChannel).connect(10000);
+ Mockito.doReturn("<ok/>").when(mockNetconfAdaptor).receiveMessage();
+ NetconfConnectionDetails connectionDetails = new NetconfConnectionDetails();
+ expectedEx.expect(SvcLogicException.class);
+ expectedEx.expectCause(allOf(isA(SvcLogicException.class),
+ hasProperty("message", is(JSchException.class.getName()))));
+ netconfClientJsch.connect(connectionDetails);
+ }
+
+ @Test
+ public void testGetConfiguration() throws IOException, SvcLogicException {
+ mockNetconfAdaptor = Mockito.mock(NetconfAdaptor.class);
+ Whitebox.setInternalState(netconfClientJsch, "netconfAdaptor", mockNetconfAdaptor);
+ Mockito.doReturn("TEST RETURN VALUE").when(mockNetconfAdaptor).receiveMessage();
+ assertEquals("TEST RETURN VALUE", netconfClientJsch.getConfiguration());
+ }
+
+ @Test
+ public void testGetConfigurationExceptionFlow() throws IOException, SvcLogicException {
+ mockNetconfAdaptor = Mockito.mock(NetconfAdaptor.class);
+ Whitebox.setInternalState(netconfClientJsch, "netconfAdaptor", mockNetconfAdaptor);
+ Mockito.doThrow(new IOException()).when(mockNetconfAdaptor).receiveMessage();
+ expectedEx.expect(SvcLogicException.class);
+ expectedEx.expectMessage(IOException.class.getName());
+ netconfClientJsch.getConfiguration();
+ }
+
+ @Test
+ public void testConfigure() throws IOException, SvcLogicException {
+ mockNetconfAdaptor = Mockito.mock(NetconfAdaptor.class);
+ Whitebox.setInternalState(netconfClientJsch, "netconfAdaptor", mockNetconfAdaptor);
+ Mockito.doReturn("<ok/>").when(mockNetconfAdaptor).receiveMessage();
+ netconfClientJsch.configure(null);
+ Mockito.verify(netconfClientJsch).exchangeMessage(null);
+ }
+
+ @Test
+ public void testConfigureExceptionFlow() throws IOException, SvcLogicException {
+ mockNetconfAdaptor = Mockito.mock(NetconfAdaptor.class);
+ Whitebox.setInternalState(netconfClientJsch, "netconfAdaptor", mockNetconfAdaptor);
+ Mockito.doThrow(new IOException()).when(mockNetconfAdaptor).receiveMessage();
+ expectedEx.expect(SvcLogicException.class);
+ expectedEx.expectMessage(IOException.class.getName());
+ netconfClientJsch.configure(null);
+ }
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestOperationalStates.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestOperationalStates.java
new file mode 100644
index 000000000..128d68347
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestOperationalStates.java
@@ -0,0 +1,86 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.sli.adaptors.netconf.jsch;
+
+import java.util.Collections;
+import java.util.List;
+import org.onap.ccsdk.sli.adaptors.netconf.NetconfConnectionDetails;
+
+public class TestOperationalStates {
+
+ private static final String HOST = "192.168.1.2";
+ private static final String USER = "test";
+ private static final String PSWD = "test123";
+ private static final int PORT = 830;
+ private static final List<String> CAPABILITIES = Collections.singletonList("<capability>urn:org:onap:appc:capability:1.1.0</capability>");
+ private static final String GET_OPERATIONAL_STATES =
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+ "<rpc message-id=\"101\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n" +
+ " <get>\n" +
+ " <filter>\n" +
+ " <ManagedElement xmlns=\"urn:org:onap:appc:Test\">\n" +
+ " <VnfFunction xmlns=\"urn:org:onap:appc:Test\">\n" +
+ " <ProcessorManagement>\n" +
+ " <MatedPair>\n" +
+ " <operationalState/>\n" +
+ " <PayloadProcessor>\n" +
+ " <operationalState/>\n" +
+ " </PayloadProcessor>\n" +
+ " </MatedPair>\n" +
+ " <SystemController>\n" +
+ " <operationalState/>\n" +
+ " </SystemController>\n" +
+ " </ProcessorManagement>\n" +
+ " </VnfFunction>\n" +
+ " </ManagedElement>\n" +
+ " </filter>\n" +
+ " </get>\n" +
+ "</rpc>";
+
+ public static void main(String[] args) {
+ try {
+ NetconfConnectionDetails connectionDetails = new NetconfConnectionDetails();
+ connectionDetails.setHost(HOST);
+ connectionDetails.setPort(PORT);
+ connectionDetails.setUsername(USER);
+ connectionDetails.setPassword(PSWD);
+ connectionDetails.setCapabilities(CAPABILITIES);
+ NetconfClientJsch netconfClientJsch = new NetconfClientJsch();
+ netconfClientJsch.connect(connectionDetails);
+ try {
+ System.out.println("=> Running get configuration...");
+ String configuration = netconfClientJsch.getConfiguration();
+ System.out.println("=> Configuration:\n" + configuration);
+
+ System.out.println("=> Running get operational states...");
+ String outMessage = netconfClientJsch.exchangeMessage(GET_OPERATIONAL_STATES);
+ System.out.println("=> Operational states:\n" + outMessage);
+ } finally {
+ netconfClientJsch.disconnect();
+ }
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/odlconnector/NetconfClientRestconfImplTest.java b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/odlconnector/NetconfClientRestconfImplTest.java
new file mode 100644
index 000000000..4b59c6d2a
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/odlconnector/NetconfClientRestconfImplTest.java
@@ -0,0 +1,207 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2019 Ericsson
+ * ================================================================================
+ * 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.sli.adaptors.netconf.odlconnector;
+
+import java.util.Properties;
+import org.apache.http.HttpStatus;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.onap.ccsdk.sli.adaptors.netconf.HttpClient;
+import org.onap.ccsdk.sli.adaptors.netconf.NetconfAdaptorConstants;
+import org.onap.ccsdk.sli.adaptors.netconf.NetconfConnectionDetails;
+import org.onap.ccsdk.sli.core.sli.SvcLogicException;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.powermock.reflect.Whitebox;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+@Ignore
+@RunWith(PowerMockRunner.class)
+@PrepareForTest(HttpClient.class)
+public class NetconfClientRestconfImplTest {
+
+ @Rule
+ public ExpectedException expectedEx = ExpectedException.none();
+
+ @Before
+ public void setup() {
+ PowerMockito.mockStatic(HttpClient.class);
+ }
+ @Test
+ public void testConfigureNullDetails() throws SvcLogicException {
+ NetconfClientRestconfImpl client = new NetconfClientRestconfImpl();
+ expectedEx.expect(SvcLogicException.class);
+ expectedEx.expectMessage("Invalid connection details - null value");
+ client.configure(null);
+ }
+
+ @Test
+ public void testConfigureNullProperties() throws SvcLogicException {
+ NetconfClientRestconfImpl client = Mockito.spy(new NetconfClientRestconfImpl());
+ expectedEx.expect(SvcLogicException.class);
+ expectedEx.expectMessage("Invalid properties!");
+ Whitebox.setInternalState(client, "connectionDetails", Mockito.mock(NetconfConnectionDetails.class));
+ client.configure(null);
+ }
+
+ @Test
+ public void testConfigureWithError() throws SvcLogicException {
+ PowerMockito.when(HttpClient.putMethod(NetconfAdaptorConstants.PROTOCOL, NetconfAdaptorConstants.CONTROLLER_IP, NetconfAdaptorConstants.CONTROLLER_PORT,
+ NetconfAdaptorConstants.CONFIGURE_PATH + "null/yang-ext:mount/MODULE_NAME:NODE_NAME", null, "application/xml"))
+ .thenReturn(HttpStatus.SC_ACCEPTED);
+ NetconfClientRestconfImpl client = Mockito.spy(new NetconfClientRestconfImpl());
+ NetconfConnectionDetails details = new NetconfConnectionDetails();
+ Properties properties = new Properties();
+ properties.setProperty("module.name", "MODULE_NAME");
+ properties.setProperty("node.name", "NODE_NAME");
+ details.setAdditionalProperties(properties);
+ Whitebox.setInternalState(client, "connectionDetails", details);
+ expectedEx.expect(SvcLogicException.class);
+ expectedEx.expectMessage("Error configuring node :NODE_NAME, of Module :MODULE_NAME, in device :null");
+ client.configure(null);
+ }
+
+ @Test
+ public void testConfigure4ArgWithError() throws SvcLogicException {
+ PowerMockito.when(HttpClient.putMethod(NetconfAdaptorConstants.PROTOCOL, NetconfAdaptorConstants.CONTROLLER_IP, NetconfAdaptorConstants.CONTROLLER_PORT,
+ NetconfAdaptorConstants.CONFIGURE_PATH + "null/yang-ext:mount/MODULE_NAME:NODE_NAME", null, "application/xml"))
+ .thenReturn(HttpStatus.SC_ACCEPTED);
+ NetconfClientRestconfImpl client = Mockito.spy(new NetconfClientRestconfImpl());
+ expectedEx.expect(SvcLogicException.class);
+ expectedEx.expectMessage("Error configuring node :NODE_NAME, of Module :MODULE_NAME, in device :null");
+ client.configure(null, null, "MODULE_NAME", "NODE_NAME");
+ }
+
+ @Test
+ public void testConnect() throws SvcLogicException {
+ PowerMockito.when(HttpClient.putMethod(NetconfAdaptorConstants.PROTOCOL, NetconfAdaptorConstants.CONTROLLER_IP, NetconfAdaptorConstants.CONTROLLER_PORT,
+ NetconfAdaptorConstants.CONFIGURE_PATH + "null/yang-ext:mount/MODULE_NAME:NODE_NAME", null, "application/xml"))
+ .thenReturn(HttpStatus.SC_ACCEPTED);
+ NetconfClientRestconfImpl client = Mockito.spy(new NetconfClientRestconfImpl());
+ NetconfConnectionDetails details = new NetconfConnectionDetails();
+ Properties properties = new Properties();
+ properties.setProperty("module.name", "MODULE_NAME");
+ properties.setProperty("node.name", "NODE_NAME");
+ details.setAdditionalProperties(properties);
+ Whitebox.setInternalState(client, "connectionDetails", details);
+ expectedEx.expect(SvcLogicException.class);
+ expectedEx.expectMessage("Error connecting device :null");
+ client.connect(details);
+ }
+
+ @Test
+ public void testConnectWithNullDetails() throws SvcLogicException {
+ PowerMockito.when(HttpClient.putMethod(NetconfAdaptorConstants.PROTOCOL, NetconfAdaptorConstants.CONTROLLER_IP, NetconfAdaptorConstants.CONTROLLER_PORT,
+ NetconfAdaptorConstants.CONFIGURE_PATH + "null/yang-ext:mount/MODULE_NAME:NODE_NAME", null, "application/xml"))
+ .thenReturn(HttpStatus.SC_ACCEPTED);
+ NetconfClientRestconfImpl client = Mockito.spy(new NetconfClientRestconfImpl());
+ expectedEx.expect(SvcLogicException.class);
+ expectedEx.expectMessage("Invalid connection details - null value");
+ client.connect(null);
+ }
+
+ @Test
+ public void testDisconnectNullDetails() throws SvcLogicException {
+ NetconfClientRestconfImpl client = Mockito.spy(new NetconfClientRestconfImpl());
+ expectedEx.expect(SvcLogicException.class);
+ expectedEx.expectMessage("Invalid connection details - null value");
+ client.disconnect();
+ }
+
+ @Test
+ public void testDisconnect() throws SvcLogicException {
+ NetconfClientRestconfImpl client = Mockito.spy(new NetconfClientRestconfImpl());
+ NetconfConnectionDetails details = new NetconfConnectionDetails();
+ Properties properties = new Properties();
+ properties.setProperty("module.name", "MODULE_NAME");
+ properties.setProperty("node.name", "NODE_NAME");
+ details.setAdditionalProperties(properties);
+ Whitebox.setInternalState(client, "connectionDetails", details);
+ expectedEx.expect(SvcLogicException.class);
+ expectedEx.expectMessage("Disconnection of device null failed!");
+ client.disconnect();
+ }
+
+ @Test
+ public void testGetConfigurationNullDetails() throws SvcLogicException {
+ NetconfClientRestconfImpl client = Mockito.spy(new NetconfClientRestconfImpl());
+ expectedEx.expect(SvcLogicException.class);
+ expectedEx.expectMessage("Invalid connection details - null value");
+ client.getConfiguration();
+ }
+
+ @Test
+ public void testGetConfigurationNullProperties() throws SvcLogicException {
+ NetconfClientRestconfImpl client = Mockito.spy(new NetconfClientRestconfImpl());
+ expectedEx.expect(SvcLogicException.class);
+ expectedEx.expectMessage("Invalid properties!");
+ Whitebox.setInternalState(client, "connectionDetails", Mockito.mock(NetconfConnectionDetails.class));
+ client.getConfiguration();
+ }
+
+ @Test
+ public void testGetConfigurationWithError() throws SvcLogicException {
+ PowerMockito.when(HttpClient.putMethod(NetconfAdaptorConstants.PROTOCOL, NetconfAdaptorConstants.CONTROLLER_IP, NetconfAdaptorConstants.CONTROLLER_PORT,
+ NetconfAdaptorConstants.CONFIGURE_PATH + "null/yang-ext:mount/MODULE_NAME:NODE_NAME", null, "application/xml"))
+ .thenReturn(HttpStatus.SC_ACCEPTED);
+ NetconfClientRestconfImpl client = Mockito.spy(new NetconfClientRestconfImpl());
+ NetconfConnectionDetails details = new NetconfConnectionDetails();
+ Properties properties = new Properties();
+ properties.setProperty("module.name", "MODULE_NAME");
+ properties.setProperty("node.name", "NODE_NAME");
+ details.setAdditionalProperties(properties);
+ Whitebox.setInternalState(client, "connectionDetails", details);
+ expectedEx.expect(SvcLogicException.class);
+ expectedEx.expectMessage("Error getting configuration of node :NODE_NAME, of Module :MODULE_NAME, in device :null");
+ client.getConfiguration();
+ }
+
+ @Test
+ public void testGetConfigurationSuccess() throws SvcLogicException {
+ PowerMockito.when(HttpClient.getMethod(NetconfAdaptorConstants.PROTOCOL, NetconfAdaptorConstants.CONTROLLER_IP, NetconfAdaptorConstants.CONTROLLER_PORT,
+ NetconfAdaptorConstants.CONFIGURE_PATH + "null/yang-ext:mount/MODULE_NAME:NODE_NAME", "application/json"))
+ .thenReturn("TEST");
+ NetconfClientRestconfImpl client = Mockito.spy(new NetconfClientRestconfImpl());
+ NetconfConnectionDetails details = new NetconfConnectionDetails();
+ Properties properties = new Properties();
+ properties.setProperty("module.name", "MODULE_NAME");
+ properties.setProperty("node.name", "NODE_NAME");
+ details.setAdditionalProperties(properties);
+ Whitebox.setInternalState(client, "connectionDetails", details);
+ assertEquals("TEST", client.getConfiguration());
+ }
+
+ @Test
+ public void testCheckConnection() throws SvcLogicException {
+ NetconfClientRestconfImpl client = new NetconfClientRestconfImpl();
+ assertFalse(client.checkConnection(null));
+
+ }
+}
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-installer/pom.xml b/adaptors/netconf-adaptor/netconf-adaptor-installer/pom.xml
new file mode 100644
index 000000000..7fdbdbd89
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-installer/pom.xml
@@ -0,0 +1,141 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ============LICENSE_START=======================================================
+ ONAP : APPC
+ ================================================================================
+ Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ Copyright (C) 2017 Amdocs
+ ================================================================================
+ 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=========================================================
+ -->
+<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>
+ <parent>
+ <groupId>org.onap.ccsdk.parent</groupId>
+ <artifactId>odlparent-lite</artifactId>
+ <version>2.2.0-SNAPSHOT</version>
+ <relativePath/>
+ </parent>
+
+ <groupId>org.onap.ccsdk.sli.adaptors</groupId>
+ <artifactId>netconf-adaptor-installer</artifactId>
+ <version>1.3.0-SNAPSHOT</version>
+ <packaging>pom</packaging>
+
+ <name>ccsdk-sli-adaptors :: ${project.artifactId}</name>
+
+ <properties>
+ <application.name>ccsdk-netconf-adaptor</application.name>
+ <features.boot>${application.name}</features.boot>
+ <features.repositories>mvn:org.onap.ccsdk.sli.adaptors/${features.boot}/${project.version}/xml/features</features.repositories>
+ <include.transitive.dependencies>false</include.transitive.dependencies>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.onap.ccsdk.sli.adaptors</groupId>
+ <artifactId>netconf-adaptor-bundle</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>maven-repo-zip</id>
+ <goals>
+ <goal>single</goal>
+ </goals>
+ <phase>package</phase>
+ <configuration>
+ <appendAssemblyId>false</appendAssemblyId>
+ <attach>false</attach>
+ <finalName>stage/${application.name}-${project.version}</finalName>
+ <descriptors>
+ <descriptor>src/assembly/assemble_mvnrepo_zip.xml</descriptor>
+ </descriptors>
+ </configuration>
+ </execution>
+ <execution>
+ <id>installer-zip</id>
+ <goals>
+ <goal>single</goal>
+ </goals>
+ <phase>package</phase>
+ <configuration>
+ <appendAssemblyId>false</appendAssemblyId>
+ <attach>true</attach>
+ <finalName>${application.name}-${project.version}</finalName>
+ <descriptors>
+ <descriptor>src/assembly/assemble_installer_zip.xml</descriptor>
+ </descriptors>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>copy-dependencies</id>
+ <goals>
+ <goal>copy-dependencies</goal>
+ </goals>
+ <phase>prepare-package</phase>
+ <configuration>
+ <outputDirectory>${project.build.directory}/assembly/system</outputDirectory>
+ <overWriteReleases>false</overWriteReleases>
+ <overWriteSnapshots>true</overWriteSnapshots>
+ <overWriteIfNewer>true</overWriteIfNewer>
+ <useRepositoryLayout>true</useRepositoryLayout>
+ <addParentPoms>false</addParentPoms>
+ <copyPom>false</copyPom>
+ <excludeGroupIds>org.opendaylight</excludeGroupIds>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <artifactId>maven-resources-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>copy-version</id>
+ <goals>
+ <goal>copy-resources</goal>
+ </goals>
+ <!-- here the phase you need -->
+ <phase>validate</phase>
+ <configuration>
+ <outputDirectory>${basedir}/target/stage</outputDirectory>
+ <resources>
+ <resource>
+ <directory>src/main/resources/scripts</directory>
+ <includes>
+ <include>install-feature.sh</include>
+ </includes>
+ <filtering>true</filtering>
+ </resource>
+ </resources>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-installer/src/assembly/assemble_installer_zip.xml b/adaptors/netconf-adaptor/netconf-adaptor-installer/src/assembly/assemble_installer_zip.xml
new file mode 100644
index 000000000..47562ec5b
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-installer/src/assembly/assemble_installer_zip.xml
@@ -0,0 +1,59 @@
+<!--
+ ============LICENSE_START=======================================================
+ ONAP : APPC
+ ================================================================================
+ Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ ================================================================================
+ Copyright (C) 2017 Amdocs
+ =============================================================================
+ 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=========================================================
+ -->
+
+<!-- Defines how we build the .zip file which is our distribution. -->
+
+<assembly
+ xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+ <id>adaptor</id>
+ <formats>
+ <format>zip</format>
+ </formats>
+
+ <!-- we want "system" and related files right at the root level
+ as this file is suppose to be unzip on top of a karaf
+ distro. -->
+ <includeBaseDirectory>false</includeBaseDirectory>
+
+ <fileSets>
+ <fileSet>
+ <directory>target/stage/</directory>
+ <outputDirectory>${application.name}</outputDirectory>
+ <fileMode>755</fileMode>
+ <includes>
+ <include>*.sh</include>
+ </includes>
+ </fileSet>
+ <fileSet>
+ <directory>target/stage/</directory>
+ <outputDirectory>${application.name}</outputDirectory>
+ <fileMode>644</fileMode>
+ <excludes>
+ <exclude>*.sh</exclude>
+ </excludes>
+ </fileSet>
+ </fileSets>
+
+</assembly>
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-installer/src/assembly/assemble_mvnrepo_zip.xml b/adaptors/netconf-adaptor/netconf-adaptor-installer/src/assembly/assemble_mvnrepo_zip.xml
new file mode 100644
index 000000000..657f337ee
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-installer/src/assembly/assemble_mvnrepo_zip.xml
@@ -0,0 +1,49 @@
+<!--
+ ============LICENSE_START=======================================================
+ ONAP : APPC
+ ================================================================================
+ Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ ================================================================================
+ Copyright (C) 2017 Amdocs
+ =============================================================================
+ 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=========================================================
+ -->
+
+<!-- Defines how we build the .zip file which is our distribution. -->
+
+<assembly
+ xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+ <id>adaptor</id>
+ <formats>
+ <format>zip</format>
+ </formats>
+
+ <!-- we want "system" and related files right at the root level
+ as this file is suppose to be unzip on top of a karaf
+ distro. -->
+ <includeBaseDirectory>false</includeBaseDirectory>
+
+ <fileSets>
+ <fileSet>
+ <directory>target/assembly/</directory>
+ <outputDirectory>.</outputDirectory>
+ <excludes>
+ </excludes>
+ </fileSet>
+ </fileSets>
+
+</assembly>
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-installer/src/main/resources/scripts/install-feature.sh b/adaptors/netconf-adaptor/netconf-adaptor-installer/src/main/resources/scripts/install-feature.sh
new file mode 100644
index 000000000..17282a8db
--- /dev/null
+++ b/adaptors/netconf-adaptor/netconf-adaptor-installer/src/main/resources/scripts/install-feature.sh
@@ -0,0 +1,50 @@
+#!/bin/bash
+
+###
+# ============LICENSE_START=======================================================
+# ONAP : APPC
+# ================================================================================
+# Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Copyright (C) 2017 Amdocs
+# =============================================================================
+# 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=========================================================
+###
+
+ODL_HOME=${ODL_HOME:-/opt/opendaylight/current}
+ODL_KARAF_CLIENT=${ODL_KARAF_CLIENT:-${ODL_HOME}/bin/client}
+ODL_KARAF_CLIENT_OPTS=${ODL_KARAF_CLIENT_OPTS:-""}
+INSTALLERDIR=$(dirname $0)
+
+REPOZIP=${INSTALLERDIR}/${features.boot}-${project.version}.zip
+
+if [ -f ${REPOZIP} ]
+then
+ unzip -n -d ${ODL_HOME} ${REPOZIP}
+
+fi
+
+COUNT=0
+while [ $COUNT -lt 10 ]; do
+# ${ODL_KARAF_CLIENT} ${ODL_KARAF_CLIENT_OPTS} feature:repo-add ${features.repositories} 2> /tmp/installErr
+ sshpass -pkaraf ssh -o StrictHostKeyChecking=no karaf@localhost -p 8101 "feature:repo-add ${features.repositories}" 2> /tmp/installErr
+ cat /tmp/installErr
+ if grep -q 'Failed to get the session' /tmp/installErr; then
+ sleep 10
+ else
+ let COUNT=10
+ fi
+ let COUNT=COUNT+1
+done
diff --git a/adaptors/netconf-adaptor/pom.xml b/adaptors/netconf-adaptor/pom.xml
new file mode 100644
index 000000000..fa5ecaaee
--- /dev/null
+++ b/adaptors/netconf-adaptor/pom.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ============LICENSE_START=======================================================
+ ONAP : APPC
+ ================================================================================
+ Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ Copyright (C) 2017 Amdocs
+ ================================================================================
+ 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=========================================================
+ -->
+<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>
+
+ <parent>
+ <groupId>org.onap.ccsdk.parent</groupId>
+ <artifactId>odlparent-lite</artifactId>
+ <version>2.2.0-SNAPSHOT</version>
+ <relativePath/>
+ </parent>
+
+ <groupId>org.onap.ccsdk.sli.adaptors</groupId>
+ <artifactId>netconf-adaptor</artifactId>
+ <version>1.3.0-SNAPSHOT</version>
+ <packaging>pom</packaging>
+
+ <name>ccsdk-sli-adaptors :: ${project.artifactId}</name>
+
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>org.onap.ccsdk.sli.adaptors</groupId>
+ <artifactId>ccsdk-netconf-adaptor</artifactId>
+ <classifier>features</classifier>
+ <type>xml</type>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.onap.ccsdk.sli.adaptors</groupId>
+ <artifactId>netconf-adaptor-bundle</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+
+ <modules>
+ <module>netconf-adaptor-bundle</module>
+ <module>netconf-adaptor-installer</module>
+ </modules>
+
+</project>
diff --git a/adaptors/pom.xml b/adaptors/pom.xml
index 2a818cbba..98600a6cb 100755
--- a/adaptors/pom.xml
+++ b/adaptors/pom.xml
@@ -26,6 +26,7 @@
<module>ansible-adaptor</module>
<module>chef-adaptor</module>
+ <module>netconf-adaptor</module>
<module>saltstack-adaptor</module>
<module>ssh-adaptor</module>
diff --git a/adaptors/saltstack-adaptor/saltstack-adaptor-provider/src/main/java/org/onap/ccsdk/sli/adaptors/saltstack/impl/SaltstackAdaptorImpl.java b/adaptors/saltstack-adaptor/saltstack-adaptor-provider/src/main/java/org/onap/ccsdk/sli/adaptors/saltstack/impl/SaltstackAdaptorImpl.java
index 05b1688b6..7e7dbe1a2 100644
--- a/adaptors/saltstack-adaptor/saltstack-adaptor-provider/src/main/java/org/onap/ccsdk/sli/adaptors/saltstack/impl/SaltstackAdaptorImpl.java
+++ b/adaptors/saltstack-adaptor/saltstack-adaptor-provider/src/main/java/org/onap/ccsdk/sli/adaptors/saltstack/impl/SaltstackAdaptorImpl.java
@@ -62,7 +62,7 @@ public class SaltstackAdaptorImpl implements SaltstackAdaptor {
@SuppressWarnings("nls")
public static final String OUTCOME_SUCCESS = "success";
public static final String CONNECTION_RETRY = "withRetry";
- private static final String APPC_EXCEPTION_CAUGHT = "APPCException caught";
+ private static final String APPC_EXCEPTION_CAUGHT = "SvcLogicException caught";
/**
* Adaptor Name
*/