blob: 4161c00943cb0a546f8b36b86add8ddbecd1138f [file] [log] [blame]
/*
* Copyright 2015-2016 IBM Corporation
*
* 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 whisk.core
import scala.concurrent.duration._
import java.time.Instant
import whisk.core.entity.UUID
import whisk.core.entity.DocRevision
/**
* This object contains type definitions that are useful when observing and timing container operations.
*/
package object container {
/**
* Identifies a combination of owner+action+version (except special cases)
*/
class ActionContainerId(val stringRepr: String) extends AnyVal
object ActionContainerId {
// Convenience "constructor" since this is the most common case.
def apply(uuid: UUID, actionFullyQualifiedName: String, actionRevision: DocRevision) =
new ActionContainerId(s"instantiated.${uuid}.${actionFullyQualifiedName}.${actionRevision}")
}
/**
* Special case for stem cell containers
*/
val WarmNodeJsActionContainerId = new ActionContainerId("warm.nodejs")
/**
* Represents a time interval, which can be viewed as a duration for which
* the start/end instants are fully known (as opposed to being relative).
*/
case class Interval(start: Instant, end: Instant) {
def duration = Duration.create(end.toEpochMilli() - start.toEpochMilli(), MILLISECONDS)
}
/**
* Represents the result of accessing an endpoint in a container:
* Start time, End time, Some(response) from container consisting of status code and payload
* If there is no response or an exception, then None.
*/
case class RunResult(interval: Interval, response: Option[(Int, String)]) {
def duration = interval.duration
}
/**
* The result of trying to obtain a container.
*/
sealed trait ContainerResult
case object CacheMiss extends ContainerResult
/**
* The result of trying to obtain a container which is known to exist.
*/
sealed trait FinalContainerResult extends ContainerResult
case class Success(con: Container, initResult: Option[RunResult]) extends FinalContainerResult
case object Busy extends FinalContainerResult
case class Error(string: String) extends FinalContainerResult
// Note: not using InetAddress here because we don't want to do any lookup
// until used for something.
case class ContainerAddr(host: String, port: Int) {
override def toString() = s"$host:$port"
}
type ContainerName = Option[String]
type ContainerId = Option[String]
type DockerOutput = Option[String]
}