diff --git a/manila.tf b/manila.tf new file mode 100644 index 0000000..991593e --- /dev/null +++ b/manila.tf @@ -0,0 +1,22 @@ +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.vast_vip_pool_name].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 +} diff --git a/variables.tf b/variables.tf index 06100e7..1e5753c 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({ @@ -337,6 +342,118 @@ variable "images"{ 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 map + driver_handles_share_servers: Required bool + snapshot_support: Optional bool + share_backend_name: Required string + vast_vip_pool_name: 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 + vast_vip_pool_name = 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 + EOT + type = map( + object({ + sharetype_name = optional(string) + share_type_id = optional(string) + project = optional(string) + project_id = optional(string) + }) + ) + default = {} +} + +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 vast_tenant + vast_tenant: Optional string, vast tenant name, overrides tenant_id + vip_ranges: Optional list of objects - + subnet: Required string, tofu subnet resource name + start: Required number + end: Required number + ip_ranges: Optional list of strings. + EOT + type = map( + object({ + name = optional(string) + network = optional(string) + vlan = optional(number) + role = optional(string) + subnet_cidr = optional(number) + tenant_id = 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)), null) + }) + ) + 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 of objects, 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 = {} +} + # 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..cc4b995 --- /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.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), + 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) + ] + ] +}