Coder Social home page Coder Social logo

Comments (3)

Vrolijkx avatar Vrolijkx commented on June 26, 2024 1

For you interest, I made a workaround for this problem creating a LogLineReciever that can also be used as readyChecker.

import com.whisk.docker.{DockerCommandExecutor, DockerContainerState, DockerReadyChecker, LogLineReceiver}
import grizzled.slf4j.Logging

import scala.concurrent.{ExecutionContext, Promise}

class BufferingLogLineReceiver(linesToKeep: Int = 100) extends LogLineReceiver(true, _ => {}) with Logging {
  import BufferingLogLineReceiver._
  private var buffer = Vector.empty[String]
  private var checkers: List[String => Unit] = List.empty

  override val f = (logLine: String) => {
    addToBuffer(logLine)
    callCheckers(logLine)
  }

  private def addToBuffer(content: String): Unit = {
    buffer = (buffer ++ content.split("\n")) takeRight linesToKeep
  }

  private def callCheckers(content: String): Unit = {
    checkers.foreach(_.apply(content))
  }

  def printAsError(): Unit = {
    if (buffer.length == linesToKeep) {
      error(s"${buffer.mkString("\n")}\n...}")
    } else {
      error(buffer.mkString("\n"))
    }
  }

  def logLineContains(partOfLine: String): DockerReadyChecker = {
    val checker = new SimpleContainsLineReadyCheck(partOfLine)
    checkers = checkers :+ checker.checkLine _
    //process already collected buffer
    buffer.foreach(checker.checkLine)
    checker
  }

}

object BufferingLogLineReceiver {

  private class SimpleContainsLineReadyCheck(partOfLine: String) extends DockerReadyChecker {
    val complete: Promise[Boolean] = Promise()

    override def apply(container: DockerContainerState)(implicit docker: DockerCommandExecutor, ec: ExecutionContext) = {
      complete.future
    }

    def checkLine(line: String): Unit = {
      if(line.toLowerCase.contains(partOfLine.toLowerCase)) {
        complete.trySuccess(true)
      }
    }
  }

}

Hope it helps you for now.

from docker-it-scala.

viktortnk avatar viktortnk commented on June 26, 2024

I think that LogLineReceiver is limited and the same time not properly working abstraction. I've just created #93 to address it in new version.

from docker-it-scala.

atais avatar atais commented on June 26, 2024

@Vrolijkx

Defienietly easier to just log it during checking:

case class LogLineAndCheckContains(str: String) extends DockerReadyChecker {
  override def apply(container: DockerContainerState)(implicit docker: DockerCommandExecutor,
                                                      ec: ExecutionContext): Future[Boolean] = {
    for {
      id <- container.id
      _ <- docker.withLogStreamLinesRequirement(id, withErr = true) {
        s =>
          print(s)
          s.contains(str)
      }
    } yield {
      true
    }
  }
}

from docker-it-scala.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.