CycloneTechnology/ChaMP

View on GitHub
champ-ipmi/src/main/scala/com/cyclone/ipmi/tool/command/PowerTool.scala

Summary

Maintainability
A
0 mins
Test Coverage
package com.cyclone.ipmi.tool.command

import com.cyclone.command.TimeoutContext
import com.cyclone.ipmi.command.chassis.ChassisControl
import com.cyclone.ipmi.command.chassis.ChassisControl.Control
import com.cyclone.ipmi.tool.command.IpmiCommands.{CommandExecutor, Ctx}
import com.cyclone.ipmi.IpmiError
import scalaz.EitherT._
import scalaz.Scalaz._
import scalaz.\/

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future

sealed trait Power

object Power {

  case object on extends Power

  case object off extends Power

  case object cycle extends Power

  case object reset extends Power

  case object diag extends Power

  case object soft extends Power

}

/**
  * [[IpmiToolCommand]] that wraps the [[ChassisControl]] low-level command.
  */
object PowerTool {

  object Command {
    implicit val executor: CommandExecutor[Command, PowerSet.type] =
      new CommandExecutor[Command, PowerSet.type] {

        def execute(
          command: Command
        )(implicit ctx: Ctx): Future[IpmiError \/ PowerTool.PowerSet.type] = {
          implicit val timeoutContext: TimeoutContext = ctx.timeoutContext
          import ctx._

          def exec = command.power match {
            case Power.on =>
              connection.executeCommandOrError(ChassisControl.Command(Control.PowerUp))
            case Power.off =>
              connection.executeCommandOrError(ChassisControl.Command(Control.PowerDown))
            case Power.cycle =>
              connection.executeCommandOrError(ChassisControl.Command(Control.PowerCycle))
            case Power.reset =>
              connection.executeCommandOrError(ChassisControl.Command(Control.HardReset))
            case Power.diag =>
              connection.executeCommandOrError(
                ChassisControl.Command(Control.PulseDiagnosticInterrupt)
              )
            case Power.soft =>
              connection.executeCommandOrError(
                ChassisControl.Command(Control.EmulateFatalOverTemperature)
              )
          }

          val result = for {
            _ <- eitherT(exec)
          } yield PowerSet

          result.run
        }
      }
  }

  case class Command(power: Power) extends IpmiToolCommand {

    def description(): String = {
      s"power $power"
    }
  }

  case object PowerSet extends IpmiToolCommandResult

}