Add ssh client configuration service 01/87801/5
authorBrinda Santh <brindasanth@in.ibm.com>
Wed, 15 May 2019 17:50:20 +0000 (13:50 -0400)
committerSteve Siani <alphonse.steve.siani.djissitchi@ibm.com>
Thu, 23 May 2019 04:15:54 +0000 (00:15 -0400)
Change-Id: I88515b430311e7937ea45516cc0fb07b4dab3c2f
Issue-ID: CCSDK-1335
Signed-off-by: Brinda Santh <brindasanth@in.ibm.com>
ms/blueprintsprocessor/modules/commons/pom.xml
ms/blueprintsprocessor/modules/commons/ssh-lib/pom.xml [new file with mode: 0644]
ms/blueprintsprocessor/modules/commons/ssh-lib/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/ssh/BluePrintSshLibConfiguration.kt [new file with mode: 0644]
ms/blueprintsprocessor/modules/commons/ssh-lib/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/ssh/BluePrintSshLibData.kt [new file with mode: 0644]
ms/blueprintsprocessor/modules/commons/ssh-lib/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/ssh/service/BasicAuthSshClientService.kt [new file with mode: 0644]
ms/blueprintsprocessor/modules/commons/ssh-lib/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/ssh/service/BluePrintSshLibPropertyService.kt [new file with mode: 0644]
ms/blueprintsprocessor/modules/commons/ssh-lib/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/ssh/service/BlueprintSshClientService.kt [new file with mode: 0644]
ms/blueprintsprocessor/modules/commons/ssh-lib/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/ssh/service/BluePrintSshLibPropertyServiceTest.kt [new file with mode: 0644]
ms/blueprintsprocessor/modules/commons/ssh-lib/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/ssh/service/BlueprintSshClientServiceTest.kt [new file with mode: 0644]
ms/blueprintsprocessor/modules/commons/ssh-lib/src/test/resources/logback-test.xml [new file with mode: 0644]
ms/blueprintsprocessor/parent/pom.xml

index 782ce61..9284e0d 100755 (executable)
@@ -37,6 +37,7 @@
         <module>dmaap-lib</module>
         <module>grpc-lib</module>
         <module>message-lib</module>
+        <module>ssh-lib</module>
     </modules>
     <dependencies>
         <dependency>
diff --git a/ms/blueprintsprocessor/modules/commons/ssh-lib/pom.xml b/ms/blueprintsprocessor/modules/commons/ssh-lib/pom.xml
new file mode 100644 (file)
index 0000000..6949c4f
--- /dev/null
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~  Copyright © 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.
+  -->
+
+<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>commons</artifactId>
+        <groupId>org.onap.ccsdk.cds.blueprintsprocessor</groupId>
+        <version>0.5.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>ssh-lib</artifactId>
+    <packaging>jar</packaging>
+    <name>Blueprints Processor SSH Lib</name>
+    <description>Blueprints Processor SSH Lib</description>
+    <dependencies>
+        <dependency>
+            <groupId>org.onap.ccsdk.cds.controllerblueprints</groupId>
+            <artifactId>blueprint-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.ccsdk.cds.blueprintsprocessor</groupId>
+            <artifactId>processor-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.sshd</groupId>
+            <artifactId>sshd-core</artifactId>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/ms/blueprintsprocessor/modules/commons/ssh-lib/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/ssh/BluePrintSshLibConfiguration.kt b/ms/blueprintsprocessor/modules/commons/ssh-lib/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/ssh/BluePrintSshLibConfiguration.kt
new file mode 100644 (file)
index 0000000..48e451f
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ *  Copyright © 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.
+ */
+
+package org.onap.ccsdk.cds.blueprintsprocessor.ssh
+
+import org.springframework.boot.context.properties.EnableConfigurationProperties
+import org.springframework.context.annotation.ComponentScan
+import org.springframework.context.annotation.Configuration
+
+@Configuration
+@ComponentScan
+@EnableConfigurationProperties
+open class BluePrintSshLibConfiguration
+
+class SshLibConstants {
+    companion object {
+        const val SERVICE_BLUEPRINT_SSH_LIB_PROPERTY = "blueprint-ssh-lib-property-service"
+        const val PROPERTY_SSH_CLIENT_PREFIX = "blueprintsprocessor.sshclient."
+        const val TYPE_BASIC_AUTH = "basic-auth"
+    }
+}
\ No newline at end of file
diff --git a/ms/blueprintsprocessor/modules/commons/ssh-lib/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/ssh/BluePrintSshLibData.kt b/ms/blueprintsprocessor/modules/commons/ssh-lib/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/ssh/BluePrintSshLibData.kt
new file mode 100644 (file)
index 0000000..a70ea55
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ *  Copyright © 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.
+ */
+
+package org.onap.ccsdk.cds.blueprintsprocessor.ssh
+
+open class SshClientProperties {
+    lateinit var type: String
+    lateinit var host: String
+    var port: Int = 22
+    var connectionTimeOut: Long = 3000
+}
+
+open class BasicAuthSshClientProperties : SshClientProperties() {
+    lateinit var password: String
+    lateinit var username: String
+}
\ No newline at end of file
diff --git a/ms/blueprintsprocessor/modules/commons/ssh-lib/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/ssh/service/BasicAuthSshClientService.kt b/ms/blueprintsprocessor/modules/commons/ssh-lib/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/ssh/service/BasicAuthSshClientService.kt
new file mode 100644 (file)
index 0000000..67d5d51
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ *  Copyright © 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.
+ */
+
+package org.onap.ccsdk.cds.blueprintsprocessor.ssh.service
+
+import org.apache.sshd.client.SshClient
+import org.apache.sshd.client.channel.ChannelExec
+import org.apache.sshd.client.channel.ClientChannel
+import org.apache.sshd.client.channel.ClientChannelEvent
+import org.apache.sshd.client.keyverifier.AcceptAllServerKeyVerifier
+import org.apache.sshd.client.session.ClientSession
+import org.onap.ccsdk.cds.blueprintsprocessor.ssh.BasicAuthSshClientProperties
+import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintProcessorException
+import org.slf4j.LoggerFactory
+import java.io.ByteArrayOutputStream
+import java.util.*
+
+
+open class BasicAuthSshClientService(private val basicAuthSshClientProperties: BasicAuthSshClientProperties)
+    : BlueprintSshClientService {
+
+    private val log = LoggerFactory.getLogger(BasicAuthSshClientService::class.java)!!
+
+    private lateinit var sshClient: SshClient
+    private lateinit var clientSession: ClientSession
+
+    override suspend fun startSessionNB(): ClientSession {
+        sshClient = SshClient.setUpDefaultClient()
+        sshClient.serverKeyVerifier = AcceptAllServerKeyVerifier.INSTANCE
+        sshClient.start()
+        log.debug("SSH Client Service started successfully")
+        clientSession = sshClient.connect(basicAuthSshClientProperties.username, basicAuthSshClientProperties.host,
+                basicAuthSshClientProperties.port)
+                .verify(basicAuthSshClientProperties.connectionTimeOut)
+                .session
+
+        clientSession.addPasswordIdentity(basicAuthSshClientProperties.password)
+        clientSession.auth().verify(basicAuthSshClientProperties.connectionTimeOut)
+        log.info("SSH client session($clientSession) created")
+        return clientSession
+    }
+
+    override suspend fun executeCommandsNB(commands: List<String>, timeOut: Long): String {
+        val buffer = StringBuffer()
+        try {
+            commands.forEach { command ->
+                buffer.append("\nCommand : $command")
+                buffer.append("\n" + executeCommandNB(command, timeOut))
+            }
+        } catch (e: Exception) {
+            throw BluePrintProcessorException("Failed to execute commands, below the output : $buffer")
+        }
+        return buffer.toString()
+    }
+
+    override suspend fun executeCommandNB(command: String, timeOut: Long): String {
+        log.debug("Executing host($clientSession) command($command)")
+
+        var channel: ChannelExec? = null
+        try {
+            channel = clientSession.createExecChannel(command)
+            //TODO("Convert to streaming ")
+            val outputStream = ByteArrayOutputStream()
+            channel.out = outputStream
+            channel.err = outputStream
+            channel.open().await()
+            val waitMask = channel.waitFor(Collections.unmodifiableSet(EnumSet.of(ClientChannelEvent.CLOSED)), timeOut)
+            if (waitMask.contains(ClientChannelEvent.TIMEOUT)) {
+                throw BluePrintProcessorException("Failed to retrieve command result in time: $command")
+            }
+            val exitStatus = channel.exitStatus
+            ClientChannel.validateCommandExitStatusCode(command, exitStatus!!)
+            return outputStream.toString()
+        } finally {
+            if (channel != null)
+                channel.close()
+        }
+    }
+
+    override suspend fun closeSessionNB() {
+        if (sshClient.isStarted) {
+            sshClient.stop()
+            log.debug("SSH Client Service stopped successfully")
+        }
+    }
+}
diff --git a/ms/blueprintsprocessor/modules/commons/ssh-lib/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/ssh/service/BluePrintSshLibPropertyService.kt b/ms/blueprintsprocessor/modules/commons/ssh-lib/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/ssh/service/BluePrintSshLibPropertyService.kt
new file mode 100644 (file)
index 0000000..9971c50
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ *  Copyright © 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.
+ */
+
+package org.onap.ccsdk.cds.blueprintsprocessor.ssh.service
+
+import org.onap.ccsdk.cds.blueprintsprocessor.core.BluePrintProperties
+import org.onap.ccsdk.cds.blueprintsprocessor.ssh.BasicAuthSshClientProperties
+import org.onap.ccsdk.cds.blueprintsprocessor.ssh.SshClientProperties
+import org.onap.ccsdk.cds.blueprintsprocessor.ssh.SshLibConstants
+import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintProcessorException
+import org.springframework.stereotype.Service
+
+@Service(SshLibConstants.SERVICE_BLUEPRINT_SSH_LIB_PROPERTY)
+open class BluePrintSshLibPropertyService(private var bluePrintProperties: BluePrintProperties) {
+
+    fun blueprintSshClientService(selector: String): BlueprintSshClientService {
+        val prefix = "${SshLibConstants.PROPERTY_SSH_CLIENT_PREFIX}$selector"
+        val sshClientProperties = sshClientProperties(prefix)
+        return blueprintSshClientService(sshClientProperties)
+    }
+
+    fun sshClientProperties(prefix: String): SshClientProperties {
+        val type = bluePrintProperties.propertyBeanType("$prefix.type", String::class.java)
+        return when (type) {
+            SshLibConstants.TYPE_BASIC_AUTH -> {
+                basicAuthSshClientProperties(prefix)
+            }
+            else -> {
+                throw BluePrintProcessorException("SSH adaptor($type) is not supported")
+            }
+        }
+    }
+
+    private fun blueprintSshClientService(sshClientProperties: SshClientProperties): BlueprintSshClientService {
+
+        when (sshClientProperties) {
+            is BasicAuthSshClientProperties -> {
+                return BasicAuthSshClientService(sshClientProperties)
+            }
+            else -> {
+                throw BluePrintProcessorException("couldn't get SSH client service for")
+            }
+        }
+    }
+
+    private fun basicAuthSshClientProperties(prefix: String): BasicAuthSshClientProperties {
+        return bluePrintProperties.propertyBeanType(
+                prefix, BasicAuthSshClientProperties::class.java)
+    }
+
+}
diff --git a/ms/blueprintsprocessor/modules/commons/ssh-lib/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/ssh/service/BlueprintSshClientService.kt b/ms/blueprintsprocessor/modules/commons/ssh-lib/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/ssh/service/BlueprintSshClientService.kt
new file mode 100644 (file)
index 0000000..279e437
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ *  Copyright © 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.
+ */
+
+package org.onap.ccsdk.cds.blueprintsprocessor.ssh.service
+
+import kotlinx.coroutines.runBlocking
+import org.apache.sshd.client.session.ClientSession
+
+interface BlueprintSshClientService {
+
+    fun startSession(): ClientSession = runBlocking {
+        startSessionNB()
+    }
+
+    fun executeCommands(commands: List<String>, timeOut: Long): String = runBlocking {
+        executeCommandsNB(commands, timeOut)
+    }
+
+    fun executeCommand(command: String, timeOut: Long): String = runBlocking {
+        executeCommandNB(command, timeOut)
+    }
+
+    fun closeSession() = runBlocking {
+        closeSessionNB()
+    }
+
+    suspend fun startSessionNB(): ClientSession
+
+    suspend fun executeCommandsNB(commands: List<String>, timeOut: Long): String
+
+    suspend fun executeCommandNB(command: String, timeOut: Long): String
+
+    suspend fun closeSessionNB()
+}
\ No newline at end of file
diff --git a/ms/blueprintsprocessor/modules/commons/ssh-lib/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/ssh/service/BluePrintSshLibPropertyServiceTest.kt b/ms/blueprintsprocessor/modules/commons/ssh-lib/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/ssh/service/BluePrintSshLibPropertyServiceTest.kt
new file mode 100644 (file)
index 0000000..d5c9993
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ *  Copyright © 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.
+ */
+
+package org.onap.ccsdk.cds.blueprintsprocessor.ssh.service
+
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.onap.ccsdk.cds.blueprintsprocessor.core.BluePrintProperties
+import org.onap.ccsdk.cds.blueprintsprocessor.core.BlueprintPropertyConfiguration
+import org.onap.ccsdk.cds.blueprintsprocessor.ssh.BasicAuthSshClientProperties
+import org.onap.ccsdk.cds.blueprintsprocessor.ssh.BluePrintSshLibConfiguration
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.test.context.ContextConfiguration
+import org.springframework.test.context.TestPropertySource
+import org.springframework.test.context.junit4.SpringRunner
+import kotlin.test.assertEquals
+import kotlin.test.assertNotNull
+
+
+@RunWith(SpringRunner::class)
+@ContextConfiguration(classes = [BluePrintSshLibConfiguration::class,
+    BlueprintPropertyConfiguration::class, BluePrintProperties::class])
+@TestPropertySource(properties =
+["blueprintsprocessor.sshclient.sample.type=basic-auth",
+    "blueprintsprocessor.sshclient.sample.host=127.0.0.1",
+    "blueprintsprocessor.sshclient.sample.port=22",
+    "blueprintsprocessor.sshclient.sample.password=1234",
+    "blueprintsprocessor.sshclient.sample.username=dummy"
+])
+class BluePrintSshLibPropertyServiceTest {
+
+    @Autowired
+    lateinit var bluePrintSshLibPropertyService: BluePrintSshLibPropertyService
+
+    @Test
+    fun testRestClientProperties() {
+        val properties = bluePrintSshLibPropertyService
+                .sshClientProperties("blueprintsprocessor.sshclient.sample") as BasicAuthSshClientProperties
+        assertNotNull(properties, "failed to create property bean")
+        assertEquals(properties.host, "127.0.0.1", "failed to match host property")
+        assertEquals(properties.port, 22, "failed to match port property")
+        assertEquals(properties.password, "1234", "failed to match host property")
+        assertEquals(properties.username, "dummy", "failed to match host property")
+    }
+}
\ No newline at end of file
diff --git a/ms/blueprintsprocessor/modules/commons/ssh-lib/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/ssh/service/BlueprintSshClientServiceTest.kt b/ms/blueprintsprocessor/modules/commons/ssh-lib/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/ssh/service/BlueprintSshClientServiceTest.kt
new file mode 100644 (file)
index 0000000..d612192
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ *  Copyright © 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.
+ */
+
+package org.onap.ccsdk.cds.blueprintsprocessor.ssh.service
+
+import kotlinx.coroutines.runBlocking
+import org.apache.sshd.common.config.keys.KeyUtils.RSA_ALGORITHM
+import org.apache.sshd.common.keyprovider.KeyPairProvider
+import org.apache.sshd.server.SshServer
+import org.apache.sshd.server.auth.password.PasswordAuthenticator
+import org.apache.sshd.server.auth.pubkey.AcceptAllPublickeyAuthenticator
+import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider
+import org.apache.sshd.server.session.ServerSession
+import org.apache.sshd.server.shell.ProcessShellCommandFactory
+import org.junit.runner.RunWith
+import org.onap.ccsdk.cds.blueprintsprocessor.core.BluePrintProperties
+import org.onap.ccsdk.cds.blueprintsprocessor.core.BlueprintPropertyConfiguration
+import org.onap.ccsdk.cds.blueprintsprocessor.ssh.BluePrintSshLibConfiguration
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.test.context.ContextConfiguration
+import org.springframework.test.context.TestPropertySource
+import org.springframework.test.context.junit4.SpringRunner
+import java.nio.file.Paths
+import kotlin.test.Test
+import kotlin.test.assertEquals
+import kotlin.test.assertNotNull
+
+
+@RunWith(SpringRunner::class)
+@ContextConfiguration(classes = [BluePrintSshLibConfiguration::class,
+    BlueprintPropertyConfiguration::class, BluePrintProperties::class])
+@TestPropertySource(properties =
+["blueprintsprocessor.sshclient.sample.type=basic-auth",
+    "blueprintsprocessor.sshclient.sample.host=localhost",
+    "blueprintsprocessor.sshclient.sample.port=52815",
+    "blueprintsprocessor.sshclient.sample.username=root",
+    "blueprintsprocessor.sshclient.sample.password=dummyps"
+])
+class BlueprintSshClientServiceTest {
+
+    @Autowired
+    lateinit var bluePrintSshLibPropertyService: BluePrintSshLibPropertyService
+
+    @Test
+    fun testBasicAuthSshClientService() {
+        runBlocking {
+            val sshServer = setupTestServer("localhost", 52815, "root", "dummyps")
+            sshServer.start()
+            println(sshServer)
+            val bluePrintSshLibPropertyService = bluePrintSshLibPropertyService.blueprintSshClientService("sample")
+            val sshSession = bluePrintSshLibPropertyService.startSession()
+            val response = bluePrintSshLibPropertyService.executeCommandsNB(arrayListOf("echo '1'", "echo '2'"), 2000)
+            assertNotNull(response, "failed to get command response")
+            bluePrintSshLibPropertyService.closeSession()
+            sshServer.stop(true)
+        }
+    }
+
+    private fun setupTestServer(host: String, port: Int, userName: String, password: String): SshServer {
+        val sshd = SshServer.setUpDefaultServer()
+        sshd.port = port
+        sshd.host = host
+        sshd.keyPairProvider = createTestHostKeyProvider()
+        sshd.passwordAuthenticator = BogusPasswordAuthenticator(userName, password)
+        sshd.publickeyAuthenticator = AcceptAllPublickeyAuthenticator.INSTANCE
+        //sshd.shellFactory = EchoShellFactory()
+        sshd.commandFactory = ProcessShellCommandFactory.INSTANCE
+        return sshd
+    }
+
+    private fun createTestHostKeyProvider(): KeyPairProvider {
+        val keyProvider = SimpleGeneratorHostKeyProvider()
+        keyProvider.path = Paths.get("target").resolve("hostkey." + RSA_ALGORITHM.toLowerCase())
+        keyProvider.algorithm = RSA_ALGORITHM
+        return keyProvider
+    }
+}
+
+class BogusPasswordAuthenticator(userName: String, password: String) : PasswordAuthenticator {
+    override fun authenticate(username: String, password: String, serverSession: ServerSession): Boolean {
+        assertEquals(username, "root", "failed to match username")
+        assertEquals(password, "dummyps", "failed to match password")
+        return true
+    }
+}
+
+
diff --git a/ms/blueprintsprocessor/modules/commons/ssh-lib/src/test/resources/logback-test.xml b/ms/blueprintsprocessor/modules/commons/ssh-lib/src/test/resources/logback-test.xml
new file mode 100644 (file)
index 0000000..365c41c
--- /dev/null
@@ -0,0 +1,35 @@
+<!--
+  ~ Copyright © 2017-2018 AT&T Intellectual Property.
+  ~
+  ~ 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.
+  -->
+
+<configuration>
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <!-- encoders are assigned the type
+             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
+        <encoder>
+            <pattern>%d{HH:mm:ss.SSS} %-5level %logger{100} - %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <logger name="org.springframework.test" level="warn"/>
+    <logger name="org.springframework" level="warn"/>
+    <logger name="org.hibernate" level="info"/>
+    <logger name="org.onap.ccsdk.cds.blueprintsprocessor" level="info"/>
+
+    <root level="warn">
+        <appender-ref ref="STDOUT"/>
+    </root>
+
+</configuration>
index 9523287..f087104 100755 (executable)
@@ -42,6 +42,7 @@
         <spring.kafka.version>2.2.6.RELEASE</spring.kafka.version>
         <kafka.version>2.2.0</kafka.version>
         <eelf.version>1.0.0</eelf.version>
+        <sli.version>${ccsdk.sli.core.version}</sli.version>
         <guava.version>27.0.1-jre</guava.version>
         <jython.version>2.7.1</jython.version>
         <springfox.swagger2.version>2.9.2</springfox.swagger2.version>
             <dependency>
                 <groupId>org.onap.ccsdk.sli.core</groupId>
                 <artifactId>sli-provider</artifactId>
-                <version>${ccsdk.sli.core.version}</version>
+                <version>${sli.version}</version>
                 <exclusions>
                     <exclusion>
                         <groupId>commons-lang</groupId>