From 7b25afd7fbb945686f5444e05e5e15716052b027 Mon Sep 17 00:00:00 2001 From: "Singal, Kapil (ks220y)" Date: Mon, 26 Apr 2021 13:41:57 -0400 Subject: Moving Netconf-adaptor from APPC to CCSDK SLI Issue-ID: CCSDK-3198 Signed-off-by: Singal, Kapil (ks220y) Change-Id: I638d57729d100211325f4e3121970d6737b9a50c --- .../ansible-adaptor/ansible-adaptor-bundle/pom.xml | 31 +-- .../adaptors/ansible/impl/AnsibleAdaptorImpl.java | 10 +- .../impl/AnsibleAdaptorPropertiesProviderImpl.java | 10 +- adaptors/features/ccsdk-netconf-adaptor/pom.xml | 39 ++++ adaptors/features/pom.xml | 1 + .../netconf-adaptor/netconf-adaptor-bundle/pom.xml | 206 +++++++++++++++++ .../sli/adaptors/netconf/ConnectionDetails.java | 66 ++++++ .../ccsdk/sli/adaptors/netconf/HttpClient.java | 204 +++++++++++++++++ .../netconf/MockOperationalStateValidatorImpl.java | 47 ++++ .../adaptors/netconf/NetconfAdaptorConstants.java | 69 ++++++ .../ccsdk/sli/adaptors/netconf/NetconfClient.java | 63 ++++++ .../sli/adaptors/netconf/NetconfClientFactory.java | 41 ++++ .../adaptors/netconf/NetconfClientRestconf.java | 67 ++++++ .../sli/adaptors/netconf/NetconfClientType.java | 30 +++ .../adaptors/netconf/NetconfConnectionDetails.java | 94 ++++++++ .../adaptors/netconf/NetconfDataAccessService.java | 82 +++++++ .../netconf/OperationalStateValidator.java | 35 +++ .../netconf/OperationalStateValidatorFactory.java | 56 +++++ .../netconf/VNFOperationalStateValidatorImpl.java | 129 +++++++++++ .../onap/ccsdk/sli/adaptors/netconf/VnfType.java | 57 +++++ .../netconf/exception/DataAccessException.java | 47 ++++ .../netconf/exception/NetconfDAOException.java | 47 ++++ .../adaptors/netconf/internal/NetconfAdaptor.java | 128 +++++++++++ .../adaptors/netconf/internal/NetconfAdaptor2.java | 127 +++++++++++ .../netconf/internal/NetconfConstMessages.java | 59 +++++ .../internal/NetconfDataAccessServiceImpl.java | 146 ++++++++++++ .../adaptors/netconf/internal/NetconfMessage.java | 97 ++++++++ .../sli/adaptors/netconf/jsch/JSchLogger.java | 64 ++++++ .../adaptors/netconf/jsch/NetconfClientJsch.java | 184 +++++++++++++++ .../odlconnector/NetconfClientRestconfImpl.java | 246 +++++++++++++++++++++ .../src/main/resources/netconf-adaptor.properties | 43 ++++ .../adaptors/netconf/NetconfClientFactoryTest.java | 50 +++++ .../adaptors/netconf/NetconfClientTypeTest.java | 41 ++++ .../netconf/NetconfConnectionDetailsTest.java | 118 ++++++++++ .../netconf/OperationalStateValidatorTest.java | 200 +++++++++++++++++ .../adaptors/netconf/TestConnectionDetails.java | 46 ++++ .../ccsdk/sli/adaptors/netconf/TestVnfType.java | 42 ++++ .../VNFOperationalStateValidatorImplTest.java | 51 +++++ .../netconf/exception/DataAccessExceptionTest.java | 64 ++++++ .../netconf/exception/NetconfDAOExceptionTest.java | 64 ++++++ .../netconf/internal/TestNetconfAdaptor.java | 88 ++++++++ .../netconf/internal/TestNetconfAdaptor2.java | 103 +++++++++ .../internal/TestNetconfDataAccessServiceImpl.java | 139 ++++++++++++ .../netconf/jsch/TestGetRunningConfig.java | 59 +++++ .../sli/adaptors/netconf/jsch/TestJSchLogger.java | 55 +++++ .../adaptors/netconf/jsch/TestModifyConfig.java | 92 ++++++++ .../netconf/jsch/TestModifyConfigMock.java | 92 ++++++++ .../netconf/jsch/TestModifyConfigRouterMock.java | 90 ++++++++ .../netconf/jsch/TestNetconfClientJsch.java | 191 ++++++++++++++++ .../netconf/jsch/TestOperationalStates.java | 86 +++++++ .../NetconfClientRestconfImplTest.java | 207 +++++++++++++++++ .../netconf-adaptor-installer/pom.xml | 141 ++++++++++++ .../src/assembly/assemble_installer_zip.xml | 59 +++++ .../src/assembly/assemble_mvnrepo_zip.xml | 49 ++++ .../src/main/resources/scripts/install-feature.sh | 50 +++++ adaptors/netconf-adaptor/pom.xml | 61 +++++ adaptors/pom.xml | 1 + .../saltstack/impl/SaltstackAdaptorImpl.java | 2 +- 58 files changed, 4742 insertions(+), 24 deletions(-) create mode 100644 adaptors/features/ccsdk-netconf-adaptor/pom.xml create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/pom.xml create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/ConnectionDetails.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/HttpClient.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/MockOperationalStateValidatorImpl.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfAdaptorConstants.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClient.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClientFactory.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClientRestconf.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClientType.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfConnectionDetails.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfDataAccessService.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/OperationalStateValidator.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/OperationalStateValidatorFactory.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/VNFOperationalStateValidatorImpl.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/VnfType.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/exception/DataAccessException.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/exception/NetconfDAOException.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/internal/NetconfAdaptor.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/internal/NetconfAdaptor2.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/internal/NetconfConstMessages.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/internal/NetconfDataAccessServiceImpl.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/internal/NetconfMessage.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/JSchLogger.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/NetconfClientJsch.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/netconf/odlconnector/NetconfClientRestconfImpl.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/main/resources/netconf-adaptor.properties create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClientFactoryTest.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfClientTypeTest.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/NetconfConnectionDetailsTest.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/OperationalStateValidatorTest.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/TestConnectionDetails.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/TestVnfType.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/VNFOperationalStateValidatorImplTest.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/exception/DataAccessExceptionTest.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/exception/NetconfDAOExceptionTest.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/internal/TestNetconfAdaptor.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/internal/TestNetconfAdaptor2.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/internal/TestNetconfDataAccessServiceImpl.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestGetRunningConfig.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestJSchLogger.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestModifyConfig.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestModifyConfigMock.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestModifyConfigRouterMock.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestNetconfClientJsch.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/jsch/TestOperationalStates.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/netconf/odlconnector/NetconfClientRestconfImplTest.java create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-installer/pom.xml create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-installer/src/assembly/assemble_installer_zip.xml create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-installer/src/assembly/assemble_mvnrepo_zip.xml create mode 100644 adaptors/netconf-adaptor/netconf-adaptor-installer/src/main/resources/scripts/install-feature.sh create mode 100644 adaptors/netconf-adaptor/pom.xml (limited to 'adaptors') 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 @@ - + 4.0.0 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 fileOptional = propertiesFileResolver.resolveFile(ANSIBLE_Adaptor_PROPERTIES); + final Optional 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 @@ + + + 4.0.0 + + + org.onap.ccsdk.parent + single-feature-parent + 2.2.0-SNAPSHOT + + + + org.onap.ccsdk.sli.adaptors + ccsdk-netconf-adaptor + 1.3.0-SNAPSHOT + feature + + ccsdk-sli-adaptors :: features :: ${project.artifactId} + + + + org.opendaylight.controller + odl-mdsal-broker + xml + features + + + org.onap.ccsdk.sli.core + ccsdk-dblib + xml + features + ${project.version} + + + ${project.groupId} + netconf-adaptor-bundle + ${project.version} + + + 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 @@ ccsdk-ansible-adaptor ccsdk-chef-adaptor + ccsdk-netconf-adaptor ccsdk-saltstack-adaptor ccsdk-ssh-adaptor 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 @@ + + + + 4.0.0 + + org.onap.ccsdk.parent + binding-parent + 2.2.0-SNAPSHOT + + + + org.onap.ccsdk.sli.adaptors + netconf-adaptor-bundle + 1.3.0-SNAPSHOT + bundle + + ccsdk-sli-adaptors :: ${project.artifactId} + + + 4.9.1 + 1.6.0 + 1.3.1-Beryllium-SR1 + 1.1.25.8-oss + + + + + + org.onap.ccsdk.sli.core + sli-core-artifacts + ${project.version} + pom + import + + + + + + com.att.eelf + eelf-core + + + commons-codec + commons-codec + + + commons-logging + commons-logging + + + org.apache.httpcomponents + httpcore + + + org.apache.httpcomponents + httpclient + + + org.onap.ccsdk.sli.core + sli-common + + + org.onap.ccsdk.sli.core + sli-provider + + + org.onap.ccsdk.sli.core + dblib-provider + + + javax + javaee-api + + + org.osgi + org.osgi.core + + + org.slf4j + slf4j-api + + + org.slf4j + jcl-over-slf4j + + + org.json + json + + + com.google.guava + guava + + + + javax.ws.rs + javax.ws.rs-api + + + javax.xml.bind + jaxb-api + + + com.jcraft + jsch + 0.1.54 + + + + + junit + junit + test + + + org.hamcrest + hamcrest-all + 1.3 + test + + + + org.mockito + mockito-core + 1.10.19 + test + + + org.powermock + powermock-reflect + test + + + org.powermock + powermock-api-mockito2 + test + + + org.powermock + powermock-module-junit4 + test + + + + + + + org.apache.felix + maven-bundle-plugin + true + + + netconf-adaptor + org.onap.ccsdk.sli.adaptors.netconf + + !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.* + + + *;scope=compile|runtime;artifactId=!dblib-provider|sli-common|org.eclipse.osgi|slf4j-api|jcl-over-slf4j|mariadb-java-client|xml-apis + + true + + + + + + + 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 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 getCapabilities() { + return capabilities; + } + + public void setCapabilities(List 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 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> getOperationalStateList(String xmlText) throws IOException, ParserConfigurationException, SAXException { + List 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 readTask = () -> { + int c; + while ((c = in.read(buf)) > 0) { + message.append(buf, 0, c); + if (message.isCompleted()) { + break; + } + } + + return c >= 0; + }; + + Future 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 = "\n"; + + public static final String CAPABILITIES_START = + XML_HEADER + + "\n" + + " \n"; + + public static final String CAPABILITIES_BASE = + " urn:ietf:params:netconf:base:1.0\n"; + + public static final String CAPABILITIES_END = + " \n" + + ""; + + public static final String GET_RUNNING_CONFIG = + XML_HEADER + + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + ""; + + public static final String CLOSE_SESSION = + XML_HEADER + + "\n" + + " \n" + + ""; + + 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 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 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 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 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("")) { + 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("")) { + 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=:3904 +event.topic.write=APPC-TEST1 +event.client.key=VIlbtVl6YLhNUrtU +event.client.secret=64AG2hF4pYeG2pq7CT6XwUOT +#restconf.user= +#restconf.pass= + +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 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(); + Assert.assertNull(netconfConnectionDetails.getCapabilities()); + } + + @Test + public void testCapabilitiesWithValues() { + capabilities = new ArrayList(); + capabilities.add("capabilities1"); + capabilities.add("capabilities2"); + netconfConnectionDetails.setCapabilities(capabilities); + Assert.assertTrue(capabilities.contains("capabilities2")); + } + + @Test + public void testCapabilities_Size() { + capabilities = new ArrayList(); + 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 = "\n" + + "\n" + + " \n" + + " \n" + + " 1\n" + + " \n" + + " 1\n" + + " \n" + + " 1\n" + + " \n" + + " 1\n" + + " ENABLED\n" + + " \n" + + " processor_0_5\n" + + " ENABLED\n" + + " \n" + + " \n" + + " processor_0_7\n" + + " ENABLED\n" + + " \n" + + " \n" + + " \n" + + " SC-1\n" + + " ENABLED\n" + + " \n" + + " \n" + + " SC-2\n" + + " ENABLED\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + ""; + 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 = ""; + assertInvalidResponse(response, operationalStateValidator); + + response = "\n" + + "\n" + + ""; + assertInvalidResponse(response, operationalStateValidator); + + response = "\n" + + "\n" + + " \n" + + " \n" + + " 1\n" + + " \n" + + " 1\n" + + " \n" + + " 1\n" + + " \n" + + " 1\n" + + " ENABLED\n" + + " \n" + + " processor_0_5\n" + + " ENABLED\n" + + " \n" + + " \n" + + " processor_0_7\n" + + " ENABLED\n" + + " \n" + + " \n" + + " \n" + + " SC-1\n" + + " ENABLED\n" + + " \n" + + " \n" + + " SC-2\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + ""; + 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 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 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 unwrap(Class 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 CAPABILITIES = Collections.singletonList("urn:org:onap:appc:capability:1.1.0"); + + 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 CAPABILITIES = Collections.singletonList("urn:org:onap:appc:capability:1.1.0"); + private static final String CONFIG = + "\n" + + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " merge\n" + + " \n" + + " \n" + + " 1\n" + + " \n" + + " 1\n" + + " \n" + + " 1\n" + + " \n" + + " example.com\n" + + " 60\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \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); + + 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 CAPABILITIES = Collections.singletonList("urn:org:onap:appc:capability:1.1.0"); + private static final String CONFIG = + "\n" + + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " merge\n" + + " \n" + + " \n" + + " 1\n" + + " \n" + + " 1\n" + + " \n" + + " 1\n" + + " \n" + + " example.com\n" + + " 60\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \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); + + 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 CAPABILITIES = Collections.emptyList(); + private static final String CONFIG = + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " 1\n" + + " \n" + + " 100.100.100.0/24\n" + + " 10\n" + + " \n" + + " \n" + + " \n" + + " 1000\n" + + " 10.10.1.1\n" + + " \n" + + " 2000\n" + + " 10.10.1.2\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "\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("").when(mockNetconfAdaptor).receiveMessage(); + NetconfConnectionDetails connectionDetails = new NetconfConnectionDetails(); + connectionDetails.setHost("test"); + connectionDetails.setPort(8080); + connectionDetails.setUsername("test"); + connectionDetails.setPassword("test"); + List capabilities = Collections.singletonList( + "urn:ietf:params:netconf:base:1.1\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("urn:ietf:params:netconf:base:1.1")); + } + + @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("").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("")) + )))); + netconfClientJsch.connect(connectionDetails); + } + + @Test + public void testConnectWithSuccessfulDisconnect() + throws JSchException, IOException, SvcLogicException { + setupForConnectTests(); + Mockito.doThrow(new JSchException()).when(mockChannel).connect(10000); + Mockito.doReturn("").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("").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 CAPABILITIES = Collections.singletonList("urn:org:onap:appc:capability:1.1.0"); + private static final String GET_OPERATIONAL_STATES = + "\n" + + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \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("=> 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 @@ + + + + 4.0.0 + + org.onap.ccsdk.parent + odlparent-lite + 2.2.0-SNAPSHOT + + + + org.onap.ccsdk.sli.adaptors + netconf-adaptor-installer + 1.3.0-SNAPSHOT + pom + + ccsdk-sli-adaptors :: ${project.artifactId} + + + ccsdk-netconf-adaptor + ${application.name} + mvn:org.onap.ccsdk.sli.adaptors/${features.boot}/${project.version}/xml/features + false + + + + + org.onap.ccsdk.sli.adaptors + netconf-adaptor-bundle + ${project.version} + + + + + + + maven-assembly-plugin + + + maven-repo-zip + + single + + package + + false + false + stage/${application.name}-${project.version} + + src/assembly/assemble_mvnrepo_zip.xml + + + + + installer-zip + + single + + package + + false + true + ${application.name}-${project.version} + + src/assembly/assemble_installer_zip.xml + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-dependencies + + copy-dependencies + + prepare-package + + ${project.build.directory}/assembly/system + false + true + true + true + false + false + org.opendaylight + + + + + + maven-resources-plugin + + + copy-version + + copy-resources + + + validate + + ${basedir}/target/stage + + + src/main/resources/scripts + + install-feature.sh + + true + + + + + + + + + + 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 @@ + + + + + + adaptor + + zip + + + + false + + + + target/stage/ + ${application.name} + 755 + + *.sh + + + + target/stage/ + ${application.name} + 644 + + *.sh + + + + + 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 @@ + + + + + + adaptor + + zip + + + + false + + + + target/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 @@ + + + + 4.0.0 + + + org.onap.ccsdk.parent + odlparent-lite + 2.2.0-SNAPSHOT + + + + org.onap.ccsdk.sli.adaptors + netconf-adaptor + 1.3.0-SNAPSHOT + pom + + ccsdk-sli-adaptors :: ${project.artifactId} + + + + + org.onap.ccsdk.sli.adaptors + ccsdk-netconf-adaptor + features + xml + ${project.version} + + + org.onap.ccsdk.sli.adaptors + netconf-adaptor-bundle + ${project.version} + + + + + + netconf-adaptor-bundle + netconf-adaptor-installer + + + 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 @@ ansible-adaptor chef-adaptor + netconf-adaptor saltstack-adaptor ssh-adaptor 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 */ -- cgit 1.2.3-korg