R/AzureResources.R

Defines functions azureListSubscriptions azureListRG getResourceGroupLocation azureListAllResources azureCreateResourceGroup azureDeleteResourceGroup

Documented in azureCreateResourceGroup azureDeleteResourceGroup azureListAllResources azureListRG azureListSubscriptions

#' Get available subscriptions.
#'
#' @inheritParams setAzureContext
#' @inheritParams azureAuthenticate
#'
#' @return data frame with subscriptionID; Sets AzureContext subscriptionID
#' @family Resource group functions
#' @export
azureListSubscriptions <- function(azureActiveContext, verbose = FALSE) {
  assert_that(is.azureActiveContext(azureActiveContext))

  uri <- "https://management.azure.com/subscriptions?api-version=2015-01-01"
  r <- call_azure_sm(azureActiveContext, uri = uri, 
    verb = "GET", verbose = verbose)
  stopWithAzureError(r)

  dfs <- lapply(content(r), data.frame, stringsAsFactors = FALSE)
  df1 <- do.call(rbind, dfs)
  if (nrow(df1) == 1) azureActiveContext$subscriptionID <- df1$subscriptionId[1]
  return(df1)
}


#' Get all resource groups in subscription ID.
#'
#' @inheritParams setAzureContext
#' @inheritParams azureAuthenticate
#'
#' @return Dataframe of resourceGroups
#' @family Resource group functions
#' @export
azureListRG <- function(azureActiveContext, subscriptionID, verbose = FALSE) {
  assert_that(is.azureActiveContext(azureActiveContext))

  if (missing(subscriptionID)) subscriptionID <- azureActiveContext$subscriptionID
  assert_that(is_subscription_id(subscriptionID))

  uri <- paste0("https://management.azure.com/subscriptions/", subscriptionID,
                 "/resourcegroups?api-version=2015-01-01")
  r <- call_azure_sm(azureActiveContext, uri = uri,
    verb = "GET", verbose = verbose)
  stopWithAzureError(r)

  rl <- content(r, "text", encoding = "UTF-8")
  df <- fromJSON(rl)
  dfn <- df$value[, c("name", "location", "id")]
  names(dfn) <- c("name", "location", "ID")
  dfn$resourceGroup <- extractResourceGroupname(dfn$ID)
  return(dfn)
}

getResourceGroupLocation <- function(azureActiveContext, resourceGroup) {
  assert_that(is.azureActiveContext(azureActiveContext))
  assert_that(is_resource_group(resourceGroup))
  z <- azureListRG(azureActiveContext)
  z[z[["name"]] == resourceGroup, "location"]
}

#' Get all Resource in default Subscription.
#'
#' @inheritParams setAzureContext
#' @inheritParams azureAuthenticate
#'
#' @param azureActiveContext Azure Context Object
#' @param resourceGroup resourceGroup Object (or use `azureActiveContext`)
#' @param subscriptionID subscriptionID Object (or use `azureActiveContext`)
#' @param name filter by resource name
#' @param type filter by resource type
#' @param location Azure region, e.g. 'westeurope' or 'southcentralus'
#'
#' @return Returns Dataframe of Resources
#' @family Resource group functions
#' @export
azureListAllResources <- function(azureActiveContext, 
                                  resourceGroup, subscriptionID,
                                  name, type, location, verbose = FALSE) {

  assert_that(is.azureActiveContext(azureActiveContext))
  if (missing(subscriptionID)) subscriptionID <- azureActiveContext$subscriptionID

  uri <- paste0("https://management.azure.com/subscriptions/", subscriptionID,
                 "/resources?api-version=2015-01-01")
  r <- call_azure_sm(azureActiveContext, uri = uri, 
    verb = "GET", verbose = verbose)
  stopWithAzureError(r)

  rl <- content(r, "text", encoding = "UTF-8")
  df <- fromJSON(rl)
  dfn <- df$value[, c("name", "type", "location", "id")]

  dfn$resourceGroup  <- extractResourceGroupname(dfn$id)
  dfn$RG             <- dfn$resourceGroup
  dfn$subscriptionID <- extractSubscriptionID(dfn$id)

  if (!missing(name))          dfn <- dfn[grep(name, dfn$name), ]
  if (!missing(type))          dfn <- dfn[grep(type, dfn$type), ]
  if (!missing(location))      dfn <- dfn[grep(location, dfn$location), ]
  if (!missing(resourceGroup) && !is.null(resourceGroup)) {
    dfn <- dfn[grep(resourceGroup, dfn$resourceGroup), ]
  }

  dfn[, c(1:2, 6, 3:5, 7)]
}


#' Create a resourceGroup.
#'
#' @inheritParams setAzureContext
#' @inheritParams azureAuthenticate
#' @inheritParams azureListAllResources
#'
#' @return Returns Dataframe of Resources
#' @family Resource group functions
#' @export
azureCreateResourceGroup <- function(azureActiveContext, resourceGroup,
                                     location, subscriptionID, verbose = FALSE) {
  assert_that(is.azureActiveContext(azureActiveContext))
  if (missing(subscriptionID)) subscriptionID <- azureActiveContext$subscriptionID
  if (missing(resourceGroup)) resourceGroup <- azureActiveContext$resourceGroup
  verbosity <- set_verbosity(verbose)
  assert_that(is_resource_group(resourceGroup))
  assert_that(is_subscription_id(subscriptionID))
  assert_that(is_location(location))
  
  azureActiveContext$resourceGroup <- resourceGroup

  body <- list(location = location)
  uri <- paste0("https://management.azure.com/subscriptions/", subscriptionID,
                 "/resourcegroups/", resourceGroup, "?api-version=2015-01-01")
  r <- call_azure_sm(azureActiveContext, uri = uri, body = body,
    verb = "PUT", verbose = verbose)
  stopWithAzureError(r)

  rl <- content(r, "text", encoding = "UTF-8")
  df <- fromJSON(rl)
  if (length(df$error$code) && df$error$code == "locationNotAvailableForresourceGroup")
    stop(df$message)

  message("Create Request Submitted")
  return(TRUE)
}


#' Delete a resourceGroup with all Resources.
#'
#' @inheritParams setAzureContext
#' @inheritParams azureAuthenticate
#' @inheritParams azureListAllResources
#'
#' @return Returns Dataframe of Resources
#' @family Resource group functions
#' @export
azureDeleteResourceGroup <- function(azureActiveContext, resourceGroup,
                                     subscriptionID, type, verbose = FALSE) {
  assert_that(is.azureActiveContext(azureActiveContext))

  if (missing(subscriptionID)) subscriptionID <- azureActiveContext$subscriptionID

  assert_that(is_resource_group(resourceGroup))
  assert_that(is_subscription_id(subscriptionID))

  uri <- paste0("https://management.azure.com/subscriptions/", subscriptionID,
                 "/resourcegroups/", resourceGroup, "?api-version=2015-01-01")
  r <- call_azure_sm(azureActiveContext, uri = uri,
    verb = "DELETE", verbose = verbose)
  if (status_code(r) == 404) {
    stop(paste0("Error: Resource Group Not Found(", status_code(r), ")"))
  }
  stopWithAzureError(r)
  message("Delete Request Submitted")
  return(TRUE)
}
CharlesCara/AzureSMRLite documentation built on March 10, 2020, 11:52 p.m.