From d63c8fcb22adc3ee6665b6f8382c69377fecc16c Mon Sep 17 00:00:00 2001 From: Claudia Watson Date: Mon, 13 Jul 2026 16:54:53 +0100 Subject: [PATCH 1/7] add sharetype and sharetype_access resource support --- manila.tf | 23 +++++++++++++++++ variables.tf | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+) diff --git a/manila.tf b/manila.tf index 5058b7f..7de087c 100644 --- a/manila.tf +++ b/manila.tf @@ -12,4 +12,27 @@ resource "openstack_sharedfilesystem_share_v2" "shares" { metadata = lookup(each.value, "metadata", null) share_network_id = lookup(each.value, "share_network_id", null) availability_zone = lookup(each.value, "availability_zone", null) +} + +resource "openstack_sharedfilesystem_sharetype_v2" "sharetypes" { + for_each = var.sharetypes + + name = each.key + + description = lookup(each.value, "description", null) + is_public = lookup(each.value, "is_public", true) + + extra_specs = { + driver_handles_share_servers = each.value.extra_specs.driver_handles_share_servers + snapshot_support = lookup(each.value.extra_specs, "snapshot_support", null) + share_backend_name = each.value.extra_specs.share_backend_name + "vast:vippoolname" = vastdata_vip_pool.vippools[each.value.extra_specs.vippoolname].name + } +} + +resource "openstack_sharedfilesystem_sharetype_access_v2" "sharetypes_access" { + for_each = var.sharetypes_access + + share_type_id = each.value.sharetype_name != null ? openstack_sharedfilesystem_sharetype_v2.sharetypes[each.value.sharetype_name].id : each.value.share_type_id + project_id = each.value.project != null ? openstack_identity_project_v3.project[each.value.project].id : each.value.project_id } \ No newline at end of file diff --git a/variables.tf b/variables.tf index a115cba..24a4663 100644 --- a/variables.tf +++ b/variables.tf @@ -356,6 +356,77 @@ variable "shares"{ default = {} } +variable "sharetypes" { + description = <<-EOT + Mapping of sharetype definitions. Key is sharetype name. Values are mappings with keys/values: + description: Optional string + is_public: Optional bool, default true + extra_specs: Required list + driver_handles_share_servers: Required bool + snapshot_support: Optional bool + share_backend_name: Required string + vippoolname: Required string, tofu resource vippool name + EOT + + type = map( + object({ + description = optional(string) + is_public = optional(bool, true) + + extra_specs = optional( + object({ + driver_handles_share_servers = bool + snapshot_support = optional(bool, null) + share_backend_name = string + vippoolname = string + }) + ) + }) + ) + default = {} +} + +variable "sharetypes_access" { + description = <<-EOT + Mappings of sharetype access definitions. Key is tofu sharetype access resource name. Values are mappings with keys/values: + sharetype_name: Optional string, tofu sharetype resource name, overrides share_type_id + share_type_id: Optional string, overridden by sharetype_name + project: Optional string, tofu project resource name + project_id: Optional string + type = map( + object({ + sharetype_name = optional(string) + share_type_id = optional(string) + project = optional(string) + project_id = optional(string) + }) + ) + default = {} +} + +variable "vippools" { + type = map( + object({ + + name = optional(string) + network = optional(string) + vlan = optional(number) + role = optional(string) + subnet_cidr = optional(number) + tenant_id = optional(string) + project = optional(string) + # may need renaming + vip_ranges = optional(list(object({ + subnet = string + start = number + end = number + })), []) + ip_ranges = optional(list(list(string)), []) + }) + ) + default = {} +} + # TODO: more outputs? output "projects" { #value = {for k, v in openstack_identity_project_v3.project: k => v.id} From 44b308b3df9dad1d61655919d47408cdc2f6e853 Mon Sep 17 00:00:00 2001 From: Claudia Watson Date: Tue, 21 Jul 2026 11:56:30 +0100 Subject: [PATCH 2/7] Add vast resource support --- manila.tf | 2 +- provider.tf | 16 +++++++++++++++ variables.tf | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++- vast.tf | 31 ++++++++++++++++++++++++++++ 4 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 provider.tf create mode 100644 vast.tf diff --git a/manila.tf b/manila.tf index 7de087c..69f39d1 100644 --- a/manila.tf +++ b/manila.tf @@ -35,4 +35,4 @@ resource "openstack_sharedfilesystem_sharetype_access_v2" "sharetypes_access" { share_type_id = each.value.sharetype_name != null ? openstack_sharedfilesystem_sharetype_v2.sharetypes[each.value.sharetype_name].id : each.value.share_type_id project_id = each.value.project != null ? openstack_identity_project_v3.project[each.value.project].id : each.value.project_id -} \ No newline at end of file +} diff --git a/provider.tf b/provider.tf new file mode 100644 index 0000000..6e91507 --- /dev/null +++ b/provider.tf @@ -0,0 +1,16 @@ +terraform { + required_providers { + vastdata = { + source = "vast-data/vastdata" + version = "2.1.1" + } + } +} + +provider "vastdata" { + username = var.username + port = 443 + password = var.password + host = var.vast_host + skip_ssl_verify = true +} diff --git a/variables.tf b/variables.tf index 24a4663..f72b4ff 100644 --- a/variables.tf +++ b/variables.tf @@ -393,6 +393,7 @@ variable "sharetypes_access" { share_type_id: Optional string, overridden by sharetype_name project: Optional string, tofu project resource name project_id: Optional string + EOT type = map( object({ sharetype_name = optional(string) @@ -405,9 +406,23 @@ variable "sharetypes_access" { } variable "vippools" { + description = <<-EOT + Map of vippools. Key is tofu resource name. Values are mappings with keys/values: + name: Optional string, if not provided network is used to template name of format "openstack_vlan_" + network: Optional string, tofu network resource name, used to template name and vlan if provided (using segmentation_id) + vlan: Optional number + role: Optional string + subnet_cidr: Optional number + tenant_id: Optional string, overridden by project + project: Optional string, openstack project name, overrides tenant_id + vip_ranges: Optional list. Elements are maps with keys/values. + subnet: Required string, tofu subnet resource name + start: Required number + end: Required number + ip_ranges: Optional list. Elements are maps with keys/values. + EOT type = map( object({ - name = optional(string) network = optional(string) vlan = optional(number) @@ -427,6 +442,47 @@ variable "vippools" { default = {} } +variable "vast_tenants" { + description = <<-EOT + Map of vast tenants. Key is tofu resource name. Values are mappings with keys/values: + allow_locked_users: Optional bool + allow_disabled_users: Optional bool + client_ranges: Optional list, overridden by client_ip_ranges + subnet: Required string, tofu subnet resource name + start: Required number + end: Required number + client_ip_ranges: Optional list, overrides client_ip_ranges + EOT + type = map( + object({ + allow_locked_users = optional(bool, null) + allow_disabled_users = optional(bool, null) + # may need renaming + client_ranges = optional(list(object({ + subnet = string + start = number + end = number + })), []) + client_ip_ranges = optional(list(list(string)), []) + }) + ) + default = {} +} + + +variable "password" { + sensitive = true +} + +variable "vast_host" { + default = "10.3.2.10" +} + +variable "username" { + default = "openstack-manila" +} + + # TODO: more outputs? output "projects" { #value = {for k, v in openstack_identity_project_v3.project: k => v.id} diff --git a/vast.tf b/vast.tf new file mode 100644 index 0000000..38e8a9e --- /dev/null +++ b/vast.tf @@ -0,0 +1,31 @@ +resource "vastdata_vip_pool" "vippools" { + for_each = var.vippools + + name = each.value.name != null ? (each.value.name) : (each.value.network != null ? format("openstack_vlan_%04d", + one(openstack_networking_network_v2.networks[each.value.network].segments).segmentation_id) + : each.key) + vlan = each.value.vlan != null ? (each.value.vlan) : one(openstack_networking_network_v2.networks[each.value.network].segments).segmentation_id + role = lookup(each.value, "role", null) + subnet_cidr = lookup(each.value, "subnet_cidr", null) + tenant_id = (each.value.project != null ? openstack_identity_project_v3.project[each.value.project].id : each.value.tenant_id) + ip_ranges = each.value.ip_ranges != null ? (each.value.ip_ranges) : [ + for r in each.value.vip_ranges : [ + cidrhost(openstack_networking_subnet_v2.subnets[r.subnet].cidr, r.start), + cidrhost(openstack_networking_subnet_v2.subnets[r.subnet].cidr, r.end) + ] + ] +} + +resource "vastdata_tenant" "vast_tenant" { + for_each = var.vast_tenants + + name = each.key + allow_locked_users = lookup(each.value, "allow_locked_users", null) + allow_disabled_users = lookup(each.value, "allow_disabled_users", null) + client_ip_ranges = each.value.client_ip_ranges != null ? (each.value.client_ip_ranges) : [ + for p in each.value.client_ranges : [ + cidr(openstack_networking_subnet_v2.subnets[p.subnet].cidr, p.start), + cidr(openstack_networking_subnet_v2.subnets[p.subnet].cidr, p.end) + ] + ] +} From b466bea8634387452b3a1db54694efc9a3df9a20 Mon Sep 17 00:00:00 2001 From: Claudia Watson Date: Wed, 22 Jul 2026 16:13:54 +0100 Subject: [PATCH 3/7] Fix vippools resource errors --- variables.tf | 6 +++--- vast.tf | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/variables.tf b/variables.tf index f72b4ff..190a31d 100644 --- a/variables.tf +++ b/variables.tf @@ -414,7 +414,7 @@ variable "vippools" { role: Optional string subnet_cidr: Optional number tenant_id: Optional string, overridden by project - project: Optional string, openstack project name, overrides tenant_id + vast_tenant: Optional string, vast tenant name, overrides tenant_id vip_ranges: Optional list. Elements are maps with keys/values. subnet: Required string, tofu subnet resource name start: Required number @@ -429,14 +429,14 @@ variable "vippools" { role = optional(string) subnet_cidr = optional(number) tenant_id = optional(string) - project = optional(string) + vast_tenant = optional(string) # may need renaming vip_ranges = optional(list(object({ subnet = string start = number end = number })), []) - ip_ranges = optional(list(list(string)), []) + ip_ranges = optional(list(list(string)), null) }) ) default = {} diff --git a/vast.tf b/vast.tf index 38e8a9e..cc4b995 100644 --- a/vast.tf +++ b/vast.tf @@ -7,7 +7,7 @@ resource "vastdata_vip_pool" "vippools" { vlan = each.value.vlan != null ? (each.value.vlan) : one(openstack_networking_network_v2.networks[each.value.network].segments).segmentation_id role = lookup(each.value, "role", null) subnet_cidr = lookup(each.value, "subnet_cidr", null) - tenant_id = (each.value.project != null ? openstack_identity_project_v3.project[each.value.project].id : each.value.tenant_id) + tenant_id = (each.value.vast_tenant != null ? vastdata_tenant.vast_tenant[each.value.vast_tenant].id : each.value.tenant_id) ip_ranges = each.value.ip_ranges != null ? (each.value.ip_ranges) : [ for r in each.value.vip_ranges : [ cidrhost(openstack_networking_subnet_v2.subnets[r.subnet].cidr, r.start), From 5cb17c194f3e31f0e9674c4830c8b90d23e36bc0 Mon Sep 17 00:00:00 2001 From: Claudia Watson Date: Fri, 24 Jul 2026 15:22:04 +0100 Subject: [PATCH 4/7] fix variable descriptions --- variables.tf | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/variables.tf b/variables.tf index 190a31d..74e9e61 100644 --- a/variables.tf +++ b/variables.tf @@ -130,14 +130,14 @@ variable "networks" { mtu: Optional number port_security_enabled: Optional bool, default false tags: Optional list - segments: Optional list of maps. Keys are unique tofu resource names. Elements are maps with keys/values - + segments: Optional list of objects - physical_network: Optional string network_type: Optional string segmentation_id: Optional number subnets: Optional map - key: Required string, tofu resource name - name: Require string, openstack name + name: Required string, openstack name region: Optional string cidr: Optional string ip_version: Optional number, default 4 @@ -146,8 +146,13 @@ variable "networks" { dns_nameservers: Optional list dns_publish_fixed_ip: Optional bool, default false service_types: Optional list + subnetpool_id: Optional string + prefix_length: Optional number no_gateway: Optional bool tags: Optional list + allocation_pool: Optional list of objects - + start: Required string + end: Required string EOT type = map( object({ @@ -413,13 +418,13 @@ variable "vippools" { vlan: Optional number role: Optional string subnet_cidr: Optional number - tenant_id: Optional string, overridden by project + tenant_id: Optional string, overridden by vast_tenant vast_tenant: Optional string, vast tenant name, overrides tenant_id - vip_ranges: Optional list. Elements are maps with keys/values. + vip_ranges: Optional list of objects - subnet: Required string, tofu subnet resource name start: Required number end: Required number - ip_ranges: Optional list. Elements are maps with keys/values. + ip_ranges: Optional list of strings. EOT type = map( object({ @@ -447,7 +452,7 @@ variable "vast_tenants" { Map of vast tenants. Key is tofu resource name. Values are mappings with keys/values: allow_locked_users: Optional bool allow_disabled_users: Optional bool - client_ranges: Optional list, overridden by client_ip_ranges + client_ranges: Optional list of objects, overridden by client_ip_ranges subnet: Required string, tofu subnet resource name start: Required number end: Required number From 0732c186c068bd0fa7b762d07aee7ea8c68ba1bb Mon Sep 17 00:00:00 2001 From: Claudia Watson Date: Wed, 29 Jul 2026 11:52:57 +0100 Subject: [PATCH 5/7] Fix variable names, add variable vast_info for provider to be optional --- manila.tf | 18 +----------------- provider.tf | 8 ++++---- variables.tf | 47 ++++++++++++----------------------------------- 3 files changed, 17 insertions(+), 56 deletions(-) diff --git a/manila.tf b/manila.tf index 69f39d1..991593e 100644 --- a/manila.tf +++ b/manila.tf @@ -1,19 +1,3 @@ -resource "openstack_sharedfilesystem_share_v2" "shares" { - for_each = var.shares - - name = each.key - share_proto = each.value.share_proto - size = each.value.size - region = lookup(each.value, "region", null) - description = lookup(each.value, "description", null) - share_type = lookup(each.value, "share_type", null) - snapshot_id = lookup(each.value, "snapshot_id", null) - is_public = lookup(each.value, "is_public", false) - metadata = lookup(each.value, "metadata", null) - share_network_id = lookup(each.value, "share_network_id", null) - availability_zone = lookup(each.value, "availability_zone", null) -} - resource "openstack_sharedfilesystem_sharetype_v2" "sharetypes" { for_each = var.sharetypes @@ -26,7 +10,7 @@ resource "openstack_sharedfilesystem_sharetype_v2" "sharetypes" { driver_handles_share_servers = each.value.extra_specs.driver_handles_share_servers snapshot_support = lookup(each.value.extra_specs, "snapshot_support", null) share_backend_name = each.value.extra_specs.share_backend_name - "vast:vippoolname" = vastdata_vip_pool.vippools[each.value.extra_specs.vippoolname].name + "vast:vippoolname" = vastdata_vip_pool.vippools[each.value.extra_specs.vast_vip_pool_name].name } } diff --git a/provider.tf b/provider.tf index 6e91507..c3f4e4f 100644 --- a/provider.tf +++ b/provider.tf @@ -8,9 +8,9 @@ terraform { } provider "vastdata" { - username = var.username - port = 443 - password = var.password - host = var.vast_host + username = try(var.vast_info.username, null) + port = try(var.vast_info.port, 443) + password = try(var.vast_info.password) + host = try(var.vast_info.host, null) skip_ssl_verify = true } diff --git a/variables.tf b/variables.tf index 74e9e61..ffd1349 100644 --- a/variables.tf +++ b/variables.tf @@ -342,37 +342,17 @@ variable "images"{ default = {} } -variable "shares"{ - - type = map( - object({ - share_proto = string - size = number - region = optional(string) - description = optional(string) - share_type = optional(string) - snapshot_id = optional(string) - is_public = optional(bool, false) - metadata = optional(string) - share_network_id = optional(string) - availability_zone = optional(string) - }) - ) - default = {} -} - variable "sharetypes" { description = <<-EOT Mapping of sharetype definitions. Key is sharetype name. Values are mappings with keys/values: description: Optional string is_public: Optional bool, default true - extra_specs: Required list + extra_specs: Required map driver_handles_share_servers: Required bool snapshot_support: Optional bool share_backend_name: Required string - vippoolname: Required string, tofu resource vippool name + vast_vip_pool_name: Required string, tofu resource vippool name EOT - type = map( object({ description = optional(string) @@ -383,7 +363,7 @@ variable "sharetypes" { driver_handles_share_servers = bool snapshot_support = optional(bool, null) share_backend_name = string - vippoolname = string + vast_vip_pool_name = string }) ) }) @@ -474,20 +454,17 @@ variable "vast_tenants" { default = {} } - -variable "password" { - sensitive = true -} - -variable "vast_host" { - default = "10.3.2.10" -} - -variable "username" { - default = "openstack-manila" +variable "vast_info" { + type = object { + username = optional(string) + password = optional(string) + host = optional(string) + port = optional(number) + } + default = null + sensitve = true } - # TODO: more outputs? output "projects" { #value = {for k, v in openstack_identity_project_v3.project: k => v.id} From 9fa48bb925b2019032cc5344828d64e6a231d186 Mon Sep 17 00:00:00 2001 From: Claudia Watson Date: Wed, 29 Jul 2026 15:04:18 +0100 Subject: [PATCH 6/7] add vast_info variable description --- variables.tf | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/variables.tf b/variables.tf index ffd1349..4172a80 100644 --- a/variables.tf +++ b/variables.tf @@ -455,6 +455,13 @@ variable "vast_tenants" { } variable "vast_info" { + description = <<-EOT + Object for vast information. + username: optional string + password: optional string + host : optional string + port : optional number + EOT type = object { username = optional(string) password = optional(string) From 6b40aa2c438d1ddf24b7209116af2beb91864afd Mon Sep 17 00:00:00 2001 From: Claudia Watson Date: Thu, 30 Jul 2026 09:17:30 +0100 Subject: [PATCH 7/7] Remove vast provider config --- provider.tf | 16 ---------------- variables.tf | 18 ------------------ 2 files changed, 34 deletions(-) delete mode 100644 provider.tf diff --git a/provider.tf b/provider.tf deleted file mode 100644 index c3f4e4f..0000000 --- a/provider.tf +++ /dev/null @@ -1,16 +0,0 @@ -terraform { - required_providers { - vastdata = { - source = "vast-data/vastdata" - version = "2.1.1" - } - } -} - -provider "vastdata" { - username = try(var.vast_info.username, null) - port = try(var.vast_info.port, 443) - password = try(var.vast_info.password) - host = try(var.vast_info.host, null) - skip_ssl_verify = true -} diff --git a/variables.tf b/variables.tf index 4172a80..1e5753c 100644 --- a/variables.tf +++ b/variables.tf @@ -454,24 +454,6 @@ variable "vast_tenants" { default = {} } -variable "vast_info" { - description = <<-EOT - Object for vast information. - username: optional string - password: optional string - host : optional string - port : optional number - EOT - type = object { - username = optional(string) - password = optional(string) - host = optional(string) - port = optional(number) - } - default = null - sensitve = true -} - # TODO: more outputs? output "projects" { #value = {for k, v in openstack_identity_project_v3.project: k => v.id}