Tuesday, October 29, 2013

Using Powershell to Create / Clone vCenter folders from Old vCenter to New...vCenter 5.1 migrations part 4

Wow, ok so yeah I have been lazy lately. This work stuff keeps getting in my way. We left off a couple months ago with the export/import of clusters. When we actually executed this in production the export and import tasks were separated because additional steps are needed prior to the import/creation of the clusters, but to keep within the topic I thought it best to post them together last time.
This post is one of those that would need to be done prior to the creation of clusters. As the title indicates we will be creating all of the folder objects in this post. The concept behind the folders is pretty simple, we just need to understand that there are 4 different folder types:
1. Network
2. HostAndCluster
3. Datastore
4. VM
Let's jump right in...

param(
 [string] $SourceVIserver = $(Read-Host -prompt "Source vCenter?"),
 [string] $DestinationVIserver = $(Read-Host -prompt "Destination vCenter?")
 )
$svc=connect-viserver $SourceVIserver
$dvc=connect-viserver $DestinationVIserver

$folderpaths = @()
$excludedNames = "Datacenters","vm","host","Datastore","Network"
$folders = get-folder -server $svc|?{$excludednames -notcontains $_.name}
foreach ($folder in $folders)
{
 $output = ""|select name, path, type
 $output.name = $folder.name
 $output.type = $folder.type
 $path = $folder.name
 $fld = $folder.extensiondata
 while ($fld.parent)
 {
  $fld = get-view $fld.parent -server $svc
  if ($excludedNames -notcontains $fld.name){$path = $fld.name + "\" + $path}
 }
 $output.path = $path
 $folderpaths += $output
}

$folderpaths = $folderpaths|sort path
foreach ($folderpath in $folderpaths)
{
 switch ($folderpath.type)
 {
  "Network" {$parent = get-folder -server $dvc -name "Network"}
  "HostAndCluster" {$parent = get-folder -server $dvc -name "Host"}
  "Datastore" {$parent = get-folder -server $dvc -name "Datastore"}
  "VM" {$parent = get-folder -server $dvc -name "vm"}
 }
 $fullpath = ($folderpath.path.split("\"))
 $depth = $fullpath.count
 for ($i = 1; $i -lt $depth; $i++)
 {
  if ($depth - $i -eq 1){new-folder -location $parent -name $folderpath.name}
  else{$parent = get-folder -location $parent -name $fullpath[$i]}
 }
}

disconnect-viserver * -confirm:$false -force

Breaking this down:
Lines 1-6, source and destination parameters
Lines 8-9, initialize variables
Line 10, get all folders from source vCenter, exclude system parent folders
Lines 11-25, loop through nested folders to create an array object with the full path for each folder
Lines 27-44, Create folders in their proper location
Line 46, disconnect from vCenters