diff mbox series

[v1,03/13] terraform/Azure: Create a set of multiple generic block devices

Message ID 20250310141813.969325-4-cel@kernel.org (mailing list archive)
State New
Headers show
Series Block device provisioning for storage nodes | expand

Commit Message

Chuck Lever March 10, 2025, 2:18 p.m. UTC
From: Chuck Lever <chuck.lever@oracle.com>

When provisioning on Azure, terraform creates one block device for
the /data file system, and one for unnamed device. This is unlike
other provisioning methods (guestfs and AWS being the primary
examples) which instead create a set of generic block devices and
then set up the sparse files or /data file system on one of those.

Luis has agreed to changing Azure to work like the other terraform
providers and guestfs.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
 .../templates/azure/terraform.tfvars.j2       |   3 +
 terraform/azure/Kconfig                       | 151 +++++++++++++++++-
 terraform/azure/main.tf                       |  46 ++----
 terraform/azure/managed_disks/main.tf         |  20 +++
 terraform/azure/managed_disks/vars.tf         |  29 ++++
 terraform/azure/vars.tf                       |  12 ++
 6 files changed, 224 insertions(+), 37 deletions(-)
 create mode 100644 terraform/azure/managed_disks/main.tf
 create mode 100644 terraform/azure/managed_disks/vars.tf
diff mbox series

Patch

diff --git a/playbooks/roles/gen_tfvars/templates/azure/terraform.tfvars.j2 b/playbooks/roles/gen_tfvars/templates/azure/terraform.tfvars.j2
index 37db35d2cbed..117c9b7c49e5 100644
--- a/playbooks/roles/gen_tfvars/templates/azure/terraform.tfvars.j2
+++ b/playbooks/roles/gen_tfvars/templates/azure/terraform.tfvars.j2
@@ -11,6 +11,9 @@  image_offer = "{{ terraform_azure_image_offer }}"
 image_sku = "{{ terraform_azure_image_sku }}"
 image_version = "{{ terraform_azure_image_version }}"
 
+managed_disks_per_instance = {{ terraform_azure_managed_disks_per_instance }}
+managed_disks_size = {{ terraform_azure_managed_disks_size }}
+
 ssh_config_pubkey_file = "{{ kdevops_terraform_ssh_config_pubkey_file }}"
 ssh_config_user = "{{ kdevops_terraform_ssh_config_user }}"
 ssh_config = "{{ sshconfig }}"
diff --git a/terraform/azure/Kconfig b/terraform/azure/Kconfig
index 0c5a0df9fbc5..18062ddf7cb2 100644
--- a/terraform/azure/Kconfig
+++ b/terraform/azure/Kconfig
@@ -155,7 +155,156 @@  config TERRAFORM_AZURE_APPLICATION_ID
 	help
 	  The application ID to use.
 
+choice
+	prompt "Count of extra managed disks"
+	default TERRAFORM_AZURE_MANAGED_DISKS_PER_INSTANCE_4
+	help
+	  The count of managed disks attached to each target node.
+
+config TERRAFORM_AZURE_MANAGED_DISKS_PER_INSTANCE_2
+	bool "2"
+	help
+	  Provision 2 extra managed disks per target node.
+
+config TERRAFORM_AZURE_MANAGED_DISKS_PER_INSTANCE_3
+	bool "3"
+	help
+	  Provision 3 extra managed disks per target node.
+
+config TERRAFORM_AZURE_MANAGED_DISKS_PER_INSTANCE_4
+	bool "4"
+	help
+	  Provision 4 extra managed disks per target node.
+
+config TERRAFORM_AZURE_MANAGED_DISKS_PER_INSTANCE_5
+	bool "5"
+	help
+	  Provision 5 extra managed disks per target node.
+
+config TERRAFORM_AZURE_MANAGED_DISKS_PER_INSTANCE_6
+	bool "6"
+	help
+	  Provision 6 extra managed disks per target node.
+
+config TERRAFORM_AZURE_MANAGED_DISKS_PER_INSTANCE_7
+	bool "7"
+	help
+	  Provision 7 extra managed disks per target node.
+
+config TERRAFORM_AZURE_MANAGED_DISKS_PER_INSTANCE_8
+	bool "8"
+	help
+	  Provision 8 extra managed disks per target node.
+
+config TERRAFORM_AZURE_MANAGED_DISKS_PER_INSTANCE_9
+	bool "9"
+	help
+	  Provision 9 extra managed disks per target node.
+
+config TERRAFORM_AZURE_MANAGED_DISKS_PER_INSTANCE_10
+	bool "10"
+	help
+	  Provision 10 extra managed disks per target node.
+
+endchoice
+
+config TERRAFORM_AZURE_MANAGED_DISKS_PER_INSTANCE
+	int
+	output yaml
+	default 2 if TERRAFORM_AZURE_MANAGED_DISKS_PER_INSTANCE_2
+	default 3 if TERRAFORM_AZURE_MANAGED_DISKS_PER_INSTANCE_3
+	default 4 if TERRAFORM_AZURE_MANAGED_DISKS_PER_INSTANCE_4
+	default 5 if TERRAFORM_AZURE_MANAGED_DISKS_PER_INSTANCE_5
+	default 6 if TERRAFORM_AZURE_MANAGED_DISKS_PER_INSTANCE_6
+	default 7 if TERRAFORM_AZURE_MANAGED_DISKS_PER_INSTANCE_7
+	default 8 if TERRAFORM_AZURE_MANAGED_DISKS_PER_INSTANCE_8
+	default 9 if TERRAFORM_AZURE_MANAGED_DISKS_PER_INSTANCE_9
+	default 10 if TERRAFORM_AZURE_MANAGED_DISKS_PER_INSTANCE_10
+
+choice
+	prompt "Volume size for each additional volume"
+	default TERRAFORM_AZURE_MANAGED_DISKS_SIZE_64G
+	help
+	  This option selects the size (in gibibytes) of managed
+	  disks create for the target nodes.
+
+config TERRAFORM_AZURE_MANAGED_DISKS_SIZE_4G
+	bool "4G"
+	help
+	  Managed disks are 4 GiB in size.
+
+config TERRAFORM_AZURE_MANAGED_DISKS_SIZE_8G
+	bool "8G"
+	help
+	  Managed disks are 8 GiB in size.
+
+config TERRAFORM_AZURE_MANAGED_DISKS_SIZE_16G
+	bool "16G"
+	help
+	  Managed disks are 16 GiB in size.
+
+config TERRAFORM_AZURE_MANAGED_DISKS_SIZE_32G
+	bool "32G"
+	help
+	  Managed disks are 32 GiB in size.
+
+config TERRAFORM_AZURE_MANAGED_DISKS_SIZE_64G
+	bool "64G"
+	help
+	  Managed disks are 64 GiB in size.
+
+config TERRAFORM_AZURE_MANAGED_DISKS_SIZE_128G
+	bool "128G"
+	help
+	  Managed disks are 128 GiB in size.
+
+config TERRAFORM_AZURE_MANAGED_DISKS_SIZE_256G
+	bool "256G"
+	help
+	  Managed disks are 256 GiB in size.
+
+config TERRAFORM_AZURE_MANAGED_DISKS_SIZE_512G
+	bool "512G"
+	help
+	  Managed disks are 512 GiB in size.
+
+config TERRAFORM_AZURE_MANAGED_DISKS_SIZE_1024G
+	bool "1024G"
+	help
+	  Managed disks are 1024 GiB in size.
+
+config TERRAFORM_AZURE_MANAGED_DISKS_SIZE_2048G
+	bool "2048G"
+	help
+	  Managed disks are 2048 GiB in size.
+
+config TERRAFORM_AZURE_MANAGED_DISKS_SIZE_4096G
+	bool "4096G"
+	help
+	  Managed disks are 4096 GiB in size.
+
+endchoice
+
+config TERRAFORM_AZURE_MANAGED_DISKS_SIZE
+	int
+	output yaml
+	default 4 if TERRAFORM_AZURE_MANAGED_DISKS_SIZE_4G
+	default 8 if TERRAFORM_AZURE_MANAGED_DISKS_SIZE_8G
+	default 16 if TERRAFORM_AZURE_MANAGED_DISKS_SIZE_16G
+	default 32 if TERRAFORM_AZURE_MANAGED_DISKS_SIZE_32G
+	default 64 if TERRAFORM_AZURE_MANAGED_DISKS_SIZE_64G
+	default 128 if TERRAFORM_AZURE_MANAGED_DISKS_SIZE_128G
+	default 256 if TERRAFORM_AZURE_MANAGED_DISKS_SIZE_256G
+	default 512 if TERRAFORM_AZURE_MANAGED_DISKS_SIZE_512G
+	default 1024 if TERRAFORM_AZURE_MANAGED_DISKS_SIZE_1024G
+	default 2048 if TERRAFORM_AZURE_MANAGED_DISKS_SIZE_2048G
+	default 4096 if TERRAFORM_AZURE_MANAGED_DISKS_SIZE_4096G
+
 config TERRAFORM_AZURE_DATA_VOLUME_DEVICE_FILE_NAME
-	string "/dev/sdc"
+	string "Device name for the /data file system"
+	default "/dev/sdc"
+	help
+	  This option sets the name of the block device on each target
+	  node that is to be used for the /data file system.
 
 endif # TERRAFORM_AZURE
diff --git a/terraform/azure/main.tf b/terraform/azure/main.tf
index d2e90ff7f7f0..9b7b9228eb0e 100644
--- a/terraform/azure/main.tf
+++ b/terraform/azure/main.tf
@@ -10,7 +10,7 @@  resource "azurerm_resource_group" "kdevops_group" {
 }
 
 locals {
-	kdevops_private_net = format("%s/%d", var.private_net_prefix, var.private_net_mask)
+  kdevops_private_net = format("%s/%d", var.private_net_prefix, var.private_net_mask)
 }
 
 resource "azurerm_virtual_network" "kdevops_network" {
@@ -168,40 +168,14 @@  resource "azurerm_linux_virtual_machine" "kdevops_vm" {
   }
 }
 
