Public/New-RubrikVMDKMount.ps1

#Requires -Version 3
function New-RubrikVMDKMount
{
  <#
      .SYNOPSIS
      Create a new live mount of a VMDK
      
      .DESCRIPTION
      The New-RubrikVMDKMount cmdlet is used to create a new mount of a specific virtual disk (vmdk) on the TargetVM of the selected Snapshot.
      
      .NOTES
      Written by Pierre Flammer for community usage
      Twitter: @PierreFlammer
      
      .LINK
      https://rubrik.gitbook.io/rubrik-sdk-for-powershell/command-documentation/reference/new-rubrikvmdkmount

      .PARAMETER
      ATTENTION: Names have to match the names configured in Rubrik!!!
      SnapshotID: ID of the Rubrik snaphot of the source VM
      TargetVM: Name of the VM where the VMDK(s) will be mounted
      AllDisks: If this parameter is used all VMDKs will be mounted to the target VM.
                If one has to enter a number and select one VMDK.
      VLAN: Specify the VLAN number

      .EXAMPLE
      New-RubrikVMDKMount -snapshotid 'cc1b363a-a0d4-40b7-9b09-7b8f3a805b27' -TargetVM 'VM2'
      
      New-RubrikVMDKMount -snapshotid 'cc1b363a-a0d4-40b7-9b09-7b8f3a805b27' -TargetVM 'VM2' -AllDisks -VLAN 50
     
  #>


  [CmdletBinding()]
  Param(
    # Snapshot ID containing VMDKs to attach to target VM
    [Parameter(Position = 0,ValueFromPipelineByPropertyName = $true)]
    [ValidateNotNullOrEmpty()]
    [Alias('id')]
    [String]$SnapshotID,
    # Target VM to attach the Live Mount disk(s)
    [Parameter(Mandatory=$true)]
    [ValidateNotNullOrEmpty()]
    [String]$TargetVM,
    # Switch to specitfy whether or not to mount all VMDKs in snapshot
    [parameter(Mandatory=$false)]
    [Switch]$AllDisks,
    # VLAN used by ESXi to mount the datastore
    [parameter(Mandatory=$false)]
    [Int]$VLAN,
    # Rubrik server IP or FQDN
    [String]$Server = $global:RubrikConnection.server,
    # API version
    [String]$api = $global:RubrikConnection.api
  )

  Begin {

    # The Begin section is used to perform one-time loads of data necessary to carry out the function's purpose
    # If a command needs to be run with each iteration or pipeline input, place it in the Process section
    
    # Check to ensure that a session to the Rubrik cluster exists and load the needed header data for authentication
    Test-RubrikConnection
    
    # API data references the name of the function
    # For convenience, that name is saved here to $function
    $function = $MyInvocation.MyCommand.Name
        
    # Retrieve all of the URI, method, body, query, result, filter, and success details for the API endpoint
    Write-Verbose -Message "Gather API Data for $function"
    $resources = Get-RubrikAPIData -endpoint $function
    Write-Verbose -Message "Load API data for $($resources.Function)"
    Write-Verbose -Message "Description: $($resources.Description)"
  
  }

  Process {

    $uri = New-URIString -server $Server -endpoint ($resources.URI) -id $snapshotid
    $uri = Test-QueryParam -querykeys ($resources.Query.Keys) -parameters ((Get-Command $function).Parameters.Values) -uri $uri
        
    $TargetID = Get-RubrikVM -name $TargetVM
    if ($TargetID.count -gt 1) {
        # Found more than one VM with the target name
        "Found multiple VMs with name " + $TargetVM + ". Please select the one to use." | Out-Host
        "--------------------------------" | Out-Host
        $TargetID.id  | ForEach-Object -Begin {$i=0} -Process {"VM $i - $($_)";$i++} | Out-Host
        $selection = Read-Host 'Enter ID of selected VM'
        $TargetID = $TargetID[$selection].id
    } else {
        $TargetID = $TargetID.id
    }

    Write-Verbose -Message "Build the body"

    $body = @{
        $resources.Body.targetVmId = $TargetID
        vmdkIds = @() 
    }

    # Disk configuration
    $snapdiskdetails = Get-RubrikVMSnapshot -id $snapshotid 
    #$snapdiskdetails = Get-RubrikVMSnapshot -id 'cc1b363a-a0d4-40b7-9b09-7b8f3a805b27'
    if ($AllDisks) {
        #Parameter -AllDisks was used -> Mount all VMDKs
        foreach ($disk in $snapdiskdetails.snapshotDiskDetails)
        {
            $body.vmdkIds += $disk.virtualDiskId
        }
    } else {
        #Get List of VMDKs and mount the selected one
        "Please select a VMDK to use:" | Out-Host
        "--------------------------------" | Out-Host
        $snapdiskdetails.snapshotDiskDetails  | ForEach-Object -Begin {$i=0} -Process {"VMDK $i - $($_.filename)";$i++} | Out-Host
        $selection = Read-Host 'Enter ID of selected VMDK'

        $body.vmdkIds += $snapdiskdetails.snapshotDiskDetails[$selection].virtualDiskId
    }

    $body = ConvertTo-Json $body
    Write-Verbose -Message "Body = $body"

    $result = Submit-Request -uri $uri -header $Header -method $($resources.Method) -body $body
    $result = Test-ReturnFormat -api $api -result $result -location $resources.Result
    $result = Test-FilterObject -filter ($resources.Filter) -result $result

    return $result

  } # End of process
} # End of function