app/controllers/DeploymentsController.scala (78 lines of code) (raw):

package controllers import auth.{BearerTokenAuth, Security} import models.DeployedImageInfo import play.api.libs.circe.Circe import play.api.mvc.{AbstractController, ControllerComponents} import javax.inject.{Inject, Singleton} import scala.concurrent.ExecutionContext.Implicits.global import io.circe.syntax._ import io.circe.generic.auto._ import models.errors.ConflictError import models.requests.UpdateDeploymentRequest import models.responses.GenericErrorResponse import org.slf4j.LoggerFactory import play.api.Configuration import services.kubernetes @Singleton class DeploymentsController @Inject() (kubernetes:kubernetes, cc:ControllerComponents, override val bearerTokenAuth:BearerTokenAuth, override val config:Configuration) extends AbstractController(cc) with Circe with Security { override protected val logger = LoggerFactory.getLogger(getClass) import models.errors.LightweightErrorEncoder._ def listDeployments = IsAdminAsync { uid=> req=> kubernetes .listDeployments() .map(_.map(DeployedImageInfo.fromDeployment)) .map(results=>Ok(results.asJson)) .recover({ case err:Throwable=> logger.error(s"Could not get deployments: ${err.getMessage}", err) InternalServerError(GenericErrorResponse("error", err.toString).asJson) }) } def getDeploymentForProjectId(projectId:String) = IsAdminAsync { uid=> req=> val predicate = ProjectIdHelper.numericId(projectId) match { case Some(_) => (i:DeployedImageInfo)=>i.labels.get("gitlab-project-id").contains(projectId) case None => val idParts = projectId.split("/") if(idParts.length!=2) { throw new RuntimeException(s"GitHub project ID $projectId was not valid, did not contain exactly one /") } else { (i:DeployedImageInfo)=>i.labels.get("github-org").contains(idParts.head) && i.labels.get("github-project-name").contains(idParts(1)) } } kubernetes .listDeployments() .map(_.map(DeployedImageInfo.fromDeployment)) .map(_.filter(predicate)) .map(results=>Ok(results.asJson)) .recover({ case err:Throwable=> logger.error(s"Could not get deployments for filtering: ${err.getMessage}", err) InternalServerError(GenericErrorResponse("error", err.getMessage).asJson) }) } def getDeploymentForName(deploymentName:String) = IsAdminAsync { uid=> req=> kubernetes .getDeploymentInfo(deploymentName) .map(info=>Ok(info.asJson)) .recover({ case err:Throwable=> logger.error(s"Could not get deployment for name: ${err.getMessage}", err) InternalServerError(GenericErrorResponse("error", err.getMessage).asJson) }) } def updateDeployment = IsAdminAsync(circe.json[UpdateDeploymentRequest]) { uid=> req=> kubernetes .updateDeployedSoftware(req.body.to, req.body.deploymentName) .map({ case err@Left(ConflictError(deployed, expected))=> Conflict(err.value.asJson) case err@Left(_)=> BadRequest(err.value.asJson) case Right(_)=> Ok(GenericErrorResponse("ok", "deployment update request made").asJson) }) } }