Public/New-UnityFileInterface.ps1

Function New-UnityFileInterface {

  <#
      .SYNOPSIS
      Creates a File Interface.
      .DESCRIPTION
      Creates a NAS Server.
      You need to have an active session with the array.
      .NOTES
      Written by Erwan Quelin under MIT licence - https://github.com/equelin/Unity-Powershell/blob/master/LICENSE
      .LINK
      https://github.com/equelin/Unity-Powershell
      .EXAMPLE
      New-UnityFileInterface -Name 'POOL01' -virtualDisk -virtualDisk @{"id"='vdisk_1';"tier"='Performance'},@{"id"='vdisk_2';"tier"='Performance'}
 
      Create pool named 'POOL01' with virtual disks 'vdisk_1' and'vdisk_2'. Virtual disks are assigned to the performance tier. Apply to Unity VSA only.
  #>


  [CmdletBinding()]
  Param (
    [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')]
    $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}),
    [Parameter(Mandatory = $true,Position = 1,HelpMessage = 'ID of the NAS server to which the network interface belongs')]
    $nasServer,
    [Parameter(Mandatory = $true,HelpMessage = 'Physical port or link aggregation on the storage processor on which the interface is running')]
    $ipPort,
    [Parameter(Mandatory = $true,HelpMessage = 'IP address of the network interface')]
    [ipaddress]$ipAddress,
    [Parameter(Mandatory = $false,HelpMessage = 'IPv4 netmask for the network interface, if it uses an IPv4 address')]
    [ipaddress]$netmask,
    [Parameter(Mandatory = $false,HelpMessage = 'IPv6 prefix length for the interface, if it uses an IPv6 address')]
    [String]$v6PrefixLength,
    [Parameter(Mandatory = $false,HelpMessage = 'IPv4 or IPv6 gateway address for the network interface')]
    [ipaddress]$gateway,
    [Parameter(Mandatory = $false,HelpMessage = ' VLAN identifier for the interface. The interface uses the identifier to accept packets that have matching VLAN tags. Values are 1 - 4094.')]
    [int]$vlanId,
    [Parameter(Mandatory = $false,HelpMessage = 'Sets the current IP interface as preferred for associated for file-based storage and unsets the previous one')]
    [bool]$isPreferred,
    [Parameter(Mandatory = $false,HelpMessage = 'Role of NAS server network interface')]
    [String]$role
  )

  Begin {
    Write-Verbose "Executing function: $($MyInvocation.MyCommand)"

    #Initialazing arrays
    $ResultCollection = @()

    $FileInterfaceRoleEnum = @{
      "Production" = "0"
      "Backup" = "1"
    }

  }

  Process {
    Foreach ($sess in $session) {

      Write-Verbose "Processing Session: $($sess.Server) with SessionId: $($sess.SessionId)"

      # Creation of the body hash
      $body = @{}

      # nasServer argument
      $body["nasServer"] = @{}
      $nasServerArg = @{}
      $nasServerArg["id"] = "$($nasServer)"
      $body["nasServer"] = $nasServerArg

      # ipPort argument
      $body["ipPort"] = @{}
      $ipPortArg = @{}
      $ipPortArg["id"] = "$($ipPort)"
      $body["ipPort"] = $ipPortArg

      # ipAddress argument
      $body["ipAddress"] = "$ipAddress"

      If ($PSBoundParameters.ContainsKey('netmask')) {
            $body["netmask"] = "$netmask"
      }

      If ($PSBoundParameters.ContainsKey('v6PrefixLength')) {
            $body["v6PrefixLength"] = "$v6PrefixLength"
      }

      If ($PSBoundParameters.ContainsKey('gateway')) {
            $body["gateway"] = "$gateway"
      }

      If ($PSBoundParameters.ContainsKey('vlanId')) {
            $body["vlanId"] = $vlanId
      }

      If ($PSBoundParameters.ContainsKey('isPreferred')) {
            $body["isPreferred"] = $isPreferred
      }

      If ($PSBoundParameters.ContainsKey('role')) {
            $body["role"] = "$($FileInterfaceRoleEnum["$($role)"])"
      }

      If ($Sess.TestConnection()) {

        #Building the URI
        $URI = 'https://'+$sess.Server+'/api/types/fileInterface/instances'
        Write-Verbose "URI: $URI"

        #Sending the request
        $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body

        Write-Verbose "Request status code: $($request.StatusCode)"

        If ($request.StatusCode -eq '201') {

          #Formating the result. Converting it from JSON to a Powershell object
          $results = ($request.content | ConvertFrom-Json).content

          Write-Verbose "File interface created with the ID: $($results.id) "

          #Executing Get-UnityUser with the ID of the new user
          Get-UnityFileInterface -Session $Sess -ID $results.id
        }
      } else {
        Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)"
      }

    }
  }

  End {}
}