Public/New-UnityFilesystem.ps1

Function New-UnityFilesystem {

  <#
      .SYNOPSIS
      Creates a Unity Filesystem.
      .DESCRIPTION
      Creates a Unity Filesystem.
      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-UnityFilesystem -Name 'FS01' -Pool 'pool_1' -Size 3298534883328 -nasServer 'nas_1' -supportedProtocols 'CIFS'
 
      Create CIFS filesystem named 'FS01' on pool 'pool_1' and with a size of '3298534883328' bytes
  #>


  [CmdletBinding()]
  Param (
    
    #Default Parameters
    [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')]
    $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}),

    #CreateFilesystem
    [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Filesystem Name')]
    [String[]]$Name,
    [Parameter(Mandatory = $false,HelpMessage = 'Filesystem Description')]
    [String]$Description,
    [Parameter(Mandatory = $false,HelpMessage = 'ID of a protection schedule to apply to the filesystem')]
    [String]$snapSchedule,
    [Parameter(Mandatory = $false,HelpMessage = 'Is assigned snapshot schedule is paused ? (Default is false)')]
    [bool]$isSnapSchedulePaused = $false,
    
    #fsParameters
    [Parameter(Mandatory = $true,HelpMessage = 'Filesystem Pool ID')]
    [String]$Pool,
    [Parameter(Mandatory = $true,HelpMessage = 'Filesystem nasServer')]
    [String]$nasServer,
    [Parameter(Mandatory = $true,HelpMessage = 'Filesystem supported protocols')]
    [FSSupportedProtocolEnum]$supportedProtocols,
    [Parameter(Mandatory = $false,HelpMessage = 'Indicates whether File Level Retention (FLR) is enabled for the file system')]
    [String]$isFLREnabled = $false,
    [Parameter(Mandatory = $false,HelpMessage = 'Indicates whether to enable thin provisioning for file system')]
    [String]$isThinEnabled = $true,
    [Parameter(Mandatory = $true,HelpMessage = 'Filesystem Size in Bytes')]
    [uint64]$Size,
    [Parameter(Mandatory = $false,HelpMessage = 'Typical write I/O size from the host to the file system')]
    [HostIOSizeEnum]$hostIOSize,
    [Parameter(Mandatory = $false,HelpMessage = 'Indicates whether caching is disabled')]
    [bool]$isCacheDisabled,
    [Parameter(Mandatory = $false,HelpMessage = 'Access policy')]
    [AccessPolicyEnum]$accessPolicy,
    [Parameter(Mandatory = $false,HelpMessage = 'Behavior to follow when pool is full and a write to this filesystem is attempted')]
    [ResourcePoolFullPolicyEnum]$poolFullPolicy,

    ##fastVPParameterseters
    [Parameter(Mandatory = $false,HelpMessage = 'Filesystem tiering policy')]
    [TieringPolicyEnum]$tieringPolicy,
    
    #cifsFilesystemParameters
    [Parameter(Mandatory = $false,HelpMessage = 'Indicates whether the CIFS synchronous writes option is enabled for the file system')]
    [bool]$isCIFSSyncWritesEnabled,
    [Parameter(Mandatory = $false,HelpMessage = 'Indicates whether opportunistic file locks are enabled for the file system')]
    [bool]$isCIFSOpLocksEnabled,
    [Parameter(Mandatory = $false,HelpMessage = 'Indicates whether the system generates a notification when the file system is written to')]
    [bool]$isCIFSNotifyOnWriteEnabled,
    [Parameter(Mandatory = $false,HelpMessage = 'Indicates whether the system generates a notification when a user accesses the file system')]
    [bool]$isCIFSNotifyOnAccessEnabled,
    [Parameter(Mandatory = $false,HelpMessage = 'Indicates the lowest directory level to which the enabled notifications apply, if any')]
    [int]$cifsNotifyOnChangeDirDepth
  )

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

  Process {
    Foreach ($sess in $session) {

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

      Foreach ($n in $Name) {

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

        # Name parameter
        $body["name"] = "$($n)"

        # Domain parameter
        If ($Description) {
              $body["description"] = "$($Description)"
        }

        # fsParameters parameter
        $body["fsParameters"] = @{}
          $fsParameters = @{}
            $poolParameters = @{}
            $poolParameters["id"] = "$($Pool)"
          $fsParameters["pool"] = $poolParameters
        
          $nasServerParameters = @{}
            $nasServerParameters["id"] = "$($nasServer)"
          $fsParameters["nasServer"] = $nasServerParameters

          $fsParameters["size"] = $($Size)
          
          $fsParameters["supportedProtocols"] = $($supportedProtocols)
          
          # isFLREnabled
          If ($PSBoundParameters.ContainsKey('isFLREnabled')) {
            $fsParameters["isFLREnabled"] = $isFLREnabled
          }
          
          # isThinEnabled
          If ($PSBoundParameters.ContainsKey('isThinEnabled')) {
            $fsParameters["isThinEnabled"] = $isThinEnabled
          }

          # hostIOSize
          If ($PSBoundParameters.ContainsKey('hostIOSize')) {
            $fsParameters["hostIOSize"] = $hostIOSize
          }

          # fastVPParameters
          If ($PSBoundParameters.ContainsKey('tieringPolicy')) {
            $fastVPParameters = @{}
            $fastVPParameters['tieringPolicy'] = $tieringPolicy
            $fsParameters["fastVPParameters"] = $fastVPParameters
          }

          # isCacheDisabled
          If ($PSBoundParameters.ContainsKey('isCacheDisabled')) {
            $fsParameters["isThinEnabled"] = $isCacheDisabled
          }

          # accessPolicy
          If ($PSBoundParameters.ContainsKey('accessPolicy')) {
            $fsParameters["accessPolicy"] = $accessPolicy
          }

          # poolFullPolicy
          If ($PSBoundParameters.ContainsKey('poolFullPolicy')) {
            $fsParameters["poolFullPolicy"] = $poolFullPolicy
          }

        $body["fsParameters"] = $fsParameters

        IF (($PSBoundParameters.ContainsKey('isCIFSSyncWritesEnabled')) -or ($PSBoundParameters.ContainsKey('isCIFSOpLocksEnabled')) -or ($PSBoundParameters.ContainsKey('isCIFSNotifyOnWriteEnabled')) -or ($PSBoundParameters.ContainsKey('isCIFSNotifyOnAccessEnabled')) -or ($PSBoundParameters.ContainsKey('cifsNotifyOnChangeDirDepth'))) {
          $body["cifsFsParameters"] = @{}
          $cifsFsParameters = @{}

          # isCIFSSyncWritesEnabled
          If ($PSBoundParameters.ContainsKey('isCIFSSyncWritesEnabled')) {
            $fsParameters["isCIFSSyncWritesEnabled"] = $isCIFSSyncWritesEnabled
          }
          
          # isCIFSOpLocksEnabled
          If ($PSBoundParameters.ContainsKey('isCIFSOpLocksEnabled')) {
            $fsParameters["isCIFSOpLocksEnabled"] = $isCIFSOpLocksEnabled
          }
          # isCIFSNotifyOnWriteEnabled
          If ($PSBoundParameters.ContainsKey('isCIFSNotifyOnWriteEnabled')) {
            $fsParameters["isCIFSNotifyOnWriteEnabled"] = $isCIFSNotifyOnWriteEnabled
          }
          # isCIFSNotifyOnAccessEnabled
          If ($PSBoundParameters.ContainsKey('isCIFSNotifyOnAccessEnabled')) {
            $fsParameters["isCIFSNotifyOnAccessEnabled"] = $isCIFSNotifyOnAccessEnabled
          }
          # cifsNotifyOnChangeDirDepth
          If ($PSBoundParameters.ContainsKey('cifsNotifyOnChangeDirDepth')) {
            $fsParameters["cifsNotifyOnChangeDirDepth"] = $cifsNotifyOnChangeDirDepth
          }
          
        $body["cifsFsParameters"] = $cifsFsParameters
        }
        
        #snapScheduleParameters
        If ($snapSchedule) {
          $body["snapScheduleParameters"] = @{}
          $snapScheduleParameters = @{}
          $snapScheduleParam = @{}
          $snapScheduleParam["id"] ="$($snapSchedule)"
          $snapScheduleParameters["snapSchedule"] = $snapScheduleParam
          $snapScheduleParameters["isSnapSchedulePaused"]= "$($isSnapSchedulePaused)"
          $body["snapScheduleParameters"] = $snapScheduleParameters
        }

        If ($Sess.TestConnection()) {

          #Building the URI
          $URI = 'https://'+$sess.Server+'/api/types/storageResource/action/createFilesystem'
          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 '200') {

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

            Write-Verbose "Filesystem created with the storage resource ID: $($results.id) "

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

  End {
  }
}