summaryrefslogtreecommitdiffstats
path: root/appc-adapters/appc-ssh-adapter
diff options
context:
space:
mode:
authorPatrick Brady <pb071s@att.com>2017-02-15 23:11:26 -0800
committerPatrick Brady <pb071s@att.com>2017-02-15 23:13:06 -0800
commit1c192d2dd68724e292b6a30f463085a262e1e813 (patch)
treed0e2b3a396e169863cd0efaa835c8675e9d5aaac /appc-adapters/appc-ssh-adapter
parentc69ba05c7508aa7d7f675189a45c8c87569369ef (diff)
Moving all files to root directory
Change-Id: Ica5535fd6ec85f350fe1640b42137b49f83f10f0 Signed-off-by: Patrick Brady <pb071s@att.com>
Diffstat (limited to 'appc-adapters/appc-ssh-adapter')
-rw-r--r--appc-adapters/appc-ssh-adapter/.settings/org.eclipse.wst.common.project.facet.core.xml4
-rw-r--r--appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/.settings/org.eclipse.wst.common.project.facet.core.xml4
-rw-r--r--appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/pom.xml47
-rw-r--r--appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/src/main/java/org/openecomp/appc/adapter/ssh/Constants.java141
-rw-r--r--appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/src/main/java/org/openecomp/appc/adapter/ssh/SshAdapter.java39
-rw-r--r--appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/src/main/java/org/openecomp/appc/adapter/ssh/SshConnection.java67
-rw-r--r--appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/src/main/java/org/openecomp/appc/adapter/ssh/SshConnectionDetails.java72
-rw-r--r--appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/src/main/java/org/openecomp/appc/adapter/ssh/SshDataAccessException.java45
-rw-r--r--appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/src/main/java/org/openecomp/appc/adapter/ssh/SshDataAccessService.java58
-rw-r--r--appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/src/main/java/org/openecomp/appc/adapter/ssh/SshException.java46
-rw-r--r--appc-adapters/appc-ssh-adapter/appc-ssh-adapter-features/pom.xml72
-rw-r--r--appc-adapters/appc-ssh-adapter/appc-ssh-adapter-features/src/main/resources/features.xml31
-rw-r--r--appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/.settings/org.eclipse.wst.common.project.facet.core.xml4
-rw-r--r--appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/pom.xml62
-rw-r--r--appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/src/main/java/org/openecomp/appc/adapter/ssh/sshd/SshAdapterSshd.java33
-rw-r--r--appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/src/main/java/org/openecomp/appc/adapter/ssh/sshd/SshConnectionSshd.java172
-rw-r--r--appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/src/main/java/org/openecomp/appc/adapter/ssh/sshd/SshdDataAccessService.java106
-rw-r--r--appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/src/main/resources/OSGI-INF/blueprint/blueprint.xml38
-rw-r--r--appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/src/test/java/org/openecomp/appc/adapter/ssh/sshd/SshAdapterSample.java56
-rw-r--r--appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/src/test/java/org/openecomp/appc/adapter/ssh/sshd/SshAdapterTest.java247
-rw-r--r--appc-adapters/appc-ssh-adapter/appc-ssh-adapter-tests/.settings/org.eclipse.wst.common.project.facet.core.xml4
-rw-r--r--appc-adapters/appc-ssh-adapter/appc-ssh-adapter-tests/pom.xml18
-rw-r--r--appc-adapters/appc-ssh-adapter/appc-ssh-adapter-tests/src/main/java/org/openecomp/appc/adapter/ssh/SshAdapterMock.java75
-rw-r--r--appc-adapters/appc-ssh-adapter/appc-ssh-adapter-tests/src/main/java/org/openecomp/appc/adapter/ssh/SshConnectionMock.java155
-rw-r--r--appc-adapters/appc-ssh-adapter/pom.xml19
25 files changed, 1615 insertions, 0 deletions
diff --git a/appc-adapters/appc-ssh-adapter/.settings/org.eclipse.wst.common.project.facet.core.xml b/appc-adapters/appc-ssh-adapter/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 000000000..f4ef8aa0a
--- /dev/null
+++ b/appc-adapters/appc-ssh-adapter/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+ <installed facet="java" version="1.8"/>
+</faceted-project>
diff --git a/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/.settings/org.eclipse.wst.common.project.facet.core.xml b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 000000000..f4ef8aa0a
--- /dev/null
+++ b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+ <installed facet="java" version="1.8"/>
+</faceted-project>
diff --git a/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/pom.xml b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/pom.xml
new file mode 100644
index 000000000..0a402669b
--- /dev/null
+++ b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/pom.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-ssh-adapter</artifactId>
+ <version>1.0.0</version>
+ </parent>
+
+ <artifactId>appc-ssh-adapter-api</artifactId>
+ <packaging>bundle</packaging>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.openecomp.sdnc.core</groupId>
+ <artifactId>dblib-provider</artifactId>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Export-Package>org.openecomp.appc.adapter.ssh</Export-Package>
+ <Embed-Dependency>!dblib-provider</Embed-Dependency>
+ </instructions>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>attach-javadocs</id>
+ <goals>
+ <goal>jar</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/src/main/java/org/openecomp/appc/adapter/ssh/Constants.java b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/src/main/java/org/openecomp/appc/adapter/ssh/Constants.java
new file mode 100644
index 000000000..9a160dbff
--- /dev/null
+++ b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/src/main/java/org/openecomp/appc/adapter/ssh/Constants.java
@@ -0,0 +1,141 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 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.openecomp.appc.adapter.ssh;
+
+public class Constants {
+
+ private Constants(){}
+
+// 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";
+//
+// public static final String VF_LICENSE = "VF_LICENSE";
+
+ // tables and fields
+ public static final String NETCONF_SCHEMA = "sdnctl";
+ public static final String SDNCTL_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 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";
+ public static final String ASDC_ARTIFACTS_TABLE_NAME = "ASDC_ARTIFACTS";
+
+ // input fields names
+ public static final String PAYLOAD = "payload";
+
+
+ public static final String PARAM_IN_connection_details = "connection-details";
+ public static final String SKIP_EXECUTION_INSTALLER_BIN_FILE = "Skip-execution-installer-bin-file";
+ public static final String SKIP_DEPLOY = "Skip-deploy";
+ public static final String UPGRADE_VERSION = "upgrade-version";
+
+ //command to get number of UP hosts
+ public static final String STATE_COMMAND = "/opt/jnetx/skyfall-scp/asp-state.sh | grep -o UP | wc -l";
+ public static final int STATE_COMMAND_RESULT = 18;
+ //commands to check FE hosts
+ public static final String FE_STATE_TRUE_TEST_COMMAND = "ssh -t -q fe1 /opt/omni/bin/swmml -e display-platform-status | grep -o TRUE | wc -l";
+ public static final int FE_STATE_TRUE_TEST_RESULT = 22;
+ public static final String FE_STATE_FALSE_TEST_COMMAND = "ssh -t -q fe1 /opt/omni/bin/swmml -e display-platform-status | grep -o FALSE | wc -l";
+ public static final int FE_STATE_FALSE_TEST_RESULT = 2;
+ public static final String FE_OPERATIONAL_TEST_COMMAND = "ssh -t -q fe1 /opt/omni/bin/swmml -e display-platform-status | grep -o 'NOT FULLY OPERATIONAL' | wc -l";
+ public static final int FE_OPERATIONAL_TEST_RESULT = 2;
+ //rsync command
+ public static final String RSYNC_COMMAND = "yes n | /opt/jnetx/skyfall-scp/asp-rsync.sh --check | grep -o 'is active' | wc -l";
+ public static final int RSYNC_COMMAND_RESULT = 9;
+
+ public static final String PARAM_IN_TIMEOUT = "timeout";
+ public static final String PARAM_IN_FILE_URL = "source-file-url";
+ public static final String DOWNLOAD_COMMAND = "wget -N %s";
+
+ // pre-define jnetx VM names
+ public static final String[] VM_NAMES = {"fe1", "fe2", "be1", "be2", "be3", "be4", "be5", "smp1", "smp2"};
+
+ public static final String DEFAULT_DISK_SPACE = "10240000";
+ public static final String DF_COMMAND_TEMPLATE = "ssh %s df | grep vda1 | grep -v grep | tr -s ' '|cut -d ' ' -f4";
+
+ public static final String DG_OUTPUT_STATUS_MESSAGE = "output.status.message";
+
+
+ // constants fo DG
+// public static final String VNF_TYPE_FIELD_NAME = "org.openecomp.appc.vftype";
+// public static final String VNF_VERSION_FIELD_NAME = "org.openecomp.appc.vfversion";
+// public static final String VNF_RESOURCE_VERSION_FIELD_NAME = "org.openecomp.appc.resource-version";
+// 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 UPGRADE_VERSION = "upgrade-version";
+ public static final String DG_ERROR_FIELD_NAME = "org.openecomp.appc.dg.error";
+// public static final String RESOURCEKEY = "resourceKey";
+// public static final String REQ_ID_FIELD_NAME = "org.openecomp.appc.reqid";
+// public static final String API_VERSION_FIELD_NAME = "org.openecomp.appc.apiversion";
+// public static final String MODEL_ENTITLMENT_POOL_UUID_NAME = "model.entitlement.pool.uuid";
+// public static final String MODEL_LICENSE_KEY_UUID_NAME = "model.license.key.uuid";
+// public static final String ENTITLMENT_POOL_UUID_NAME = "entitlement.pool.uuid";
+// public static final String LICENSE_KEY_UUID_NAME = "license.key.uuid";
+// public static final String IS_ACQUIRE_LICENSE_REQUIRE ="is.acquire-license.require";
+// public static final String IS_RELEASE_LICENSE_REQUIRE ="is.release-license.require";
+//
+// public static final String AAI_ENTITLMENT_POOL_UUID_NAME = "aai.input.data.entitlement-assignment-group-uuid";
+// public static final String AAI_LICENSE_KEY_UUID_NAME = "aai.input.data.license-assignment-group-uuid";
+// public static final String AAI_LICENSE_KEY_VALUE = "aai.input.data.license-key";
+// public static final String IS_AAI_ENTITLEMENT_UPDATE_REQUIRE = "is.aai-entitlement-update.require";
+// public static final String IS_AAI_LICENSE_UPDATE_REQUIRE = "is.aai-license-update.require";
+// public static final String IS_ACQUIRE_ENTITLEMENT_REQUIRE ="is.acquire-entitlement.require";
+// public static final String IS_RELEASE_ENTITLEMENT_REQUIRE ="is.release-entitlement.require";
+//
+// public enum ASDC_ARTIFACTS_FIELDS {
+// SERVICE_UUID,
+// DISTRIBUTION_ID,
+// SERVICE_NAME,
+// SERVICE_DESCRIPTION,
+// RESOURCE_UUID,
+// RESOURCE_INSTANCE_NAME,
+// RESOURCE_NAME,
+// RESOURCE_VERSION,
+// RESOURCE_TYPE,
+// ARTIFACT_UUID,
+// ARTIFACT_TYPE,
+// ARTIFACT_VERSION,
+// ARTIFACT_DESCRIPTION,
+// INTERNAL_VERSION,
+// CREATION_DATE,
+// ARTIFACT_NAME,
+// ARTIFACT_CONTENT
+// }
+}
diff --git a/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/src/main/java/org/openecomp/appc/adapter/ssh/SshAdapter.java b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/src/main/java/org/openecomp/appc/adapter/ssh/SshAdapter.java
new file mode 100644
index 000000000..3d305877b
--- /dev/null
+++ b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/src/main/java/org/openecomp/appc/adapter/ssh/SshAdapter.java
@@ -0,0 +1,39 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 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.openecomp.appc.adapter.ssh;
+
+/**
+ * Factory class for creating SshConnection instances.
+ */
+public interface SshAdapter {
+
+ /**
+ * Creates instance of SshConnection.
+ *
+ * @param host remote host to open SSH connection to
+ * @param port remote SSH port
+ * @param username SSH connection user name
+ * @param password SSH connection password
+ * @return instance of SshConnection
+ */
+ SshConnection getConnection(String host, int port, String username, String password);
+}
diff --git a/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/src/main/java/org/openecomp/appc/adapter/ssh/SshConnection.java b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/src/main/java/org/openecomp/appc/adapter/ssh/SshConnection.java
new file mode 100644
index 000000000..0b3275f5d
--- /dev/null
+++ b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/src/main/java/org/openecomp/appc/adapter/ssh/SshConnection.java
@@ -0,0 +1,67 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 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.openecomp.appc.adapter.ssh;
+
+import java.io.OutputStream;
+
+/**
+ * Provides utility method(s) to call commands on remote host via SSH.
+ */
+public interface SshConnection {
+
+ /**
+ * Connect to SSH server.
+ */
+ void connect();
+
+ /**
+ * Disconnect from SSH server.
+ */
+ void disconnect();
+
+ /**
+ * Exec remote command over SSH. Return command execution status.
+ * Command output is written to out or err stream.
+ *
+ * @param cmd command to execute
+ * @param out content of sysout will go to this stream
+ * @param err content of syserr will go to this stream
+ * @return command execution status
+ */
+ int execCommand(String cmd, OutputStream out, OutputStream err);
+
+ /**
+ * Exec remote command over SSH with pseudo-tty. Return command execution status.
+ * Command output is written to out stream only as pseudo-tty writes to one stream only.
+ *
+ * @param cmd command to execute
+ * @param out content of sysout will go to this stream
+ * @return command execution status
+ */
+ int execCommandWithPty(String cmd, OutputStream out);
+
+ /**
+ * Set the command execution timeout
+ * @param timeout time in milliseconds
+ */
+ void setExecTimeout(long timeout);
+}
diff --git a/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/src/main/java/org/openecomp/appc/adapter/ssh/SshConnectionDetails.java b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/src/main/java/org/openecomp/appc/adapter/ssh/SshConnectionDetails.java
new file mode 100644
index 000000000..a1fa97422
--- /dev/null
+++ b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/src/main/java/org/openecomp/appc/adapter/ssh/SshConnectionDetails.java
@@ -0,0 +1,72 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 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.openecomp.appc.adapter.ssh;
+
+/**
+ * Provides details required for connecting to device.
+ */
+public class SshConnectionDetails {
+
+ private static int DEFAULT_PORT = 22;
+
+ private String host;
+ private int port = DEFAULT_PORT;
+ private String username;
+ private String password;
+
+ public SshConnectionDetails() {
+ }
+
+ 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/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/src/main/java/org/openecomp/appc/adapter/ssh/SshDataAccessException.java b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/src/main/java/org/openecomp/appc/adapter/ssh/SshDataAccessException.java
new file mode 100644
index 000000000..2d7f8333d
--- /dev/null
+++ b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/src/main/java/org/openecomp/appc/adapter/ssh/SshDataAccessException.java
@@ -0,0 +1,45 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 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.openecomp.appc.adapter.ssh;
+
+
+
+public class SshDataAccessException extends RuntimeException {
+
+ private static final long serialVersionUID = -155423437162622414L;
+
+ public SshDataAccessException(){
+ }
+
+ public SshDataAccessException(String message){
+ super(message);
+ }
+
+ public SshDataAccessException(Throwable cause){
+ super(cause);
+ }
+
+ public SshDataAccessException(String message , Throwable cause){
+ super(message , cause);
+ }
+
+}
diff --git a/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/src/main/java/org/openecomp/appc/adapter/ssh/SshDataAccessService.java b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/src/main/java/org/openecomp/appc/adapter/ssh/SshDataAccessService.java
new file mode 100644
index 000000000..2d8119899
--- /dev/null
+++ b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/src/main/java/org/openecomp/appc/adapter/ssh/SshDataAccessService.java
@@ -0,0 +1,58 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 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.openecomp.appc.adapter.ssh;
+
+import org.openecomp.sdnc.sli.resource.dblib.DbLibService;
+
+
+@SuppressWarnings("JavaDoc")
+public interface SshDataAccessService {
+
+ /**
+ *
+ * @param schema
+ */
+ void setSchema(String schema);
+
+ /**
+ *@param dbLibService
+ */
+ void setDbLibService(DbLibService dbLibService);
+
+ /**
+ *
+ * @param xmlID
+ * @return
+ * @throws SshDataAccessException
+ */
+ String retrieveConfigFileName(String xmlID) throws SshDataAccessException;
+
+ /**
+ *
+ * @param vnfType
+ * @param connectionDetails
+ * @return
+ * @throws SshException
+ */
+ boolean retrieveConnectionDetails(String vnfType, SshConnectionDetails connectionDetails) throws SshDataAccessException;
+
+}
diff --git a/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/src/main/java/org/openecomp/appc/adapter/ssh/SshException.java b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/src/main/java/org/openecomp/appc/adapter/ssh/SshException.java
new file mode 100644
index 000000000..7a0c1fb99
--- /dev/null
+++ b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-api/src/main/java/org/openecomp/appc/adapter/ssh/SshException.java
@@ -0,0 +1,46 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 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.openecomp.appc.adapter.ssh;
+
+public class SshException extends RuntimeException {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Constructor with message.
+ *
+ * @param message exception message
+ */
+ public SshException(String message) {
+ super(message);
+ }
+
+ /**
+ * Constructor with message and cause exception.
+ *
+ * @param message exception message
+ * @param cause exception cause
+ */
+ public SshException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-features/pom.xml b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-features/pom.xml
new file mode 100644
index 000000000..39ac425d9
--- /dev/null
+++ b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-features/pom.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <artifactId>appc-ssh-adapter</artifactId>
+ <groupId>org.openecomp.appc</groupId>
+ <version>1.0.0</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+
+ <artifactId>appc-ssh-adapter-features</artifactId>
+ <packaging>jar</packaging>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-ssh-adapter-api</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-ssh-adapter-sshd</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <resources>
+ <resource>
+ <filtering>true</filtering>
+ <directory>src/main/resources</directory>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-resources-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>filter</id>
+ <goals>
+ <goal>resources</goal>
+ </goals>
+ <phase>generate-resources</phase>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>attach-artifacts</id>
+ <goals>
+ <goal>attach-artifact</goal>
+ </goals>
+ <phase>package</phase>
+ <configuration>
+ <artifacts>
+ <artifact>
+ <file>${project.build.directory}/classes/${features.file}</file>
+ <type>xml</type>
+ <classifier>features</classifier>
+ </artifact>
+ </artifacts>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-features/src/main/resources/features.xml b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-features/src/main/resources/features.xml
new file mode 100644
index 000000000..6f565dc09
--- /dev/null
+++ b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-features/src/main/resources/features.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ============LICENSE_START=======================================================
+ openECOMP : APP-C
+ ================================================================================
+ Copyright (C) 2017 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=========================================================
+ -->
+
+
+<features name="appc-ssh-adapter-${project.version}" xmlns="http://karaf.apache.org/xmlns/features/v1.2.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0">
+ <feature name='appc-ssh-adapter' description="appc-ssh-adapter" version='${project.version}'>
+ <bundle>mvn:org.openecomp.appc/appc-ssh-adapter-api/${project.version}</bundle>
+ <bundle>mvn:org.openecomp.appc/appc-ssh-adapter-sshd/${project.version}</bundle>
+ </feature>
+</features>
diff --git a/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/.settings/org.eclipse.wst.common.project.facet.core.xml b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 000000000..f4ef8aa0a
--- /dev/null
+++ b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+ <installed facet="java" version="1.8"/>
+</faceted-project>
diff --git a/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/pom.xml b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/pom.xml
new file mode 100644
index 000000000..54b7ea428
--- /dev/null
+++ b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/pom.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-ssh-adapter</artifactId>
+ <version>1.0.0</version>
+ </parent>
+
+ <artifactId>appc-ssh-adapter-sshd</artifactId>
+ <packaging>bundle</packaging>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-ssh-adapter-api</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.sshd</groupId>
+ <artifactId>sshd-core</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.att.eelf</groupId>
+ <artifactId>eelf-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-common</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.sdnc.core</groupId>
+ <artifactId>dblib-provider</artifactId>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Export-Service>org.openecomp.appc.adapter.ssh.SshAdapter</Export-Service>
+ <Private-Package>org.openecomp.appc.adapter.ssh.impl.*</Private-Package>
+ <Import-Package>!org.apache.log,!org.apache.commons.logging,!groovy.lang,!javax.jms,!org.codehaus.commons.compiler,!org.codehaus.groovy.*,!org.codehaus.janino,!com.ibm.icu.*,!com.sun.faces.*,!org.jasypt.*,*</Import-Package>
+ <Embed-Dependency>!dblib-provider,appc-common,jasypt,eelf-core,logback-core,logback-classic;scope=compile|runtime;inline=false</Embed-Dependency>
+ <Embed-Transitive>true</Embed-Transitive>
+ </instructions>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/src/main/java/org/openecomp/appc/adapter/ssh/sshd/SshAdapterSshd.java b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/src/main/java/org/openecomp/appc/adapter/ssh/sshd/SshAdapterSshd.java
new file mode 100644
index 000000000..44a6fb4ce
--- /dev/null
+++ b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/src/main/java/org/openecomp/appc/adapter/ssh/sshd/SshAdapterSshd.java
@@ -0,0 +1,33 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 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.openecomp.appc.adapter.ssh.sshd;
+
+import org.openecomp.appc.adapter.ssh.SshAdapter;
+import org.openecomp.appc.adapter.ssh.SshConnection;
+
+public class SshAdapterSshd implements SshAdapter {
+
+ @Override
+ public SshConnection getConnection(String host, int port, String username, String password) {
+ return new SshConnectionSshd(host, port, username, password);
+ }
+}
diff --git a/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/src/main/java/org/openecomp/appc/adapter/ssh/sshd/SshConnectionSshd.java b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/src/main/java/org/openecomp/appc/adapter/ssh/sshd/SshConnectionSshd.java
new file mode 100644
index 000000000..4d8b83b6f
--- /dev/null
+++ b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/src/main/java/org/openecomp/appc/adapter/ssh/sshd/SshConnectionSshd.java
@@ -0,0 +1,172 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 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.openecomp.appc.adapter.ssh.sshd;
+
+import org.apache.sshd.ClientChannel;
+import org.apache.sshd.ClientSession;
+import org.apache.sshd.SshClient;
+import org.apache.sshd.client.channel.ChannelExec;
+import org.apache.sshd.client.future.AuthFuture;
+import org.apache.sshd.client.future.OpenFuture;
+import org.apache.sshd.common.KeyPairProvider;
+import org.apache.sshd.common.keyprovider.FileKeyPairProvider;
+import org.openecomp.appc.adapter.ssh.SshConnection;
+import org.openecomp.appc.adapter.ssh.SshException;
+import org.openecomp.appc.encryption.EncryptionTool;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+
+import java.io.OutputStream;
+import java.security.KeyPair;
+
+/**
+ * Implementation of SshConnection interface based on Apache MINA SSHD library.
+ */
+class SshConnectionSshd implements SshConnection {
+
+ private static final EELFLogger logger = EELFManager.getInstance().getApplicationLogger();
+
+ private static final long AUTH_TIMEOUT = 60000;
+ private static final long EXEC_TIMEOUT = 120000;
+
+ private String host;
+ private int port;
+ private String username;
+ private String password;
+ private long timeout = EXEC_TIMEOUT;
+ private String keyFile;
+ private SshClient sshClient;
+ private ClientSession clientSession;
+
+ public SshConnectionSshd(String host, int port, String username, String password, String keyFile) {
+ this.host = host;
+ this.port = port;
+ this.username = username;
+ this.password = password;
+ this.keyFile = keyFile;
+ }
+
+ public SshConnectionSshd(String host, int port, String username, String password) {
+ this(host, port, username, password, null);
+ }
+
+ public SshConnectionSshd(String host, int port, String keyFile) {
+ this(host, port, null, null, keyFile);
+ }
+
+ @Override
+ public void connect() {
+ sshClient = SshClient.setUpDefaultClient();
+ sshClient.start();
+ try {
+ clientSession = sshClient.connect(EncryptionTool.getInstance().decrypt(username), host, port).await().getSession();
+ if(password != null) {
+ clientSession.addPasswordIdentity(EncryptionTool.getInstance().decrypt(password));
+ }
+ if(keyFile != null) {
+ KeyPairProvider keyPairProvider = new FileKeyPairProvider(new String[]{keyFile});
+ KeyPair keyPair = keyPairProvider.loadKeys().iterator().next();
+ clientSession.addPublicKeyIdentity(keyPair);
+ }
+ AuthFuture authFuture = clientSession.auth();
+ authFuture.await(AUTH_TIMEOUT);
+ if(!authFuture.isSuccess()) {
+ throw new SshException("Error establishing ssh connection to [" + username + "@" + host + ":" + port + "]. Authentication failed.");
+ }
+ } catch(RuntimeException e) {
+ throw e;
+ } catch(Exception e) {
+ throw new SshException("Error establishing ssh connection to [" + username + "@" + host + ":" + port + "].", e);
+ }
+ if(logger.isDebugEnabled()) {
+ logger.debug("SSH: connected to [" + toString() + "]");
+ }
+ }
+
+ @Override
+ public void disconnect() {
+ try {
+ if(logger.isDebugEnabled()) {
+ logger.debug("SSH: disconnecting from [" + toString() + "]");
+ }
+ clientSession.close(false);
+ } finally {
+ if(sshClient != null) {
+ sshClient.stop();
+ }
+ }
+ }
+
+ @Override
+ public void setExecTimeout(long timeout) {
+ this.timeout = timeout;
+ }
+
+ @Override
+ public int execCommand(String cmd, OutputStream out, OutputStream err) {
+ return execCommand(cmd, out, err, false);
+ }
+
+ @Override
+ public int execCommandWithPty(String cmd, OutputStream out) {
+ return execCommand(cmd, out, out, true);
+ }
+
+ private int execCommand(String cmd, OutputStream out, OutputStream err, boolean usePty) {
+ try {
+ if(logger.isDebugEnabled()) {
+ logger.debug("SSH: executing command");
+ }
+ ChannelExec client = clientSession.createExecChannel(cmd);
+ client.setUsePty(usePty); // use pseudo-tty?
+ client.setOut(out);
+ client.setErr(err);
+ OpenFuture openFuture = client.open();
+ int exitStatus = 0;
+ try {
+ client.waitFor(ClientChannel.CLOSED, timeout);
+ openFuture.verify();
+ Integer exitStatusI = client.getExitStatus();
+ if(exitStatusI == null) {
+ throw new SshException("Error executing command [" + cmd + "] over SSH [" + username + "@" + host + ":" + port + "]. Operation timed out.");
+ }
+ exitStatus = exitStatusI;
+ } finally {
+ client.close(false);
+ }
+ return exitStatus;
+ } catch(RuntimeException e) {
+ throw e;
+ } catch(Exception t) {
+ throw new SshException("Error executing command [" + cmd + "] over SSH [" + username + "@" + host + ":" + port + "]", t);
+ }
+ }
+
+ @Override
+ public String toString() {
+ String address = host;
+ if(username != null) {
+ address = username + '@' +address;
+ }
+ return address;
+ }
+}
diff --git a/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/src/main/java/org/openecomp/appc/adapter/ssh/sshd/SshdDataAccessService.java b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/src/main/java/org/openecomp/appc/adapter/ssh/sshd/SshdDataAccessService.java
new file mode 100644
index 000000000..a12e2be93
--- /dev/null
+++ b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/src/main/java/org/openecomp/appc/adapter/ssh/sshd/SshdDataAccessService.java
@@ -0,0 +1,106 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 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.openecomp.appc.adapter.ssh.sshd;
+
+import javax.sql.rowset.CachedRowSet;
+
+import org.openecomp.appc.adapter.ssh.Constants;
+import org.openecomp.appc.adapter.ssh.SshConnectionDetails;
+import org.openecomp.appc.adapter.ssh.SshDataAccessException;
+import org.openecomp.appc.adapter.ssh.SshDataAccessService;
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.sdnc.sli.resource.dblib.DbLibService;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+
+
+
+public class SshdDataAccessService implements SshDataAccessService {
+
+ private String schema = Constants.NETCONF_SCHEMA;
+ private DbLibService dbLibService;
+
+ @Override
+ public void setSchema(String schema) {
+ this.schema = schema;
+ }
+
+ @Override
+ public void setDbLibService(DbLibService dbLibService) {
+ this.dbLibService = dbLibService;
+ }
+
+ @Override
+ public boolean retrieveConnectionDetails(String vnfType, SshConnectionDetails connectionDetails) throws SshDataAccessException {
+
+ boolean recordFound = false;
+
+ String queryString = "select " + Constants.USER_NAME_TABLE_FIELD_NAME + "," + Constants.PASSWORD_TABLE_FIELD_NAME + "," + Constants.PORT_NUMBER_TABLE_FIELD_NAME + " " +
+ "from " + Constants.DEVICE_AUTHENTICATION_TABLE_NAME + " " +
+ "where " + Constants.VNF_TYPE_TABLE_FIELD_NAME + " = ?";
+
+ ArrayList<String> argList = new ArrayList<>();
+ argList.add(vnfType);
+
+ try {
+
+ final CachedRowSet data = dbLibService.getData(queryString, argList, schema);
+ if (data.first()) {
+ recordFound = true;
+ connectionDetails.setUsername(data.getString(Constants.USER_NAME_TABLE_FIELD_NAME));
+ connectionDetails.setPassword(data.getString(Constants.PASSWORD_TABLE_FIELD_NAME));
+ connectionDetails.setPort(data.getInt(Constants.PORT_NUMBER_TABLE_FIELD_NAME));
+ }
+
+ } catch (SQLException e) {
+ throw new SshDataAccessException(e);
+ }
+
+ return recordFound;
+ }
+
+ @Override
+ public String retrieveConfigFileName(String xmlID) throws SshDataAccessException {
+ String fileContent;
+
+ String queryString = "select " + Constants.FILE_CONTENT_TABLE_FIELD_NAME + " " +
+ "from " + Constants.CONFIGFILES_TABLE_NAME + " " +
+ "where " + Constants.FILE_NAME_TABLE_FIELD_NAME + " = ?";
+
+ ArrayList<String> argList = new ArrayList<>();
+ argList.add(xmlID);
+
+ try {
+
+ final CachedRowSet data = dbLibService.getData(queryString, argList, schema);
+ fileContent = data.getString(Constants.FILE_CONTENT_TABLE_FIELD_NAME);
+
+ } catch (SQLException e) {
+ throw new SshDataAccessException(e);
+ }
+
+ return fileContent;
+ }
+
+
+}
diff --git a/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/src/main/resources/OSGI-INF/blueprint/blueprint.xml
new file mode 100644
index 000000000..f9d10868a
--- /dev/null
+++ b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/src/main/resources/OSGI-INF/blueprint/blueprint.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ============LICENSE_START=======================================================
+ openECOMP : APP-C
+ ================================================================================
+ Copyright (C) 2017 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=========================================================
+ -->
+
+
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
+
+ <bean id="sshdBean" class="org.openecomp.appc.adapter.ssh.sshd.SshAdapterSshd" scope="singleton"/>
+ <service id="sshAdapter" interface="org.openecomp.appc.adapter.ssh.SshAdapter" ref="sshdBean"/>
+
+ <reference id="dbLibServiceRef" availability="mandatory" activation="eager" interface="org.openecomp.sdnc.sli.resource.dblib.DbLibService" />
+ <bean id="sshdDAServiceBean" class="org.openecomp.appc.adapter.ssh.sshd.SshdDataAccessService" scope="singleton">
+ <property name="dbLibService" ref="dbLibServiceRef" />
+ </bean>
+
+ <service id="sshDAService" interface="org.openecomp.appc.adapter.ssh.SshDataAccessService" ref="sshdDAServiceBean"/>
+
+</blueprint>
diff --git a/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/src/test/java/org/openecomp/appc/adapter/ssh/sshd/SshAdapterSample.java b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/src/test/java/org/openecomp/appc/adapter/ssh/sshd/SshAdapterSample.java
new file mode 100644
index 000000000..197915de8
--- /dev/null
+++ b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/src/test/java/org/openecomp/appc/adapter/ssh/sshd/SshAdapterSample.java
@@ -0,0 +1,56 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 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.openecomp.appc.adapter.ssh.sshd;
+
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStream;
+
+import org.openecomp.appc.adapter.ssh.SshAdapter;
+import org.openecomp.appc.adapter.ssh.SshConnection;
+import org.openecomp.appc.adapter.ssh.sshd.SshAdapterSshd;
+
+public class SshAdapterSample {
+
+ public static void main(String[] args) {
+ String host = "hostname";
+ int port = 22;
+ String username = "user";
+ String password = "secret";
+ String command = "ls";
+
+ SshAdapter sshAdapter = new SshAdapterSshd();
+ SshConnection sshConnection = sshAdapter.getConnection(host, port, username, password);
+ sshConnection.connect();
+ try {
+ OutputStream stdout = new ByteArrayOutputStream();
+ OutputStream stderr = new ByteArrayOutputStream();
+ int status = sshConnection.execCommand(command, stdout, stderr);
+ if(status == 0) {
+ System.out.println("Command executed successfully. Output:\n" + stdout.toString());
+ } else {
+ System.err.println("Command returned status " + status + ". Error:\n" + stderr.toString());
+ }
+ } finally {
+ sshConnection.disconnect();
+ }
+ }
+}
diff --git a/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/src/test/java/org/openecomp/appc/adapter/ssh/sshd/SshAdapterTest.java b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/src/test/java/org/openecomp/appc/adapter/ssh/sshd/SshAdapterTest.java
new file mode 100644
index 000000000..1d7d06df2
--- /dev/null
+++ b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-sshd/src/test/java/org/openecomp/appc/adapter/ssh/sshd/SshAdapterTest.java
@@ -0,0 +1,247 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 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.openecomp.appc.adapter.ssh.sshd;
+
+import org.apache.sshd.SshServer;
+import org.apache.sshd.common.NamedFactory;
+import org.apache.sshd.common.util.OsUtils;
+import org.apache.sshd.server.Command;
+import org.apache.sshd.server.CommandFactory;
+import org.apache.sshd.server.PasswordAuthenticator;
+import org.apache.sshd.server.PublickeyAuthenticator;
+import org.apache.sshd.server.command.ScpCommandFactory;
+import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
+import org.apache.sshd.server.session.ServerSession;
+import org.apache.sshd.server.sftp.SftpSubsystem;
+import org.apache.sshd.server.shell.ProcessShellFactory;
+import org.hamcrest.CoreMatchers;
+import org.junit.*;
+import org.junit.rules.ExpectedException;
+import org.openecomp.appc.adapter.ssh.SshAdapter;
+import org.openecomp.appc.adapter.ssh.SshConnection;
+import org.openecomp.appc.adapter.ssh.SshException;
+import org.openecomp.appc.adapter.ssh.sshd.SshAdapterSshd;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.BindException;
+import java.security.PublicKey;
+import java.util.Collections;
+import java.util.EnumSet;
+
+public class SshAdapterTest {
+
+ private static final boolean START_SERVER = true;
+ private static final String SSH_HOST = "localhost";
+ private static final int SSH_PORT = 2222;
+ private static final String SSH_USERNAME = "test";
+ private static final String SSH_PASSWORD = "test";
+ private static final String F_TEST_CMD = "ping -%c 4 %s";
+
+ private int sshPort = SSH_PORT;
+ private SshServer sshd;
+ private SshAdapter sshAdapter = new SshAdapterSshd();
+
+ @Rule
+ public ExpectedException thrown = ExpectedException.none();
+
+ @Test
+ public void testExecute() {
+ String cmd = String.format(F_TEST_CMD, OsUtils.isUNIX() ? 'c' : 'n', "localhost");
+ SshConnection sshConnection = connect(SSH_USERNAME, SSH_PASSWORD);
+ try {
+ System.out.println("SSH client connected. Server port [" + sshPort + "]. [" + getClass().getName() + "#" + System.identityHashCode(this) + "]");
+ ByteArrayOutputStream stdout = new ByteArrayOutputStream();
+ ByteArrayOutputStream stderr = new ByteArrayOutputStream();
+ int status = execCmd(sshConnection, cmd, stdout, stderr, false);
+ Assert.assertEquals(stdout.toString() + ". " + stderr.toString(), 0, status);
+ } finally {
+ disconnect(sshConnection);
+ }
+ }
+
+ @Test
+ public void testExecuteWithPty() {
+ String cmd = String.format(F_TEST_CMD, OsUtils.isUNIX() ? 'c' : 'n', "localhost");
+ SshConnection sshConnection = connect(SSH_USERNAME, SSH_PASSWORD);
+ try {
+ System.out.println("SSH client connected. Server port [" + sshPort + "]. [" + getClass().getName() + "#" + System.identityHashCode(this) + "]");
+ ByteArrayOutputStream stdout = new ByteArrayOutputStream();
+ int status = execCmd(sshConnection, cmd, stdout, null, true);
+ Assert.assertEquals(stdout.toString() + ". " + stdout.toString(), 0, status);
+ } finally {
+ disconnect(sshConnection);
+ }
+ }
+
+ @Test
+ public void testExecuteInvalidCommand() {
+ String cmd = String.format(F_TEST_CMD, OsUtils.isUNIX() ? 'c' : 'n', "nosuchhost");
+ SshConnection sshConnection = connect(SSH_USERNAME, SSH_PASSWORD);
+ try {
+ ByteArrayOutputStream stdout = new ByteArrayOutputStream();
+ ByteArrayOutputStream stderr = new ByteArrayOutputStream();
+ int status = execCmd(sshConnection, cmd, stdout, stderr, false);
+ Assert.assertNotEquals(stdout.toString() + ". " + stderr.toString(), 0, status);
+ } finally {
+ disconnect(sshConnection);
+ }
+ }
+
+ @Test
+ public void testWrongUsername() {
+ thrown.expect(SshException.class);
+ thrown.expectMessage(CoreMatchers.containsString("Authentication failed"));
+ disconnect(connect("WrongUsername", SSH_PASSWORD));
+ }
+
+ @Test
+ public void testWrongPassword() {
+ thrown.expect(SshException.class);
+ thrown.expectMessage(CoreMatchers.containsString("Authentication failed"));
+ disconnect(connect(SSH_USERNAME, "WrongPassword"));
+ }
+
+ @Before
+ public void beforeTest() throws IOException {
+ if (START_SERVER) {
+ startServer();
+ }
+ }
+
+ @After
+ public void afterTest() throws InterruptedException {
+ stopServer();
+ }
+
+ private SshConnection connect(String username, String password) {
+ SshConnection sshConnection = sshAdapter.getConnection(SSH_HOST, sshPort, username, password);
+ sshConnection.connect();
+ System.out.println("SSH client connected. Server port [" + sshPort + "]. [" + getClass().getName() + "#" + System.identityHashCode(this) + "]");
+ return sshConnection;
+ }
+
+ private void disconnect(SshConnection sshConnection) {
+ sshConnection.disconnect();
+ System.out.println("SSH client disconnected. Server port [" + sshPort + "]. [" + getClass().getName() + "#" + System.identityHashCode(this) + "]");
+ }
+
+ private int execCmd(SshConnection sshConnection, String cmd, OutputStream stdout, OutputStream stderr, boolean usePty) {
+ System.out.println("=> Running command [" + cmd + "] over SSH");
+ int status;
+ if (usePty) {
+ status = sshConnection.execCommandWithPty(cmd, stdout);
+ } else {
+ status = sshConnection.execCommand(cmd, stdout, stderr);
+ }
+ System.out.println("=> Command [" + cmd + "] status is [" + status + "], stdout is [" + String.valueOf(stdout) + "], stderr is [" + String.valueOf(stderr) + "]");
+ return status;
+ }
+
+ private void startServer() throws IOException {
+ sshd = SshServer.setUpDefaultServer();
+ sshd.setSubsystemFactories(Collections.<NamedFactory<Command>>singletonList(new SftpSubsystem.Factory()));
+ sshd.setCommandFactory(new ScpCommandFactory(new CommandFactory() {
+
+ public Command createCommand(String command) {
+ EnumSet<ProcessShellFactory.TtyOptions> ttyOptions;
+ if (OsUtils.isUNIX()) {
+ ttyOptions = EnumSet.of(ProcessShellFactory.TtyOptions.ONlCr);
+ } else {
+ ttyOptions = EnumSet.of(ProcessShellFactory.TtyOptions.Echo, ProcessShellFactory.TtyOptions.ICrNl, ProcessShellFactory.TtyOptions.ONlCr);
+ }
+ return new ProcessShellFactory(command.split(" "), ttyOptions).create();
+ }
+ }));
+ if (OsUtils.isUNIX()) {
+ sshd.setShellFactory(new ProcessShellFactory(new String[]{"/bin/sh", "-i", "-l"},
+ EnumSet.of(ProcessShellFactory.TtyOptions.ONlCr)));
+ } else {
+ sshd.setShellFactory(new ProcessShellFactory(new String[]{"cmd.exe "},
+ EnumSet.of(ProcessShellFactory.TtyOptions.Echo, ProcessShellFactory.TtyOptions.ICrNl, ProcessShellFactory.TtyOptions.ONlCr)));
+ }
+// if(SecurityUtils.isBouncyCastleRegistered()) {
+// sshd.setKeyPairProvider(new PEMGeneratorHostKeyProvider(System.getProperty("java.io.tmpdir") + "/key.pem"));
+// } else {
+ sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(System.getProperty("java.io.tmpdir") + "/key.ser"));
+// }
+ sshd.setPasswordAuthenticator(new PasswordAuthenticator() {
+
+ @Override
+ public boolean authenticate(String username, String password, ServerSession session) {
+ return (SSH_USERNAME.equals(username) && SSH_PASSWORD.equals(password));
+ }
+ });
+ sshd.setPublickeyAuthenticator(new PublickeyAuthenticator() {
+
+ public boolean authenticate(String username, PublicKey key, ServerSession session) {
+ return true;
+ }
+ });
+ sshd.getProperties().put(SshServer.WELCOME_BANNER, "Welcome to SSHD\n");
+ startServer0();
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ // ignore
+ }
+ }
+
+ private void startServer0() throws IOException {
+ boolean serverStarted = false;
+ IOException exception = null;
+ while (!serverStarted && (sshPort < Integer.MAX_VALUE)) {
+ try {
+ System.out.println("Starting SSH server on port [" + sshPort + "]. [" + getClass().getName() + "#" + System.identityHashCode(this) + "]");
+ sshd.setPort(sshPort);
+ sshd.start();
+ serverStarted = true;
+ } catch (BindException e) {
+ System.err.println("Cannot start SSH server on port [" + sshPort + "]. " + e.getMessage());
+ if (exception == null) {
+ // store first thrown exception - will be thrown if cannot start the server
+ exception = e;
+ }
+ sshPort++;
+ }
+ }
+ if (!serverStarted) {
+ throw exception;
+ }
+ System.out.println("SSH server started on port [" + sshPort + "]. [" + getClass().getName() + "#" + System.identityHashCode(this) + "]");
+ }
+
+ private void stopServer() {
+ try {
+ if (sshd != null) {
+ sshd.stop(true);
+ System.out.println("SSH server stopped on port [" + sshPort + "]. [" + getClass().getName() + "#" + System.identityHashCode(this) + "]");
+ }
+ } catch (InterruptedException e) {
+ System.err.println("=> Error stopping SSH server.");
+ e.printStackTrace();
+ } finally {
+ sshd = null;
+ }
+ }
+}
diff --git a/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-tests/.settings/org.eclipse.wst.common.project.facet.core.xml b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-tests/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 000000000..f4ef8aa0a
--- /dev/null
+++ b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-tests/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+ <installed facet="java" version="1.8"/>
+</faceted-project>
diff --git a/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-tests/pom.xml b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-tests/pom.xml
new file mode 100644
index 000000000..0c66afd21
--- /dev/null
+++ b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-tests/pom.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-ssh-adapter</artifactId>
+ <version>1.0.0</version>
+ </parent>
+ <artifactId>appc-ssh-adapter-tests</artifactId>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-ssh-adapter-api</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ </dependencies>
+</project> \ No newline at end of file
diff --git a/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-tests/src/main/java/org/openecomp/appc/adapter/ssh/SshAdapterMock.java b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-tests/src/main/java/org/openecomp/appc/adapter/ssh/SshAdapterMock.java
new file mode 100644
index 000000000..c0ccdfaee
--- /dev/null
+++ b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-tests/src/main/java/org/openecomp/appc/adapter/ssh/SshAdapterMock.java
@@ -0,0 +1,75 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 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.openecomp.appc.adapter.ssh;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.openecomp.appc.adapter.ssh.SshAdapter;
+import org.openecomp.appc.adapter.ssh.SshConnection;
+
+public class SshAdapterMock implements SshAdapter {
+
+ private List<SshConnectionMock> connectionMocks = new ArrayList<>();
+
+ private int returnStatus;
+ private String returnStdout;
+ private String returnStderr;
+
+ @Override
+ public SshConnection getConnection(String host, int port, String username, String password) {
+ SshConnectionMock sshConnectionMock = new SshConnectionMock(host, port, username, password);
+ sshConnectionMock.setReturnStatus(returnStatus);
+ sshConnectionMock.setReturnStdout(returnStdout);
+ sshConnectionMock.setReturnStderr(returnStderr);
+ connectionMocks.add(sshConnectionMock);
+ return sshConnectionMock;
+ }
+
+ public List<SshConnectionMock> getConnectionMocks() {
+ return connectionMocks;
+ }
+
+ public int getReturnStatus() {
+ return returnStatus;
+ }
+
+ public void setReturnStatus(int returnStatus) {
+ this.returnStatus = returnStatus;
+ }
+
+ public String getReturnStdout() {
+ return returnStdout;
+ }
+
+ public void setReturnStdout(String returnStdout) {
+ this.returnStdout = returnStdout;
+ }
+
+ public String getReturnStderr() {
+ return returnStderr;
+ }
+
+ public void setReturnStderr(String returnStderr) {
+ this.returnStderr = returnStderr;
+ }
+}
diff --git a/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-tests/src/main/java/org/openecomp/appc/adapter/ssh/SshConnectionMock.java b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-tests/src/main/java/org/openecomp/appc/adapter/ssh/SshConnectionMock.java
new file mode 100644
index 000000000..3194edcfb
--- /dev/null
+++ b/appc-adapters/appc-ssh-adapter/appc-ssh-adapter-tests/src/main/java/org/openecomp/appc/adapter/ssh/SshConnectionMock.java
@@ -0,0 +1,155 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 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.openecomp.appc.adapter.ssh;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.openecomp.appc.adapter.ssh.SshConnection;
+
+public class SshConnectionMock implements SshConnection {
+
+ private static final int DEF_SUCCESS_STATUS = 0;
+
+ private String host;
+ private int port;
+ private String username;
+ private String password;
+ private long timeout;
+
+ private int returnStatus = DEF_SUCCESS_STATUS;
+ private String returnStdout;
+ private String returnStderr;
+
+ private int connectCallCount = 0;
+ private int disconnectCallCount = 0;
+ private List<String> executedCommands = new ArrayList<>();
+
+ public SshConnectionMock(String host, int port, String username, String password) {
+ this.host = host;
+ this.port = port;
+ this.username = username;
+ this.password = password;
+ }
+
+ @Override
+ public void connect() {
+ connectCallCount++;
+ }
+
+ @Override
+ public void disconnect() {
+ disconnectCallCount++;
+ }
+
+ @Override
+ public int execCommand(String cmd, OutputStream out, OutputStream err) {
+ return execCommand(cmd, out, err, false);
+ }
+
+ @Override
+ public int execCommandWithPty(String cmd, OutputStream out) {
+ return execCommand(cmd, out, out, true);
+ }
+
+ private int execCommand(String cmd, OutputStream out, OutputStream err, boolean usePty) {
+ executedCommands.add(cmd);
+ try {
+ if((out != null) && (returnStdout != null)) {
+ out.write(returnStdout.getBytes());
+ }
+ } catch(IOException e) {
+ throw new RuntimeException("Error writing to stdout output stream", e);
+ }
+ try {
+ if((err != null) && (returnStderr != null)) {
+ err.write(returnStderr.getBytes());
+ }
+ } catch(IOException e) {
+ throw new RuntimeException("Error writing to stderr output stream", e);
+ }
+ return returnStatus;
+ }
+
+ @Override
+ public void setExecTimeout(long timeout) {
+ this.timeout = timeout;
+ }
+
+ public long getExecTimeout() {
+ return timeout;
+ }
+
+ public String getHost() {
+ return host;
+ }
+
+ public int getPort() {
+ return port;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public int getConnectCallCount() {
+ return connectCallCount;
+ }
+
+ public int getDisconnectCallCount() {
+ return disconnectCallCount;
+ }
+
+ public List<String> getExecutedCommands() {
+ return executedCommands;
+ }
+
+ public int getReturnStatus() {
+ return returnStatus;
+ }
+
+ public void setReturnStatus(int returnStatus) {
+ this.returnStatus = returnStatus;
+ }
+
+ public String getReturnStdout() {
+ return returnStdout;
+ }
+
+ public void setReturnStdout(String returnStdout) {
+ this.returnStdout = returnStdout;
+ }
+
+ public String getReturnStderr() {
+ return returnStderr;
+ }
+
+ public void setReturnStderr(String returnStderr) {
+ this.returnStderr = returnStderr;
+ }
+}
diff --git a/appc-adapters/appc-ssh-adapter/pom.xml b/appc-adapters/appc-ssh-adapter/pom.xml
new file mode 100644
index 000000000..af3d503fc
--- /dev/null
+++ b/appc-adapters/appc-ssh-adapter/pom.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <artifactId>appc-adapters</artifactId>
+ <groupId>org.openecomp.appc</groupId>
+ <version>1.0.0</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+
+ <artifactId>appc-ssh-adapter</artifactId>
+ <packaging>pom</packaging>
+
+ <modules>
+ <module>appc-ssh-adapter-api</module>
+ <module>appc-ssh-adapter-tests</module>
+ <module>appc-ssh-adapter-sshd</module>
+ <module>appc-ssh-adapter-features</module>
+ </modules>
+</project> \ No newline at end of file