All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.fherbreteau.gatling.sftp.client.SftpOperation.scala Maven / Gradle / Ivy

package io.github.fherbreteau.gatling.sftp.client

import io.gatling.commons.validation.Validation
import io.gatling.core.Predef.Session
import io.gatling.core.session.Expression
import io.github.fherbreteau.gatling.sftp.client.SftpActions.{Action, Copy, Delete, Download, Mkdir, Move, RmDir, Upload}
import io.github.fherbreteau.gatling.sftp.protocol.SftpProtocol
import org.apache.sshd.common.util.io.IoUtils
import org.apache.sshd.sftp.client.SftpClient
import org.apache.sshd.sftp.client.SftpClient.{CopyMode, OpenMode}

import java.nio.file.Files
import scala.util.Using

final case class SftpOperationDef(operationName: Expression[String],
                                  operationDef: Expression[OperationDef],
                                  sftpProtocol: SftpProtocol,
                                  throttled: Boolean) {
  def build(session: Session): Validation[SftpOperation] =
    operationDef(session).map(definition => SftpOperation(definition, sftpProtocol, throttled))
}

object SftpOperation {
  def apply(definition: OperationDef, sftpProtocol: SftpProtocol, throttled: Boolean): SftpOperation =
    SftpOperation(definition.operationName, definition, sftpProtocol, throttled)
}

final case class SftpOperation(operationName: String,
                               definition: OperationDef,
                               sftpProtocol: SftpProtocol,
                               throttled: Boolean) {

  def build: SftpClient => Unit = {
    val localSourcePath = sftpProtocol.localSource(definition.source)
    val localDestPath = sftpProtocol.localDestination(definition.destination)
    val remoteSourcePath = sftpProtocol.remoteSource(definition.source)
    val remoteDestPath = sftpProtocol.remoteDestination(definition.destination)
    definition.action match {
      case Move => client => {
        client.rename(remoteSourcePath, remoteDestPath, CopyMode.Atomic)
      }
      case Copy => client => {
        Using.Manager { use =>
          val source = use(client.read(remoteSourcePath))
          val destination = use(client.write(remoteDestPath, OpenMode.Create, OpenMode.Write))
          IoUtils.copy(source, destination)
        }
      }
      case Delete => client => {
        client.remove(remoteSourcePath)
      }
      case Download => client => {
        Using.Manager { use =>
          val source = use(client.read(remoteSourcePath))
          val destination = use(Files.newOutputStream(localDestPath))
          IoUtils.copy(source, destination)
        }
      }
      case Upload => client => {
        Using.Manager { use =>
          val source = use(Files.newInputStream(localSourcePath))
          val destination = use(client.write(remoteDestPath, OpenMode.Create, OpenMode.Write))
          IoUtils.copy(source, destination)
        }
      }
      case Mkdir => client => {
        client.mkdir(remoteSourcePath)
      }
      case RmDir => client => {
        client.rmdir(remoteSourcePath)
      }
    }
  }

}

final case class OperationDef(operationName: String,
                              source: String,
                              destination: String,
                              action: Action) {}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy