Deploying a PowerFlex cluster using a CSV Topology File

This guide explains how to use CSV file(s) for managing PowerFlex cluster via Terraform’s Cluster Resource.

Example

Note: It is recommended to use 2 separate csv files for cluster node related information and storage pool related information. Refer the following examples for more information. The first row will be treated as header.

cluster_node.csv

IPs,Username,Password,Operating System,Is MDM/TB,Is SDS,SDS Storage Device List,Is SDC
10.76.60.1,root,Password1,linux,Primary,Yes,/dev/sdb,Yes
10.76.60.2,root,Password1,linux,Secondary,Yes,/dev/sdb,Yes
10.76.60.3,root,Password1,linux,TB,Yes,/dev/sdb,Yes
10.76.60.4,root,Password1,linux,,Yes,/dev/sdb,Yes

sp_data.csv

ProtectionDomain,StoragePool,Media Type,Replication journal capacity percentage
domain_1,pool1,HDD,50

To perform SDC operations with a CSV file, use the following configuration:


locals {
  cluster_node_data = csvdecode(file("cluster_node.csv"))
  sp_data = csvdecode(file("sp_data.csv"))
}

resource "powerflex_cluster" "test" {
  # Security Related Fields
  mdm_password = "Password"
  lia_password = "Password"

  # Advance Security Configuration
  allow_non_secure_communication_with_lia = false
  allow_non_secure_communication_with_mdm = false
  disable_non_mgmt_components_auth = false

  # Cluster Configuration related fields
  cluster = [
    for row in local.cluster_node_data : {
      ips                  = row.IPs
      username             = row.Username
      password             = row.Password
      operating_system     = row["Operating System"]
      is_mdm_or_tb         = row["Is MDM/TB"]
      is_sds               = row["Is SDS"]
      sdc_name             = row["SDS Name"]
      perf_profile_for_sdc = row.perfProfileForSDC
      is_rfcache           = row["RFcache"]
      is_sdr               = row["Is SDR"]
    }
    if row["Is MDM/TB"] != "" # Validates if MDM role is not empty string
  ]

  storage_pools = [
    for row in local.sp_data : {
      media_type                              = row["Media Type"]
      protection_domain                       = row.ProtectionDomain
      storage_pool                            = row.StoragePool
      replication_journal_capacity_percentage = tonumber(row["Replication journal capacity percentage"])
    }
  ]
}

This Terraform configuration sets up a PowerFlex cluster by defining its configuration, including security settings, node information, and storage pool details. The data for this configuration is read from two CSV files using the csvdecode function and organized into the required format for the resource.

Proposed: Two Terraform local variables are getting declared here (cluster_node_data and sp_data) by using Terraform’s built-in ‘csvdecode’ function.

locals: The scope of the variable is within the configuration file. These variables are used to store data or perform calculations within this configuration.

cluster_node_data: Reads and decodes the CSV file “cluster_node.csv” into a list of maps. This file contains information about cluster nodes.

sp_data: Reads and decodes the CSV file “sp_data.csv” into a list of maps. This file contains information about storage pools.

cluster: A list variable which is getting created using a for loop which iterates over each element in the ‘cluster_node_data’ (local list variable).

storage_pools: A list variable which is getting created using a for loop which iterates over each element in the ‘sp_data’ (local list variable defined earlier).

The fields inside the object (e.g., ip, password, operating_system, etc.) are populated with values from the CSV file. You can also apply some conditions in the if statement to filter out rows where IPs and Password are not empty and not equal to “null.”