Welcome!
I have been creating a few PowerShell scripts for use with the HDS AMS 2000 array. One thing I found I needed was a quick way to look at DP(Dynamic Provisioning) pools, raid groups, and LUNs. I also wanted to be able to see the associations and filter easily. Since I am working on a new deployment I have been creating Raid Groups and Luns often. I needed a quick way to see what I currently had while creating new resources.
I created a PowerShell script that would quickly show existing resources by raid group or DP pool. It also uses nickname info for the devices that are maintained in three csv files(LU_Nicknames.csv,RG_Nicknames.csv,DP_Nicknames.csv). These are simple comma delimited text files which contain the ID and nickname of each resource. The files are updated as storage resources are added. This allows me to easily identify the resources and to filter for specific devices.
The script executes three HSNM2 CLI commands and reads the information into object form. The LUN information is then shown grouped by raid group or DP pool.
Here is the output with the nickname search parameter set to “DB”. This will return all database resources based on the naming standard. If this is left null it will return all resources.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
PS D:DToolsScriptsPSHDS-SNM2> D:DToolsScriptsPSHDS-SNM2get-LunsByDPRG.ps1 Nickname Search: DB -- DP Pool Number: 0 Nickname: DB_SQL_OLTP Raid Level: 5( 5D+1P) Type: SAS Capacity: 1986.0 GB Used: 734.0 GB ---------------------------------------------------------------- lu nickname capacity stripesize status -- -------- -------- ---------- ------ 3 DB01_OLTP_DATA 300.0 256 Normal 20 DB01_OLTP_DATA 300.0 256 Normal 22 DB01_OLTP_DATA 300.0 256 Normal 29 DB01_DSS_DATA_TEMP 600.0 256 Normal -- RAID GROUP Number: 4 Nickname: DB_LOG Raid Level: 1+0( 2D+2D) Type: SAS Capacity: 535.7 GB Free: 0.0 GB ------------------------------------------------------------------- lu nickname capacity stripesize status -- -------- -------- ---------- ------ 5 DB01_OLTP_LOG 267.0 64 Normal 21 DB01_OLTP_LOG 268.7 64 Normal -- RAID GROUP Number: 7 Nickname: DB_OS Raid Level: 5( 3D+1P) Type: SAS Capacity: 398.4 GB Free: 183.4 GB -------------------------------------------------------------------- lu nickname capacity stripesize status -- -------- -------- ---------- ------ 9 DB01_OS_DATA 215.0 256 Normal -- RAID GROUP Number: 8 Nickname: DB_LOG Raid Level: 1+0( 2D+2D) Type: SAS Capacity: 535.7 GB Free: 535.7 GB ----------------------------------------------------------------- |
Here is the script:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 |
# -- Setup login info and SNM2 environment ------------------ . ./start-session.ps1 Set-Location $env:STONAVM_HOME # -- Import Nickname tables --------------------------------------- $LUNicknames = Import-Csv $SCRIPTHOMELU_Nicknames.csv $RGNicknames = Import-Csv $SCRIPTHOMERG_Nicknames.csv $DPNicknames = Import-Csv $SCRIPTHOMEDP_Nicknames.csv # -- Get storage resource info ----------------------------------- $luresults = & ./auluref.exe -unit $DEFAULTARRAY -g -nosublu -totalsize $rgresults = & ./aurgref.exe -unit $DEFAULTARRAY -g $dpresults = & ./audppool.exe -unit $DEFAULTARRAY -refer -g # -- Setup object collections ----------------------------------- $allrgdata = @() $allludata = @() $alldpdata = @() # -- Get LUN data ----------------------------------------------------------- foreach($luresult in $luresults){ if ($luresult -match 'LUs+Capacitys+Sizes+Groups+Pools+Levels+Types+Status'){ $LUDataRead = $TRUE }elseif($LUDataRead){ if($luresult -match '(d+)s+(d+.d+)sGBs+(d+)KBs+(d+|N/A)s+(d+|N/A)s+(([5,6]|1+0)(s+d+D+d+[D,P]))s+(SAS|SATA)s+(.+)'){ $ludata = "" | Select lu,nickname,capacity,stripesize,raidgroup,dppool,raidlevel,type,status $ludata.lu = $matches[1] $Nickname = $LUNicknames | where {$_.LU -eq $ludata.lu} | select nickname $ludata.nickname = $Nickname.nickname $ludata.capacity = $matches[2] $ludata.stripesize = $matches[3] $ludata.raidgroup = $matches[4] $ludata.dppool = $matches[5] $ludata.raidlevel = $matches[6] $ludata.type = $matches[8] $ludata.status = $matches[9] $allludata += $ludata } } } # -- Get Raid Group data -------------------------------------------------------- foreach($rgresult in $rgresults){ if ($rgresult -match 'Groups+Levels+Groupss+Types+TotalsCapacitys+FreesCapacitys+Prioritys+Status'){ $RGDataRead = $TRUE }elseif($RGDataRead){ if($rgresult -match '(d+)s+(([5,6]|1+0)(s+d+D+d+[D,P]))s+(d+)s+(SAS|SATA)s+(d+.d+)sGBs+(d+.d+)sGBs(s*d+.{1}d+%{1})s+(.+s.+)s+(.+)'){ $rgdata = "" | Select rg,nickname,raidlevel,raidconfig,paritygroups,type,totalcapacity,freecapacity,priority,status $rgdata.rg = $matches[1] $Nickname = $RGNicknames | where {$_.RG -eq $rgdata.rg} | select nickname $rgdata.nickname = $Nickname.nickname $rgdata.raidlevel = $matches[2] $rgdata.raidconfig = $matches[3] $rgdata.paritygroups = $matches[4] $rgdata.type = $matches[5] $rgdata.totalcapacity = $matches[6] $rgdata.freecapacity = $matches[7] $rgdata.priority = $matches[8] $rgdata.status = $matches[9] $allrgdata += $rgdata } } } # -- Get DP pool data ------------------------------------------------------------- foreach($dpresult in $dpresults){ if ($dpresult -match 'Pools+Levels+TotalsCapacitys+ConsumedsCapacitys+Types+Status'){ $DPDataRead = $TRUE }elseif($DPDataRead){ if($dpresult -match '(d+)s+(([5,6]|1+0)(s+d+D+d+[D,P]))s+(d+.d+)sGBs+(d+.d+)sGBs+(SAS|SATA)s+(.+)'){ $dpdata = "" | Select dp,nickname,raidlevel,totalcapacity,capacityused,type,status $dpdata.dp = $matches[1] $Nickname = $DPNicknames | where {$_.DP -eq $dpdata.dp} | select nickname $dpdata.nickname = $Nickname.nickname $dpdata.raidlevel = $matches[2] $dpdata.totalcapacity = $matches[4] $dpdata.capacityused = $matches[5] $dpdata.type = $matches[6] $dpdata.status = $matches[7] $alldpdata += $dpdata } } } # -- Get search string ----------------------------- $searchstring = Read-Host "Nickname Search" # -- Display LUN's by DP pool -------------------------------------------------------------- foreach($dppool in $alldpdata){ $dpnum = $dppool.dp $dpcapacity = $dppool.totalcapacity $dpused = $dppool.capacityused $dpnickname = $dppool.nickname $dplevel = $dppool.raidlevel $dptype = $dppool.type if($dpnickname -like "*$searchstring*"){ $message = "-- DP Pool Number: $dpnum Nickname: $dpnickname Raid Level: $dplevel Type: $dptype Capacity: $dpcapacity GB Used: $dpused GB -" $charadd = (180 - $message.length) for($x=1;$x -le $charadd;$x++){$message += "-"} Write-Host "" Write-Host $message Write-Host "" } if($searchstring){ $allludata | where {(($_.nickname -like "*$searchstring*") -and ($_.dppool -eq $dpnum))} | FT -property lu,nickname,capacity,stripesize,status } else { $allludata | where {$_.dppool -eq $dpnum} | FT -property lu,nickname,capacity,stripesize,status } } # -- Display LUN"s by raid group ------------------------------------------------- foreach($rgroup in $allrgdata){ $rgnum = $rgroup.rg $rgcapacity = $rgroup.totalcapacity $rgfree = $rgroup.freecapacity $rgnickname = $rgroup.nickname $rglevel = $rgroup.raidlevel $rgtype = $rgroup.type if($rgnickname -like "*$searchstring*"){ $message = "-- RAID GROUP Number: $rgnum Nickname: $rgnickname Raid Level: $rglevel Type: $rgtype Capacity: $rgcapacity GB Free: $rgfree GB -" $charadd = (180 - $message.length) for($x=1;$x -le $charadd;$x++){$message += "-"} Write-Host "" Write-Host $message Write-Host "" } if($searchstring){ $allludata | where {(($_.nickname -like "*$searchstring*") -and ($_.raidgroup -eq $rgnum))} | FT -property lu,nickname,capacity,stripesize,status } else { $allludata | where {$_.raidgroup -eq $rgnum} | FT -property lu,nickname,capacity,stripesize,status } } # -- CD back to script directory and set window title --------------------- Set-Location $SCRIPTHOME $Host.UI.RawUI.WindowTitle = "DP-RG-LU Info" |
The script uses the start-session.ps1 file to establish connectivity with the HDS array. Additional information regarding the use of this include file can be found at this post. Then the script executes HSNM2 CLI commands to return information on DP pools raid groups and LUNS. The script uses regular expressions to parse the output and convert it into objects. It also reads in the nickname files and adds the data to the custom objects.
The objects are then output using the built-in PowerShell formating engine with a little custom formating thrown in for the group headers.
Here is an example nickname file:
1 2 3 4 5 6 7 |
RG,Nickname 0,MG_OS 1,AP_OS 2,DT_OS 3,DB_SQL_OLTP 7,DB_OS 8,DB_LOG |
I suppose this may not be necessary with the use of Device Manager, but I am still learning it and I could not quite get this view with it. Besides I am more of a scripting kind of guy. I also really like the output of this script as it gives me just the view of the array I need when I am allocating new storage and setting up new resources. I use this script in conjuction with two other scripts for creating LUN’s and raid groups. I plan to post those scripts soon.
Hope this helps,
Dave