3.File.Storage/Hammerspace/node.data.tf (140 lines of code) (raw):

###################################################################################################### # Hammerspace (https://azuremarketplace.microsoft.com/marketplace/apps/hammerspace.hammerspace-byol) # ###################################################################################################### locals { hsDataNodes = [ for i in range(var.hammerspace.data.machine.count) : merge(var.hammerspace.data, { machine = merge(var.hammerspace.data.machine, { index = i name = "${var.hammerspace.namePrefix}${var.hammerspace.data.machine.namePrefix}${i + 1}" adminLogin = merge(var.hammerspace.data.machine.adminLogin, { userName = var.hammerspace.data.machine.adminLogin.userName != "" ? var.hammerspace.data.machine.adminLogin.userName : data.azurerm_key_vault_secret.admin_username.value userPassword = var.hammerspace.data.machine.adminLogin.userPassword != "" ? var.hammerspace.data.machine.adminLogin.userPassword : data.azurerm_key_vault_secret.admin_password.value sshKeyPublic = var.hammerspace.data.machine.adminLogin.sshKeyPublic != "" ? var.hammerspace.data.machine.adminLogin.sshKeyPublic : data.azurerm_key_vault_secret.ssh_key_public.value }) }) }) ] hsDataNodeDisks = flatten([ for node in local.hsDataNodes : [ for i in range(node.machine.dataDisk.count) : merge(node, { machine = merge(node.machine, { dataDisk = merge(node.machine.dataDisk, { index = i name = "${node.machine.name}-data${i + 1}" }) }) }) ] ]) hsDataNodeConfig = { cluster = { domainname = var.hammerspace.domainName metadata = { ips = [ "${local.hsHighAvailability ? azurerm_lb.metadata[0].frontend_ip_configuration[0].private_ip_address : azurerm_linux_virtual_machine.metadata[local.hsMetadataNodes[0].machine.name].private_ip_address}${local.hsSubnetSize}" ] } } node = { hostname = "" features = [ "portal", "storage" ] storage = { options = var.hammerspace.data.machine.dataDisk.raid0.enable && var.hammerspace.data.machine.dataDisk.count > 1 ? ["raid0"] : [] } add_volumes = true } } } ################################################################################################### # Availability Set (https://learn.microsoft.com/azure/virtual-machines/availability-set-overview) # ################################################################################################### resource azurerm_availability_set data { name = "${var.hammerspace.namePrefix}${var.hammerspace.data.machine.namePrefix}" resource_group_name = azurerm_resource_group.hammerspace.name location = azurerm_resource_group.hammerspace.location proximity_placement_group_id = var.hammerspace.proximityPlacementGroup.enable ? azurerm_proximity_placement_group.hammerspace[0].id : null } ######################################################################### # Virtual Machines (https://learn.microsoft.com/azure/virtual-machines) # ######################################################################### resource azurerm_network_interface data { for_each = { for node in local.hsDataNodes : node.machine.name => node } name = each.value.machine.name resource_group_name = azurerm_resource_group.hammerspace.name location = azurerm_resource_group.hammerspace.location ip_configuration { name = "ipConfig" private_ip_address_allocation = "Dynamic" subnet_id = data.azurerm_subnet.storage.id } accelerated_networking_enabled = each.value.network.acceleration.enable } resource azurerm_linux_virtual_machine data { for_each = { for node in local.hsDataNodes : node.machine.name => node } name = each.value.machine.name resource_group_name = azurerm_resource_group.hammerspace.name location = azurerm_resource_group.hammerspace.location size = each.value.machine.size admin_username = each.value.machine.adminLogin.userName admin_password = each.value.machine.adminLogin.userPassword disable_password_authentication = each.value.machine.adminLogin.passwordAuth.disable availability_set_id = azurerm_availability_set.data.id proximity_placement_group_id = var.hammerspace.proximityPlacementGroup.enable ? azurerm_proximity_placement_group.hammerspace[0].id : null custom_data = base64encode(jsonencode( merge(local.hsDataNodeConfig, { node = merge(local.hsDataNodeConfig.node, { hostname = each.value.machine.name }) }) )) network_interface_ids = [ azurerm_network_interface.data[each.value.machine.name].id ] os_disk { storage_account_type = each.value.machine.osDisk.storageType caching = each.value.machine.osDisk.cachingMode disk_size_gb = each.value.machine.osDisk.sizeGB > 0 ? each.value.machine.osDisk.sizeGB : null } source_image_reference { publisher = local.hsImage.publisher offer = local.hsImage.product sku = local.hsImage.name version = local.hsImage.version } plan { publisher = lower(local.hsImage.publisher) product = lower(local.hsImage.product) name = lower(local.hsImage.name) } dynamic admin_ssh_key { for_each = each.value.machine.adminLogin.sshKeyPublic != "" ? [1] : [] content { username = each.value.machine.adminLogin.userName public_key = each.value.machine.adminLogin.sshKeyPublic } } } resource azurerm_managed_disk data { for_each = { for disk in local.hsDataNodeDisks : disk.machine.dataDisk.name => disk } name = each.value.machine.dataDisk.name resource_group_name = azurerm_resource_group.hammerspace.name location = azurerm_resource_group.hammerspace.location storage_account_type = each.value.machine.dataDisk.storageType disk_size_gb = each.value.machine.dataDisk.sizeGB create_option = "Empty" public_network_access_enabled = false } resource azurerm_virtual_machine_data_disk_attachment data { for_each = { for disk in local.hsDataNodeDisks : disk.machine.dataDisk.name => disk } virtual_machine_id = "${azurerm_resource_group.hammerspace.id}/providers/Microsoft.Compute/virtualMachines/${each.value.machine.name}" managed_disk_id = "${azurerm_resource_group.hammerspace.id}/providers/Microsoft.Compute/disks/${each.value.machine.dataDisk.name}" caching = each.value.machine.dataDisk.cachingMode lun = each.value.machine.dataDisk.index depends_on = [ azurerm_managed_disk.data, azurerm_linux_virtual_machine.data ] }