All Downloads are FREE. Search and download functionalities are using the official Maven repository.

me.jeffshaw.digitalocean.Droplet.scala Maven / Gradle / Ivy

package me.jeffshaw.digitalocean

import java.time.Instant
import org.json4s.JsonDSL._
import org.json4s._
import scala.concurrent._

case class Droplet(
  id: BigInt,
  name: String,
  memory: BigInt,
  vcpus: BigInt,
  disk: BigInt,
  region: Region,
  image: Image,
  kernel: Kernel,
  size: Size,
  locked: Boolean,
  createdAt: Instant,
  status: Status,
  networks: Networks,
  backupIds: Seq[BigInt],
  snapshotIds: Seq[BigInt],
  features: Seq[String],
  nextBackupWindow: BackupWindow,
  tags: Seq[String],
  volumeIds: Seq[String]
) {

  def exists(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Boolean] = {
    Droplet.exists(id)
  }

  def kernels(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Iterator[Kernel]] = {
    Droplet.kernels(id)
  }

  def backups(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Iterator[Image]] = {
    Droplet.backups(id)
  }

  def action(actionId: BigInt)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    Droplet.action(id, actionId)
  }

  def actions()(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Iterator[Action]] = {
    Droplet.actions(id)
  }

  def delete()(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[DropletDeletion] = {
    Droplet.delete(id)
  }

  def isDeleted()(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Boolean] = {
    Droplet.isDeleted(id)
  }

  def reboot()(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    Droplet.reboot(id)
  }

  def snapshots()(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Iterator[Image]] = {
    Droplet.snapshots(id)
  }

  def powerCycle()(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    Droplet.powerCycle(id)
  }

  def shutdown()(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    Droplet.shutdown(id)
  }

  def powerOff()(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    Droplet.powerOff(id)
  }

  def powerOn()(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    Droplet.powerOn(id)
  }

  def passwordReset()(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    Droplet.passwordReset(id)
  }

  def resize(size: SizeEnum)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    Droplet.resize(id, size)
  }

  def restore(image: Image)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    Droplet.restore(id, image)
  }

  def restore(imageId: BigInt)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    Droplet.restore(id, imageId)
  }

  def rebuild(imageSlug: String)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    Droplet.rebuild(id, imageSlug)
  }

  def rebuild(imageId: BigInt)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    Droplet.rebuild(id, imageId)
  }

  def rebuild(image: Image)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    Droplet.rebuild(id, image)
  }

  def rename(name: String)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    Droplet.rename(id, name)
  }

  def changeKernel(kernelId: BigInt)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    Droplet.changeKernel(id, kernelId)
  }

  def changeKernel(kernel: Kernel)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    Droplet.changeKernel(id, kernel)
  }

  def enableIPv6()(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    Droplet.enableIPv6(id)
  }

  def disableBackups(kernel: Kernel)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    Droplet.disableBackups(id)
  }

  def enablePrivateNetworking(kernel: Kernel)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    Droplet.enablePrivateNetworking(id)
  }

  def snapshot(name: Option[String] = None)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    Droplet.snapshot(id, name)
  }

  def neighbors()(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Iterator[Droplet]] = {
    Droplet.neighbors(id)
  }

  def attach(volumeId: String)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    Volume.attach(volumeId, id, region)
  }

  def detach(volumeId: String)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    Volume.detach(volumeId, id, region)
  }

  def attach(volume: Volume)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    volume.attach(id)
  }

  def detach(volume: Volume)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    volume.detach(id)
  }

  def attachByName(name: String)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    Volume.attachByName(name, id, region)
  }

  def detachByName(name: String)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    Volume.detachByName(name, id, region)
  }

  def refresh()(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Droplet] = {
    Droplet(id)
  }

  override def equals(obj: scala.Any): Boolean = {
    obj match {
      case that: Droplet =>
        eq(that) || this.id == that.id
      case _ =>
        false
    }
  }

  override def hashCode(): Int = id.hashCode()

}

object Droplet
  extends Path
  with Listable[Droplet, responses.Droplets] {

  override val path: Seq[String] = Seq("droplets")

  def apply(id: BigInt)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Droplet] = {
    val path = this.path :+ id.toString
    for {
      response <- client.get[responses.Droplet](path)
    } yield {
      response.droplet
    }
  }

  def exists(id: BigInt)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Boolean] = {
    val path = this.path :+ id.toString
    client.exists(path)
  }

  def isDeleted(id: BigInt)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Boolean] = {
    for {
      exists <- exists(id)
    } yield {! exists}
  }

  def delete(id: BigInt)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[DropletDeletion] = {
    val path = this.path :+ id.toString
    for {
      () <- client.delete(path)
    } yield DropletDeletion(id)
  }

  def delete(tag: String)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Unit] = {
    client.delete(path, queryParameters = Map("tag_name" -> Seq(tag)))
  }

  def kernels(id: BigInt)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Iterator[Kernel]] = {
    Listable.listGet[Kernel, responses.Kernels](path ++ Seq(id.toString, "kernels"))
  }

  def snapshots(id: BigInt)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Iterator[Image]] = {
    Listable.listGet[Image, responses.Snapshots](this.path ++ Seq(id.toString, "snapshots"))
  }

  def backups(id: BigInt)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Iterator[Image]] = {
    Listable.listGet[Image, responses.Backups](this.path ++ Seq(id.toString, "backups"))
  }

  def action(id: BigInt, actionId: BigInt)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    val path = this.path ++ Seq(id.toString, "actions", actionId.toString)
    for {
      response <- client.get[responses.Action](path)
    } yield {
      response.action
    }
  }

  def actions(id: BigInt)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Iterator[Action]] = {
    Listable.listGet[Action, responses.Actions](this.path ++ Seq(id.toString, "actions"), Map.empty)
  }

  private def performAction(id: BigInt, action: String, argument: JObject = JObject(Nil))(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    val path = this.path ++ Seq(id.toString, "actions")
    client.post[responses.Action](path, ("type" -> action) ~ argument).map(_.action)
  }

  private def performTaggedActions(tag: String, action: String, argument: JObject = JObject(Nil))(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Iterator[Action]] = {
    Listable.listPost[Action, responses.Actions](this.path :+ "actions", ("type" -> action) ~ argument, Map("tag_name" -> Seq(tag)))
  }

  def reboot(id: BigInt)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    performAction(id, "reboot")
  }

  def reboot(tag: String)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Iterator[Action]] = {
    performTaggedActions(tag, "reboot")
  }

  def powerCycle(id: BigInt)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    performAction(id, "power_cycle")
  }

  def powerCycle(tag: String)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Iterator[Action]] = {
    performTaggedActions(tag, "power_cycle")
  }

  def shutdown(id: BigInt)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    performAction(id, "shutdown")
  }

  def shutdown(tag: String)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Iterator[Action]] = {
    performTaggedActions(tag, "shutdown")
  }

  def powerOff(id: BigInt)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    performAction(id, "power_off")
  }

  def powerOff(tag: String)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Iterator[Action]] = {
    performTaggedActions(tag, "power_off")
  }

  def powerOn(id: BigInt)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    performAction(id, "power_on")
  }

  def powerOn(tag: String)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Iterator[Action]] = {
    performTaggedActions(tag, "power_on")
  }

  def passwordReset(id: BigInt)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    performAction(id, "password_reset")
  }

  def resize(id: BigInt, size: SizeEnum)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    performAction(id, "resize", ("size" -> size.slug))
  }

  def restore(id: BigInt, image: Image)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    restore(id, image.id)
  }

  def restore(id: BigInt, imageId: BigInt)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    performAction(id, "restore", ("image" -> imageId))
  }

  def rebuild(id: BigInt, image: Image)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    rebuild(id, image.id)
  }

  def rebuild(id: BigInt, imageId: BigInt)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    performAction(id, "rebuild", ("image" -> imageId))
  }

  def rebuild(id: BigInt, imageSlug: String)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    performAction(id, "rebuid", ("image" -> imageSlug))
  }

  def rename(id: BigInt, name: String)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    performAction(id, "rename", ("name" -> name))
  }

  def changeKernel(id: BigInt, kernel: Kernel)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    changeKernel(id, kernel.id)
  }

  def changeKernel(id: BigInt, kernelId: BigInt)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    performAction(id, "change_kernel", ("kernel" -> kernelId))
  }

  def enableIPv6(id: BigInt)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    performAction(id, "enable_ipv6")
  }

  def enableIPv6(tag: String)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Iterator[Action]] = {
    performTaggedActions(tag, "enable_ipv6")
  }

  def disableBackups(id: BigInt)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    performAction(id, "disable_backups")
  }

  def disableBackups(tag: String)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Iterator[Action]] = {
    performTaggedActions(tag, "disable_backups")
  }

  def enablePrivateNetworking(id: BigInt)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    performAction(id, "enable_private_networking")
  }

  def enablePrivateNetworking(tag: String)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Iterator[Action]] = {
    performTaggedActions(tag, "enable_private_networking")
  }

  def snapshot(id: BigInt, name: Option[String])(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Action] = {
    performAction(id, "snapshot", ("name" -> name))
  }

  def snapshot(tag: String, name: Option[String])(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Iterator[Action]] = {
    performTaggedActions(tag, "snapshot", ("name" -> name))
  }

  def neighbors(id: BigInt)(implicit client: DigitalOceanClient, ec: ExecutionContext): Future[Iterator[Droplet]] = {
    Listable.listGet[Droplet, responses.Droplets](path ++ Seq(id.toString, "neighbors"))
  }

  def create(
    name: String,
    region: RegionEnum,
    size: SizeEnum,
    image: Image,
    sshKeys: Seq[SshKey],
    backups: Boolean,
    ipv6: Boolean,
    privateNetworking: Boolean,
    userData: Option[String]
  )(implicit client: DigitalOceanClient,
    ec: ExecutionContext
  ): Future[DropletCreation] = {
    create(name, region, size, image.id, sshKeys, backups, ipv6, privateNetworking, userData)
  }

  def create(
    name: String,
    region: RegionEnum,
    size: SizeEnum,
    image: BigInt,
    sshKeys: Seq[SshKey],
    backups: Boolean,
    ipv6: Boolean,
    privateNetworking: Boolean,
    userData: Option[String]
  )(implicit client: DigitalOceanClient,
    ec: ExecutionContext
  ): Future[DropletCreation] = {
    val imagePart = "image" -> image
    createAux(name, region, size, imagePart, sshKeys, backups, ipv6, privateNetworking, userData)
  }

  def create(
    name: String,
    region: RegionEnum,
    size: SizeEnum,
    image: String,
    sshKeys: Seq[SshKey],
    backups: Boolean,
    ipv6: Boolean,
    privateNetworking: Boolean,
    userData: Option[String]
  )(implicit client: DigitalOceanClient,
    ec: ExecutionContext
  ): Future[DropletCreation] = {
    val imagePart = "image" -> image
    createAux(name, region, size, imagePart, sshKeys, backups, ipv6, privateNetworking, userData)
  }

  private def createAux(
    name: String,
    region: RegionEnum,
    size: SizeEnum,
    imagePart: JValue,
    sshKeys: Seq[SshKey],
    backups: Boolean,
    ipv6: Boolean,
    privateNetworking: Boolean,
    userData: Option[String]
  )(implicit client: DigitalOceanClient,
    ec: ExecutionContext
  ): Future[DropletCreation] = {
    val nonImageParts =
      ("name" -> name) ~
        ("region" -> region.slug) ~
        ("size" -> size.slug) ~
        ("ssh_keys" -> sshKeys.map(_.id)) ~
        ("backups" -> backups) ~
        ("ipv6" -> ipv6) ~
        ("private_networking" -> privateNetworking) ~
        ("user_data" -> userData)

    val requestJson = nonImageParts.merge(imagePart)

    for {
      response <- client.post[responses.DropletCreation](path, requestJson)
      droplet <- response.toDropletCreation
    } yield {
      droplet
    }
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy