R/describe_instances.R

Defines functions describe_instances instance_status print.ec2_instance_status get_instance_public_ip get_instance_private_ip

Documented in describe_instances get_instance_private_ip get_instance_public_ip instance_status

#' @rdname describe_instances
#' @title EC2 Instance Status
#' @description Describe or check status of an EC2 instance
#' @template instance
#' @template filter
#' @param runningonly \dots
#' @param n \dots
#' @template token
#' @template dots
#' @return For `describe_instances`, a list containing several lists of elements, including one or more \dQuote{instancesSet} elements that lists various instances. For `instance_status`, a possibly empty list.
#' @references
#' <http://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstances.html>
#' <http://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstanceStatus.html>
#' @examples
#' \dontrun{
#' i <- run_instances()
#' describe_instances(i[[1]])
#' instance_status(i[[1]])
#'
#' stop_instances(i[[1]])
#' terminate_instances(i[[1]])
#' }
#' @keywords instances
#' @export
describe_instances <-
function(
  instance = NULL,
  filter = NULL,
  n = NULL,
  token = NULL,
  ...
) {
    query <- list(Action = "DescribeInstances")
    if (!is.null(instance) && length(instance) > 0) {
        if (inherits(instance, "ec2_instance")) {
            instance <- list(get_instanceid(instance))
        } else if (is.character(instance)) {
            instance <- as.list(get_instanceid(instance))
        } else {
            instance <- lapply(instance, get_instanceid)
        }
        names(instance) <- paste0("InstanceId.", 1:length(instance))
        query <- c(query, instance)
    }
    if (!is.null(filter)) {
        query <- c(query, .makelist(filter, type = "Filter"))
    }
    if (!is.null(n)) {
        if(n > 1000) {
            warning("'n' coerced to 1000 (the maximum)")
            n <- 1000
        }
        query$MaxResults <- n
    }
    if (!is.null(token)) {
        query$NextToken <- token
    }
    r <- ec2HTTP(query = query, ...)
    out <- unname(lapply(r$reservationSet, function(x) {
        x$instancesSet <- unname(lapply(x$instancesSet, function(x) {
            structure(flatten_list(x), class = "ec2_instance")
        }))
        `class<-`(x, "ec2_reservation")
    }))
    class(out) <-  "ec2_reservation_set"
    return(out)
}

#' @rdname describe_instances
#' @export
instance_status <-
function(
  instance = NULL,
  filter = NULL,
  runningonly = NULL,
  n = NULL,
  token = NULL,
  ...
) {
    query <- list(Action = "DescribeInstanceStatus")
    if (!is.null(instance)) {
        if (inherits(instance, "ec2_instance")) {
            instance <- list(get_instanceid(instance))
        } else if (is.character(instance)) {
            instance <- as.list(get_instanceid(instance))
        } else {
            instance <- lapply(instance, get_instanceid)
        }
        names(instance) <- paste0("InstanceId.", 1:length(instance))
        query <- c(query, instance)
    }
    if (!is.null(filter)) {
        query <- c(query, .makelist(filter, type = "Filter"))
    }
    if (!is.null(n)) {
        if (n > 1000) {
            warning("'n' coerced to 1000 (the maximum)")
            n <- 1000
        }
        query$MaxResults <- n
    }
    if (!is.null(token)) {
        query$NextToken <- token
    }
    if (!missing(runningonly)) {
        query$IncludeAllInstances <- !runningonly
    }
    r <- ec2HTTP(query = query, ...)
    return(lapply(r$instanceStatusSet, `class<-`, "ec2_instance_status"))
}

print.ec2_instance_status <- function(x, ...) {
    cat(sprintf("instanceId:       %s\n", x$instanceId[[1L]]))
    cat(sprintf("availabilityZone: %s\n", x$availabilityZone[[1L]]))
    cat(sprintf("instanceState:    %s (%s)\n", x$instanceState$code[[1L]], x$instanceState$name[[1L]]))
    cat(sprintf("systemStatus:     %s\n", x$systemStatus$status[[1L]]))
    cat(sprintf("instanceStatus:   %s\n", x$instanceStatus$status[[1L]]))
    invisible(x)
}

#' @rdname describe_instances
#' @export
get_instance_public_ip <-
function(
  instance,
  ...
) {
    if (is.character(instance)) {
        instance_ids <- instance
    } else if (inherits(instance, "ec2_instance")) {
        instance_ids <- get_instanceid(instance)
    } else {
        instance_ids <- unlist(lapply(instance, get_instanceid))
    }
    instance_list <- describe_instances(instance, ...)
    if (length(instance) > 1L) {
        out <- unlist(lapply(instance_list, function(x) {
            address <- x$instancesSet[[1L]]$ipAddress
            if (is.null(address)) {
                NA_character_
            } else {
                address
            }
        }))
    } else {
        out <- instance_list[[1L]]$instancesSet[[1L]]$ipAddress
        if (is.null(out)) {
            out <- NA_character_
        }
    }
    names(out) <- instance_ids
    return(out)
}

#' @rdname describe_instances
#' @export
get_instance_private_ip <-
function(
  instance,
  ...
) {
    if (is.character(instance)) {
        instance_ids <- instance
    } else if (inherits(instance, "ec2_instance")) {
        instance_ids <- get_instanceid(instance)
    } else {
        instance_ids <- unlist(lapply(instance, get_instanceid))
    }
    instance_list <- describe_instances(instance, ...)
    if (length(instance) > 1L) {
        out <- unlist(lapply(instance_list, function(x) x$instancesSet[[1L]]$privateIpAddress))
    } else {
        out <- instance_list[[1L]]$instancesSet[[1L]]$privateIpAddress
        if (is.null(out)) {
            out <- NA_character_
        }
    }
    names(out) <- instance_ids
    return(out)
}
HanjoStudy/awsR documentation built on May 6, 2019, 9:06 a.m.