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
      .PARAMETER Session
      Specify an UnitySession Object.
      .PARAMETER Name
      New Name of the filesystem
      .PARAMETER Description
      Filesystem Description
      .PARAMETER snapSchedule
      ID of a protection schedule to apply to the filesystem
      .PARAMETER isSnapSchedulePaused
      Is assigned snapshot schedule is paused ? (Default is false)
      .PARAMETER isThinEnabled
      Indicates whether to enable thin provisioning for file system. Default is $True
      .PARAMETER Size
      Filesystem Size
      .PARAMETER hostIOSize
      Typical write I/O size from the host to the file system
      .PARAMETER isCacheDisabled
      Indicates whether caching is disabled
      .PARAMETER accessPolicy
      Access policy
      .PARAMETER poolFullPolicy
      Behavior to follow when pool is full and a write to this filesystem is attempted
      .PARAMETER tieringPolicy
      Filesystem tiering policy
      .PARAMETER isCIFSSyncWritesEnabled
      Indicates whether the CIFS synchronous writes option is enabled for the file system
      .PARAMETER isCIFSOpLocksEnabled
      Indicates whether opportunistic file locks are enabled for the file system
      .PARAMETER isCIFSNotifyOnWriteEnabled
      Indicates whether the system generates a notification when the file system is written to
      .PARAMETER isCIFSNotifyOnAccessEnabled
      Indicates whether the system generates a notification when a user accesses the file system
      .PARAMETER cifsNotifyOnChangeDirDepth
      Indicates the lowest directory level to which the enabled notifications apply, if any
      .PARAMETER Confirm
      If the value is $true, indicates that the cmdlet asks for confirmation before running. If the value is $false, the cmdlet runs without asking for user confirmation.
      .PARAMETER WhatIf
      Indicate that the cmdlet is run only to display the changes that would be made and actually no objects are modified.
      .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 ID or Object')]
    [String[]]$ID,
    [Parameter(Mandatory = $false,HelpMessage = 'New Name of the filesystem')]
    [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 = $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)"

    # Variables
    $URI = '/api/instances/storageResource/<id>/action/modifyFilesystem'
    $Type = 'Filesystem'
    $TypeName = 'UnityFilesystem'
    $StatusCode = 204
  }

  Process {

    Foreach ($sess in $session) {

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

      If ($Sess.TestConnection()) {

        Foreach ($i in $ID) {

          # Determine input and convert to object if necessary
          Switch ($i.GetType().Name)
          {
            "String" {
              $Object = get-UnityFilesystem -Session $Sess -ID $i
              $ObjectID = $Object.id
              If ($Object.Name) {
                $ObjectName = $Object.Name
              } else {
                $ObjectName = $ObjectID
              }
            }
            "$TypeName" {
              Write-Verbose "Input object type is $($i.GetType().Name)"
              $ObjectID = $i.id
              If ($Object = Get-UnityFilesystem -Session $Sess -ID $ObjectID) {
                If ($Object.Name) {
                  $ObjectName = $Object.Name
                } else {
                  $ObjectName = $ObjectID
                }          
              }
            }
          }

          If ($ObjectID) {

            $UnitystorageResource = Get-UnitystorageResource -Session $sess | Where-Object {($_.filesystem.id -like $ObjectID)}

            #### REQUEST BODY

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

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

            # 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
            }

            ####### END BODY - Do not edit beyond this line

            #Show $body in verbose message
            $Json = $body | ConvertTo-Json -Depth 10
            Write-Verbose $Json 

            #Building the URL
            $FinalURI = $URI -replace '<id>',$UnitystorageResource.id

            $URL = 'https://'+$sess.Server+$FinalURI
            Write-Verbose "URL: $URL"

            #Sending the request
            If ($pscmdlet.ShouldProcess($Sess.Name,"Modify $Type $ObjectName")) {
              $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'POST' -Body $Body
            }
            
            If ($request.StatusCode -eq $StatusCode) {

              Write-Verbose "$Type with ID $ObjectID has been modified"

              Get-UnityFilesystem  -Session $Sess -ID $ObjectID

            }  # End If ($request.StatusCode -eq $StatusCode)
          } else {
            Write-Warning -Message "$Type with ID $i does not exist on the array $($sess.Name)"
          } # End If ($ObjectID)
        } # End Foreach ($i in $ID)
      } # End If ($Sess.TestConnection())
    } # End Foreach ($sess in $session)
  } # End Process
} # End Function