Public/Set-UnityFilesystem.ps1

Function Set-UnityFilesystem {

  <#
      .SYNOPSIS
      Modifies filesystem parameters.
      .DESCRIPTION
      Modifies filesystem parameters.
      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
      Set-UnityFilesystem -Name 'FS01' -Description 'Modified description'
 
      Change the description of the filesystem named FS01
  #>


    [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')]
  Param (
    #Default Parameters
    [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')]
    $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}),
    
    #SetFilesystem
    [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Filesystem Name')]
    [String[]]$Name,
    [Parameter(Mandatory = $false,HelpMessage = 'New Name of the filesystem')]
    [String]$NewName,
    [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 = $false,HelpMessage = 'Indicates whether to enable thin provisioning for file system')]
    [String]$isThinEnabled = $true,
    [Parameter(Mandatory = $false,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)"

      If ($Sess.TestConnection()) {

        Foreach ($n in $Name) {

          # Determine input and convert to UnityFilesystem object
          Switch ($n.GetType().Name)
          {
            "String" {
              $filesystem = get-UnityFilesystem -Session $Sess -Name $n
              $filesystemID = $filesystem.id
              $filesystemName = $filesystem.Name
            }
            "UnityFilesystem" {
              Write-Verbose "Input object type is $($n.GetType().Name)"
              $filesystemName = $n.Name
              If ($filesystem = Get-UnityFilesystem -Session $Sess -Name $filesystemName) {
                        $filesystemID = $n.id
              }
            }
          }

          If ($filesystemID) {

             $UnityStorageRessource = Get-UnitystorageResource -Session $sess | ? {($_.Name -like $filesystemName) -and ($_.filesystem.id -like $filesystemID)}

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

            # Name parameter
            If ($NewName) {
              $body["name"] = "$($NewName)"
            }

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

            If (($PSBoundParameters.ContainsKey('Size')) -or ($PSBoundParameters.ContainsKey('isThinEnabled')) -or ($PSBoundParameters.ContainsKey('hostIOSize')) -or ($PSBoundParameters.ContainsKey('tieringPolicy')) -or ($PSBoundParameters.ContainsKey('isCacheDisabled')) -or ($PSBoundParameters.ContainsKey('accessPolicy')) -or ($PSBoundParameters.ContainsKey('poolFullPolicy'))) {
              # fsParameters parameter
              $body["fsParameters"] = @{}
                $fsParameters = @{}
                
                # Size
                If ($PSBoundParameters.ContainsKey('Size')) {
                  $fsParameters["Size"] = $Size
                }
              
                # 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
            }

            #Building the URI
            $URI = 'https://'+$sess.Server+'/api/instances/storageResource/'+($UnityStorageRessource.id)+'/action/modifyFilesystem'
            Write-Verbose "URI: $URI"

            #Sending the request
            If ($pscmdlet.ShouldProcess($filesystemName,"Modify filesystem")) {
              $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body
            }

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

              Write-Verbose "Filesystem with ID: $filesystemID has been modified"

              Get-UnityFilesystem -Session $Sess -id $filesystemID

            }
          } else {
            Write-Verbose "filesystem $filesystemName does not exist on the array $($sess.Name)"
          }
        }
      } else {
        Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)"
      }
    }
  }

  End {}
}