public inbox for kdevops@lists.linux.dev
 help / color / mirror / Atom feed
From: cel@kernel.org
To: Luis Chamberlain <mcgrof@kernel.org>,
	Chandan Babu R <chandanbabu@kernel.org>,
	Jeff Layton <jlayton@kernel.org>
Cc: <kdevops@lists.linux.dev>, Chuck Lever <chuck.lever@oracle.com>
Subject: [PATCH v1 03/13] terraform/Azure: Create a set of multiple generic block devices
Date: Mon, 10 Mar 2025 10:18:03 -0400	[thread overview]
Message-ID: <20250310141813.969325-4-cel@kernel.org> (raw)
In-Reply-To: <20250310141813.969325-1-cel@kernel.org>

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 --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
+}
-- 
2.48.1


  parent reply	other threads:[~2025-03-10 14:18 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-03-10 14:18 [PATCH v1 00/13] Block device provisioning for storage nodes cel
2025-03-10 14:18 ` [PATCH v1 01/13] terraform/AWS: Upgrade the EBS volume type to "gp3" cel
2025-03-10 14:18 ` [PATCH v1 02/13] terraform/Azure: Remove managed_disk_type selection cel
2025-03-10 14:18 ` cel [this message]
2025-03-10 14:18 ` [PATCH v1 04/13] terraform/OCI: Create a set of multiple generic block devices cel
2025-03-13  5:56   ` Chandan Babu R
2025-03-10 14:18 ` [PATCH v1 05/13] guestfs: Set storage options consistently cel
2025-03-10 14:18 ` [PATCH v1 06/13] playbooks: Add a role to create an LVM volume group cel
2025-03-10 14:18 ` [PATCH v1 07/13] volume_group: Detect the /data partition directly cel
2025-03-10 14:18 ` [PATCH v1 08/13] volume_group: Prepare to support cloud providers cel
2025-03-10 14:18 ` [PATCH v1 09/13] volume_group: Create volume group on terraform/AWS nodes cel
2025-03-10 14:18 ` [PATCH v1 10/13] volume_group: Create a volume group on Azure nodes cel
2025-03-10 14:18 ` [PATCH v1 11/13] volume_group: Create a volume group on GCE nodes cel
2025-03-10 14:18 ` [PATCH v1 12/13] volume_group: Create a volume group on OCI nodes cel
2025-03-13  6:29   ` Chandan Babu R
2025-03-10 14:18 ` [PATCH v1 13/13] volume_group: Create a volume group on OpenStack public clouds cel
2025-03-11  3:29 ` [PATCH v1 00/13] Block device provisioning for storage nodes Luis Chamberlain

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250310141813.969325-4-cel@kernel.org \
    --to=cel@kernel.org \
    --cc=chandanbabu@kernel.org \
    --cc=chuck.lever@oracle.com \
    --cc=jlayton@kernel.org \
    --cc=kdevops@lists.linux.dev \
    --cc=mcgrof@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox