Skip to content

Commit

Permalink
deploy multiple resources at once
Browse files Browse the repository at this point in the history
  • Loading branch information
lhns committed Apr 1, 2022
1 parent 089a752 commit d7ef4ce
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,15 @@ case class DeployRequest(
object DeployRequest {
implicit val codec: Codec[DeployRequest] = deriveCodec

case class DeployRequests(deployRequests: Seq[DeployRequest])

object DeployRequests {
implicit val codec: Codec[DeployRequests] = Codec.from(
Decoder[Seq[DeployRequest]].or(Decoder[DeployRequest].map(Seq(_))).map(DeployRequests(_)),
Encoder[Seq[DeployRequest]].contramap(_.deployRequests)
)
}

sealed trait Locator

object Locator {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package de.lolhens.kubedeploy.model

import cats.kernel.Semigroup
import de.lolhens.kubedeploy.model.DeployResult.{DeployFailure, DeploySuccess}
import io.circe.generic.semiauto._
import io.circe.{Codec, Decoder, Encoder}

sealed trait DeployResult
sealed trait DeployResult {
def toEither: Either[DeployFailure, DeploySuccess]
}

object DeployResult {
implicit val codec: Codec[DeployResult] = {
Expand Down Expand Up @@ -44,9 +48,22 @@ object DeployResult {
)
}

case class DeploySuccess(awaitedStatus: Boolean) extends DeployResult
implicit val semigroup: Semigroup[DeployResult] = Semigroup.instance {
case (DeployFailure(_, false), b@DeployFailure(_, true)) => b
case (a: DeployFailure, _: DeployFailure) => a
case (a: DeployFailure, _) => a
case (_, b: DeployFailure) => b
case (DeploySuccess(aAwaitedStatus), DeploySuccess(bAwaitedStatus)) =>
DeploySuccess(aAwaitedStatus && bAwaitedStatus)
}

case class DeployFailure(message: String, notFound: Boolean = false) extends DeployResult
case class DeploySuccess(awaitedStatus: Boolean) extends DeployResult {
override def toEither: Either[DeployFailure, DeploySuccess] = Right(this)
}

case class DeployFailure(message: String, notFound: Boolean = false) extends DeployResult {
override def toEither: Either[DeployFailure, DeploySuccess] = Left(this)
}

// https://github.com/kubernetes-sigs/cli-utils/blob/master/pkg/kstatus/README.md#statuses
sealed abstract class Status(val string: String, val failure: Boolean)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@ package de.lolhens.kubedeploy.route

import cats.data.{EitherT, OptionT}
import cats.effect.IO
import cats.syntax.semigroup._
import de.lolhens.http4s.errors.syntax._
import de.lolhens.http4s.errors.{ErrorResponseEncoder, ErrorResponseLogger}
import de.lolhens.kubedeploy.JsonOf
import de.lolhens.kubedeploy.deploy.PortainerDeploy
import de.lolhens.kubedeploy.model.DeployRequest.DeployRequests
import de.lolhens.kubedeploy.model.DeployResult.DeployFailure
import de.lolhens.kubedeploy.model.DeployTarget.DeployTargetId
import de.lolhens.kubedeploy.model.{DeployRequest, DeployResult, DeployTarget}
import de.lolhens.kubedeploy.model.{DeployResult, DeployTarget}
import de.lolhens.kubedeploy.repo.DeployTargetRepo
import org.http4s.client.Client
import org.http4s.dsl.io._
Expand Down Expand Up @@ -38,12 +40,20 @@ class KubedeployRoutes(client: Client[IO], deployTargetRepo: DeployTargetRepo[IO
case Authorization(Credentials.Token(AuthScheme.Bearer, secret)) if secret == deployTarget.secret.value =>
()
}, "not authorized").toErrorResponse(Unauthorized)
deployRequest <- request.as[JsonOf[DeployRequest]].map(_.value).orErrorResponse(BadRequest)
deployRequests <- request.as[JsonOf[DeployRequests]].map(_.value).orErrorResponse(BadRequest)
deploy <- IO(deployTarget match {
case DeployTarget(_, _, Some(portainerDeployTarget)) =>
new PortainerDeploy(client, portainerDeployTarget)
}).orErrorResponse(InternalServerError)
deployResult <- deploy.deploy(deployRequest).toErrorResponse(InternalServerError)
deployResult <- EitherT {
IO.parTraverseN(8)(deployRequests.deployRequests) { deployRequest =>
deploy.deploy(deployRequest).value
}.map(_
.map[DeployResult](_.merge)
.reduce(_ |+| _)
.toEither
)
}.toErrorResponse(InternalServerError)
response <- Ok(JsonOf(deployResult: DeployResult)).orErrorResponse(InternalServerError)
} yield
response)
Expand Down

0 comments on commit d7ef4ce

Please sign in to comment.