From 43aca63b615a8ae9e6e66f39374bdba3ccc21f56 Mon Sep 17 00:00:00 2001 From: Anthony Howe Date: Sat, 29 Feb 2020 17:26:34 -0500 Subject: [PATCH] add the HPC Cache examples --- docs/images/terraform/1filer-hpcc.png | Bin 0 -> 6159 bytes docs/images/terraform/3filers-hpcc.png | Bin 0 -> 19440 bytes docs/images/terraform/nofiler-hpcc.png | Bin 0 -> 12873 bytes src/terraform/README.md | 8 +- .../examples/HPC Cache/1-filer/README.md | 42 ++++ .../examples/HPC Cache/1-filer/main.tf | 150 +++++++++++ .../examples/HPC Cache/3-filers/README.md | 42 ++++ .../examples/HPC Cache/3-filers/main.tf | 238 ++++++++++++++++++ src/terraform/examples/HPC Cache/README.md | 8 +- .../examples/HPC Cache/hpc_cache.json | 25 ++ .../examples/HPC Cache/no-filers/README.md | 42 ++++ .../examples/HPC Cache/no-filers/main.tf | 83 ++++++ .../examples/HPC Cache/storage_target.json | 26 ++ .../vdbench}/README.md | 0 .../vdbench => HPC Cache/vmss}/README.md | 0 src/terraform/examples/vfxt/README.md | 4 +- .../vmss => vfxt/vdbench}/README.md | 0 src/terraform/examples/vfxt/vmss/README.md | 0 src/terraform/modules/controller/README.md | 4 +- src/terraform/modules/jumpbox/install.sh | 7 +- .../terraform-provider-avere/README.md | 4 +- 21 files changed, 671 insertions(+), 12 deletions(-) create mode 100644 docs/images/terraform/1filer-hpcc.png create mode 100644 docs/images/terraform/3filers-hpcc.png create mode 100644 docs/images/terraform/nofiler-hpcc.png create mode 100644 src/terraform/examples/HPC Cache/1-filer/main.tf create mode 100644 src/terraform/examples/HPC Cache/3-filers/main.tf create mode 100644 src/terraform/examples/HPC Cache/hpc_cache.json create mode 100644 src/terraform/examples/HPC Cache/no-filers/main.tf create mode 100644 src/terraform/examples/HPC Cache/storage_target.json rename src/terraform/examples/{nfsclients => HPC Cache/vdbench}/README.md (100%) rename src/terraform/examples/{nfsclients/vdbench => HPC Cache/vmss}/README.md (100%) rename src/terraform/examples/{nfsclients/vmss => vfxt/vdbench}/README.md (100%) create mode 100644 src/terraform/examples/vfxt/vmss/README.md diff --git a/docs/images/terraform/1filer-hpcc.png b/docs/images/terraform/1filer-hpcc.png new file mode 100644 index 0000000000000000000000000000000000000000..5ab7eca8a331365f15bd998132a8a5224f0c6b2b GIT binary patch literal 6159 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 b*!kpjxAvv3UB3vH_#jhbt8-;%f4}};R)Z~h literal 0 HcmV?d00001 diff --git a/docs/images/terraform/3filers-hpcc.png b/docs/images/terraform/3filers-hpcc.png new file mode 100644 index 0000000000000000000000000000000000000000..75dab03be4e81f77f6d955414de80bb7432f5944 GIT binary patch literal 19440 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 UX|+G_GYgQNjnm;Lht6I7Z`{cwbpQYW literal 0 HcmV?d00001 diff --git a/src/terraform/README.md b/src/terraform/README.md index 16e9aebd..755b8a70 100644 --- a/src/terraform/README.md +++ b/src/terraform/README.md @@ -8,12 +8,12 @@ The examples show how to deploy HPC Cache and Avere vFXT from minimal configurat 1. [HPC Cache](examples/HPC%20Cache) 1. [no-filer example](examples/HPC%20Cache/no-filers) - 2. [Avere vFXT against 1 IaaS NAS filer example](examples/HPC%20Cache/1-filer) - 3. [Avere vFXT against 3 IaaS NAS filers example](examples/HPC%20Cache/3-filers) + 2. [HPC Cache mounting 1 IaaS NAS filer example](examples/HPC%20Cache/1-filer) + 3. [HPC Cache mounting 3 IaaS NAS filers example](examples/HPC%20Cache/3-filers) 2. [Avere vFXT](examples/vfxt) 1. [no-filer example](examples/vfxt/no-filers) - 2. [Avere vFXT against 1 IaaS NAS filer example](examples/vfxt/1-filer) - 3. [Avere vFXT against 3 IaaS NAS filers example](examples/vfxt/3-filers) + 2. [Avere vFXT mounting 1 IaaS NAS filer example](examples/vfxt/1-filer) + 3. [Avere vFXT mounting 3 IaaS NAS filers example](examples/vfxt/3-filers) 4. [Avere vFXT optimized for Houdini](examples/vfxt/HoudiniOptimized) 3. [NFS Filers](examples/nfsfilers) 1. [L32sv1](examples/nfsfilers/L32sv1) diff --git a/src/terraform/examples/HPC Cache/1-filer/README.md b/src/terraform/examples/HPC Cache/1-filer/README.md index e69de29b..2260e05d 100644 --- a/src/terraform/examples/HPC Cache/1-filer/README.md +++ b/src/terraform/examples/HPC Cache/1-filer/README.md @@ -0,0 +1,42 @@ +# HPC Cache Deployment with 1 NFS Filer + +This example shows how to deploy an HPC Cache mounting 1 NFS Filer. + +This example currently uses `azurerm_template_deployment` to deploy a template, but will be replaced soon by a native azurerm module. + +This examples configures a render network, controller, and HPC Cache with 1 filer as shown in the diagram below: + +![The architecture](../../../../../docs/images/terraform/1filer-hpcc.png) + +## Deployment Instructions + +To run the example, execute the following instructions. This assumes use of Azure Cloud Shell. If you are installing into your own environment, you will need to follow the [instructions to setup terraform for the Azure environment](https://docs.microsoft.com/en-us/azure/terraform/terraform-install-configure). + +1. browse to https://shell.azure.com + +2. Specify your subscription by running this command with your subscription ID: ```az account set --subscription YOUR_SUBSCRIPTION_ID```. You will need to run this everytime after restarting your shell, otherwise it may default you to the wrong subscription, and you will see an error similar to `azurerm_public_ip.vm is empty tuple`. + +3. double check your [HPC Cache pre-requistes](https://docs.microsoft.com/en-us/azure/hpc-cache/hpc-cache-prereqs) + +4. get the terraform examples +```bash +mkdir tf +cd tf +git init +git remote add origin -f https://github.com/Azure/Avere.git +git config core.sparsecheckout true +echo "src/terraform/*" >> .git/info/sparse-checkout +git pull origin master +``` + +6. `cd src/terraform/examples/HPC\ Cache/1-filer` + +7. edit the local variables section at the top of the file `main.tf`, to customize to your preferences + +8. execute `terraform init` in the directory of `main.tf`. + +9. execute `terraform apply -auto-approve` to build the HPC Cache cluster + +Once installed you will be able to mount the HPC Cache cluster login according to the [documentation](https://docs.microsoft.com/en-us/azure/hpc-cache/hpc-cache-mount). + +When you are done using the cluster, you can destroy it by running `terraform destroy -auto-approve` or just delete the three resource groups created. \ No newline at end of file diff --git a/src/terraform/examples/HPC Cache/1-filer/main.tf b/src/terraform/examples/HPC Cache/1-filer/main.tf new file mode 100644 index 00000000..2309c3d5 --- /dev/null +++ b/src/terraform/examples/HPC Cache/1-filer/main.tf @@ -0,0 +1,150 @@ +// customize the HPC Cache by adjusting the following local variables +locals { + // the region of the deployment + location = "eastus" + + // network details + network_resource_group_name = "network_resource_group" + + // vfxt details + hpc_cache_resource_group_name = "hpc_cache_resource_group" + + // HPC Cache Throughput SKU - 3 allowed values for throughput (GB/s) of the cache + // Standard_2G + // Standard_4G + // Standard_8G + cache_throughput = "Standard_2G" + + // HPC Cache Size - 5 allowed sizes (GBs) for the cache + // 3072 + // 6144 + // 12288 + // 24576 + // 49152 + cache_size = 12288 + + // unique name for cache + cache_name = "uniquename" + + // usage model + // WRITE_AROUND + // READ_HEAVY_INFREQ + // WRITE_WORKLOAD_15 + usage_model = "READ_HEAVY_INFREQ" + + // filer related variables + vm_admin_username = "azureuser" + // use either SSH Key data or admin password, if ssh_key_data is specified + // then admin_password is ignored + vm_admin_password = "PASSWORD" + // if you use SSH key, ensure you have ~/.ssh/id_rsa with permission 600 + // populated where you are running terraform + vm_ssh_key_data = null //"ssh-rsa AAAAB3...." + + // filer details + filer_resource_group_name = "filer_resource_group" +} + +provider "azurerm" { + version = "~>2.0.0" + features {} +} + +// the render network +module "network" { + source = "../../../modules/render_network" + resource_group_name = local.network_resource_group_name + location = local.location +} + +resource "azurerm_resource_group" "hpc_cache_rg" { + name = local.hpc_cache_resource_group_name + location = local.location + // the depends on is necessary for destroy. Due to the + // limitation of the template deployment, the only + // way to destroy template resources is to destroy + // the resource group + depends_on = [module.network] +} + +data "azurerm_subnet" "vnet" { + name = module.network.cloud_cache_subnet_name + virtual_network_name = module.network.vnet_name + resource_group_name = local.network_resource_group_name +} + +// load the HPC Cache Template, with the necessary variables +locals { + arm_template = templatefile("${path.module}/../hpc_cache.json", + { + uniquename = local.cache_name, + location = local.location, + hpccsku = local.cache_throughput, + subnetid = data.azurerm_subnet.vnet.id, + hpccachesize = local.cache_size + }) +} + +// HPC cache is currently deployed using azurerm_template_deployment as described in +// https://www.terraform.io/docs/providers/azurerm/r/template_deployment.html. +// The only way to destroy a template deployment is to destroy the associated +// RG, so keep each template unique to its RG. +resource "azurerm_template_deployment" "storage_cache" { + name = "hpc_cache" + resource_group_name = azurerm_resource_group.hpc_cache_rg.name + deployment_mode = "Incremental" + template_body = local.arm_template +} + +resource "azurerm_resource_group" "nfsfiler" { + name = local.filer_resource_group_name + location = local.location +} + +// the ephemeral filer +module "nasfiler1" { + source = "../../../modules/nfs_filer" + resource_group_name = azurerm_resource_group.nfsfiler.name + location = azurerm_resource_group.nfsfiler.location + admin_username = local.vm_admin_username + admin_password = local.vm_admin_password + ssh_key_data = local.vm_ssh_key_data + vm_size = "Standard_D2s_v3" + unique_name = "nasfiler1" + + // network details + virtual_network_resource_group = local.network_resource_group_name + virtual_network_name = module.network.vnet_name + virtual_network_subnet_name = module.network.cloud_filers_subnet_name +} + +// load the Storage Target Template, with the necessary variables +locals { + storage_target_1_template = templatefile("${path.module}/../storage_target.json", + { + uniquename = local.cache_name, + uniquestoragetargetname = "storage_target_1" + location = local.location, + nfsaddress = module.nasfiler1.primary_ip, + usagemodel = local.usage_model, + namespacepath_j1 = "/nfs1data", + nfsexport_j1 = module.nasfiler1.core_filer_export + targetPath_j1 = "" + }) +} + +resource "azurerm_template_deployment" "storage_target1" { + name = "storage_target_1" + resource_group_name = azurerm_resource_group.hpc_cache_rg.name + deployment_mode = "Incremental" + template_body = local.storage_target_1_template + + depends_on = [ + azurerm_template_deployment.storage_cache, // add after cache created + module.nasfiler1 + ] +} + +output "mount_addresses" { + value = azurerm_template_deployment.storage_cache.outputs["mountAddresses"] +} \ No newline at end of file diff --git a/src/terraform/examples/HPC Cache/3-filers/README.md b/src/terraform/examples/HPC Cache/3-filers/README.md index e69de29b..5b47cea8 100644 --- a/src/terraform/examples/HPC Cache/3-filers/README.md +++ b/src/terraform/examples/HPC Cache/3-filers/README.md @@ -0,0 +1,42 @@ +# HPC Cache Deployment with 3 NFS Filers + +This example shows how to deploy an HPC Cache mounting 3 NFS Filers. + +This example currently uses `azurerm_template_deployment` to deploy a template, but will be replaced soon by a native azurerm module. + +This examples configures a render network, controller, and HPC Cache with 3 filers as shown in the diagram below: + +![The architecture](../../../../../docs/images/terraform/3filers-hpcc.png) + +## Deployment Instructions + +To run the example, execute the following instructions. This assumes use of Azure Cloud Shell. If you are installing into your own environment, you will need to follow the [instructions to setup terraform for the Azure environment](https://docs.microsoft.com/en-us/azure/terraform/terraform-install-configure). + +1. browse to https://shell.azure.com + +2. Specify your subscription by running this command with your subscription ID: ```az account set --subscription YOUR_SUBSCRIPTION_ID```. You will need to run this everytime after restarting your shell, otherwise it may default you to the wrong subscription, and you will see an error similar to `azurerm_public_ip.vm is empty tuple`. + +3. double check your [HPC Cache pre-requistes](https://docs.microsoft.com/en-us/azure/hpc-cache/hpc-cache-prereqs) + +4. get the terraform examples +```bash +mkdir tf +cd tf +git init +git remote add origin -f https://github.com/Azure/Avere.git +git config core.sparsecheckout true +echo "src/terraform/*" >> .git/info/sparse-checkout +git pull origin master +``` + +6. `cd src/terraform/examples/HPC\ Cache/3-filer` + +7. edit the local variables section at the top of the file `main.tf`, to customize to your preferences + +8. execute `terraform init` in the directory of `main.tf`. + +9. execute `terraform apply -auto-approve` to build the HPC Cache cluster + +Once installed you will be able to mount the HPC Cache cluster login according to the [documentation](https://docs.microsoft.com/en-us/azure/hpc-cache/hpc-cache-mount). + +When you are done using the cluster, you can destroy it by running `terraform destroy -auto-approve` or just delete the three resource groups created. \ No newline at end of file diff --git a/src/terraform/examples/HPC Cache/3-filers/main.tf b/src/terraform/examples/HPC Cache/3-filers/main.tf new file mode 100644 index 00000000..2a57d1cf --- /dev/null +++ b/src/terraform/examples/HPC Cache/3-filers/main.tf @@ -0,0 +1,238 @@ +// customize the HPC Cache by adjusting the following local variables +locals { + // the region of the deployment + location = "eastus" + + // network details + network_resource_group_name = "network_resource_group" + + // vfxt details + hpc_cache_resource_group_name = "hpc_cache_resource_group" + + // HPC Cache Throughput SKU - 3 allowed values for throughput (GB/s) of the cache + // Standard_2G + // Standard_4G + // Standard_8G + cache_throughput = "Standard_2G" + + // HPC Cache Size - 5 allowed sizes (GBs) for the cache + // 3072 + // 6144 + // 12288 + // 24576 + // 49152 + cache_size = 12288 + + // unique name for cache + cache_name = "uniquename" + + // usage model + // WRITE_AROUND + // READ_HEAVY_INFREQ + // WRITE_WORKLOAD_15 + usage_model = "READ_HEAVY_INFREQ" + + // filer related variables + vm_admin_username = "azureuser" + // use either SSH Key data or admin password, if ssh_key_data is specified + // then admin_password is ignored + vm_admin_password = "PASSWORD" + // if you use SSH key, ensure you have ~/.ssh/id_rsa with permission 600 + // populated where you are running terraform + vm_ssh_key_data = null //"ssh-rsa AAAAB3...." + + // filer details + filer_resource_group_name = "filer_resource_group" +} + +provider "azurerm" { + version = "~>2.0.0" + features {} +} + +// the render network +module "network" { + source = "../../../modules/render_network" + resource_group_name = local.network_resource_group_name + location = local.location +} + +resource "azurerm_resource_group" "hpc_cache_rg" { + name = local.hpc_cache_resource_group_name + location = local.location + // the depends on is necessary for destroy. Due to the + // limitation of the template deployment, the only + // way to destroy template resources is to destroy + // the resource group + depends_on = [module.network] +} + +data "azurerm_subnet" "vnet" { + name = module.network.cloud_cache_subnet_name + virtual_network_name = module.network.vnet_name + resource_group_name = local.network_resource_group_name +} + +// load the HPC Cache Template, with the necessary variables +locals { + arm_template = templatefile("${path.module}/../hpc_cache.json", + { + uniquename = local.cache_name, + location = local.location, + hpccsku = local.cache_throughput, + subnetid = data.azurerm_subnet.vnet.id, + hpccachesize = local.cache_size + }) +} + +// HPC cache is currently deployed using azurerm_template_deployment as described in +// https://www.terraform.io/docs/providers/azurerm/r/template_deployment.html. +// The only way to destroy a template deployment is to destroy the associated +// RG, so keep each template unique to its RG. +resource "azurerm_template_deployment" "storage_cache" { + name = "hpc_cache" + resource_group_name = azurerm_resource_group.hpc_cache_rg.name + deployment_mode = "Incremental" + template_body = local.arm_template +} + +resource "azurerm_resource_group" "nfsfiler" { + name = local.filer_resource_group_name + location = local.location +} + +// the ephemeral filer +module "nasfiler1" { + source = "../../../modules/nfs_filer" + resource_group_name = azurerm_resource_group.nfsfiler.name + location = azurerm_resource_group.nfsfiler.location + admin_username = local.vm_admin_username + admin_password = local.vm_admin_password + ssh_key_data = local.vm_ssh_key_data + vm_size = "Standard_D2s_v3" + unique_name = "nasfiler1" + + // network details + virtual_network_resource_group = local.network_resource_group_name + virtual_network_name = module.network.vnet_name + virtual_network_subnet_name = module.network.cloud_filers_subnet_name +} + +// load the Storage Target Template, with the necessary variables +locals { + storage_target_1_template = templatefile("${path.module}/../storage_target.json", + { + uniquename = local.cache_name, + uniquestoragetargetname = "storage_target_1" + location = local.location, + nfsaddress = module.nasfiler1.primary_ip, + usagemodel = local.usage_model, + namespacepath_j1 = "/nfs1data", + nfsexport_j1 = module.nasfiler1.core_filer_export + targetPath_j1 = "" + }) +} + +resource "azurerm_template_deployment" "storage_target1" { + name = "storage_target_1" + resource_group_name = azurerm_resource_group.hpc_cache_rg.name + deployment_mode = "Incremental" + template_body = local.storage_target_1_template + + depends_on = [ + azurerm_template_deployment.storage_cache, // add after cache created + module.nasfiler1 + ] +} + +// the ephemeral filer +module "nasfiler2" { + source = "../../../modules/nfs_filer" + resource_group_name = azurerm_resource_group.nfsfiler.name + location = azurerm_resource_group.nfsfiler.location + admin_username = local.vm_admin_username + admin_password = local.vm_admin_password + ssh_key_data = local.vm_ssh_key_data + vm_size = "Standard_D2s_v3" + unique_name = "nasfiler2" + + // network details + virtual_network_resource_group = local.network_resource_group_name + virtual_network_name = module.network.vnet_name + virtual_network_subnet_name = module.network.cloud_filers_subnet_name +} + +// load the Storage Target Template, with the necessary variables +locals { + storage_target_2_template = templatefile("${path.module}/../storage_target.json", + { + uniquename = local.cache_name, + uniquestoragetargetname = "storage_target_2" + location = local.location, + nfsaddress = module.nasfiler2.primary_ip, + usagemodel = local.usage_model, + namespacepath_j1 = "/nfs2data", + nfsexport_j1 = module.nasfiler2.core_filer_export + targetPath_j1 = "" + }) +} + +resource "azurerm_template_deployment" "storage_target2" { + name = "storage_target_2" + resource_group_name = azurerm_resource_group.hpc_cache_rg.name + deployment_mode = "Incremental" + template_body = local.storage_target_2_template + + depends_on = [ + azurerm_template_deployment.storage_target1, // add after storage target1 + module.nasfiler2 + ] +} + +// the ephemeral filer +module "nasfiler3" { + source = "../../../modules/nfs_filer" + resource_group_name = azurerm_resource_group.nfsfiler.name + location = azurerm_resource_group.nfsfiler.location + admin_username = local.vm_admin_username + admin_password = local.vm_admin_password + ssh_key_data = local.vm_ssh_key_data + vm_size = "Standard_D2s_v3" + unique_name = "nasfiler3" + + // network details + virtual_network_resource_group = local.network_resource_group_name + virtual_network_name = module.network.vnet_name + virtual_network_subnet_name = module.network.cloud_filers_subnet_name +} + +// load the Storage Target Template, with the necessary variables +locals { + storage_target_3_template = templatefile("${path.module}/../storage_target.json", + { + uniquename = local.cache_name, + uniquestoragetargetname = "storage_target_3" + location = local.location, + nfsaddress = module.nasfiler3.primary_ip, + usagemodel = local.usage_model, + namespacepath_j1 = "/nfs3data", + nfsexport_j1 = module.nasfiler3.core_filer_export + targetPath_j1 = "" + }) +} + +resource "azurerm_template_deployment" "storage_target3" { + name = "storage_target_3" + resource_group_name = azurerm_resource_group.hpc_cache_rg.name + deployment_mode = "Incremental" + template_body = local.storage_target_3_template + + depends_on = [ + azurerm_template_deployment.storage_target2, // add after storage target2 + module.nasfiler3 + ] +} + +output "mount_addresses" { + value = azurerm_template_deployment.storage_cache.outputs["mountAddresses"] +} \ No newline at end of file diff --git a/src/terraform/examples/HPC Cache/README.md b/src/terraform/examples/HPC Cache/README.md index b7e15690..0cd6d5bd 100644 --- a/src/terraform/examples/HPC Cache/README.md +++ b/src/terraform/examples/HPC Cache/README.md @@ -1 +1,7 @@ -Please refer to the Artist Anywhere tutorials for how to use the HPC Cache filer: https://github.com/Azure/Avere/blob/master/src/tutorials/ArtistAnywhere/StorageCache/04-Cache.tf \ No newline at end of file +# HPC Cache + +The examples in this folder build various configurations of the Avere vFXT with IaaS based filers: + +1. [no-filer example](examples/HPC%20Cache/no-filers) +2. [HPC Cache mounting 1 IaaS NAS filer example](examples/HPC%20Cache/1-filer) +3. [HPC Cache mounting 3 IaaS NAS filers example](examples/HPC%20Cache/3-filers) diff --git a/src/terraform/examples/HPC Cache/hpc_cache.json b/src/terraform/examples/HPC Cache/hpc_cache.json new file mode 100644 index 00000000..7851ea3a --- /dev/null +++ b/src/terraform/examples/HPC Cache/hpc_cache.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "resources": [ + { + "name": "${uniquename}", + "type": "Microsoft.StorageCache/caches", + "apiVersion": "2019-11-01", + "location": "${location}", + "sku": { + "name": "${hpccsku}" + }, + "properties": { + "subnet": "${subnetid}", + "cacheSizeGB": "${hpccachesize}" + } + } + ], + "outputs": { + "mountAddresses": { + "type": "string", + "value": "[string(reference(resourceId('Microsoft.StorageCache/caches', '${uniquename}'), '2019-11-01').mountAddresses)]" + } + } +} \ No newline at end of file diff --git a/src/terraform/examples/HPC Cache/no-filers/README.md b/src/terraform/examples/HPC Cache/no-filers/README.md index e69de29b..d6820c81 100644 --- a/src/terraform/examples/HPC Cache/no-filers/README.md +++ b/src/terraform/examples/HPC Cache/no-filers/README.md @@ -0,0 +1,42 @@ +# HPC Cache Deployment with no Filers + +This example shows how to deploy an HPC Cache by itself. + +This example currently uses `azurerm_template_deployment` to deploy a template, but will be replaced soon by a native azurerm module. + +This examples configures a render network, controller, and HPC Cache without any filers as shown in the diagram below: + +![The architecture](../../../../../docs/images/terraform/nofiler.png) + +## Deployment Instructions + +To run the example, execute the following instructions. This assumes use of Azure Cloud Shell. If you are installing into your own environment, you will need to follow the [instructions to setup terraform for the Azure environment](https://docs.microsoft.com/en-us/azure/terraform/terraform-install-configure). + +1. browse to https://shell.azure.com + +2. Specify your subscription by running this command with your subscription ID: ```az account set --subscription YOUR_SUBSCRIPTION_ID```. You will need to run this everytime after restarting your shell, otherwise it may default you to the wrong subscription, and you will see an error similar to `azurerm_public_ip.vm is empty tuple`. + +3. double check your [HPC Cache pre-requistes](https://docs.microsoft.com/en-us/azure/hpc-cache/hpc-cache-prereqs) + +4. get the terraform examples +```bash +mkdir tf +cd tf +git init +git remote add origin -f https://github.com/Azure/Avere.git +git config core.sparsecheckout true +echo "src/terraform/*" >> .git/info/sparse-checkout +git pull origin master +``` + +6. `cd src/terraform/examples/HPC\ Cache/1-filer` + +7. edit the local variables section at the top of the file `main.tf`, to customize to your preferences + +8. execute `terraform init` in the directory of `main.tf`. + +9. execute `terraform apply -auto-approve` to build the HPC Cache cluster + +Once installed you will be able to mount the HPC Cache cluster login according to the [documentation](https://docs.microsoft.com/en-us/azure/hpc-cache/hpc-cache-mount). + +When you are done using the cluster, you can destroy it by running `terraform destroy -auto-approve` or just delete the three resource groups created. \ No newline at end of file diff --git a/src/terraform/examples/HPC Cache/no-filers/main.tf b/src/terraform/examples/HPC Cache/no-filers/main.tf new file mode 100644 index 00000000..d20cc9e5 --- /dev/null +++ b/src/terraform/examples/HPC Cache/no-filers/main.tf @@ -0,0 +1,83 @@ +// customize the HPC Cache by adjusting the following local variables +locals { + // the region of the deployment + location = "eastus" + + // network details + network_resource_group_name = "network_resource_group" + + // vfxt details + hpc_cache_resource_group_name = "hpc_cache_resource_group" + + // HPC Cache Throughput SKU - 3 allowed values for throughput (GB/s) of the cache + // Standard_2G + // Standard_4G + // Standard_8G + cache_throughput = "Standard_2G" + + // HPC Cache Size - 5 allowed sizes (GBs) for the cache + // 3072 + // 6144 + // 12288 + // 24576 + // 49152 + cache_size = 12288 + + // unique name for cache + cache_name = "uniquename" +} + +provider "azurerm" { + version = "~>2.0.0" + features {} +} + +// the render network +module "network" { + source = "../../../modules/render_network" + resource_group_name = local.network_resource_group_name + location = local.location +} + +resource "azurerm_resource_group" "hpc_cache_rg" { + name = local.hpc_cache_resource_group_name + location = local.location + // the depends on is necessary for destroy. Due to the + // limitation of the template deployment, the only + // way to destroy template resources is to destroy + // the resource group + depends_on = [module.network] +} + +data "azurerm_subnet" "vnet" { + name = module.network.cloud_cache_subnet_name + virtual_network_name = module.network.vnet_name + resource_group_name = local.network_resource_group_name +} + +// load the HPC Cache Template, with the necessary variables +locals { + arm_template = templatefile("${path.module}/../hpc_cache.json", + { + uniquename = local.cache_name, + location = local.location, + hpccsku = local.cache_throughput, + subnetid = data.azurerm_subnet.vnet.id, + hpccachesize = local.cache_size + }) +} + +// HPC cache is currently deployed using azurerm_template_deployment as described in +// https://www.terraform.io/docs/providers/azurerm/r/template_deployment.html. +// The only way to destroy a template deployment is to destroy the associated +// RG, so keep each template unique to its RG. +resource "azurerm_template_deployment" "storage_cache" { + name = "hpc_cache" + resource_group_name = azurerm_resource_group.hpc_cache_rg.name + deployment_mode = "Incremental" + template_body = local.arm_template +} + +output "mount_addresses" { + value = azurerm_template_deployment.storage_cache.outputs["mountAddresses"] +} \ No newline at end of file diff --git a/src/terraform/examples/HPC Cache/storage_target.json b/src/terraform/examples/HPC Cache/storage_target.json new file mode 100644 index 00000000..29811cee --- /dev/null +++ b/src/terraform/examples/HPC Cache/storage_target.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "resources": [ + { + "name": "${uniquename}/${uniquestoragetargetname}", + "type": "Microsoft.StorageCache/caches/storageTargets", + "apiVersion": "2019-11-01", + "location": "${location}", + "properties": { + "targetType": "nfs3", + "nfs3": { + "target": "${nfsaddress}", + "usageModel": "${usagemodel}" + }, + "junctions": [ + { + "namespacePath": "${namespacepath_j1}", + "nfsExport": "${nfsexport_j1}", + "targetPath": "${targetpath_j1}" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/src/terraform/examples/nfsclients/README.md b/src/terraform/examples/HPC Cache/vdbench/README.md similarity index 100% rename from src/terraform/examples/nfsclients/README.md rename to src/terraform/examples/HPC Cache/vdbench/README.md diff --git a/src/terraform/examples/nfsclients/vdbench/README.md b/src/terraform/examples/HPC Cache/vmss/README.md similarity index 100% rename from src/terraform/examples/nfsclients/vdbench/README.md rename to src/terraform/examples/HPC Cache/vmss/README.md diff --git a/src/terraform/examples/vfxt/README.md b/src/terraform/examples/vfxt/README.md index 6b582c71..15782cd5 100644 --- a/src/terraform/examples/vfxt/README.md +++ b/src/terraform/examples/vfxt/README.md @@ -3,6 +3,6 @@ The examples in this folder build various configurations of the Avere vFXT with IaaS based filers: 1. [Avere vFXT for Azure](no-filers/) -2. [Avere vFXT for Azure and wire up against 1 IaaS NAS filer](1-filer/) -3. [Avere vFXT for Azure and wire up against 3 IaaS NAS filers](3-filers/) +2. [Avere vFXT for Azure mounting 1 IaaS NAS filer](1-filer/) +3. [Avere vFXT for Azure mounting 3 IaaS NAS filers](3-filers/) 4. [Avere vFXT optimized for Houdini](HoudiniOptimized/) diff --git a/src/terraform/examples/nfsclients/vmss/README.md b/src/terraform/examples/vfxt/vdbench/README.md similarity index 100% rename from src/terraform/examples/nfsclients/vmss/README.md rename to src/terraform/examples/vfxt/vdbench/README.md diff --git a/src/terraform/examples/vfxt/vmss/README.md b/src/terraform/examples/vfxt/vmss/README.md new file mode 100644 index 00000000..e69de29b diff --git a/src/terraform/modules/controller/README.md b/src/terraform/modules/controller/README.md index a58b1035..28fc4444 100644 --- a/src/terraform/modules/controller/README.md +++ b/src/terraform/modules/controller/README.md @@ -3,5 +3,5 @@ This module deploys a controller for the Avere vFXT for Azure. Examples of module usage can be found in any of the following examples: 1. [Install Avere vFXT for Azure](../../examples/vfxt/no-filers) -2. [Install Avere vFXT for Azure and wire up against 1 IaaS NAS filer](../../examples/vfxt/1-filer) -3. [Install Avere vFXT for Azure and wire up against 3 IaaS NAS filers](../../examples/vfxt/3-filers) +2. [Install Avere vFXT for Azure mounting 1 IaaS NAS filer](../../examples/vfxt/1-filer) +3. [Install Avere vFXT for Azure mounting 3 IaaS NAS filers](../../examples/vfxt/3-filers) diff --git a/src/terraform/modules/jumpbox/install.sh b/src/terraform/modules/jumpbox/install.sh index 3ac2d0a2..58ca4b49 100644 --- a/src/terraform/modules/jumpbox/install.sh +++ b/src/terraform/modules/jumpbox/install.sh @@ -38,13 +38,16 @@ function install_golang() { mkdir -p $AZURE_HOME_DIR/gopath echo "export GOPATH=$AZURE_HOME_DIR/gopath" >> $AZURE_HOME_DIR/.bashrc echo "export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin" >> $AZURE_HOME_DIR/.bashrc - source $AZURE_HOME_DIR/.bashrc rm $GO_DL_FILE } function pull_avere_github() { # best effort to build the github content set +e + # setup the environment + source $AZURE_HOME_DIR/.bashrc + OLD_HOME=$HOME + export HOME=$AZURE_HOME_DIR # checkout Checkpoint simulator code, all dependencies and build the binaries cd $GOPATH go get -v github.com/Azure/Avere/src/terraform/providers/terraform-provider-avere @@ -52,8 +55,10 @@ function pull_avere_github() { go build mkdir -p $AZURE_HOME_DIR/.terraform.d/plugins cp terraform-provider-avere $AZURE_HOME_DIR/.terraform.d/plugins + export HOME=$OLD_HOME # re-enable exit on error set -e + } function install_az_cli() { diff --git a/src/terraform/providers/terraform-provider-avere/README.md b/src/terraform/providers/terraform-provider-avere/README.md index 1c3d8744..3b83948f 100644 --- a/src/terraform/providers/terraform-provider-avere/README.md +++ b/src/terraform/providers/terraform-provider-avere/README.md @@ -13,8 +13,8 @@ The provider has the following features: This provider requires a controller to be installed that is used to create and manage the Avere vFXT. The following examples provide details on how to use terraform to deploy the controller: 1. [Install Avere vFXT for Azure](../../examples/vfxt/no-filers) -2. [Install Avere vFXT for Azure and wire up against 1 IaaS NAS filer](../../examples/vfxt/1-filer) -3. [Install Avere vFXT for Azure and wire up against 3 IaaS NAS filers](../../examples/vfxt/3-filers) +2. [Install Avere vFXT for Azure mounting 1 IaaS NAS filer](../../examples/vfxt/1-filer) +3. [Install Avere vFXT for Azure mounting 3 IaaS NAS filers](../../examples/vfxt/3-filers) ## Build the Terraform Provider binary