-resource "azurerm_managed_disk" "kdevops_data_disk" {
-  count                = local.kdevops_num_boxes
-  name                 = format("kdevops-data-disk-%02d", count.index + 1)
-  location             = var.resource_location
-  resource_group_name  = azurerm_resource_group.kdevops_group.name
-  create_option        = "Empty"
-  storage_account_type = "Premium_LRS"
-  disk_size_gb         = 100
-}
+module "managed_disks" {
+  count                   = local.kdevops_num_boxes
+  source                  = "./managed_disks"
 
-resource "azurerm_virtual_machine_data_disk_attachment" "kdevops_data_disk" {
-  count                     = local.kdevops_num_boxes
-  managed_disk_id           = azurerm_managed_disk.kdevops_data_disk[count.index].id
-  virtual_machine_id        = element(azurerm_linux_virtual_machine.kdevops_vm.*.id, count.index)
-  caching                   = "None"
-  write_accelerator_enabled = false
-  lun                       = 0
-}
-
-resource "azurerm_managed_disk" "kdevops_scratch_disk" {
-  count                = local.kdevops_num_boxes
-  name                 = format("kdevops-scratch-disk-%02d", count.index + 1)
-  location             = var.resource_location
-  resource_group_name  = azurerm_resource_group.kdevops_group.name
-  create_option        = "Empty"
-  storage_account_type = "Premium_LRS"
-  disk_size_gb         = 100
-}
-
-resource "azurerm_virtual_machine_data_disk_attachment" "kdevops_scratch_disk" {
-  count                     = local.kdevops_num_boxes
-  managed_disk_id           = azurerm_managed_disk.kdevops_scratch_disk[count.index].id
-  virtual_machine_id        = element(azurerm_linux_virtual_machine.kdevops_vm.*.id, count.index)
-  caching                   = "None"
-  write_accelerator_enabled = false
-  lun                       = 1
+  md_disk_size            = var.managed_disks_size
+  md_disk_count           = var.managed_disks_per_instance
+  md_location             = var.resource_location
+  md_resource_group_name  = azurerm_resource_group.kdevops_group.name
+  md_virtual_machine_id   = element(azurerm_linux_virtual_machine.kdevops_vm.*.id, count.index)
+  md_virtual_machine_name = element(azurerm_linux_virtual_machine.kdevops_vm.*.name, count.index)
 }
diff --git a/terraform/azure/managed_disks/main.tf b/terraform/azure/managed_disks/main.tf
new file mode 100644
index 000000000000..503c782662fc
--- /dev/null
+++ b/terraform/azure/managed_disks/main.tf
@@ -0,0 +1,20 @@ 
+resource "azurerm_managed_disk" "kdevops_managed_disk" {
+  count                = var.md_disk_count
+
+  name                 = format("kdevops_%s_disk%02d", var.md_virtual_machine_name, count.index + 1)
+  location             = var.md_location
+  resource_group_name  = var.md_resource_group_name
+  create_option        = "Empty"
+  storage_account_type = "Premium_LRS"
+  disk_size_gb         = var.md_disk_size
+}
+
+resource "azurerm_virtual_machine_data_disk_attachment" "kdevops_disk_attachment" {
+  count                     = var.md_disk_count
+
+  managed_disk_id           = azurerm_managed_disk.kdevops_managed_disk[count.index].id
+  virtual_machine_id        = var.md_virtual_machine_id
+  caching                   = "None"
+  write_accelerator_enabled = false
+  lun                       = count.index
+}
diff --git a/terraform/azure/managed_disks/vars.tf b/terraform/azure/managed_disks/vars.tf
new file mode 100644
index 000000000000..568df7c6fc41
--- /dev/null
+++ b/terraform/azure/managed_disks/vars.tf
@@ -0,0 +1,29 @@ 
+variable "md_disk_count" {
+  type        = number
+  description = "Count of managed disks to attach to the virtual machine"
+}
+
+variable "md_disk_size" {
+  type        = number
+  description = "Size of each managed disk, in gibibytes"
+}
+
+variable "md_location" {
+  type        = string
+  description = "Azure resource location"
+}
+
+variable "md_resource_group_name" {
+  type        = string
+  description = "Azure resource group name"
+}
+
+variable "md_virtual_machine_id" {
+  type        = string
+  description = "Azure ID of the virtual machine to attach the disks to"
+}
+
+variable "md_virtual_machine_name" {
+  type        = string
+  description = "Name of the virtual machine to attach the disks to"
+}
diff --git a/terraform/azure/vars.tf b/terraform/azure/vars.tf
index 3981ccb01faf..bf20adf813e0 100644
--- a/terraform/azure/vars.tf
+++ b/terraform/azure/vars.tf
@@ -59,3 +59,15 @@  variable "image_version" {
   description = "Storage image version"
   default     = "latest"
 }
+
+variable "managed_disks_per_instance" {
+  description = "Count of managed disks per VM instance"
+  type        = number
+  default     = 0
+}
+
+variable "managed_disks_size" {
+  description = "Size of each managed disk, in gibibytes"
+  type        = number
+  default     = 0
+}