From: cel@kernel.org
To: Luis Chamberlain <mcgrof@kernel.org>, chandanbabu@kernel.org
Cc: <kdevops@lists.linux.dev>, Chuck Lever <chuck.lever@oracle.com>
Subject: [RFC PATCH] terraform/OCI: Create a set of multiple generic block devices
Date: Wed, 5 Mar 2025 16:12:07 -0500 [thread overview]
Message-ID: <20250305211207.243174-1-cel@kernel.org> (raw)
From: Chuck Lever <chuck.lever@oracle.com>
When provisioning on OCI, terraform creates one block device for
the /data file system, and one for sparse files. 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 and Chandan have agreed to changing OCI to work like the
other terraform providers and guestfs.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
.../templates/oci/terraform.tfvars.j2 | 6 +
terraform/oci/Kconfig | 160 ++++++++++++++++++
terraform/oci/main.tf | 23 ++-
terraform/oci/vars.tf | 17 ++
4 files changed, 202 insertions(+), 4 deletions(-)
This seems to do what we want. For the moment, this facility is
gated behind a Kconfig boolean so you can revert back to the old
data/sparse configuratino quickly. Testing will confirm if we need
to keep this revert setting.
diff --git a/playbooks/roles/gen_tfvars/templates/oci/terraform.tfvars.j2 b/playbooks/roles/gen_tfvars/templates/oci/terraform.tfvars.j2
index 6429c7289f52..2d45fd77d510 100644
--- a/playbooks/roles/gen_tfvars/templates/oci/terraform.tfvars.j2
+++ b/playbooks/roles/gen_tfvars/templates/oci/terraform.tfvars.j2
@@ -12,10 +12,16 @@ oci_os_image_ocid = "{{ terraform_oci_os_image_ocid }}"
oci_assign_public_ip = "{{ terraform_oci_assign_public_ip | lower }}"
oci_instance_display_name = "{{ terraform_oci_instance_display_name }}"
oci_subnet_ocid = "{{ terraform_oci_subnet_ocid }}"
+oci_volumes_enable_extra = "{{ terraform_oci_volumes_enable_extra | lower }}"
+{% if terraform_oci_volumes_enable_extra %}
+oci_volumes_per_instance = {{ terraform_oci_volumes_per_instance }}
+oci_volumes_size = {{ terraform_oci_volumes_size }}
+{% else %}
oci_data_volume_display_name = "{{ terraform_oci_data_volume_display_name }}"
oci_data_volume_device_file_name = "{{ terraform_oci_data_volume_device_file_name }}"
oci_sparse_volume_display_name = "{{ terraform_oci_sparse_volume_display_name }}"
oci_sparse_volume_device_file_name = "{{ terraform_oci_sparse_volume_device_file_name }}"
+{% endif %}
ssh_config_pubkey_file = "{{ kdevops_terraform_ssh_config_pubkey_file }}"
ssh_config_user = "{{ kdevops_terraform_ssh_config_user }}"
diff --git a/terraform/oci/Kconfig b/terraform/oci/Kconfig
index 4b37ad91d4b9..08eb239fcc5c 100644
--- a/terraform/oci/Kconfig
+++ b/terraform/oci/Kconfig
@@ -90,6 +90,160 @@ config TERRAFORM_OCI_SUBNET_OCID
Read this:
https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/terraformproviderconfiguration.htm
+config TERRAFORM_OCI_VOLUMES_ENABLE_EXTRA
+ bool "Enable additional block devices"
+ output yaml
+ default n
+ help
+ Enable this to provision up to 10 extra block devices
+ on each target node.
+
+if TERRAFORM_OCI_VOLUMES_ENABLE_EXTRA
+
+choice
+ prompt "Count of extra block volumes"
+ default TERRAFORM_OCI_VOLUMES_PER_INSTANCE_4
+ help
+ The count of extra block devices attached to each target
+ node.
+
+config TERRAFORM_OCI_VOLUMES_PER_INSTANCE_1
+ bool "1"
+ help
+ Provision 1 extra volume per target node.
+
+config TERRAFORM_OCI_VOLUMES_PER_INSTANCE_2
+ bool "2"
+ help
+ Provision 2 extra volumes per target node.
+
+config TERRAFORM_OCI_VOLUMES_PER_INSTANCE_3
+ bool "3"
+ help
+ Provision 3 extra volumes per target node.
+
+config TERRAFORM_OCI_VOLUMES_PER_INSTANCE_4
+ bool "4"
+ help
+ Provision 4 extra volumes per target node.
+
+config TERRAFORM_OCI_VOLUMES_PER_INSTANCE_5
+ bool "5"
+ help
+ Provision 5 extra volumes per target node.
+
+config TERRAFORM_OCI_VOLUMES_PER_INSTANCE_6
+ bool "6"
+ help
+ Provision 6 extra volumes per target node.
+
+config TERRAFORM_OCI_VOLUMES_PER_INSTANCE_7
+ bool "7"
+ help
+ Provision 7 extra volumes per target node.
+
+config TERRAFORM_OCI_VOLUMES_PER_INSTANCE_8
+ bool "8"
+ help
+ Provision 8 extra volumes per target node.
+
+config TERRAFORM_OCI_VOLUMES_PER_INSTANCE_9
+ bool "9"
+ help
+ Provision 9 extra volumes per target node.
+
+config TERRAFORM_OCI_VOLUMES_PER_INSTANCE_10
+ bool "10"
+ help
+ Provision 10 extra volumes per target node.
+
+endchoice
+
+config TERRAFORM_OCI_VOLUMES_PER_INSTANCE
+ int
+ output yaml
+ default 1 if TERRAFORM_OCI_VOLUMES_PER_INSTANCE_1
+ default 2 if TERRAFORM_OCI_VOLUMES_PER_INSTANCE_2
+ default 3 if TERRAFORM_OCI_VOLUMES_PER_INSTANCE_3
+ default 4 if TERRAFORM_OCI_VOLUMES_PER_INSTANCE_4
+ default 5 if TERRAFORM_OCI_VOLUMES_PER_INSTANCE_5
+ default 6 if TERRAFORM_OCI_VOLUMES_PER_INSTANCE_6
+ default 7 if TERRAFORM_OCI_VOLUMES_PER_INSTANCE_7
+ default 8 if TERRAFORM_OCI_VOLUMES_PER_INSTANCE_8
+ default 9 if TERRAFORM_OCI_VOLUMES_PER_INSTANCE_9
+ default 10 if TERRAFORM_OCI_VOLUMES_PER_INSTANCE_10
+
+choice
+ prompt "Volume size for each additional volume"
+ default TERRAFORM_OCI_VOLUMES_SIZE_50G
+ help
+ OCI implements volume sizes between 50G and 32T. In some
+ cases, 50G volumes are in the free tier.
+
+config TERRAFORM_OCI_VOLUMES_SIZE_50G
+ bool "50G"
+ help
+ Extra block volumes are 50 GiB in size.
+
+config TERRAFORM_OCI_VOLUMES_SIZE_64G
+ bool "64G"
+ help
+ Extra block volumes are 64 GiB in size.
+
+config TERRAFORM_OCI_VOLUMES_SIZE_128G
+ bool "128G"
+ help
+ Extra block volumes are 128 GiB in size.
+
+config TERRAFORM_OCI_VOLUMES_SIZE_256G
+ bool "256G"
+ help
+ Extra block volumes are 256 GiB in size.
+
+config TERRAFORM_OCI_VOLUMES_SIZE_512G
+ bool "512G"
+ help
+ Extra block volumes are 512 GiB in size.
+
+config TERRAFORM_OCI_VOLUMES_SIZE_1024G
+ bool "1024G"
+ help
+ Extra block volumes are 1024 GiB in size.
+
+config TERRAFORM_OCI_VOLUMES_SIZE_2048G
+ bool "2048G"
+ help
+ Extra block volumes are 2048 GiB in size.
+
+config TERRAFORM_OCI_VOLUMES_SIZE_4096G
+ bool "4096G"
+ help
+ Extra block volumes are 4096 GiB in size.
+
+config TERRAFORM_OCI_VOLUMES_SIZE_8192G
+ bool "8192G"
+ help
+ Extra block volumes are 8192 GiB in size.
+
+endchoice
+
+config TERRAFORM_OCI_VOLUMES_SIZE
+ int
+ output yaml
+ default 50 if TERRAFORM_OCI_VOLUMES_SIZE_50G
+ default 64 if TERRAFORM_OCI_VOLUMES_SIZE_64G
+ default 128 if TERRAFORM_OCI_VOLUMES_SIZE_128G
+ default 256 if TERRAFORM_OCI_VOLUMES_SIZE_256G
+ default 512 if TERRAFORM_OCI_VOLUMES_SIZE_512G
+ default 1024 if TERRAFORM_OCI_VOLUMES_SIZE_1024G
+ default 2048 if TERRAFORM_OCI_VOLUMES_SIZE_2048G
+ default 4096 if TERRAFORM_OCI_VOLUMES_SIZE_4096G
+ default 8192 if TERRAFORM_OCI_VOLUMES_SIZE_8192G
+
+endif # TERRAFORM_OCI_VOLUMES_ENABLE_EXTRA
+
+if !TERRAFORM_OCI_VOLUMES_ENABLE_EXTRA
+
config TERRAFORM_OCI_DATA_VOLUME_DISPLAY_NAME
string "Display name to use for the data volume"
default "data"
@@ -98,6 +252,8 @@ config TERRAFORM_OCI_DATA_VOLUME_DISPLAY_NAME
Read this:
https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/terraformproviderconfiguration.htm
+endif # !TERRAFORM_OCI_VOLUMES_ENABLE_EXTRA
+
config TERRAFORM_OCI_DATA_VOLUME_DEVICE_FILE_NAME
string "Data volume's device file name"
default "/dev/oracleoci/oraclevdb"
@@ -106,6 +262,8 @@ config TERRAFORM_OCI_DATA_VOLUME_DEVICE_FILE_NAME
Read this:
https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/terraformproviderconfiguration.htm
+if !TERRAFORM_OCI_VOLUMES_ENABLE_EXTRA
+
config TERRAFORM_OCI_SPARSE_VOLUME_DISPLAY_NAME
string "Display name to use for the sparse volume"
default "sparse"
@@ -114,6 +272,8 @@ config TERRAFORM_OCI_SPARSE_VOLUME_DISPLAY_NAME
Read this:
https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/terraformproviderconfiguration.htm
+endif # !TERRAFORM_OCI_VOLUMES_ENABLE_EXTRA
+
config TERRAFORM_OCI_SPARSE_VOLUME_DEVICE_FILE_NAME
string "Sparse volume's device file name"
default "/dev/oracleoci/oraclevdc"
diff --git a/terraform/oci/main.tf b/terraform/oci/main.tf
index 033f821d9502..05e51d6bef89 100644
--- a/terraform/oci/main.tf
+++ b/terraform/oci/main.tf
@@ -28,7 +28,7 @@ resource "oci_core_instance" "kdevops_instance" {
}
resource "oci_core_volume" "kdevops_data_disk" {
- count = local.kdevops_num_boxes
+ count = var.oci_volumes_enable_extra == "true" ? 0 : local.kdevops_num_boxes
compartment_id = var.oci_compartment_ocid
@@ -38,7 +38,7 @@ resource "oci_core_volume" "kdevops_data_disk" {
}
resource "oci_core_volume" "kdevops_sparse_disk" {
- count = local.kdevops_num_boxes
+ count = var.oci_volumes_enable_extra == "true" ? 0 : local.kdevops_num_boxes
compartment_id = var.oci_compartment_ocid
@@ -48,7 +48,7 @@ resource "oci_core_volume" "kdevops_sparse_disk" {
}
resource "oci_core_volume_attachment" "kdevops_data_volume_attachment" {
- count = local.kdevops_num_boxes
+ count = var.oci_volumes_enable_extra == "true" ? 0 : local.kdevops_num_boxes
attachment_type = "paravirtualized"
instance_id = element(oci_core_instance.kdevops_instance.*.id, count.index)
@@ -58,7 +58,7 @@ resource "oci_core_volume_attachment" "kdevops_data_volume_attachment" {
}
resource "oci_core_volume_attachment" "kdevops_sparse_disk_attachment" {
- count = local.kdevops_num_boxes
+ count = var.oci_volumes_enable_extra == "true" ? 0 : local.kdevops_num_boxes
attachment_type = "paravirtualized"
instance_id = element(oci_core_instance.kdevops_instance.*.id, count.index)
@@ -66,3 +66,18 @@ resource "oci_core_volume_attachment" "kdevops_sparse_disk_attachment" {
device = var.oci_sparse_volume_device_file_name
}
+
+resource "oci_core_volume" "kdevops_volume_extra" {
+ count = var.oci_volumes_enable_extra == "false" ? 0 : local.kdevops_num_boxes * var.oci_volumes_per_instance
+ availability_domain = var.oci_availablity_domain
+ display_name = format("kdevops_volume-%02d", count.index + 1)
+ compartment_id = var.oci_compartment_ocid
+ size_in_gbs = var.oci_volumes_size
+}
+
+resource "oci_core_volume_attachment" "kdevops_volume_extra_att" {
+ count = var.oci_volumes_enable_extra == "false" ? 0 : local.kdevops_num_boxes * var.oci_volumes_per_instance
+ attachment_type = "paravirtualized"
+ instance_id = element(oci_core_instance.kdevops_instance.*.id, count.index)
+ volume_id = element(oci_core_volume.kdevops_volume_extra.*.id, count.index)
+}
diff --git a/terraform/oci/vars.tf b/terraform/oci/vars.tf
index b02e79c597ec..5642bd7d5f63 100644
--- a/terraform/oci/vars.tf
+++ b/terraform/oci/vars.tf
@@ -70,6 +70,23 @@ variable "oci_subnet_ocid" {
default = ""
}
+variable "oci_volumes_enable_extra" {
+ description = "Create additional block volumes per instance"
+ default = false
+}
+
+variable "oci_volumes_per_instance" {
+ description = "The count of additional block volumes per instance"
+ type = number
+ default = null
+}
+
+variable "oci_volumes_size" {
+ description = "The size of additional block volumes, in gibibytes"
+ type = number
+ default = null
+}
+
variable "oci_data_volume_display_name" {
description = "Display name to use for the data volume"
default = "data"
--
2.48.1
next reply other threads:[~2025-03-05 21:12 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-05 21:12 cel [this message]
2025-03-06 11:06 ` [RFC PATCH] terraform/OCI: Create a set of multiple generic block devices Chandan Babu R
2025-03-06 14:10 ` Chuck Lever
2025-03-10 13:07 ` Chandan Babu R
2025-03-10 13:30 ` Chuck Lever
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=20250305211207.243174-1-cel@kernel.org \
--to=cel@kernel.org \
--cc=chandanbabu@kernel.org \
--cc=chuck.lever@oracle.com \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.