|
| 1 | +spaces_base <- "nyc3.digitaloceanspaces.com" |
| 2 | + |
| 3 | +check_space_access <- function(spaces_key) { |
| 4 | + tmp <- ifelse(is.null(spaces_key), |
| 5 | + Sys.getenv("DO_SPACES_ACCESS_KEY"), |
| 6 | + spaces_key) |
| 7 | + if (tmp == "") { |
| 8 | + stop("Need a digital ocean spaces access key defined in your session", |
| 9 | + call. = FALSE) |
| 10 | + } else { |
| 11 | + tmp |
| 12 | + } |
| 13 | +} |
| 14 | + |
| 15 | +check_space_secret <- function(spaces_secret) { |
| 16 | + tmp <- ifelse(is.null(spaces_secret), |
| 17 | + Sys.getenv("DO_SPACES_SECRET_KEY"), |
| 18 | + spaces_secret) |
| 19 | + if (tmp == "") { |
| 20 | + stop("Need a digital ocean spaces secret key defined in your session", |
| 21 | + call. = FALSE) |
| 22 | + } else { |
| 23 | + tmp |
| 24 | + } |
| 25 | +} |
| 26 | + |
| 27 | +#' @param x Object to coerce to a space |
| 28 | +#' @export |
| 29 | +#' @rdname spaces |
| 30 | +as.space <- function(x) UseMethod("as.space") |
| 31 | +#' @export |
| 32 | +as.space.space <- function(x) x |
| 33 | +#' @export |
| 34 | +as.space.character <- function(x) spaces()[[x]] |
| 35 | + |
| 36 | +#' @export |
| 37 | +print.space <- function(x, ...) { |
| 38 | + cat("<space>", x$Name, "\n", sep = "") |
| 39 | + cat(" Created at: ", x$CreationDate, "\n") |
| 40 | +} |
| 41 | + |
| 42 | +#' @export |
| 43 | +summary.space <- function(object, ...) { |
| 44 | + space_info <- space_info(name = object$Name, ...) |
| 45 | + |
| 46 | + # obtain total size used by space |
| 47 | + size <- space_size(space_info) |
| 48 | + |
| 49 | + # obtain number of files in space |
| 50 | + n_files <- space_files(space_info) |
| 51 | + |
| 52 | + cat("<space_detail>", object$Name, "\n", sep = "") |
| 53 | + cat(" Size (GB): ", size, "\n", sep = "") |
| 54 | + cat(" Files: ", n_files, "\n", sep = "") |
| 55 | + cat(" Created at: ", object$CreationDate, "\n", sep = "") |
| 56 | +} |
| 57 | + |
| 58 | +#' Spaces storage operations |
| 59 | +#' |
| 60 | +#' \describe{ |
| 61 | +#' \item{spaces}{Retrieve all spaces in your digital ocean account} |
| 62 | +#' \item{space_create}{Create a new space} |
| 63 | +#' } |
| 64 | +#' |
| 65 | +#' @param name (character) Space name. |
| 66 | +#' @param spaces_key (character) String containing a spaces access key. If |
| 67 | +#' missing, defaults to value stored in an environment variable |
| 68 | +#' \code{DO_SPACES_ACCESS_KEY}. |
| 69 | +#' @param spaces_secret (character) String containing the secret associated |
| 70 | +#' with the spaces key. If missing, defaults to value stored in an environment |
| 71 | +#' variable \code{DO_SPACES_SECRET_KEY}. |
| 72 | +#' @param ... Additional arguments passed down to \code{\link[aws.s3]{bucketlist}}, |
| 73 | +#' \code{\link[aws.s3]{get_bucket}}, \code{\link[aws.s3]{put_bucket}} functions |
| 74 | +#' from the \code{aws.s3} package. |
| 75 | +#' @examples \dontrun{ |
| 76 | +#' # list spaces |
| 77 | +#' spaces() |
| 78 | +#' |
| 79 | +#' # obtain spaces as a list of space objects |
| 80 | +#' res <- spaces() |
| 81 | +#' |
| 82 | +#' # print space summary using a space object |
| 83 | +#' summary(res[['my_space_name']]) |
| 84 | +#' |
| 85 | +#' # create a new space |
| 86 | +#' space_create('new_space_name') |
| 87 | +#' } |
| 88 | + |
| 89 | +#' @importFrom aws.s3 bucketlist |
| 90 | +#' @keywords internal |
| 91 | +spaces_GET <- function(spaces_key = NULL, spaces_secret = NULL, ...) { |
| 92 | + |
| 93 | + spaces_key <- check_space_access(spaces_key) |
| 94 | + spaces_secret <- check_space_secret(spaces_secret) |
| 95 | + |
| 96 | + res <- aws.s3::s3HTTP(verb = "GET", |
| 97 | + region = NULL, |
| 98 | + key = spaces_key, |
| 99 | + secret = spaces_secret, |
| 100 | + base_url = spaces_base, |
| 101 | + ...) |
| 102 | + |
| 103 | + return(res) |
| 104 | +} |
| 105 | + |
| 106 | +#' @export |
| 107 | +#' @rdname spaces |
| 108 | +spaces <- function(spaces_key = NULL, spaces_secret = NULL, ...) { |
| 109 | + res <- spaces_GET(spaces_key = spaces_key, spaces_secret = spaces_secret, ...) |
| 110 | + |
| 111 | + # when only one space is present, res$Buckets only contains the Name and |
| 112 | + # CreationDate. If more than one space is present, then each space will |
| 113 | + # have a Bucket list object with the Name and CreationDate |
| 114 | + if (identical(names(res$Buckets), c("Name", "CreationDate"))) { |
| 115 | + res$Buckets <- list( |
| 116 | + Bucket = list( |
| 117 | + Name = res$Buckets$Name, |
| 118 | + CreationDate = res$Buckets$CreationDate |
| 119 | + ) |
| 120 | + ) |
| 121 | + } |
| 122 | + sp <- lapply(res$Buckets, structure, class = "space") |
| 123 | + setNames(sp, vapply(res$Buckets, function(x) x$Name, character(1))) |
| 124 | +} |
| 125 | + |
| 126 | +#' @importFrom aws.s3 get_bucket |
| 127 | +#' @keywords internal |
| 128 | +space_info <- function(name, spaces_key = NULL, spaces_secret = NULL, ...) { |
| 129 | + if (is.null(name)) stop("Please specify the space name") |
| 130 | + spaces_key <- check_space_access(spaces_key) |
| 131 | + spaces_secret <- check_space_secret(spaces_secret) |
| 132 | + |
| 133 | + space_info <- get_bucket(name, |
| 134 | + region = NULL, |
| 135 | + check_region = FALSE, |
| 136 | + key = spaces_key, |
| 137 | + secret = spaces_secret, |
| 138 | + base_url = spaces_base, |
| 139 | + max = Inf, |
| 140 | + ...) |
| 141 | + |
| 142 | + return(space_info) |
| 143 | +} |
| 144 | + |
| 145 | +space_size <- function(space_info) { |
| 146 | + # grab the sizes from each file (unit is bytes) |
| 147 | + sizes <- vapply(space_info, function(x) x$Size, numeric(1)) |
| 148 | + |
| 149 | + # compute total size (convert to gb) |
| 150 | + sum(sizes) * 1e-09 |
| 151 | +} |
| 152 | + |
| 153 | +space_files <- function(space_info) { |
| 154 | + # remove entries with size 0 (those are nested directories) |
| 155 | + length(lapply(space_info, function(x) x[x$Size > 0])) |
| 156 | +} |
| 157 | + |
| 158 | +#' Create a new space |
| 159 | +#' @importFrom aws.s3 put_bucket |
| 160 | +#' @export |
| 161 | +#' @rdname spaces |
| 162 | +space_create <- function(name, spaces_key = NULL, spaces_secret = NULL, ...) { |
| 163 | + if (is.null(name)) stop("Please specify the space name") |
| 164 | + spaces_key <- check_space_access(spaces_key) |
| 165 | + spaces_secret <- check_space_secret(spaces_secret) |
| 166 | + |
| 167 | + res <- put_bucket(name, |
| 168 | + region = NULL, |
| 169 | + key = spaces_key, |
| 170 | + secret = spaces_secret, |
| 171 | + base_url = spaces_base, |
| 172 | + ...) |
| 173 | + |
| 174 | + if (res) message(sprintf("New space %s created successfully", name)) |
| 175 | +} |
0 commit comments