From c2c25a1460f4216e1561c65afdb2f569d0915b8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erwan=20Qu=C3=A9lin?= Date: Fri, 16 Sep 2016 15:25:52 +0200 Subject: [PATCH] v0.8.0 [!deploy] v0.8.0 [!deploy] --- Medias/Unity-Powershell-Demo-01.gif | Bin 235865 -> 285452 bytes README.md | 41 +-- Tests/Help/Module.Help.Tests.ps1 | 302 ++++++++++++++++++ Tests/Module/Unity-Powershell.Tests.ps1 | 26 ++ Tools/Workflows/Unity-Configuration.ps1 | 135 ++++++++ Tools/Workflows/Unity-Erase.ps1 | 82 +++++ Unity-Powershell.PSDeploy.ps1 | 62 ++++ ...Unity-Powershell.UnitySystem.Format.ps1xml | Bin 8002 -> 8348 bytes .../Private/Remove-UnityLUNResource.ps1 | 80 +++-- Unity-Powershell/Public/Connect-Unity.ps1 | 8 +- .../Public/Disable-UnityFastCache.ps1 | 7 +- Unity-Powershell/Public/Disconnect-Unity.ps1 | 2 + Unity-Powershell/Public/Get-UnityAlert.ps1 | 18 +- .../Public/Get-UnityBasicSystemInfo.ps1 | 18 +- .../Public/Get-UnityCIFSShare.ps1 | 18 +- .../Public/Get-UnityCifsServer.ps1 | 24 +- Unity-Powershell/Public/Get-UnityDisk.ps1 | 24 +- .../Public/Get-UnityDiskGroup.ps1 | 22 +- .../Public/Get-UnityDnsServer.ps1 | 35 +- Unity-Powershell/Public/Get-UnityESXi.ps1 | 24 +- .../Public/Get-UnityEthernetPort.ps1 | 16 +- .../Public/Get-UnityFastCache.ps1 | 24 +- Unity-Powershell/Public/Get-UnityFeature.ps1 | 24 +- .../Public/Get-UnityFileDnsServer.ps1 | 18 +- .../Public/Get-UnityFileInterface.ps1 | 18 +- .../Public/Get-UnityFilesystem.ps1 | 22 +- Unity-Powershell/Public/Get-UnityHost.ps1 | 22 +- .../Public/Get-UnityIpInterface.ps1 | 16 +- Unity-Powershell/Public/Get-UnityIpPort.ps1 | 22 +- .../Public/Get-UnityIscsiPortal.ps1 | 16 +- Unity-Powershell/Public/Get-UnityItem.ps1 | 8 +- Unity-Powershell/Public/Get-UnityLicense.ps1 | 25 +- .../Public/Get-UnityMgmtInterface.ps1 | 18 +- .../Public/Get-UnityMgmtInterfaceSettings.ps1 | 24 +- .../Public/Get-UnityNTPServer.ps1 | 24 +- .../Public/Get-UnityNasServer.ps1 | 22 +- Unity-Powershell/Public/Get-UnityPool.ps1 | 25 +- Unity-Powershell/Public/Get-UnityPoolUnit.ps1 | 22 +- Unity-Powershell/Public/Get-UnitySession.ps1 | 2 + .../Public/Get-UnitySmtpServer.ps1 | 22 +- .../Public/Get-UnityStorageResource.ps1 | 24 +- Unity-Powershell/Public/Get-UnitySystem.ps1 | 22 +- Unity-Powershell/Public/Get-UnityUser.ps1 | 22 +- .../Public/Get-UnityVMwareLUN.ps1 | 14 +- Unity-Powershell/Public/Get-UnityvCenter.ps1 | 22 +- .../Public/New-UnityCIFSShare.ps1 | 118 +++++-- .../Public/New-UnityCifsServer.ps1 | 99 ++++-- .../Public/New-UnityFileDnsServer.ps1 | 64 ++-- .../Public/New-UnityFileInterface.ps1 | 96 ++++-- .../Public/New-UnityFilesystem.ps1 | 106 ++++-- .../Public/New-UnityIscsiPortal.ps1 | 63 ++-- Unity-Powershell/Public/New-UnityLUN.ps1 | 115 +++++-- .../Public/New-UnityMgmtInterface.ps1 | 46 +-- .../Public/New-UnityNasServer.ps1 | 54 ++-- Unity-Powershell/Public/New-UnityPool.ps1 | 55 ++-- .../Public/New-UnitySMTPServer.ps1 | 55 ++-- Unity-Powershell/Public/New-UnityUser.ps1 | 65 ++-- .../Public/New-UnityVMwareLUN.ps1 | 65 ++-- Unity-Powershell/Public/New-UnityvCenter.ps1 | 51 +-- Unity-Powershell/Public/Remove-UnityAlert.ps1 | 75 +++-- .../Public/Remove-UnityCIFSShare.ps1 | 88 +++-- .../Public/Remove-UnityCifsServer.ps1 | 105 +++--- .../Public/Remove-UnityFileDnsServer.ps1 | 75 +++-- .../Public/Remove-UnityFileInterface.ps1 | 75 +++-- .../Public/Remove-UnityFilesystem.ps1 | 86 ++--- Unity-Powershell/Public/Remove-UnityHost.ps1 | 74 +++-- .../Public/Remove-UnityIscsiPortal.ps1 | 75 +++-- Unity-Powershell/Public/Remove-UnityLUN.ps1 | 86 +++-- .../Public/Remove-UnityMgmtInterface.ps1 | 85 +++-- .../Public/Remove-UnityNasServer.ps1 | 91 +++--- Unity-Powershell/Public/Remove-UnityPool.ps1 | 99 +++--- .../Public/Remove-UnitySMTPServer.ps1 | 73 +++-- Unity-Powershell/Public/Remove-UnityUser.ps1 | 85 ++--- .../Public/Remove-UnityVMwareLUN.ps1 | 72 +++-- .../Public/Remove-UnityvCenter.ps1 | 73 +++-- Unity-Powershell/Public/Set-UnityAlert.ps1 | 108 ++++--- .../Public/Set-UnityCIFSShare.ps1 | 84 +++-- .../Public/Set-UnityDnsServer.ps1 | 39 ++- .../Public/Set-UnityFileDNSServer.ps1 | 137 +++++--- .../Public/Set-UnityFileInterface.ps1 | 202 +++++++----- .../Public/Set-UnityFilesystem.ps1 | 134 +++++--- .../Public/Set-UnityIscsiPortal.ps1 | 129 +++++--- Unity-Powershell/Public/Set-UnityLUN.ps1 | 193 ++++++++--- .../Public/Set-UnityMgmtInterface.ps1 | 161 ++++++---- .../Public/Set-UnityMgmtInterfaceSettings.ps1 | 42 ++- .../Public/Set-UnityNTPServer.ps1 | 62 ++-- .../Public/Set-UnityNasServer.ps1 | 98 +++--- Unity-Powershell/Public/Set-UnityPool.ps1 | 110 ++++--- .../Public/Set-UnitySMTPServer.ps1 | 110 ++++--- Unity-Powershell/Public/Set-UnitySystem.ps1 | 149 +++++++++ Unity-Powershell/Public/Set-UnityUser.ps1 | 116 ++++--- .../Public/Set-UnityVMwareLUN.ps1 | 88 ++--- Unity-Powershell/Public/Set-UnityvCenter.ps1 | 2 +- .../Public/Update-UnityvCenter.ps1 | 92 +++--- Unity-Powershell/Unity-Powershell.psd1 | 2 +- Unity-Powershell/Unity-Powershell.psm1 | 3 + appveyor.yml | 20 ++ build.ps1 | 53 +++ psake.ps1 | 86 +++++ 99 files changed, 4005 insertions(+), 2006 deletions(-) create mode 100644 Tests/Help/Module.Help.Tests.ps1 create mode 100644 Tests/Module/Unity-Powershell.Tests.ps1 create mode 100644 Tools/Workflows/Unity-Configuration.ps1 create mode 100644 Tools/Workflows/Unity-Erase.ps1 create mode 100644 Unity-Powershell.PSDeploy.ps1 create mode 100644 Unity-Powershell/Public/Set-UnitySystem.ps1 create mode 100644 appveyor.yml create mode 100644 build.ps1 create mode 100644 psake.ps1 diff --git a/Medias/Unity-Powershell-Demo-01.gif b/Medias/Unity-Powershell-Demo-01.gif index 1338e667f67bd52ab4d1d523ca5805e7a57ad2a3..09c6f93ed4b418ef993dc639f925969b2179747a 100644 GIT binary patch literal 285452 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

TM9LALp`{9B460ug?e}PPm5BeG9xeMB6@2yM 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

Ce+U(1 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 z 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�uxYqCB@edQyICf;*1feb(r~c& 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 literal 235865 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

!mAiTE9U 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 EAE6MaEC2ui diff --git a/README.md b/README.md index e242378..7793a0c 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,13 @@ -[![GitHub version](https://badge.fury.io/gh/equelin%2FUnity-Powershell.svg)](https://badge.fury.io/gh/equelin%2FUnity-Powershell) +[![Build status](https://ci.appveyor.com/api/projects/status/y6w9s01j9ddqnsbi/branch/master?svg=true)](https://ci.appveyor.com/api/projects/status/y6w9s01j9ddqnsbi/branch/master?svg=true) [![GitHub version](https://badge.fury.io/gh/equelin%2FUnity-Powershell.svg)](https://badge.fury.io/gh/equelin%2FUnity-Powershell) # Unity-Powershell -This is a PowerShell module for querying EMC Unity array's API. +This is a PowerShell module for managing EMC Unity arrays (physical or virtual). +Unity-Powershell is a member of the DevHigh5 program from [{code} by Dell EMC(tm)](https://github.com/codedellemc/codedellemc.github.io/wiki/DevHigh5-Program-Overview-and-FAQ). ![](./Medias/Unity-Powershell-Demo-01.gif) -With this module (version 0.7.0) you can manage: +With this module (version 0.8.0) you can manage: - System (DNS,NTP...) - Pools (Virtual and physical deployment) @@ -31,7 +32,7 @@ For example, you can manage Pools with the following commands: - Set-UnityPool - Remove-UnityPool -Some functions accept pipelining. If you want to delete all the existing LUNS you can do this: +Some functions accept pipelining. For axample, if you want to delete all the existing LUNS you can do this: ```powershell Get-UnityLUN | Remove-UnityLUN @@ -39,8 +40,8 @@ Get-UnityLUN | Remove-UnityLUN # Requirements -- Powershell 5 -- An EMC Unity array ! +- Powershell 5 (If possible get the latest version) +- An EMC Unity array ! (virtual or physical) # Instructions ### Install the module @@ -95,24 +96,24 @@ You can create a new LUN `New-UnityLUN`, retrieves informations `Get-UnityLUN`, ```PowerShell # Create a block LUN - New-UnityLUN -Name 'LUN01' -Pool 'pool_1' -Size 1024000 + New-UnityLUN -Name 'LUN01' -Pool 'pool_1' -Size '10GB' - Name id pool isThinEnabled tieringPolicy sizeTotal sizeUsed sizeAllocated - ---- -- ---- ------------- ------------- --------- -------- ------------- - LUN01 sv_69 pool_1 True Autotier_High 1024000 0 0 + Id Name Pool IsThinEnabled TieringPolicy SizeTotal SizeAllocated Type + -- ---- ---- ------------- ------------- --------- ------------- ---- + sv_94 LUN01 @{id=pool_1} True Autotier_High 10737418240 0 Standalone # Retrieve informations about block LUN Get-UnityLUN - Name ID pool isThinEnabled tieringPolicy sizeTotal sizeUsed sizeAllocated - ---- -- ---- ------------- ------------- --------- -------- ------------- - LUN01 sv_1 pool_1 True Autotier_High 1073741824 0 0 - LUN02 sv_2 pool_1 True Autotier_High 1073741824 0 0 + Id Name Pool IsThinEnabled TieringPolicy SizeTotal SizeAllocated Type + -- ---- ---- ------------- ------------- --------- ------------- ---- + sv_94 LUN01 @{id=pool_1} True Autotier_High 10737418240 0 Standalone + sv_95 LUN02 @{id=pool_1} True Autotier_High 10737418240 0 Standalone # Delete a LUN - Remove-UnityLUN -Name 'LUN01' + Remove-UnityLUN -ID 'sv_95' ``` ### Users Management @@ -123,19 +124,19 @@ You can add a new user `New-UnityUser`, modify his properties `Set-UnityUSer` or # Retrieve informations about a specific user Get-UnityUser -Name 'demo' - id Name Role + Id Name Role -- ---- ---- - user_demo demo storageadmin + user_demo demo @{id=storageadmin} # Change the role of the user from storageadmin to operator Get-UnityUser -Name 'demo' | Set-UnityUser -Role 'operator' - id Name Role + Id Name Role -- ---- ---- - user_demo demo operator + user_demo demo @{id=operator} # Delete an user - Remove-UnityUser -Name 'demo' + Remove-UnityUser -ID 'user_demo' ``` ### Query ressources diff --git a/Tests/Help/Module.Help.Tests.ps1 b/Tests/Help/Module.Help.Tests.ps1 new file mode 100644 index 0000000..e6401d5 --- /dev/null +++ b/Tests/Help/Module.Help.Tests.ps1 @@ -0,0 +1,302 @@ +<# +.SYNOPSIS +Tests the PowerShell help for the commands in a module. + +.DESCRIPTION +This Pester test verifies that the commands in a module have basic help content. +It works on all command types and both comment-based and XML help. + +This test verifies that Get-Help is not autogenerating help because it cannot +find any help for the command. Then, it checks for the following help elements: + - Synopsis + - Description + - Parameter: + - A description of each parameter. + - An accurate value for the Mandatory property. + - An accurate value for the .NET type of the parameter value. + - No extra parameters: + - Verifies that there are no parameters in help that are not also in the code. + +When testing attributes of parameters that appear in multiple parameter sets, +this test uses the parameter that appears in the default parameter set, if one +is defined. + +You can run this Tests file from any location. For a help test that is located in a module +directory, use https://github.com/juneb/PesterTDD/InModule.Help.Tests.ps1 + +.PARAMETER ModuleName +Enter the name of the module to test. You can enter only one name at a time. This +parameter is mandatory. + +.PARAMETER RequiredVersion +Enter the version of the module to test. This parameter is optional. If you +omit it, the test runs on the latest version of the module in $env:PSModulePath. + +.EXAMPLE +.\Module.Help.Tests.ps1 -ModuleName Pester -RequiredVersion 3.4.0 +This command runs the tests on the commands in Pester 3.4.0. + +.EXAMPLE +.\Module.Help.Tests.ps1 -ModuleName Pester +This command runs the tests on the commands in latest local version of the +Pester module. + + +.NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2016 v5.2.119 + Created on: 4/12/2016 1:11 AM + Created by: June Blender + Organization: SAPIEN Technologies, Inc + Filename: *.Help.Tests.ps1 + =========================================================================== +#> + +#Requires -Module @{ModuleName = 'Pester'; ModuleVersion = '3.4.0'} + + +[ValidateNotNullOrEmpty()]$Manifest = Get-ChildItem $PSScriptRoot\..\..\Unity-Powershell\Unity-Powershell.psd1 -Recurse +$ModuleName = $Manifest.BaseName +[ValidateNotNullOrEmpty()]$RequiredVersion = ($Manifest | Select-String -Pattern "^ModuleVersion = '([\d\.]*)'$").Matches.Groups.value[1] + + +# Param +# ( +# [Parameter(Mandatory = $true)] +# [ValidateScript({ Get-Module -ListAvailable -Name $_ })] +# [string] +# $ModuleName = $Manifest.BaseName, + +# [Parameter(Mandatory = $false)] +# [System.Version] +# $RequiredVersion = ($Manifest | Select-String -Pattern "^ModuleVersion = '([\d\.]*)'$").Matches.Groups.value[1] +# ) + + + +<# +.SYNOPSIS +Gets command parameters; one per name. Prefers default parameter set. + +.DESCRIPTION +Gets one CommandParameterInfo object for each parameter in the specified +command. If a command has more than one parameter with the same name, this +function gets the parameters in the default parameter set, if one is specified. + +For example, if a command has two parameter sets: + Name, ID (default) + Name, Path +This function returns: + Name (default), ID Path + +This function is used to get parameters for help and for help testing. + +.PARAMETER Command +Enter a CommandInfo object, such as the object that Get-Command returns. You +can also pipe a CommandInfo object to the function. + +This parameter takes a CommandInfo object, instead of a command name, so +you can use the parameters of Get-Command to specify the module and version +of the command. + +.EXAMPLE +PS C:\> Get-ParametersDefaultFirst -Command (Get-Command New-Guid) +This command uses the Command parameter to specify the command to +Get-ParametersDefaultFirst + +.EXAMPLE +PS C:\> Get-Command New-Guid | Get-ParametersDefaultFirst +You can also pipe a CommandInfo object to Get-ParametersDefaultFirst + +.EXAMPLE +PS C:\> Get-ParametersDefaultFirst -Command (Get-Command BetterCredentials\Get-Credential) +You can use the Command parameter to specify the CommandInfo object. This +command runs Get-Command module-qualified name value. + +.EXAMPLE +PS C:\> $ModuleSpec = @{ModuleName='BetterCredentials';RequiredVersion=4.3} +PS C:\> Get-Command -FullyQualifiedName $ModuleSpec | Get-ParametersDefaultFirst +This command uses a Microsoft.PowerShell.Commands.ModuleSpecification object to +specify the module and version. You can also use it to specify the module GUID. +Then, it pipes the CommandInfo object to Get-ParametersDefaultFirst. +#> +function Get-ParametersDefaultFirst { + Param + ( + [Parameter(Mandatory = $true, + ValueFromPipeline = $true)] + [System.Management.Automation.CommandInfo] + $Command + ) + + BEGIN { + $Common = 'Debug', 'ErrorAction', 'ErrorVariable', 'InformationAction', 'InformationVariable', 'OutBuffer', 'OutVariable', 'PipelineVariable', 'Verbose', 'WarningAction', 'WarningVariable' + $parameters = @() + } + PROCESS { + if ($defaultPSetName = $Command.DefaultParameterSet) { + $defaultParameters = ($Command.ParameterSets | Where-Object Name -eq $defaultPSetName).parameters | Where-Object Name -NotIn $common + $otherParameters = ($Command.ParameterSets | Where-Object Name -ne $defaultPSetName).parameters | Where-Object Name -NotIn $common + + $parameters += $defaultParameters + if ($parameters -and $otherParameters) { + $otherParameters | ForEach-Object { + if ($_.Name -notin $parameters.Name) { + $parameters += $_ + } + } + $parameters = $parameters | Sort-Object Name + } + } + else { + $parameters = $Command.ParameterSets.Parameters | Where-Object Name -NotIn $common | Sort-Object Name -Unique + } + + + return $parameters + } + END { } +} + +<# +.SYNOPSIS +Gets the module/snapin name and version for a command. + +.DESCRIPTION +This function takes a CommandInfo object (the type that +Get-Command returns) and retuns a custom object with the +following properties: + + -- [string] $CommandName + -- [string] $ModuleName (or PSSnapin name) + -- [string] $ModuleVersion (or PowerShell Version) + +.PARAMETER CommandInfo +Specifies a Commandinfo object, e.g. (Get-Command Get-Item). + +.EXAMPLE +PS C:\> Get-CommandVersion -CommandInfo (Get-Command Get-Help) + +CommandName ModuleName Version +----------- ---------- ------- +Get-Help Microsoft.PowerShell.Core 3.0.0.0 + +This command gets information about a cmdlet in a PSSnapin. + + +.EXAMPLE +PS C:\> Get-CommandVersion -CommandInfo (Get-Command New-JobTrigger) + +CommandName ModuleName Version +----------- ---------- ------- +New-JobTrigger PSScheduledJob 1.1.0.0 + +This command gets information about a cmdlet in a module. +#> +function Get-CommandVersion { + Param + ( + [Parameter(Mandatory = $true)] + [System.Management.Automation.CommandInfo] + $CommandInfo + ) + + if ((-not ((($commandModuleName = $CommandInfo.Module.Name) -and ($commandVersion = $CommandInfo.Module.Version)) -or + (($commandModuleName = $CommandInfo.PSSnapin) -and ($commandVersion = $CommandInfo.PSSnapin.Version))))) { + Write-Error "For $($CommandInfo.Name) : Can't find PSSnapin/module name and version" + } + else { + # "For $commandName : Module is $commandModuleName. Version is $commandVersion" + [PSCustomObject]@{ CommandName = $CommandInfo.Name; ModuleName = $commandModuleName; Version = $commandVersion } + } +} + + +if (!$RequiredVersion) { + $RequiredVersion = (Get-Module $ModuleName -ListAvailable | Sort-Object -Property Version -Descending | Select-Object -First 1).Version +} + +# Remove all versions of the module from the session. Pester can't handle multiple versions. +Get-Module $ModuleName | Remove-Module + +# Import the required version +Import-Module $Manifest -RequiredVersion $RequiredVersion -ErrorAction Stop +$ms = [Microsoft.PowerShell.Commands.ModuleSpecification]@{ ModuleName = $ModuleName; RequiredVersion = $RequiredVersion } +$commands = Get-Command -FullyQualifiedModule $ms -CommandType Cmdlet, Function, Workflow # Not alias + +## When testing help, remember that help is cached at the beginning of each session. +## To test, restart session. + +foreach ($command in $commands) { + $commandName = $command.Name + + # Get the module name and version of the command. Used in the Describe name. + $commandModuleVersion = Get-CommandVersion -CommandInfo $command + + # The module-qualified command fails on Microsoft.PowerShell.Archive cmdlets + $Help = Get-Help $ModuleName\$commandName -ErrorAction SilentlyContinue + if ($Help.Synopsis -like '*`[``]*') { + $Help = Get-Help $commandName -ErrorAction SilentlyContinue + } + + Describe "Test help for $commandName in $($commandModuleVersion.ModuleName) ($($commandModuleVersion.Version))" { + + # If help is not found, synopsis in auto-generated help is the syntax diagram + It "should not be auto-generated" { + $Help.Synopsis | Should Not BeLike '*`[``]*' + } + + # Should be a synopsis for every function + It "gets synopsis for $commandName" { + $Help.Synopsis | Should Not beNullOrEmpty + } + + # Should be a description for every function + It "gets description for $commandName" { + $Help.Description | Should Not BeNullOrEmpty + } + + # Should be at least one example + It "gets example code from $commandName" { + ($Help.Examples.Example | Select-Object -First 1).Code | Should Not BeNullOrEmpty + } + + # Should be at least one example description + It "gets example help from $commandName" { + ($Help.Examples.Example.Remarks | Select-Object -First 1).Text | Should Not BeNullOrEmpty + } + + Context "Test parameter help for $commandName" { + + $Common = 'Debug', 'ErrorAction', 'ErrorVariable', 'InformationAction', 'InformationVariable', 'OutBuffer', 'OutVariable', + 'PipelineVariable', 'Verbose', 'WarningAction', 'WarningVariable' + + # Get parameters. When >1 parameter with same name, + # get parameter from the default parameter set, if any. + $parameters = Get-ParametersDefaultFirst -Command $command + + $parameterNames = $parameters.Name + $HelpParameterNames = $Help.Parameters.Parameter.Name | Sort-Object -Unique + + foreach ($parameter in $parameters) { + $parameterName = $parameter.Name + $parameterHelp = $Help.parameters.parameter | Where-Object Name -EQ $parameterName + + # Should be a description for every parameter + if ($parameterName -ne 'Confirm' -AND $parameterName -ne 'WhatIf') + { + It "gets help for parameter: $parameterName : in $commandName" { + $parameterHelp.Description.Text | Should Not BeNullOrEmpty + } + } + } + + foreach ($helpParm in $HelpParameterNames) { + # Shouldn't find extra parameters in help. + It "finds help parameter in code: $helpParm" { + $helpParm -in $parameterNames | Should Be $true + } + } + } + } +} \ No newline at end of file diff --git a/Tests/Module/Unity-Powershell.Tests.ps1 b/Tests/Module/Unity-Powershell.Tests.ps1 new file mode 100644 index 0000000..5463156 --- /dev/null +++ b/Tests/Module/Unity-Powershell.Tests.ps1 @@ -0,0 +1,26 @@ +$here = Split-Path -Parent $MyInvocation.MyCommand.Path + +$manifestPath = "$here\..\..\Unity-Powershell\Unity-Powershell.psd1" + +Import-Module "$here\..\..\Unity-Powershell" -force + +Describe -Tags 'VersionChecks' "Unity-Powershell manifest" { + $script:manifest = $null + It "has a valid manifest" { + { + $script:manifest = Test-ModuleManifest -Path $manifestPath -ErrorAction Stop -WarningAction SilentlyContinue + } | Should Not Throw + } + + It "has a valid name in the manifest" { + $script:manifest.Name | Should Be 'Unity-Powershell' + } + + It "has a valid guid in the manifest" { + $script:manifest.Guid | Should Be '586e7e62-9753-4fd6-91b6-89d8d89d69a2' + } + + It "has a valid version in the manifest" { + $script:manifest.Version -as [Version] | Should Not BeNullOrEmpty + } +} \ No newline at end of file diff --git a/Tools/Workflows/Unity-Configuration.ps1 b/Tools/Workflows/Unity-Configuration.ps1 new file mode 100644 index 0000000..5893ffe --- /dev/null +++ b/Tools/Workflows/Unity-Configuration.ps1 @@ -0,0 +1,135 @@ +#require Unity-Powershell + +[CmdletBinding()] +Param () + +$Server = '10.44.10.112' +$UnityUsername = 'admin' +$UnityPassword = 'Password123#' + +#System + +$DNS = '10.44.10.101' +$DefaultSMTP = 'mail.example.com' +$NTP = '10.44.10.101' + +$UserName = 'User01' +$UserPassword = 'Password123#' +$UserRole = 'administrator' + +#Pool + +$PoolVdiskID = 'vdisk_3' +$PoolVdiskTier = 'Performance' +$PoolName = 'POOL01' + +#VMwareLUN + +$VMwareLUNName = 'DATASTORE01' +$VMwareLUNSize = 10GB + +#VMwareLUN + +$LUNName = 'LUN01' +$LUNSize = 10GB + +#iSCSI Portal + +$ethernetPort = 'spa_eth0' +$ipAddress = '10.44.40.252' +$netmask = '255.255.255.0' + +# NAS Server + +$NasServerName = 'NAS01' +$homeSP = 'spa' + +# File Interface + +$FileInterfaceipPort = 'spa_eth0' +$FileInterfaceipAddress = '10.44.40.253' +$FileInterfacenetmask = '255.255.0.0' +$FileInterfacegateway = '10.44.1.254' + +# File DNS Server +$FileDNSDomainName = 'example.local' +$FileDNSAddress = '10.44.10.101' + +# CIFS Server +$CIFSServerName = 'CIFS01' +$CIFSServerdomainUsername = 'administrator' +$CIFSServerdomainPassword = 'Password123#' + +# Filesystem +$FilesystemName = 'FS01' +$FilesystemsupportedProtocols = 'CIFS' +$FilesystemSize = 10GB + +# CIFS Share +$CIFSShareName = 'SHARE01' +$CIFSSharePath = '/' + +######## SCRIPT ########### + +Write-Host "Connecting to Unity" -ForegroundColor 'magenta' + +$UnitySecurePassword = $UnityPassword | ConvertTo-SecureString -AsPlainText -Force + +Write-Host "[+] Connecting to Unity $Server" -ForegroundColor 'Green' +$Session = Connect-Unity -Server $server -Username $UnityUsername -Password $UnitySecurePassword + +Write-Host "Configuring the system" -ForegroundColor 'magenta' + +Write-Host "[+] Accepting EULA" -ForegroundColor 'Green' +Set-UnitySystem -Session $Session -ID '0' -isEULAAccepted $True -Confirm:$false | Out-Null + +Write-Host "[+] Creating user $UserName" -ForegroundColor 'Green' +New-UnityUser -Session $Session -Name $UserName -Password $UserPassword -Role $UserRole -Confirm:$false | Out-Null + +Write-Host "[+] Setting DNS Server addresses $DNS" -ForegroundColor 'Green' +Set-UnityDNSServer -Session $Session -Addresses $DNS -Confirm:$false | Out-Null + +Write-Host "[+] Setting NTP Server addresses $NTP" -ForegroundColor 'Green' +Set-UnityNTPServer -Session $Session -Addresses $NTP -Confirm:$false | Out-Null + +Write-Host "[+] Setting SMTP Server addresses $DefaultSMTP" -ForegroundColor 'Green' +New-UnitySMTPServer -Session $Session -address $DefaultSMTP -type Default -Confirm:$false | Out-Null + +Write-Host "Configuring storage" -ForegroundColor 'magenta' + +Write-Host "[+] Creating Pool $PoolName" -ForegroundColor 'Green' +$Pool = New-UnityPool -Session $Session -Name $PoolName -virtualDisk @{"id"=$PoolVdiskID;"tier"=$PoolVdiskTier} -Confirm:$false + +Write-Host "[+] Creating VMware LUN $VMwareLUNName" -ForegroundColor 'Green' +New-UnityVMwareLUN -Session $Session -Name $VMwareLUNName -Size $VMwareLUNSize -Pool $Pool.id -Confirm:$false | Out-Null + +Write-Host "[+] Creating LUN $LUNName" -ForegroundColor 'Green' +New-UnityLUN -Session $Session -Name $LUNName -Size $LUNSize -Pool $Pool.id -Confirm:$false | Out-Null + +Write-Host "[+] Creating iSCSI Portal on $ethernetPort with IP $ipAddress" -ForegroundColor 'Green' +New-UnityIscsiPortal -Session $Session -ethernetPort $ethernetPort -ipAddress $ipAddress -netmask $netmask -Confirm:$false | Out-Null + +Write-Host "Configuring NAS" -ForegroundColor 'magenta' + +Write-Host "[+] Creating NAS Server $NasServerName" -ForegroundColor 'Green' +$NasServer = New-UnityNasServer -Session $Session -Name $NasServerName -Pool $Pool.id -homeSP $homeSP -Confirm:$false + +Write-Host "[+] Creating File Interface on $FileInterfaceipPort with IP $FileInterfaceipAddress" -ForegroundColor 'Green' +$FileInterface = New-UnityFileInterface -Session $Session -ipPort $FileInterfaceipPort -nasServer $NasServer.id -ipAddress $FileInterfaceipAddress -netmask $FileInterfacenetmask -gateway $FileInterfacegateway -Confirm:$false + +Write-Host "[+] Creating File DNS with address $FileDNSAddress" -ForegroundColor 'Green' +New-UnityFileDNSServer -Session $Session -nasServer $NasServer.id -domain $FileDNSDomainName -addresses $FileDNSAddress -Confirm:$false | Out-Null + +Write-Host "[+] Creating File CIFS Server $CIFSServerName" -ForegroundColor 'Green' +$CIFSServer = New-UnityCIFSServer -Session $Session -Name $CIFSServerName -nasServer $NasServer.id -domain $FileDNSDomainName -domainUsername $CIFSServerdomainUsername -domainPassword $CIFSServerdomainPassword -interfaces $FileInterface.id -Confirm:$false + +Write-Host "[+] Creating Filesystem $FilesystemName" -ForegroundColor 'Green' +$Filesystem = New-UnityFilesystem -Session $Session -Name $FilesystemName -Pool $Pool.id -Size $FilesystemSize -nasServer $NasServer.id -supportedProtocols $FilesystemsupportedProtocols -Confirm:$false + +Write-Host "[+] Creating CIFS Share $CIFSShareName" -ForegroundColor 'Green' +New-UnityCIFSShare -Session $Session -Filesystem $Filesystem.id -Name $CIFSShareName -path $CIFSSharePath -cifsServer $CIFSServer.id -Confirm:$false | Out-Null + +Write-Host "Disconnecting from Unity" -ForegroundColor 'magenta' + +Write-Host "[+] Disconnecting from Unity $Server" -ForegroundColor 'Green' +Disconnect-Unity -Session $Session -Confirm:$false | Out-Null diff --git a/Tools/Workflows/Unity-Erase.ps1 b/Tools/Workflows/Unity-Erase.ps1 new file mode 100644 index 0000000..311d87b --- /dev/null +++ b/Tools/Workflows/Unity-Erase.ps1 @@ -0,0 +1,82 @@ +#require Unity-Powershell + +[CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] +Param () + +##### Variables ###### + +$Server = '10.44.10.112' +$UnityUsername = 'admin' +$UnityPassword = 'Password123#' + +$domainUsername = 'administrator' +$domainPassword = 'Password123#' + +##### Script ###### + +Write-Warning -Message 'You are about to erase all your data !' + +If ($pscmdlet.ShouldProcess($Server,"Deleting all data")) { + Write-Host "Connecting to Unity" -ForegroundColor 'magenta' + + $UnitySecurePassword = $UnityPassword | ConvertTo-SecureString -AsPlainText -Force + + Write-Host "[+] Connecting to Unity $Server" -ForegroundColor 'Green' + $Session = Connect-Unity -Server $server -Username $UnityUsername -Password $UnitySecurePassword + + Write-Host "Deleting NAS configuration" -ForegroundColor 'magenta' + + Write-Host "[-] Deleting CIFS Share" -ForegroundColor 'Red' + Get-UnityCIFSShare -Session $Session | Remove-UnityCIFSShare -Session $Session -Confirm:$false + + Write-Host "[-] Deleting Filesystem" -ForegroundColor 'Red' + Get-UnityFilesystem -Session $Session | Remove-UnityFilesystem -Session $Session -Confirm:$false + + Write-Host "[-] Deleting CIFS Server" -ForegroundColor 'Red' + Get-UnityCIFSServer -Session $Session | Remove-UnityCIFSServer -Session $Session -domainUsername $domainUsername -domainPassword $domainPassword -Confirm:$false + + Write-Host "[-] Deleting File DNS Server" -ForegroundColor 'Red' + Get-UnityFileDNSServer -Session $Session | Remove-UnityFileDNSServer -Session $Session -Confirm:$false + + Write-Host "[-] Deleting File Interface" -ForegroundColor 'Red' + Get-UnityFileInterface -Session $Session | Remove-UnityFileInterface -Session $Session -Confirm:$false + + Write-Host "[-] Deleting NAS Server" -ForegroundColor 'Red' + Get-UnityNasServer -Session $Session | Remove-UnityNasServer -Session $Session -Confirm:$false + + Write-Host "Deleting Host configuration" -ForegroundColor 'magenta' + + Write-Host "[-] Deleting vCenter" -ForegroundColor 'Red' + Get-UnityvCenter -Session $Session | Remove-UnityvCenter -Session $Session -Confirm:$false + + Write-Host "[-] Deleting Hosts" -ForegroundColor 'Red' + Get-UnityHost -Session $Session | Remove-UnityHost -Session $Session -Confirm:$false + + Write-Host "Deleting Storage configuration" -ForegroundColor 'magenta' + + Write-Host "[-] Deleting iSCSI Portal" -ForegroundColor 'Red' + Get-UnityIscsiPortal -Session $Session | Remove-UnityIscsiPortal -Session $Session -Confirm:$false + + Write-Host "[-] Deleting VMware LUN" -ForegroundColor 'Red' + Get-UnityVMwareLUN -Session $Session | Remove-UnityVMwareLUN -Session $Session -Confirm:$false + + Write-Host "[-] Deleting LUN" -ForegroundColor 'Red' + Get-UnityLUN -Session $Session | Remove-UnityLUN -Session $Session -Confirm:$false + + Write-Host "[-] Deleting Pool" -ForegroundColor 'Red' + Get-UnityPool -Session $Session | Remove-UnityPool -Session $Session -Confirm:$false + + Write-Host "Deleting system configuration" -ForegroundColor 'magenta' + + Write-Host "[-] Deleting SMTP Server" -ForegroundColor 'Red' + Get-UnitySMTPServer -Session $Session | Remove-UnitySMTPServer -Session $Session -Confirm:$false + + Write-Host "[-] Deleting Users" -ForegroundColor 'Red' + Get-UnityUser -Session $Session | where-object {$_.Name -ne 'admin'} | Remove-UnityUser -Session $Session -Confirm:$false + + Write-Host "Disconnecting from Unity" -ForegroundColor 'magenta' + + Write-Host "[+] Disconnecting from Unity $Server" -ForegroundColor 'Green' + Disconnect-Unity -Session $Session -Confirm:$false | Out-Null +} + diff --git a/Unity-Powershell.PSDeploy.ps1 b/Unity-Powershell.PSDeploy.ps1 new file mode 100644 index 0000000..b48ad86 --- /dev/null +++ b/Unity-Powershell.PSDeploy.ps1 @@ -0,0 +1,62 @@ +# Generic module deployment. +# +# ASSUMPTIONS: +# +# * folder structure either like: +# +# - RepoFolder +# - This PSDeploy file +# - ModuleName +# - ModuleName.psd1 +# +# OR the less preferable: +# - RepoFolder +# - RepoFolder.psd1 +# +# * Nuget key in $ENV:NugetApiKey +# +# * Set-BuildEnvironment from BuildHelpers module has populated ENV:BHPSModulePath and related variables + +# Publish to gallery with a few restrictions +if( + $env:BHPSModulePath -and + $env:BHBuildSystem -ne 'Unknown' -and + $env:BHBranchName -eq "master" -and + $env:BHCommitMessage -match '!deploy' +) +{ + Deploy Module { + By PSGalleryModule { + FromSource $ENV:BHPSModulePath + To PSGallery + WithOptions @{ + ApiKey = $ENV:NugetApiKey + } + } + } +} +else +{ + "Skipping deployment: To deploy, ensure that...`n" + + "`t* You are in a known build system (Current: $ENV:BHBuildSystem)`n" + + "`t* You are committing to the master branch (Current: $ENV:BHBranchName) `n" + + "`t* Your commit message includes !deploy (Current: $ENV:BHCommitMessage)" | + Write-Host +} + +# Publish to AppVeyor if we're in AppVeyor +if( + $env:BHPSModulePath -and + $env:BHBuildSystem -eq 'AppVeyor' + ) +{ + Deploy DeveloperBuild { + By AppVeyorModule { + FromSource $ENV:BHPSModulePath + To AppVeyor + WithOptions @{ + Version = $env:APPVEYOR_BUILD_VERSION + } + } + } +} \ No newline at end of file diff --git a/Unity-Powershell/Format/Unity-Powershell.UnitySystem.Format.ps1xml b/Unity-Powershell/Format/Unity-Powershell.UnitySystem.Format.ps1xml index bd9f96ce5f76a6435cac31aefda26b5195e52ca6..a29be9f9c0ea8f6f0cbf73ba3ed38736c8be086e 100644 GIT binary patch delta 76 zcmX?PH^*^>QID#C#+(8HyQP8A2I+7#x8x83',$UnityStorageRessource.id + + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" - if ($pscmdlet.ShouldProcess($LUNName,"Delete LUN")) { + if ($pscmdlet.ShouldProcess($Sess.Name,"Delete $Type $ObjectName")) { #Sending the request - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'DELETE' + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'DELETE' } - If ($request.StatusCode -eq '204') { + If ($request.StatusCode -eq $StatusCode) { - Write-Verbose "LUN with ID: $LUNID has been deleted" + Write-Verbose "$Type with ID $ObjectID has been deleted" - } + } # End If ($request.StatusCode -eq $StatusCode) } else { - Write-Verbose "LUN $LUNName does not exist on the array $($sess.Name)" - } - } - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - - End {} -} + 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 diff --git a/Unity-Powershell/Public/Connect-Unity.ps1 b/Unity-Powershell/Public/Connect-Unity.ps1 index 5e3e5d6..4bb779d 100644 --- a/Unity-Powershell/Public/Connect-Unity.ps1 +++ b/Unity-Powershell/Public/Connect-Unity.ps1 @@ -14,10 +14,14 @@ Function Connect-Unity { https://github.com/equelin/Unity-Powershell .PARAMETER Session Specifies an UnitySession Object. + .PARAMETER Server + IP or FQDN of the Unity array. .PARAMETER Username Specifies the username. .PARAMETER Password Specifies the password. It as to be a powershell's secure string. + .PARAMETER Credentials + Credentials object of type [System.Management.Automation.PSCredential] .PARAMETER TrustAllCerts Specifies if .EXAMPLE @@ -40,14 +44,14 @@ Function Connect-Unity { $Credentials = New-Object System.Management.Automation.PSCredential($Username,$secpasswd) Connect-Unity -Server $IP -Credentials $Credentials - Connects to the arrays with the IP 192.168.0.1 + Connects to the arrays with the IP 192.168.0.1 and using powershell credentials #> [CmdletBinding(DefaultParameterSetName="ByServer")] Param( [Parameter(Mandatory = $true,Position = 0,ParameterSetName="ByServer",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'EMC Unity FQDN or IP address')] [String[]]$Server, - [Parameter(Mandatory = $true,Position = 0,ParameterSetName="BySession",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'EMC Unity Session object')] + [Parameter(Mandatory = $true,ParameterSetName="BySession",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'EMC Unity Session object')] [UnitySession]$Session, [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity username')] [String]$Username, diff --git a/Unity-Powershell/Public/Disable-UnityFastCache.ps1 b/Unity-Powershell/Public/Disable-UnityFastCache.ps1 index d8f768c..b048ab2 100644 --- a/Unity-Powershell/Public/Disable-UnityFastCache.ps1 +++ b/Unity-Powershell/Public/Disable-UnityFastCache.ps1 @@ -4,7 +4,7 @@ Function Disable-UnityFastCache { .SYNOPSIS Disable FAST Cache. .DESCRIPTION - Disable FAST Cache using specified disk group and number of disks and if specified, Disable FAST Cache on all existing pools. + Disable FAST Cache. 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 @@ -49,12 +49,7 @@ Function Disable-UnityFastCache { If ($request.StatusCode -eq '202') { Write-Host "Fast Cache is currently disabling" } - - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" } } } - - End {} } diff --git a/Unity-Powershell/Public/Disconnect-Unity.ps1 b/Unity-Powershell/Public/Disconnect-Unity.ps1 index 99c5ed0..6f64039 100644 --- a/Unity-Powershell/Public/Disconnect-Unity.ps1 +++ b/Unity-Powershell/Public/Disconnect-Unity.ps1 @@ -10,6 +10,8 @@ Function Disconnect-Unity { 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 + Specifies an UnitySession Object. .EXAMPLE Disconnect-Unity diff --git a/Unity-Powershell/Public/Get-UnityAlert.ps1 b/Unity-Powershell/Public/Get-UnityAlert.ps1 index cb8d708..dc4c9c2 100644 --- a/Unity-Powershell/Public/Get-UnityAlert.ps1 +++ b/Unity-Powershell/Public/Get-UnityAlert.ps1 @@ -24,7 +24,7 @@ Function Get-UnityAlert { Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'File DNS Server ID')] + [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Alert ID')] [String[]]$ID='*' ) @@ -78,12 +78,10 @@ Function Get-UnityAlert { # Output results $Object - } - } - } - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} + } # End Foreach ($Result in $ResultCollection) + } # End If ($ResultsFiltered) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/Get-UnityBasicSystemInfo.ps1 b/Unity-Powershell/Public/Get-UnityBasicSystemInfo.ps1 index adfea0a..479de85 100644 --- a/Unity-Powershell/Public/Get-UnityBasicSystemInfo.ps1 +++ b/Unity-Powershell/Public/Get-UnityBasicSystemInfo.ps1 @@ -82,16 +82,14 @@ Function Get-UnityBasicSystemInfo { Foreach ($Result in $ResultCollection) { # Instantiate object - $Object = [UnityBasicSystemInfo]$Result + $Object = New-Object -TypeName $TypeName -Property $Result # Output results $Object - } - } - } - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} + } # End Foreach ($Result in $ResultCollection) + } # End If ($ResultsFiltered) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/Get-UnityCIFSShare.ps1 b/Unity-Powershell/Public/Get-UnityCIFSShare.ps1 index e8f3fa3..37ef5ed 100644 --- a/Unity-Powershell/Public/Get-UnityCIFSShare.ps1 +++ b/Unity-Powershell/Public/Get-UnityCIFSShare.ps1 @@ -85,16 +85,14 @@ Function Get-UnityCIFSShare { Foreach ($Result in $ResultCollection) { # Instantiate object - $Object = [UnityCIFSShare]$Result + $Object = New-Object -TypeName $TypeName -Property $Result # Output results $Object - } - } - } - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} + } # End Foreach ($Result in $ResultCollection) + } # End If ($ResultsFiltered) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/Get-UnityCifsServer.ps1 b/Unity-Powershell/Public/Get-UnityCifsServer.ps1 index 446f606..bffd7e4 100644 --- a/Unity-Powershell/Public/Get-UnityCifsServer.ps1 +++ b/Unity-Powershell/Public/Get-UnityCifsServer.ps1 @@ -19,7 +19,7 @@ Function Get-UnityCIFSServer { .EXAMPLE Get-UnityCIFSServer - Retrieve information about all block LUN + Retrieve information about all CIFS Server .EXAMPLE Get-UnityCIFSServer -Name 'SERVER01' @@ -30,9 +30,9 @@ Function Get-UnityCIFSServer { Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN Name')] + [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'CIFS Server Name')] [String[]]$Name='*', - [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN ID')] + [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'CIFS Server ID')] [String[]]$ID='*' ) @@ -85,16 +85,14 @@ Function Get-UnityCIFSServer { Foreach ($Result in $ResultCollection) { # Instantiate object - $Object = [UnityCifsServer]$Result + $Object = New-Object -TypeName $TypeName -Property $Result # Output results $Object - } - } - } - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} + } # End Foreach ($Result in $ResultCollection) + } # End If ($ResultsFiltered) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function \ No newline at end of file diff --git a/Unity-Powershell/Public/Get-UnityDisk.ps1 b/Unity-Powershell/Public/Get-UnityDisk.ps1 index f9377a6..d78a912 100644 --- a/Unity-Powershell/Public/Get-UnityDisk.ps1 +++ b/Unity-Powershell/Public/Get-UnityDisk.ps1 @@ -2,7 +2,7 @@ Function Get-UnityDisk { <# .SYNOPSIS - View details about disk on the system. + View details about disks on the system. .DESCRIPTION View details about disk on the system. You need to have an active session with the array. @@ -26,9 +26,9 @@ Function Get-UnityDisk { Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN Name')] + [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Disk Name')] [String[]]$Name='*', - [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN ID')] + [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Disk ID')] [String[]]$ID='*' ) @@ -81,16 +81,14 @@ Function Get-UnityDisk { Foreach ($Result in $ResultCollection) { # Instantiate object - $Object = [UnityDisk]$Result + $Object = New-Object -TypeName $TypeName -Property $Result # Output results $Object - } - } - } - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} \ No newline at end of file + } # End Foreach ($Result in $ResultCollection) + } # End If ($ResultsFiltered) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function \ No newline at end of file diff --git a/Unity-Powershell/Public/Get-UnityDiskGroup.ps1 b/Unity-Powershell/Public/Get-UnityDiskGroup.ps1 index e02bc72..0ea8321 100644 --- a/Unity-Powershell/Public/Get-UnityDiskGroup.ps1 +++ b/Unity-Powershell/Public/Get-UnityDiskGroup.ps1 @@ -30,9 +30,9 @@ Function Get-UnityDiskGroup { Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN Name')] + [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Disk group Name')] [String[]]$Name='*', - [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN ID')] + [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Disk group ID')] [String[]]$ID='*' ) @@ -85,16 +85,14 @@ Function Get-UnityDiskGroup { Foreach ($Result in $ResultCollection) { # Instantiate object - $Object = [UnityDiskGroup]$Result + $Object = New-Object -TypeName $TypeName -Property $Result # Output results $Object - } - } - } - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} \ No newline at end of file + } # End Foreach ($Result in $ResultCollection) + } # End If ($ResultsFiltered) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function \ No newline at end of file diff --git a/Unity-Powershell/Public/Get-UnityDnsServer.ps1 b/Unity-Powershell/Public/Get-UnityDnsServer.ps1 index 060f280..681bbfc 100644 --- a/Unity-Powershell/Public/Get-UnityDnsServer.ps1 +++ b/Unity-Powershell/Public/Get-UnityDnsServer.ps1 @@ -13,17 +13,12 @@ Function Get-UnityDNSServer { .PARAMETER Session Specifies an UnitySession Object. .EXAMPLE - Get-UnitySystem + Get-UnityDNSServer - Retrieve informations about all the arrays with an active session. - .EXAMPLE - Get-UnitySystem -Name 'UnityVSA' - - - Retrieves informations about an array named 'UnityVSA' + Retrieve informations about the DNS server. #> - [CmdletBinding(DefaultParameterSetName="ByName")] + [CmdletBinding()] Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}) @@ -63,16 +58,14 @@ Function Get-UnityDNSServer { Foreach ($Result in $ResultCollection) { - # Instantiate object - $Object = [UnityDnsServer]$Result - - # Output results - $Object - } - } - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} + # Instantiate object + $Object = New-Object -TypeName $TypeName -Property $Result + + # Output results + $Object + } # End Foreach ($Result in $ResultCollection) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/Get-UnityESXi.ps1 b/Unity-Powershell/Public/Get-UnityESXi.ps1 index 35e2c9e..7887412 100644 --- a/Unity-Powershell/Public/Get-UnityESXi.ps1 +++ b/Unity-Powershell/Public/Get-UnityESXi.ps1 @@ -19,7 +19,7 @@ Function Get-UnityESXi { .EXAMPLE Get-UnityESXi - Retrieve information about all hosts + Retrieve information about all ESXi hosts .EXAMPLE Get-UnityESXi -Name 'ESXi01' @@ -30,9 +30,9 @@ Function Get-UnityESXi { Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN Name')] + [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'ESXi Name')] [String[]]$Name='*', - [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN ID')] + [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'ESXi ID')] [String[]]$ID='*' ) @@ -86,16 +86,14 @@ Function Get-UnityESXi { Foreach ($Result in $ResultCollection) { # Instantiate object - $Object = [UnityHostContainer]$Result + $Object = New-Object -TypeName $TypeName -Property $Result # Output results $Object - } - } - } - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} \ No newline at end of file + } # End Foreach ($Result in $ResultCollection) + } # End If ($ResultsFiltered) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function \ No newline at end of file diff --git a/Unity-Powershell/Public/Get-UnityEthernetPort.ps1 b/Unity-Powershell/Public/Get-UnityEthernetPort.ps1 index bed723e..3cbe30a 100644 --- a/Unity-Powershell/Public/Get-UnityEthernetPort.ps1 +++ b/Unity-Powershell/Public/Get-UnityEthernetPort.ps1 @@ -89,12 +89,10 @@ Function Get-UnityEthernetPort { # Output results $Object - } - } - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} + } # End Foreach ($Result in $ResultCollection) + } # End If ($ResultsFiltered) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/Get-UnityFastCache.ps1 b/Unity-Powershell/Public/Get-UnityFastCache.ps1 index 3eb365e..0ff0a1b 100644 --- a/Unity-Powershell/Public/Get-UnityFastCache.ps1 +++ b/Unity-Powershell/Public/Get-UnityFastCache.ps1 @@ -29,7 +29,7 @@ Function Get-UnityFastCache { Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN ID')] + [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Fast Cache ID')] [String[]]$ID='*' ) @@ -49,7 +49,7 @@ Function Get-UnityFastCache { # Test if the Unity is a virtual appliance If ($Sess.isUnityVSA()) { - Write-Warning -Message "This functionnality is not supported on this Unity VSA ($($Sess.Name))" + Write-Warning -Message "This functionnality is not supported on the Unity VSA ($($Sess.Name))" } else { If ($Sess.TestConnection()) { @@ -84,17 +84,15 @@ Function Get-UnityFastCache { Foreach ($Result in $ResultCollection) { # Instantiate object - $Object = [UnityFastCache]$Result + $Object = New-Object -TypeName $TypeName -Property $Result # Output results $Object - } - } - } - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - } -} \ No newline at end of file + } # End Foreach ($Result in $ResultCollection) + } # End If ($ResultsFiltered) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } #End If ($Sess.isUnityVSA()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function \ No newline at end of file diff --git a/Unity-Powershell/Public/Get-UnityFeature.ps1 b/Unity-Powershell/Public/Get-UnityFeature.ps1 index b942c96..cbc788d 100644 --- a/Unity-Powershell/Public/Get-UnityFeature.ps1 +++ b/Unity-Powershell/Public/Get-UnityFeature.ps1 @@ -19,16 +19,16 @@ Function Get-UnityFeature { .EXAMPLE Get-UnityFeature - Retrieve information about all licenses + Retrieve information about all features #> [CmdletBinding(DefaultParameterSetName="ByName")] Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN Name')] + [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Feature Name')] [String[]]$Name='*', - [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN ID')] + [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Feature ID')] [String[]]$ID='*' ) @@ -81,16 +81,14 @@ Function Get-UnityFeature { Foreach ($Result in $ResultCollection) { # Instantiate object - $Object = [UnityFeature]$Result + $Object = New-Object -TypeName $TypeName -Property $Result # Output results $Object - } - } - } - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} + } # End Foreach ($Result in $ResultCollection) + } # End If ($ResultsFiltered) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/Get-UnityFileDnsServer.ps1 b/Unity-Powershell/Public/Get-UnityFileDnsServer.ps1 index 3c95bb7..5d23bb5 100644 --- a/Unity-Powershell/Public/Get-UnityFileDnsServer.ps1 +++ b/Unity-Powershell/Public/Get-UnityFileDnsServer.ps1 @@ -74,16 +74,14 @@ Function Get-UnityFileDNSServer { Foreach ($Result in $ResultCollection) { # Instantiate object - $Object = [UnityFileDnsServer]$Result + $Object = New-Object -TypeName $TypeName -Property $Result # Output results $Object - } - } - } - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} + } # End Foreach ($Result in $ResultCollection) + } # End If ($ResultsFiltered) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/Get-UnityFileInterface.ps1 b/Unity-Powershell/Public/Get-UnityFileInterface.ps1 index b81bef7..5dffe7e 100644 --- a/Unity-Powershell/Public/Get-UnityFileInterface.ps1 +++ b/Unity-Powershell/Public/Get-UnityFileInterface.ps1 @@ -82,16 +82,14 @@ Function Get-UnityFileInterface { Foreach ($Result in $ResultCollection) { # Instantiate object - $Object = [UnityFileInterface]$Result + $Object = New-Object -TypeName $TypeName -Property $Result # Output results $Object - } - } - } - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} + } # End Foreach ($Result in $ResultCollection) + } # End If ($ResultsFiltered) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/Get-UnityFilesystem.ps1 b/Unity-Powershell/Public/Get-UnityFilesystem.ps1 index 0ff3e8e..cd87186 100644 --- a/Unity-Powershell/Public/Get-UnityFilesystem.ps1 +++ b/Unity-Powershell/Public/Get-UnityFilesystem.ps1 @@ -2,9 +2,9 @@ Function Get-UnityFilesystem { <# .SYNOPSIS - Queries the EMC Unity array to retrieve informations about filesystem. + Queries the EMC Unity array to retrieve informations about filesystems. .DESCRIPTION - Querries the EMC Unity array to retrieve informations about filesystem. + Querries the EMC Unity array to retrieve informations about filesystems. 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 @@ -85,16 +85,14 @@ Function Get-UnityFilesystem { Foreach ($Result in $ResultCollection) { # Instantiate object - $Object = [UnityFilesystem]$Result + $Object = New-Object -TypeName $TypeName -Property $Result # Output results $Object - } - } - } - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} + } # End Foreach ($Result in $ResultCollection) + } # End If ($ResultsFiltered) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/Get-UnityHost.ps1 b/Unity-Powershell/Public/Get-UnityHost.ps1 index 564b7dd..2faa0d2 100644 --- a/Unity-Powershell/Public/Get-UnityHost.ps1 +++ b/Unity-Powershell/Public/Get-UnityHost.ps1 @@ -30,9 +30,9 @@ Function Get-UnityHost { Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN Name')] + [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Host Name')] [String[]]$Name='*', - [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN ID')] + [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Host ID')] [String[]]$ID='*' ) @@ -85,16 +85,14 @@ Function Get-UnityHost { Foreach ($Result in $ResultCollection) { # Instantiate object - $Object = [UnityHost]$Result + $Object = New-Object -TypeName $TypeName -Property $Result # Output results $Object - } - } - } - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} \ No newline at end of file + } # End Foreach ($Result in $ResultCollection) + } # End If ($ResultsFiltered) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function \ No newline at end of file diff --git a/Unity-Powershell/Public/Get-UnityIpInterface.ps1 b/Unity-Powershell/Public/Get-UnityIpInterface.ps1 index 983e4f0..e7fd81a 100644 --- a/Unity-Powershell/Public/Get-UnityIpInterface.ps1 +++ b/Unity-Powershell/Public/Get-UnityIpInterface.ps1 @@ -79,12 +79,10 @@ Function Get-UnityIpInterface { # Output results $Object - } - } - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} + } # End Foreach ($Result in $ResultCollection) + } # End If ($ResultsFiltered) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/Get-UnityIpPort.ps1 b/Unity-Powershell/Public/Get-UnityIpPort.ps1 index 2abaf22..33906f9 100644 --- a/Unity-Powershell/Public/Get-UnityIpPort.ps1 +++ b/Unity-Powershell/Public/Get-UnityIpPort.ps1 @@ -26,9 +26,9 @@ Function Get-UnityIPPort { Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN Name')] + [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'IP Port Name')] [String[]]$Name='*', - [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN ID')] + [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'IP Port ID')] [String[]]$ID='*' ) @@ -81,16 +81,14 @@ Function Get-UnityIPPort { Foreach ($Result in $ResultCollection) { # Instantiate object - $Object = [UnityIpPort]$Result + $Object = New-Object -TypeName $TypeName -Property $Result # Output results $Object - } - } - } - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} + } # End Foreach ($Result in $ResultCollection) + } # End If ($ResultsFiltered) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/Get-UnityIscsiPortal.ps1 b/Unity-Powershell/Public/Get-UnityIscsiPortal.ps1 index 5a18a60..c124fdd 100644 --- a/Unity-Powershell/Public/Get-UnityIscsiPortal.ps1 +++ b/Unity-Powershell/Public/Get-UnityIscsiPortal.ps1 @@ -79,12 +79,10 @@ Function Get-UnityIscsiPortal { # Output results $Object - } - } - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} + } # End Foreach ($Result in $ResultCollection) + } # End If ($ResultsFiltered) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/Get-UnityItem.ps1 b/Unity-Powershell/Public/Get-UnityItem.ps1 index 5456d3f..f70fdea 100644 --- a/Unity-Powershell/Public/Get-UnityItem.ps1 +++ b/Unity-Powershell/Public/Get-UnityItem.ps1 @@ -11,6 +11,12 @@ Function Get-UnityItem { 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 + Specifies an UnitySession Object. + .PARAMETER URI + URI of the Unity ressource (ex: /api/types/lun/instances) + .PARAMETER JSON + Output in the JSON Format .EXAMPLE Get-UnityItem -URI '/api/types/pool/instances' @@ -27,7 +33,7 @@ Function Get-UnityItem { $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), [Parameter(Mandatory = $true,HelpMessage = 'EMC Unity Session')] [String]$URI, - [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] + [Parameter(Mandatory = $false,HelpMessage = 'Output in the JSON Format')] [Switch]$JSON ) diff --git a/Unity-Powershell/Public/Get-UnityLicense.ps1 b/Unity-Powershell/Public/Get-UnityLicense.ps1 index d2baacb..0934517 100644 --- a/Unity-Powershell/Public/Get-UnityLicense.ps1 +++ b/Unity-Powershell/Public/Get-UnityLicense.ps1 @@ -26,9 +26,9 @@ Function Get-UnityLicense { Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN Name')] + [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Licence Name')] [String[]]$Name='*', - [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN ID')] + [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Licence ID')] [String[]]$ID='*' ) @@ -80,14 +80,15 @@ Function Get-UnityLicense { Foreach ($Result in $ResultCollection) { + # Instantiate object + $Object = New-Object -TypeName $TypeName -Property $Result + # Output results - [UnityLicense]$Result - } - } - } - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} + $Object + } # End Foreach ($Result in $ResultCollection) + } # End If ($ResultsFiltered) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function \ No newline at end of file diff --git a/Unity-Powershell/Public/Get-UnityMgmtInterface.ps1 b/Unity-Powershell/Public/Get-UnityMgmtInterface.ps1 index 350fe55..5337384 100644 --- a/Unity-Powershell/Public/Get-UnityMgmtInterface.ps1 +++ b/Unity-Powershell/Public/Get-UnityMgmtInterface.ps1 @@ -24,7 +24,7 @@ Function Get-UnityMgmtInterface { Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'File DNS Server ID')] + [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Mgmt interface ID')] [String[]]$ID='*' ) @@ -78,12 +78,10 @@ Function Get-UnityMgmtInterface { # Output results $Object - } - } - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} + } # End Foreach ($Result in $ResultCollection) + } # End If ($ResultsFiltered) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/Get-UnityMgmtInterfaceSettings.ps1 b/Unity-Powershell/Public/Get-UnityMgmtInterfaceSettings.ps1 index fa35658..4c32f72 100644 --- a/Unity-Powershell/Public/Get-UnityMgmtInterfaceSettings.ps1 +++ b/Unity-Powershell/Public/Get-UnityMgmtInterfaceSettings.ps1 @@ -58,16 +58,14 @@ Function Get-UnityMgmtInterfaceSettings { Foreach ($Result in $ResultCollection) { - # Instantiate object - $Object = New-Object -TypeName $TypeName -Property $Result - - # Output results - $Object - } - } - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} + # Instantiate object + $Object = New-Object -TypeName $TypeName -Property $Result + + # Output results + $Object + } # End Foreach ($Result in $ResultCollection) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/Get-UnityNTPServer.ps1 b/Unity-Powershell/Public/Get-UnityNTPServer.ps1 index bf9ce05..5b47e9a 100644 --- a/Unity-Powershell/Public/Get-UnityNTPServer.ps1 +++ b/Unity-Powershell/Public/Get-UnityNTPServer.ps1 @@ -58,16 +58,14 @@ Function Get-UnityNTPServer { Foreach ($Result in $ResultCollection) { - # Instantiate object - $Object = [UnityNTPServer]$Result - - # Output results - $Object - } - } - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} + # Instantiate object + $Object = New-Object -TypeName $TypeName -Property $Result + + # Output results + $Object + } # End Foreach ($Result in $ResultCollection) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function \ No newline at end of file diff --git a/Unity-Powershell/Public/Get-UnityNasServer.ps1 b/Unity-Powershell/Public/Get-UnityNasServer.ps1 index 9ac9a2b..d02a794 100644 --- a/Unity-Powershell/Public/Get-UnityNasServer.ps1 +++ b/Unity-Powershell/Public/Get-UnityNasServer.ps1 @@ -30,9 +30,9 @@ Function Get-UnityNASServer { Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN Name')] + [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'NAS Server Name')] [String[]]$Name='*', - [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN ID')] + [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'NAS Server ID')] [String[]]$ID='*' ) @@ -85,16 +85,14 @@ Function Get-UnityNASServer { Foreach ($Result in $ResultCollection) { # Instantiate object - $Object = [UnityNasServer]$Result + $Object = New-Object -TypeName $TypeName -Property $Result # Output results $Object - } - } - } - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} + } # End Foreach ($Result in $ResultCollection) + } # End If ($ResultsFiltered) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/Get-UnityPool.ps1 b/Unity-Powershell/Public/Get-UnityPool.ps1 index 0578d53..fe99596 100644 --- a/Unity-Powershell/Public/Get-UnityPool.ps1 +++ b/Unity-Powershell/Public/Get-UnityPool.ps1 @@ -30,9 +30,9 @@ Function Get-UnityPool { Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN Name')] + [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Pool Name')] [String[]]$Name='*', - [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN ID')] + [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Pool ID')] [String[]]$ID='*' ) @@ -85,19 +85,14 @@ Function Get-UnityPool { Foreach ($Result in $ResultCollection) { # Instantiate object - $Object = [UnityPool]$Result - - # Convert to MB - #$Object.ConvertToMB() + $Object = New-Object -TypeName $TypeName -Property $Result # Output results $Object - } - } - } - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} + } # End Foreach ($Result in $ResultCollection) + } # End If ($ResultsFiltered) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/Get-UnityPoolUnit.ps1 b/Unity-Powershell/Public/Get-UnityPoolUnit.ps1 index bd05a39..f00e665 100644 --- a/Unity-Powershell/Public/Get-UnityPoolUnit.ps1 +++ b/Unity-Powershell/Public/Get-UnityPoolUnit.ps1 @@ -30,9 +30,9 @@ Function Get-UnityPoolUnit { Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN Name')] + [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Pool Unit Name')] [String[]]$Name='*', - [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN ID')] + [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Pool Unit ID')] [String[]]$ID='*' ) @@ -85,16 +85,14 @@ Function Get-UnityPoolUnit { Foreach ($Result in $ResultCollection) { # Instantiate object - $Object = [UnityPoolUnit]$Result + $Object = New-Object -TypeName $TypeName -Property $Result # Output results $Object - } - } - } - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} + } # End Foreach ($Result in $ResultCollection) + } # End If ($ResultsFiltered) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/Get-UnitySession.ps1 b/Unity-Powershell/Public/Get-UnitySession.ps1 index 63d38d7..823e08b 100644 --- a/Unity-Powershell/Public/Get-UnitySession.ps1 +++ b/Unity-Powershell/Public/Get-UnitySession.ps1 @@ -9,6 +9,8 @@ Function Get-UnitySession { Written by Erwan Quelin under MIT licence .LINK https://github.com/equelin/Unity-Powershell + .PARAMETER Server + IP or FQDN of the Unity array. .EXAMPLE Get-UnitySession diff --git a/Unity-Powershell/Public/Get-UnitySmtpServer.ps1 b/Unity-Powershell/Public/Get-UnitySmtpServer.ps1 index a894980..d605152 100644 --- a/Unity-Powershell/Public/Get-UnitySmtpServer.ps1 +++ b/Unity-Powershell/Public/Get-UnitySmtpServer.ps1 @@ -1,4 +1,4 @@ -Function Get-UnitySmtpServer { +Function Get-UnitySMTPServer { <# .SYNOPSIS @@ -15,9 +15,9 @@ Function Get-UnitySmtpServer { .PARAMETER ID Specifies the object ID. .EXAMPLE - Get-UnitySmtpServer + Get-UnitySMTPServer - Retrieve informations about all the smtp servers. + Retrieve informations about all the SMTP servers. #> [CmdletBinding(DefaultParameterSetName="ByID")] @@ -78,12 +78,10 @@ Function Get-UnitySmtpServer { # Output results $Object - } - } - } - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} + } # End Foreach ($Result in $ResultCollection) + } # End If ($ResultsFiltered) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/Get-UnityStorageResource.ps1 b/Unity-Powershell/Public/Get-UnityStorageResource.ps1 index 99e4936..3853f3a 100644 --- a/Unity-Powershell/Public/Get-UnityStorageResource.ps1 +++ b/Unity-Powershell/Public/Get-UnityStorageResource.ps1 @@ -35,9 +35,9 @@ Function Get-UnitystorageResource { Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN Name')] + [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Storage Resource Name')] [String[]]$Name='*', - [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN ID')] + [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Storage Resource ID')] [String[]]$ID='*', [Parameter(Mandatory = $false,HelpMessage = 'Storage ressource type')] [ValidateSet('lun','vmwareiscsi','vmwarefs')] @@ -99,19 +99,17 @@ Function Get-UnitystorageResource { Foreach ($Result in $ResultCollection) { # Instantiate object - $Object = [UnitystorageResource]$Result + $Object = New-Object -TypeName $TypeName -Property $Result # Convert to MB #$Object.ConvertToMB() - + # Output results $Object - } - } - } - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} + } # End Foreach ($Result in $ResultCollection) + } # End If ($ResultsFiltered) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/Get-UnitySystem.ps1 b/Unity-Powershell/Public/Get-UnitySystem.ps1 index a82c5ef..4e3ad9b 100644 --- a/Unity-Powershell/Public/Get-UnitySystem.ps1 +++ b/Unity-Powershell/Public/Get-UnitySystem.ps1 @@ -31,9 +31,9 @@ Function Get-UnitySystem { Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN Name')] + [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Unity Name')] [String[]]$Name='*', - [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN ID')] + [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Unity ID')] [String[]]$ID='*' ) @@ -86,16 +86,14 @@ Function Get-UnitySystem { Foreach ($Result in $ResultCollection) { # Instantiate object - $Object = [UnitySystem]$Result + $Object = New-Object -TypeName $TypeName -Property $Result # Output results $Object - } - } - } - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} + } # End Foreach ($Result in $ResultCollection) + } # End If ($ResultsFiltered) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/Get-UnityUser.ps1 b/Unity-Powershell/Public/Get-UnityUser.ps1 index f26a729..ae0fb97 100644 --- a/Unity-Powershell/Public/Get-UnityUser.ps1 +++ b/Unity-Powershell/Public/Get-UnityUser.ps1 @@ -30,9 +30,9 @@ Function Get-UnityUser { Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN Name')] + [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'User Name')] [String[]]$Name='*', - [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN ID')] + [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'User ID')] [String[]]$ID='*' ) @@ -85,16 +85,14 @@ Function Get-UnityUser { Foreach ($Result in $ResultCollection) { # Instantiate object - $Object = [UnityUser]$Result + $Object = New-Object -TypeName $TypeName -Property $Result # Output results $Object - } - } - } - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} + } # End Foreach ($Result in $ResultCollection) + } # End If ($ResultsFiltered) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/Get-UnityVMwareLUN.ps1 b/Unity-Powershell/Public/Get-UnityVMwareLUN.ps1 index 6df41c7..252dc03 100644 --- a/Unity-Powershell/Public/Get-UnityVMwareLUN.ps1 +++ b/Unity-Powershell/Public/Get-UnityVMwareLUN.ps1 @@ -30,9 +30,9 @@ Function Get-UnityVMwareLUN { Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN Name')] + [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'VMware LUN Name')] [String[]]$Name='*', - [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN ID')] + [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'VMware LUN ID')] [String[]]$ID='*' ) @@ -76,9 +76,7 @@ Function Get-UnityVMwareLUN { Write-Output $ResultCollection | Where-Object {$_.Id -like $I} } } - } - } - } - - End {} -} + } #End Switch + } # End If ($ResultCollection) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/Get-UnityvCenter.ps1 b/Unity-Powershell/Public/Get-UnityvCenter.ps1 index 877a35b..5f28804 100644 --- a/Unity-Powershell/Public/Get-UnityvCenter.ps1 +++ b/Unity-Powershell/Public/Get-UnityvCenter.ps1 @@ -30,9 +30,9 @@ Function Get-UnityvCenter { Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN Name')] + [Parameter(Mandatory = $false,ParameterSetName="ByName",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'vCenter Name')] [String[]]$Name='*', - [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN ID')] + [Parameter(Mandatory = $false,ParameterSetName="ByID",ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'vCenter ID')] [String[]]$ID='*' ) @@ -86,16 +86,14 @@ Function Get-UnityvCenter { Foreach ($Result in $ResultCollection) { # Instantiate object - $Object = [UnityHostContainer]$Result + $Object = New-Object -TypeName $TypeName -Property $Result # Output results $Object - } - } - } - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } -} \ No newline at end of file + } # End Foreach ($Result in $ResultCollection) + } # End If ($ResultsFiltered) + } # End If ($Results) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function \ No newline at end of file diff --git a/Unity-Powershell/Public/New-UnityCIFSShare.ps1 b/Unity-Powershell/Public/New-UnityCIFSShare.ps1 index 617bb59..18d9a75 100644 --- a/Unity-Powershell/Public/New-UnityCIFSShare.ps1 +++ b/Unity-Powershell/Public/New-UnityCIFSShare.ps1 @@ -10,25 +10,51 @@ Function New-UnityCIFSShare { 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 Filesystem + Specify Filesystem ID + .PARAMETER Path + Local path to a location within a file system. + .PARAMETER Name + Name of the CIFS share unique to NAS server + .PARAMETER cifsServer + CIFS server ID to use for CIFS share creation, as defined by the cifsServer type + .PARAMETER description + CIFS share description + .PARAMETER isReadOnly + Indicates whether the CIFS share is read-only + .PARAMETER isEncryptionEnabled + Indicates whether CIFS encryption for Server Message Block (SMB) 3.0 is enabled for the CIFS share + .PARAMETER isContinuousAvailabilityEnabled + Indicates whether continuous availability for SMB 3.0 is enabled for the CIFS share + .PARAMETER isABEEnabled + Enumerate file with read access and directories with list access in folder listings + .PARAMETER isBranchCacheEnabled + Branch Cache optimizes traffic between the NAS server and Branch Office Servers + .PARAMETER offlineAvailability + Offline Files store a version of the shared resources on the client computer in the file system cache, a reserved portion of disk space, which the client computer can access even when it is disconnected from the network + .PARAMETER umask + The default UNIX umask for new files created on the share .EXAMPLE - New-UnityCIFSShare -Name 'FS01' -Description 'Modified description' + New-UnityCIFSShare -Filesystem 'fs_1' -Name 'SHARE01' -path '/' -cifsServer 'cifs_1' - Change the description of the filesystem named FS01 + Create a new CIFS Share named 'SHARE01' #> - [CmdletBinding()] + [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')] + [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Filesystem ID')] [String[]]$Filesystem, #cifsShareCreate - [Parameter(Mandatory = $false,HelpMessage = 'Local path to a location within a file system')] - [String]$path, + [Parameter(Mandatory = $true,HelpMessage = 'Local path to a location within a file system')] + [String]$Path, [Parameter(Mandatory = $true,HelpMessage = 'Name of the CIFS share unique to NAS server')] [String]$Name, [Parameter(Mandatory = $true,HelpMessage = 'CIFS server ID to use for CIFS share creation, as defined by the cifsServer type')] @@ -55,6 +81,12 @@ Function New-UnityCIFSShare { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + ## Variables + $URI = '/api/instances/storageResource//action/modifyFilesystem' + $Type = 'Share CIFS' + $TypeName = 'UnityFilesystem' + $StatusCode = 204 } Process { @@ -71,22 +103,32 @@ Function New-UnityCIFSShare { Switch ($fs.GetType().Name) { "String" { - $fs = get-UnityFilesystem -Session $Sess -Name $fs - $filesystemID = $fs.id - $filesystemName = $fs.Name + $Object = get-UnityFilesystem -Session $Sess -ID $fs + $ObjectID = $Object.id + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } - "UnityFilesystem" { - Write-Verbose "Input object type is $($n.GetType().Name)" - $filesystemName = $fs.Name - If ($filesystem = Get-UnityFilesystem -Session $Sess -Name $fs) { - $filesystemID = $fs.id + "$TypeName" { + Write-Verbose "Input object type is $($i.GetType().Name)" + $ObjectID = $fs.id + If ($Object = Get-UnityFilesystem -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } } } - If ($filesystemID) { + If ($ObjectID) { + + #### REQUEST BODY - $UnityStorageRessource = Get-UnitystorageResource -Session $sess | ? {($_.Name -like $filesystemName) -and ($_.filesystem.id -like $filesystemID)} + $UnityStorageRessource = Get-UnitystorageResource -Session $sess | ? {($_.Name -like $ObjectName) -and ($_.filesystem.id -like $ObjectID)} # Creation of the body hash $body = @{} @@ -151,29 +193,35 @@ Function New-UnityCIFSShare { $body["cifsShareCreate"] += $cifsShareCreateParameters - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/storageResource/'+($UnityStorageRessource.id)+'/action/modifyFilesystem' - Write-Verbose "URI: $URI" + ####### 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 + $URI = $URI -replace '',$UnityStorageRessource.id + + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" #Sending the request - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body + If ($pscmdlet.ShouldProcess($Sess.Name,"Create $Type $name")) { + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'POST' -Body $Body + } - If ($request.StatusCode -eq '204') { + If ($request.StatusCode -eq $StatusCode) { - Write-Verbose "CIFS Share named $name on filesystem $filesystemName has been created" + Write-Verbose "$Type with ID $ObjectID has been modified" - Get-UnityCIFSShare -Session $Sess -id $filesystemID + Get-UnityCIFSShare -Session $Sess -Name $name - } + } # End If ($request.StatusCode -eq $StatusCode) } 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 {} -} + Write-Warning -Message "$Type with ID $i does not exist on the array $($sess.Name)" + } # End If ($ObjectID) + } # End Foreach ($fs in $Filesystem) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/New-UnityCifsServer.ps1 b/Unity-Powershell/Public/New-UnityCifsServer.ps1 index 6555971..0d6d215 100644 --- a/Unity-Powershell/Public/New-UnityCifsServer.ps1 +++ b/Unity-Powershell/Public/New-UnityCifsServer.ps1 @@ -2,28 +2,60 @@ Function New-UnityCIFSServer { <# .SYNOPSIS - Creates a pool. + Create an SMB/CIFS server. .DESCRIPTION - Creates a pool. + Create an SMB/CIFS 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 + .PARAMETER Session + Specify an UnitySession Object. + .PARAMETER nasServer + ID of the NAS server to which the SMB server belongs. + .PARAMETER netbiosName + Computer name of the SMB server in Windows network. + .PARAMETER name + User friendly, descriptive name of SMB server. + .PARAMETER description + Description of the SMB server. + .PARAMETER domain + Domain name where SMB server is registered in Active Directory, if applicable. + .PARAMETER organizationalUnit + LDAP organizational unit of SMB server in Active Directory, if applicable. + .PARAMETER domainUsername + Active Directory domain user name. + .PARAMETER domainPassword + Active Directory domain password. + .PARAMETER reuseComputerAccount + Reuse existing SMB server account in the Active Directory. + .PARAMETER workgroup + Standalone SMB server workgroup. + .PARAMETER localAdminPassword + Standalone SMB server administrator password. + .PARAMETER interfaces + List of file IP interfaces that service CIFS protocol of SMB server. + .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 - New-UnityCifsServer -nasServer 'nas_1' -Name 'CIFS01' + New-UnityCIFSServer -Name CIFS01 -nasServer 'nas_6' -domain 'example.com' -domainUsername 'administrator' -domainPassword 'Password#123' -interfaces 'if_1' Create CIFS Server named 'CIFS01' #> - [CmdletBinding(DefaultParameterSetName="AD")] + [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High',DefaultParameterSetName="AD")] Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $false,Position = 1,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Pool Name')] + [Parameter(Mandatory = $false,Position = 1,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'User friendly, descriptive name of SMB server')] [String[]]$Name, [Parameter(Mandatory = $true,HelpMessage = 'ID of the NAS server to which the SMB server belongs')] [String]$nasServer, + [Parameter(Mandatory = $false,HelpMessage = 'Computer name of the SMB server in Windows network')] + [String]$netbiosName, [Parameter(Mandatory = $false,HelpMessage = 'Description of the SMB server')] [String]$Description, [Parameter(Mandatory = $false,ParameterSetName="AD",HelpMessage = 'Domain name where SMB server is registered in Active Directory, if applicable.')] @@ -47,8 +79,10 @@ Function New-UnityCIFSServer { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" - #Initialazing arrays - $ResultCollection = @() + ## Variables + $URI = '/api/types/cifsServer/instances' + $Type = 'Server CIFS' + $StatusCode = 201 } Process { @@ -58,6 +92,8 @@ Function New-UnityCIFSServer { Foreach ($n in $Name) { + #### REQUEST BODY + # Creation of the body hash $body = @{} @@ -118,40 +154,45 @@ Function New-UnityCIFSServer { } #interfaces argument - $body['interfaces'] = @() - Foreach ($int in $interfaces) { - $ÎntArgument = @{} - $ÎntArgument['id'] = "$($int)" - $body["interfaces"] += $ÎntArgument + If ($PSBoundParameters.ContainsKey('interfaces')) { + $body['interfaces'] = @() + Foreach ($int in $interfaces) { + $ÎntArgument = @{} + $ÎntArgument['id'] = "$($int)" + $body["interfaces"] += $ÎntArgument + } } + ####### END BODY - Do not edit beyond this line + + #Show $body in verbose message + $Json = $body | ConvertTo-Json -Depth 10 + Write-Verbose $Json + If ($Sess.TestConnection()) { - #Building the URI - $URI = 'https://'+$sess.Server+'/api/types/cifsServer/instances' - Write-Verbose "URI: $URI" + ##Building the URL + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" #Sending the request - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body + If ($pscmdlet.ShouldProcess($Sess.Name,"Create $Type $n")) { + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'POST' -Body $Body + } Write-Verbose "Request status code: $($request.StatusCode)" - If ($request.StatusCode -eq '201') { + If ($request.StatusCode -eq $StatusCode) { #Formating the result. Converting it from JSON to a Powershell object $results = ($request.content | ConvertFrom-Json).content - Write-Verbose "CIFS Server created with the ID: $($results.id) " + Write-Verbose "$Type with the ID $($results.id) has been created" - #Executing Get-UnityUser with the ID of the new user Get-UnityCifsServer -Session $Sess -ID $results.id - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - } - - End {} -} + } # End If ($request.StatusCode -eq $StatusCode) + } # End If ($Sess.TestConnection()) + } # End Foreach + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/New-UnityFileDnsServer.ps1 b/Unity-Powershell/Public/New-UnityFileDnsServer.ps1 index a6189f9..3585c4e 100644 --- a/Unity-Powershell/Public/New-UnityFileDnsServer.ps1 +++ b/Unity-Powershell/Public/New-UnityFileDnsServer.ps1 @@ -2,25 +2,38 @@ Function New-UnityFileDNSServer { <# .SYNOPSIS - Creates a DNS file server. + Create a new DNS server for a NAS Server. .DESCRIPTION - Creates a DNS file server. + Create a new DNS server for a NAS Server. + Only one instance can be created per 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 + .PARAMETER Session + Specify an UnitySession Object. + .PARAMETER nasServer + ID of the NAS server to which the DNS server belongs. + .PARAMETER domain + DNS domain name + .PARAMETER addresses + Prioritized list of one to three IPv4 and/or IPv6 addresses of DNS server(s) for the domain + .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 New-UnityFileDNSServer -nasServer 'nas_1' -domain 'example.com' -ip '192.168.0.1','192.168.0.2' Create a DNS file server associated to NAS server 'nas_1' #> - [CmdletBinding()] + [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] 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')] + [Parameter(Mandatory = $true,Position = 1,HelpMessage = 'ID of the NAS server to which the DNS server belongs')] $nasServer, [Parameter(Mandatory = $true,HelpMessage = 'DNS domain name')] [string]$domain, @@ -31,8 +44,10 @@ Function New-UnityFileDNSServer { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" - #Initialazing arrays - $ResultCollection = @() + ## Variables + $URI = '/api/types/fileDNSServer/instances' + $Type = 'File DNS Server' + $StatusCode = 201 } Process { @@ -40,6 +55,8 @@ Function New-UnityFileDNSServer { Write-Verbose "Processing Session: $($sess.Server) with SessionId: $($sess.SessionId)" + #### REQUEST BODY + # Creation of the body hash $body = @{} @@ -59,33 +76,36 @@ Function New-UnityFileDNSServer { $body["domain"] = "$($domain)" } + ####### END BODY - Do not edit beyond this line + + #Show $body in verbose message + $Json = $body | ConvertTo-Json -Depth 10 + Write-Verbose $Json + If ($Sess.TestConnection()) { - #Building the URI - $URI = 'https://'+$sess.Server+'/api/types/fileDNSServer/instances' - Write-Verbose "URI: $URI" + ##Building the URL + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" #Sending the request - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body + If ($pscmdlet.ShouldProcess($Sess.Name,"Create $Type $domain")) { + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'POST' -Body $Body + } Write-Verbose "Request status code: $($request.StatusCode)" - If ($request.StatusCode -eq '201') { + If ($request.StatusCode -eq $StatusCode) { #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) " + Write-Verbose "$Type with the ID $($results.id) has been created" #Executing Get-UnityUser with the ID of the new user Get-UnityFileDNSServer -Session $Sess -ID $results.id - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - - } - } - - End {} -} + } # End If ($request.StatusCode -eq $StatusCode) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/New-UnityFileInterface.ps1 b/Unity-Powershell/Public/New-UnityFileInterface.ps1 index cb6fe3d..8ab12ca 100644 --- a/Unity-Powershell/Public/New-UnityFileInterface.ps1 +++ b/Unity-Powershell/Public/New-UnityFileInterface.ps1 @@ -4,19 +4,45 @@ Function New-UnityFileInterface { .SYNOPSIS Creates a File Interface. .DESCRIPTION - Creates a NAS Server. + Creates a File Interface. + These interfaces control access to Windows (CIFS) and UNIX/Linux (NFS) file storage. 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 nasServer + ID of the NAS server to which the network interface belongs + .PARAMETER ipPort + Physical port or link aggregation on the storage processor on which the interface is running + .PARAMETER ipAddress + IP address of the network interface + .PARAMETER netmask + IPv4 netmask for the network interface, if it uses an IPv4 address + .PARAMETER v6PrefixLength + IPv6 prefix length for the interface, if it uses an IPv6 address + .PARAMETER gateway + IPv4 or IPv6 gateway address for the network interface + .PARAMETER vlanId + LAN identifier for the interface. The interface uses the identifier to accept packets that have matching VLAN tags. Values are 1 - 4094. + .PARAMETER isPreferred + Sets the current IP interface as preferred for associated for file-based storage and unsets the previous one + .PARAMETER role + Role of NAS server network interface + .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 - 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. + New-UnityFileInterface -ipPort spa_eth0 -nasServer nas_6 -ipAddress 192.168.0.1 -netmask 255.255.255.0 -gateway 192.168.0.254 + + Create interface on the ethernet port 'spa_eth0' associated to the NAS server 'nas_6' #> - [CmdletBinding()] + [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), @@ -37,19 +63,16 @@ Function New-UnityFileInterface { [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 + [FileInterfaceRoleEnum]$role ) Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" - #Initialazing arrays - $ResultCollection = @() - - $FileInterfaceRoleEnum = @{ - "Production" = "0" - "Backup" = "1" - } + # Variables + $URI = '/api/types/fileInterface/instances' + $Type = 'File Interface' + $StatusCode = 201 } @@ -97,36 +120,39 @@ Function New-UnityFileInterface { } If ($PSBoundParameters.ContainsKey('role')) { - $body["role"] = "$($FileInterfaceRoleEnum["$($role)"])" + $body["role"] = "$role" } - If ($Sess.TestConnection()) { + ####### END BODY - Do not edit beyond this line - #Building the URI - $URI = 'https://'+$sess.Server+'/api/types/fileInterface/instances' - Write-Verbose "URI: $URI" + #Show $body in verbose message + $Json = $body | ConvertTo-Json -Depth 10 + Write-Verbose $Json - #Sending the request - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body + If ($Sess.TestConnection()) { - Write-Verbose "Request status code: $($request.StatusCode)" + ##Building the URL + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" - If ($request.StatusCode -eq '201') { + #Sending the request + If ($pscmdlet.ShouldProcess($Sess.Name,"Create $Type on $ipPort")) { + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'POST' -Body $Body + } - #Formating the result. Converting it from JSON to a Powershell object - $results = ($request.content | ConvertFrom-Json).content + Write-Verbose "Request status code: $($request.StatusCode)" - Write-Verbose "File interface created with the ID: $($results.id) " + If ($request.StatusCode -eq $StatusCode) { - #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)" - } + #Formating the result. Converting it from JSON to a Powershell object + $results = ($request.content | ConvertFrom-Json).content - } - } + Write-Verbose "$Type with the ID $($results.id) has been created" - End {} -} + #Executing Get-UnityUser with the ID of the new user + Get-UnityFileInterface -Session $Sess -ID $results.id + } # End If ($request.StatusCode -eq $StatusCode) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/New-UnityFilesystem.ps1 b/Unity-Powershell/Public/New-UnityFilesystem.ps1 index 4c5adfc..ea93df7 100644 --- a/Unity-Powershell/Public/New-UnityFilesystem.ps1 +++ b/Unity-Powershell/Public/New-UnityFilesystem.ps1 @@ -10,13 +10,60 @@ Function New-UnityFilesystem { 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 + Filesystem Name + .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 Pool + Filesystem Pool ID + .PARAMETER nasServer + Filesystem nasServer ID + .PARAMETER supportedProtocols + Filesystem supported protocols + .PARAMETER isFLREnabled + Indicates whether File Level Retention (FLR) is enabled for the file system + .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 - New-UnityFilesystem -Name 'FS01' -Pool 'pool_1' -Size 3298534883328 -nasServer 'nas_1' -supportedProtocols 'CIFS' + New-UnityFilesystem -Name 'FS01' -Pool 'pool_1' -Size 10GB -nasServer 'nas_1' -supportedProtocols 'CIFS' - Create CIFS filesystem named 'FS01' on pool 'pool_1' and with a size of '3298534883328' bytes + Create CIFS filesystem named 'FS01' on pool 'pool_1' and with a size of '10GB' bytes #> - [CmdletBinding()] + [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] Param ( #Default Parameters @@ -36,7 +83,7 @@ Function New-UnityFilesystem { #fsParameters [Parameter(Mandatory = $true,HelpMessage = 'Filesystem Pool ID')] [String]$Pool, - [Parameter(Mandatory = $true,HelpMessage = 'Filesystem nasServer')] + [Parameter(Mandatory = $true,HelpMessage = 'Filesystem nasServer ID')] [String]$nasServer, [Parameter(Mandatory = $true,HelpMessage = 'Filesystem supported protocols')] [FSSupportedProtocolEnum]$supportedProtocols, @@ -44,7 +91,7 @@ Function New-UnityFilesystem { [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')] + [Parameter(Mandatory = $true,HelpMessage = 'Filesystem Size')] [uint64]$Size, [Parameter(Mandatory = $false,HelpMessage = 'Typical write I/O size from the host to the file system')] [HostIOSizeEnum]$hostIOSize, @@ -74,6 +121,11 @@ Function New-UnityFilesystem { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + ## Variables + $URI = '/api/types/storageResource/action/createFilesystem' + $Type = 'Filesystem' + $StatusCode = 200 } Process { @@ -83,6 +135,8 @@ Function New-UnityFilesystem { Foreach ($n in $Name) { + #### REQUEST BODY + # Creation of the body hash $body = @{} @@ -188,34 +242,38 @@ Function New-UnityFilesystem { $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 + If ($Sess.TestConnection()) { - #Building the URI - $URI = 'https://'+$sess.Server+'/api/types/storageResource/action/createFilesystem' - Write-Verbose "URI: $URI" + ##Building the URL + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" #Sending the request - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body + If ($pscmdlet.ShouldProcess($Sess.Name,"Create $Type $n")) { + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'POST' -Body $Body + } Write-Verbose "Request status code: $($request.StatusCode)" - If ($request.StatusCode -eq '200') { + If ($request.StatusCode -eq $StatusCode) { #Formating the result. Converting it from JSON to a Powershell object - $results = ($request.content | ConvertFrom-Json).content.storageResource + $results = ($request.content | ConvertFrom-Json).content - Write-Verbose "Filesystem created with the storage resource ID: $($results.id) " + $Storageresource = Get-UnitystorageResource -session $Sess -ID $results.storageResource.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)" - } - } - } - } + Write-Verbose "$Type with the ID $($Storageresource.Filesystem.id) has been created" - End { - } -} + Get-UnityFilesystem -Session $Sess -ID $Storageresource.Filesystem.id + } # End If ($request.StatusCode -eq $StatusCode) + } # End If ($Sess.TestConnection()) + } # End Foreach + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/New-UnityIscsiPortal.ps1 b/Unity-Powershell/Public/New-UnityIscsiPortal.ps1 index eb2ff34..654d34f 100644 --- a/Unity-Powershell/Public/New-UnityIscsiPortal.ps1 +++ b/Unity-Powershell/Public/New-UnityIscsiPortal.ps1 @@ -1,4 +1,4 @@ -Function New-UnityIscsiPortal { +Function New-UnityiSCSIPortal { <# .SYNOPSIS @@ -24,13 +24,18 @@ Function New-UnityIscsiPortal { IPv4 or IPv6 gateway address for the iSCSI Network Portal. .PARAMETER vlanId Ethernet virtual LAN identifier used for tagging iSCSI portal outgoing packets and for filtering iSCSI portal incoming packets. + .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 - New-UnityIscsiPortal -ipAddress '192.168.0.1' -netmask '255.255.255.0' -gateway '192.168.0.254' + New-UnityiSCSIPortal -ethernetPort 'spa_eth0' -ipAddress '192.168.0.1' -netmask '255.255.255.0' -gateway '192.168.0.254' Create a new iSCSI portal. #> - [CmdletBinding()] + [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), @@ -51,8 +56,10 @@ Function New-UnityIscsiPortal { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" - #Initialazing arrays - $ResultCollection = @() + ## Variables + $URI = '/api/types/iscsiPortal/instances' + $Type = 'iSCSI Portal' + $StatusCode = 201 } Process { @@ -60,6 +67,8 @@ Function New-UnityIscsiPortal { Write-Verbose "Processing Session: $($sess.Server) with SessionId: $($sess.SessionId)" + #### REQUEST BODY + #Creation of the body hash $body = @{} @@ -89,33 +98,35 @@ Function New-UnityIscsiPortal { $body["gateway"] = "$($gateway)" } - If ($Sess.TestConnection()) { + ####### END BODY - Do not edit beyond this line - #Building the URI - $URI = 'https://'+$sess.Server+'/api/types/iscsiPortal/instances' - Write-Verbose "URI: $URI" + #Show $body in verbose message + $Json = $body | ConvertTo-Json -Depth 10 + Write-Verbose $Json - #Sending the request - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body + If ($Sess.TestConnection()) { - Write-Verbose "Request status code: $($request.StatusCode)" + ##Building the URL + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" - If ($request.StatusCode -eq '201') { + #Sending the request + If ($pscmdlet.ShouldProcess($Sess.Name,"Create $Type $n")) { + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'POST' -Body $Body + } - #Formating the result. Converting it from JSON to a Powershell object - $results = ($request.content | ConvertFrom-Json).content + Write-Verbose "Request status code: $($request.StatusCode)" - Write-Verbose "iSCSI Portal created with the ID: $($results.id) " + If ($request.StatusCode -eq $StatusCode) { - #Executing Get-UnityIscsiPortal - Get-UnityIscsiPortal -Session $Sess -Id $results.id - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } + #Formating the result. Converting it from JSON to a Powershell object + $results = ($request.content | ConvertFrom-Json).content - } - } + Write-Verbose "$Type with the ID $($results.id) has been created" - End {} -} + Get-UnityiSCSIPortal -Session $Sess -Id $results.id + } # End If ($request.StatusCode -eq $StatusCode) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/New-UnityLUN.ps1 b/Unity-Powershell/Public/New-UnityLUN.ps1 index a885f01..462577e 100644 --- a/Unity-Powershell/Public/New-UnityLUN.ps1 +++ b/Unity-Powershell/Public/New-UnityLUN.ps1 @@ -10,14 +10,44 @@ Function New-UnityLUN { 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 + Name of the LUN unique to the system. + .PARAMETER Pool + Pool ID + .PARAMETER Description + Description of the LUN. + .PARAMETER Size + LUN Size. + .PARAMETER snapSchedule + Snapshot schedule settings for the LUN, as defined by the snapScheduleParameters. + .PARAMETER host + List of host to grant access to LUN. + .PARAMETER accessMask + Host access mask. Might be: + - NoAccess: No access. + - Production: Access to production LUNs only. + - Snapshot: Access to LUN snapshots only. + - Both: Access to both production LUNs and their snapshots. + .PARAMETER isThinEnabled + Is Thin enabled on LUN ? (Default is true) + .PARAMETER snapSchedule + Snapshot schedule assigned to the storage resource + .PARAMETER isSnapSchedulePaused + Indicates whether the assigned snapshot schedule is paused. + .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 - New-UnityLUN -Name 'LUN01' -Pool 'pool_1' -Size 1024000 + New-UnityLUN -Name 'DATASTORE01' -Pool 'pool_1' -Size 10GB -host 'Host_12' -accessMask 'Production' - Create LUN named 'LUN01' on pool 'pool_1' and with a size of '1024000' bytes + Create LUN named 'LUN01' on pool 'pool_1' and with a size of '10GB', grant production access to 'Host_12' #> - [CmdletBinding()] - Param ( + [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] + Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN Name')] @@ -28,8 +58,12 @@ Function New-UnityLUN { [String]$Pool, [Parameter(Mandatory = $true,HelpMessage = 'LUN Size in Bytes')] [uint64]$Size, + [Parameter(Mandatory = $false,HelpMessage = 'Host to grant access to LUN')] + [String[]]$host, + [Parameter(Mandatory = $false,HelpMessage = 'Host access mask')] + [HostLUNAccessEnum]$accessMask = 'Production', [Parameter(Mandatory = $false,HelpMessage = 'Is Thin enabled on LUN ? (Default is true)')] - [String]$isThinEnabled = $true, + [bool]$isThinEnabled = $true, [Parameter(Mandatory = $false,HelpMessage = 'ID of a protection schedule to apply to the storage resource')] [String]$snapSchedule, [Parameter(Mandatory = $false,HelpMessage = 'Is assigned snapshot schedule is paused ? (Default is false)')] @@ -39,8 +73,10 @@ Function New-UnityLUN { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" - #Initialazing arrays - $ResultCollection = @() + ## Variables + $URI = '/api/types/storageResource/action/createLun' + $Type = 'LUN' + $StatusCode = 200 } Process { @@ -50,6 +86,8 @@ Function New-UnityLUN { Foreach ($n in $Name) { + #### REQUEST BODY + # Creation of the body hash $body = @{} @@ -65,10 +103,32 @@ Function New-UnityLUN { $body["lunParameters"] = @{} $lunParameters = @{} $poolParameters = @{} + $poolParameters["id"] = "$($Pool)" $lunParameters["pool"] = $poolParameters $lunParameters["size"] = $($Size) + If ($PSBoundParameters.ContainsKey('host')) { + + $lunParameters["hostAccess"] = @() + $hostAccess = @() + + foreach ($h in $host) { + $blockHostAccessParam = @{} + $blockHostAccessParam['host'] = @{} + $HostParam = @{} + $HostParam['id'] = $h + $blockHostAccessParam['host'] = $HostParam + $blockHostAccessParam['accessMask'] = $accessMask + $hostAccess += $blockHostAccessParam + } + + $lunParameters["hostAccess"] = $hostAccess + + } + + $body["lunParameters"] = $lunParameters + #snapScheduleParameters If ($snapSchedule) { $body["snapScheduleParameters"] = @{} @@ -87,33 +147,38 @@ Function New-UnityLUN { $body["lunParameters"] = $lunParameters + ####### END BODY - Do not edit beyond this line + + #Show $body in verbose message + $Json = $body | ConvertTo-Json -Depth 10 + Write-Verbose $Json + If ($Sess.TestConnection()) { - #Building the URI - $URI = 'https://'+$sess.Server+'/api/types/storageResource/action/createLun' - Write-Verbose "URI: $URI" + ##Building the URL + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" #Sending the request - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body + If ($pscmdlet.ShouldProcess($Sess.Name,"Create $Type $n")) { + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'POST' -Body $Body + } Write-Verbose "Request status code: $($request.StatusCode)" - If ($request.StatusCode -eq '200') { + If ($request.StatusCode -eq $StatusCode) { #Formating the result. Converting it from JSON to a Powershell object - $results = ($request.content | ConvertFrom-Json).content.storageResource + $results = ($request.content | ConvertFrom-Json).content - Write-Verbose "LUN created with the ID: $($results.id) " + $Storageresource = Get-UnitystorageResource -session $Sess -ID $results.storageResource.id - #Executing Get-UnityUser with the ID of the new user - Get-UnityLUN -Session $Sess -ID $results.id - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - } + Write-Verbose "$Type with the ID $($Storageresource.luns.id) has been created" - End {} -} + Get-UnityLUN -Session $Sess -ID $Storageresource.luns.id + } # End If ($request.StatusCode -eq $StatusCode) + } # End If ($Sess.TestConnection()) + } # End Foreach + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/New-UnityMgmtInterface.ps1 b/Unity-Powershell/Public/New-UnityMgmtInterface.ps1 index 0f106b9..d8990a1 100644 --- a/Unity-Powershell/Public/New-UnityMgmtInterface.ps1 +++ b/Unity-Powershell/Public/New-UnityMgmtInterface.ps1 @@ -47,8 +47,10 @@ Function New-UnityMgmtInterface { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" - #Initialazing arrays - $ResultCollection = @() + ## Variables + $URI = '/api/types/mgmtInterface/instances?timeout=0' #run async + $Type = 'Management Interface' + $StatusCode = 202 } Process { @@ -56,6 +58,8 @@ Function New-UnityMgmtInterface { Write-Verbose "Processing Session: $($sess.Server) with SessionId: $($sess.SessionId)" + #### REQUEST BODY + #Creation of the body hash $body = @{} @@ -71,28 +75,32 @@ Function New-UnityMgmtInterface { $body["v6PrefixLength"] = "$($v6PrefixLength)" } - If ($Sess.TestConnection()) { + ####### END BODY - Do not edit beyond this line + + #Show $body in verbose message + $Json = $body | ConvertTo-Json -Depth 10 + Write-Verbose $Json + + If ($Sess.TestConnection()) { + + ##Building the URL + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" + + #Sending the request - #Building the URI - $URI = 'https://'+$sess.Server+'/api/types/mgmtInterface/instances?timeout=0' #run async - Write-Verbose "URI: $URI" + Write-Warning -Message 'You might be disconnected from the old interface' - #Sending the request - If ($pscmdlet.ShouldProcess($($Sess.Server),"Create a new management interface. WARNING: You might be disconnected from the old interface.")) { + If ($pscmdlet.ShouldProcess($Sess.Name,"Create $Type $ipAddress")) { $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body } Write-Verbose "Request status code: $($request.StatusCode)" - If ($request.StatusCode -eq '202') { + If ($request.StatusCode -eq $StatusCode) { Write-Host "Management interface is creating asynchronously." - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - - } - } - - End {} -} + } # End If ($request.StatusCode -eq $StatusCode) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/New-UnityNasServer.ps1 b/Unity-Powershell/Public/New-UnityNasServer.ps1 index b3e43c9..b16aff8 100644 --- a/Unity-Powershell/Public/New-UnityNasServer.ps1 +++ b/Unity-Powershell/Public/New-UnityNasServer.ps1 @@ -42,13 +42,18 @@ Function New-UnityNASServer { .PARAMETER defaultWindowsUser Default Windows user name that grants file access in the multiprotocol sharing mode. This user name is used when the corresponding Windows user name is not found by the mapping mechanism. + .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 New-UnityNasServer -Name 'NAS01' -Pool 'pool_1' -homeSP 'spa' Create NAS server named 'NAS01' on the pool ID 'pool_1' and attached to the sp 'spa' #> - [CmdletBinding()] + [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] Param ( #Default Parameters [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] @@ -79,8 +84,10 @@ Function New-UnityNASServer { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" - #Initialazing arrays - $ResultCollection = @() + ## Variables + $URI = '/api/types/nasServer/instances' + $Type = 'NAS Server' + $StatusCode = 201 } Process { @@ -90,6 +97,8 @@ Function New-UnityNASServer { Foreach ($n in $Name) { + #### REQUEST BODY + # Creation of the body hash $body = @{} @@ -132,33 +141,36 @@ Function New-UnityNASServer { $body["defaultWindowsUser"] = $defaultWindowsUser } + ####### END BODY - Do not edit beyond this line + + #Show $body in verbose message + $Json = $body | ConvertTo-Json -Depth 10 + Write-Verbose $Json + If ($Sess.TestConnection()) { - #Building the URI - $URI = 'https://'+$sess.Server+'/api/types/nasServer/instances' - Write-Verbose "URI: $URI" + ##Building the URL + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" #Sending the request - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body + If ($pscmdlet.ShouldProcess($Sess.Name,"Create $Type $n")) { + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'POST' -Body $Body + } Write-Verbose "Request status code: $($request.StatusCode)" - If ($request.StatusCode -eq '201') { + If ($request.StatusCode -eq $StatusCode) { #Formating the result. Converting it from JSON to a Powershell object $results = ($request.content | ConvertFrom-Json).content - Write-Verbose "NAS Server created with the ID: $($results.id) " - - #Executing Get-UnityUser with the ID of the new user - Get-UnityNasServer -Session $Sess -ID $results.id - } - } else { - Write-Warning "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - } + Write-Verbose "$Type with the ID $($results.id) has been created" - End {} -} + Get-UnityNASServer -Session $Sess -ID $results.id + } # End If ($request.StatusCode -eq $StatusCode) + } # End If ($Sess.TestConnection()) + } # End Foreach + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/New-UnityPool.ps1 b/Unity-Powershell/Public/New-UnityPool.ps1 index 605c81a..dbeb35b 100644 --- a/Unity-Powershell/Public/New-UnityPool.ps1 +++ b/Unity-Powershell/Public/New-UnityPool.ps1 @@ -38,6 +38,10 @@ Function New-UnityPool { Specify the snapshot space used high watermark to trigger auto-delete on the storage pool. .PARAMETER snapSpaceHarvestLowThreshold Specify the snapshot space used low watermark to trigger auto-delete on the storage pool. + .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 New-UnityPool -Name 'POOL01' -virtualDisk @{"id"='vdisk_1';"tier"='Performance'},@{"id"='vdisk_2';"tier"='Performance'} @@ -48,7 +52,7 @@ Function New-UnityPool { Create pool named 'POOL01' with with 15 disks from diskgroup ID 'dg_11'.RAID protection is a 'RAID5' with a stripe width of 5 (4+1). Apply to physical deployment only. #> - [CmdletBinding(DefaultParameterSetName="RaidGroup")] + [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High',DefaultParameterSetName="RaidGroup")] Param ( #Default Parameters [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] @@ -59,9 +63,9 @@ Function New-UnityPool { [String[]]$Name, [Parameter(Mandatory = $false,HelpMessage = 'Pool Description')] [String]$Description, - [Parameter(Mandatory = $false,ParameterSetName="VirtualDisk",HelpMessage = 'Parameters to add virtual disks to the pool')] + [Parameter(Mandatory = $true,ParameterSetName="VirtualDisk",HelpMessage = 'Parameters to add virtual disks to the pool')] [array]$virtualDisk, - [Parameter(Mandatory = $false,ParameterSetName="RaidGroup",HelpMessage = 'Parameters to add RAID groups to the pool')] + [Parameter(Mandatory = $true,ParameterSetName="RaidGroup",HelpMessage = 'Parameters to add RAID groups to the pool')] [array]$raidGroup, [Parameter(Mandatory = $false,HelpMessage = 'Threshold at which the system will generate alerts about the free space in the pool')] [Int]$alertThreshold, @@ -86,8 +90,10 @@ Function New-UnityPool { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" - #Initialazing arrays - $ResultCollection = @() + ## Variables + $URI = '/api/types/pool/instances' + $Type = 'Pool' + $StatusCode = 201 $tier = @{ "Extreme_Performance" = "10" @@ -115,6 +121,8 @@ Function New-UnityPool { Foreach ($n in $Name) { + #### REQUEST BODY + # Creation of the body hash $body = @{} @@ -205,33 +213,36 @@ Function New-UnityPool { $body["isFASTVpScheduleEnabled"] = $isFASTVpScheduleEnabled } + ####### END BODY - Do not edit beyond this line + + #Show $body in verbose message + $Json = $body | ConvertTo-Json -Depth 10 + Write-Verbose $Json + If ($Sess.TestConnection()) { - #Building the URI - $URI = 'https://'+$sess.Server+'/api/types/pool/instances' - Write-Verbose "URI: $URI" + ##Building the URL + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" #Sending the request - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body + If ($pscmdlet.ShouldProcess($Sess.Name,"Create $Type $n")) { + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'POST' -Body $Body + } Write-Verbose "Request status code: $($request.StatusCode)" - If ($request.StatusCode -eq '201') { + If ($request.StatusCode -eq $StatusCode) { #Formating the result. Converting it from JSON to a Powershell object $results = ($request.content | ConvertFrom-Json).content - Write-Verbose "LUN created with the ID: $($results.id) " + Write-Verbose "$Type with the ID $($results.id) has been created" - #Executing Get-UnityUser with the ID of the new user Get-UnityPool -Session $Sess -ID $results.id - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - } - - End {} -} + } # End If ($request.StatusCode -eq $StatusCode) + } # End If ($Sess.TestConnection()) + } # End Foreach + } # End Foreach ($sess in $session) + } # End Process +} # End Function \ No newline at end of file diff --git a/Unity-Powershell/Public/New-UnitySMTPServer.ps1 b/Unity-Powershell/Public/New-UnitySMTPServer.ps1 index c370f2c..9faa078 100644 --- a/Unity-Powershell/Public/New-UnitySMTPServer.ps1 +++ b/Unity-Powershell/Public/New-UnitySMTPServer.ps1 @@ -41,8 +41,10 @@ Function New-UnitySMTPServer { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" - #Initialazing arrays - $ResultCollection = @() + ## Variables + $URI = '/api/types/smtpServer/instances' + $Item = 'SMTP Server' + $StatusCode = 201 } Process { @@ -50,6 +52,8 @@ Function New-UnitySMTPServer { Write-Verbose "Processing Session: $($sess.Server) with SessionId: $($sess.SessionId)" + #### REQUEST BODY + #Creation of the body hash $body = @{} @@ -57,35 +61,36 @@ Function New-UnitySMTPServer { $body["address"] = $address $body["type"] = $type - If ($Sess.TestConnection()) { + ####### END BODY - Do not edit beyond this line - #Building the URI - $URI = 'https://'+$sess.Server+'/api/types/smtpServer/instances' - Write-Verbose "URI: $URI" + #Show $body in verbose message + $Json = $body | ConvertTo-Json -Depth 10 + Write-Verbose $Json - #Sending the request - If ($pscmdlet.ShouldProcess($($Sess.Server),"Create a new SMTP Server.")) { - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body - } + If ($Sess.TestConnection()) { - Write-Verbose "Request status code: $($request.StatusCode)" + ##Building the URL + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" - If ($request.StatusCode -eq '201') { + #Sending the request + If ($pscmdlet.ShouldProcess($Sess.Name,"Create $Item $address")) { + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'POST' -Body $Body + } - #Formating the result. Converting it from JSON to a Powershell object - $results = ($request.content | ConvertFrom-Json).content + Write-Verbose "Request status code: $($request.StatusCode)" - Write-Verbose "SMTP Server created with the ID: $($results.id) " + If ($request.StatusCode -eq $StatusCode) { - #Executing Get-UnityUser with the ID of the new user - Get-UnitySMTPServer -Session $Sess -ID $results.id - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } + #Formating the result. Converting it from JSON to a Powershell object + $results = ($request.content | ConvertFrom-Json).content - } - } + Write-Verbose "$Item with the ID $($results.id) has been created" - End {} -} + #Executing Get-UnityUser with the ID of the new user + Get-UnitySMTPServer -Session $Sess -ID $results.id + } # End If ($request.StatusCode -eq $StatusCode) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/New-UnityUser.ps1 b/Unity-Powershell/Public/New-UnityUser.ps1 index 98bdd3e..475b6cb 100644 --- a/Unity-Powershell/Public/New-UnityUser.ps1 +++ b/Unity-Powershell/Public/New-UnityUser.ps1 @@ -10,19 +10,36 @@ Function New-UnityUser { 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 + User name. + .PARAMETER role + User role. Might be: + - administrator + - storageadmin + - vmadmin + - operator + .PARAMETER password + Initial password for the user. + .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 New-UnityUser -Name 'user' -Role 'operator' -Password 'Password@123' Creates a new local user named 'User' with the role 'operator' and the password 'Password@123' #> - [CmdletBinding()] + [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'User Name')] [String[]]$Name, [Parameter(Mandatory = $true,HelpMessage = 'User role. It mights be administrator, storageadmin, vmadmin or operator')] + [ValidateSet('administrator', 'storageadmin', 'vmadmin', 'operator')] [String]$Role, [Parameter(Mandatory = $true,HelpMessage = 'User Password')] [String]$Password @@ -30,6 +47,11 @@ Function New-UnityUser { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + ## Variables + $URI = '/api/types/user/instances' + $Type = 'User' + $StatusCode = 201 } Process { @@ -39,6 +61,8 @@ Function New-UnityUser { Foreach ($n in $Name) { + #### REQUEST BODY + # Creation of the body hash $body = @{} @@ -51,31 +75,36 @@ Function New-UnityUser { # Password parameter $body["password"] = "$($Password)" + ####### END BODY - Do not edit beyond this line + + #Show $body in verbose message + $Json = $body | ConvertTo-Json -Depth 10 + Write-Verbose $Json + If ($Sess.TestConnection()) { - #Building the URI - $URI = 'https://'+$sess.Server+'/api/types/user/instances' - Write-Verbose "URI: $URI" + ##Building the URL + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" #Sending the request - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body + If ($pscmdlet.ShouldProcess($Sess.Name,"Create $Type $n")) { + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'POST' -Body $Body + } - If ($request.StatusCode -eq '201') { + Write-Verbose "Request status code: $($request.StatusCode)" + + If ($request.StatusCode -eq $StatusCode) { #Formating the result. Converting it from JSON to a Powershell object $results = ($request.content | ConvertFrom-Json).content - Write-Verbose "User created with the ID: $($results.id) " + Write-Verbose "$Type with the ID $($results.id) has been created" - #Executing Get-UnityUser with the ID of the new user Get-UnityUser -Session $Sess -ID $results.id - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - } - - End {} -} + } # End If ($request.StatusCode -eq $StatusCode) + } # End If ($Sess.TestConnection()) + } # End Foreach + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/New-UnityVMwareLUN.ps1 b/Unity-Powershell/Public/New-UnityVMwareLUN.ps1 index 8958aed..aaa883d 100644 --- a/Unity-Powershell/Public/New-UnityVMwareLUN.ps1 +++ b/Unity-Powershell/Public/New-UnityVMwareLUN.ps1 @@ -14,12 +14,16 @@ Function New-UnityVMwareLUN { Specify an UnitySession Object. .PARAMETER Name Name of the VMware VMFS datastore unique to the system. + .PARAMETER Pool + Pool ID .PARAMETER Description Description of the VMware VMFS datastore. .PARAMETER Size LUN Size. .PARAMETER snapSchedule Snapshot schedule settings for the VMware VMFS datastore, as defined by the snapScheduleParameters. + .PARAMETER isThinEnabled + Is Thin enabled? (Default is true) .PARAMETER host List of host to grant access to LUN. .PARAMETER accessMask @@ -38,23 +42,23 @@ Function New-UnityVMwareLUN { Create LUN named 'LUN01' on pool 'pool_1' and with a size of '10GB', grant production access to 'Host_12' #> - [CmdletBinding()] + [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN Name')] + [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'VMware LUN Name')] [String[]]$Name, - [Parameter(Mandatory = $false,HelpMessage = 'LUN Description')] + [Parameter(Mandatory = $false,HelpMessage = 'VMware LUN Description')] [String]$Description, - [Parameter(Mandatory = $true,HelpMessage = 'LUN Pool ID')] + [Parameter(Mandatory = $true,HelpMessage = 'VMware LUN Pool ID')] [String]$Pool, - [Parameter(Mandatory = $true,HelpMessage = 'LUN Size in Bytes')] + [Parameter(Mandatory = $true,HelpMessage = 'VMware LUN Size in Bytes')] [uint64]$Size, - [Parameter(Mandatory = $false,HelpMessage = 'Host to grant access to LUN')] + [Parameter(Mandatory = $false,HelpMessage = 'Host to grant access to VMware LUN')] [String[]]$host, [Parameter(Mandatory = $false,HelpMessage = 'Host access mask')] [HostLUNAccessEnum]$accessMask = 'Production', - [Parameter(Mandatory = $false,HelpMessage = 'Is Thin enabled on LUN ? (Default is true)')] + [Parameter(Mandatory = $false,HelpMessage = 'Is Thin enabled on VMware LUN ? (Default is true)')] [bool]$isThinEnabled = $true, [Parameter(Mandatory = $false,HelpMessage = 'ID of a protection schedule to apply to the storage resource')] [String]$snapSchedule, @@ -64,6 +68,11 @@ Function New-UnityVMwareLUN { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + ## Variables + $URI = '/api/types/storageResource/action/createVmwareLun' + $Type = 'VMware LUN' + $StatusCode = 200 } Process { @@ -130,38 +139,38 @@ Function New-UnityVMwareLUN { $lunParameters["isThinEnabled"] = $isThinEnabled } - #Displaying request's body + ####### END BODY - Do not edit beyond this line + + #Show $body in verbose message $Json = $body | ConvertTo-Json -Depth 10 - Write-Verbose $Json + Write-Verbose $Json If ($Sess.TestConnection()) { - #Building the URI - $URI = 'https://'+$sess.Server+'/api/types/storageResource/action/createVmwareLun' - Write-Verbose "URI: $URI" + ##Building the URL + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" #Sending the request - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body + If ($pscmdlet.ShouldProcess($Sess.Name,"Create $Type $n")) { + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'POST' -Body $Body + } Write-Verbose "Request status code: $($request.StatusCode)" - If ($request.StatusCode -eq '200') { + If ($request.StatusCode -eq $StatusCode) { #Formating the result. Converting it from JSON to a Powershell object - $results = ($request.content | ConvertFrom-Json).content.storageResource + $results = ($request.content | ConvertFrom-Json).content - Write-Verbose "LUN created with the storage resource ID: $($results.id) " + $Storageresource = Get-UnitystorageResource -session $Sess -ID $results.storageResource.id - #Executing Get-UnityVMwareLUN with the ID of the new user - Get-UnityVMwareLUN -Session $Sess -Name $n - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - } + Write-Verbose "$Type with the ID $($Storageresource.luns.id) has been created" - End { - } -} + Get-UnityVMwareLUN -Session $Sess -ID $Storageresource.luns.id + } # End If ($request.StatusCode -eq $StatusCode) + } # End If ($Sess.TestConnection()) + } # End Foreach + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/New-UnityvCenter.ps1 b/Unity-Powershell/Public/New-UnityvCenter.ps1 index ae77551..3796f8d 100644 --- a/Unity-Powershell/Public/New-UnityvCenter.ps1 +++ b/Unity-Powershell/Public/New-UnityvCenter.ps1 @@ -2,7 +2,7 @@ Function New-UnityvCenter { <# .SYNOPSIS - Adds the vCenter credentials and optionally discovers any ESXi host managed by that vCenter. + Add the vCenter credentials and optionally discovers any ESXi host managed by that vCenter. .DESCRIPTION Discover vCenter servers on the network and optionnaly create a host configuration for multiple ESXi hosts managed by a single vCenter server. For any discovered vCenters, you can enable or disable access for any ESXi host managed by the vCenter. After you associate a vCenter server configuration with a VMware datastore, the datastore is available to any ESXi hosts associated with the vCenter host configuration. The vCenter credentials are stored in the storage system. @@ -26,7 +26,7 @@ Function New-UnityvCenter { .EXAMPLE New-UnityvCenter -Address 'vcenter.example.com' -Username 'admin' -Password 'Password123#' -ImportHosts - Import a vCenter and all the associated hosts. + Import a vCenter and all the associated ESXi hosts. #> [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] @@ -50,6 +50,11 @@ Function New-UnityvCenter { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/types/hostContainer/instances' + $Type = 'vCenter' + $StatusCode = 201 } Process { @@ -57,6 +62,8 @@ Function New-UnityvCenter { Write-Verbose "Processing Session: $($sess.Server) with SessionId: $($sess.SessionId)" + #### REQUEST BODY + Foreach ($a in $Address) { $recommendation = Get-UnityHostContainerReco -Session $Sess -Address $a -Username $Username -Password $Password @@ -87,40 +94,36 @@ Function New-UnityvCenter { $body["potentialHosts"] = $recommendation.potentialHosts | Where-Object {$_.importOption -ne 2} } - #Displaying request's body + ####### END BODY - Do not edit beyond this line + + #Show $body in verbose message $Json = $body | ConvertTo-Json -Depth 10 - Write-Verbose $Json + Write-Verbose $Json If ($Sess.TestConnection()) { - #Building the URI - $URI = 'https://'+$sess.Server+'/api/types/hostContainer/instances' - Write-Verbose "URI: $URI" + ##Building the URL + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" - if ($pscmdlet.ShouldProcess($a,"Add vCenter Server")) { - #Sending the request - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body + #Sending the request + If ($pscmdlet.ShouldProcess($Sess.Name,"Create $Type $a")) { + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'POST' -Body $Body } Write-Verbose "Request status code: $($request.StatusCode)" - If ($request.StatusCode -eq '201') { + If ($request.StatusCode -eq $StatusCode) { #Formating the result. Converting it from JSON to a Powershell object $results = ($request.content | ConvertFrom-Json).content - Write-Verbose "vCenter created with the ID: $($results.id) " + Write-Verbose "$Type with the ID $($results.id) has been created" - #Executing Get-UnityUser with the ID of the new user Get-UnityvCenter -Session $Sess -ID $results.id - - } - } else { - Write-Warning "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - } - - End {} -} + } # End If ($request.StatusCode -eq $StatusCode) + } # End If ($Sess.TestConnection()) + } # End Foreach + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/Remove-UnityAlert.ps1 b/Unity-Powershell/Public/Remove-UnityAlert.ps1 index 5afac82..6fbcb0b 100644 --- a/Unity-Powershell/Public/Remove-UnityAlert.ps1 +++ b/Unity-Powershell/Public/Remove-UnityAlert.ps1 @@ -23,7 +23,7 @@ Function Remove-UnityAlert { Delete the Alert with ID 'alert_28' .EXAMPLE - Get-UnityAlert -Name 'alert_28' | Remove-UnityAlert + Get-UnityAlert -ID 'alert_28' | Remove-UnityAlert Delete the Alert with ID 'alert_28'. Alert informations are provided by the Get-UnityAlert through the pipeline. #> @@ -38,6 +38,12 @@ Function Remove-UnityAlert { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/alert/' + $Type = 'Alert' + $TypeName = 'UnityAlert' + $StatusCode = 204 } Process { @@ -50,43 +56,54 @@ Function Remove-UnityAlert { Foreach ($i in $ID) { - # Determine input and convert to UnityAlert object - Write-Verbose "Input object type is $($ID.GetType().Name)" - Switch ($ID.GetType().Name) + # Determine input and convert to object if necessary + Switch ($i.GetType().Name) { "String" { - $Alert = get-UnityAlert -Session $Sess -ID $ID - $AlertID = $Alert.id + $Object = get-UnityAlert -Session $Sess -ID $i + $ObjectID = $Object.id + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } - "UnityAlert" { - $AlertID = $ID.id + "$TypeName" { + Write-Verbose "Input object type is $($i.GetType().Name)" + $ObjectID = $i.id + If ($Object = Get-UnityAlert -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } + } } - } + } # End Switch + + If ($ObjectID) { + + #Building the URL + $URI = $URI -replace '',$ObjectID - If ($AlertID) { - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/alert/'+$AlertID - Write-Verbose "URI: $URI" + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" - if ($pscmdlet.ShouldProcess($AlertID,"Delete alert")) { + if ($pscmdlet.ShouldProcess($Sess.Name,"Delete $Type $($ObjectName)")) { #Sending the request - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'DELETE' + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'DELETE' } - If ($request.StatusCode -eq '204') { + If ($request.StatusCode -eq $StatusCode) { - Write-Verbose "Alert with ID: $id has been deleted" + Write-Verbose "$Type with ID $ObjectID has been deleted" - } + } # End If ($request.StatusCode -eq $StatusCode) } else { - Write-Information -MessageData "Alert $AlertID does not exist on the array $($sess.Name)" - } - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - - End {} -} + 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 diff --git a/Unity-Powershell/Public/Remove-UnityCIFSShare.ps1 b/Unity-Powershell/Public/Remove-UnityCIFSShare.ps1 index ff8940b..24128ca 100644 --- a/Unity-Powershell/Public/Remove-UnityCIFSShare.ps1 +++ b/Unity-Powershell/Public/Remove-UnityCIFSShare.ps1 @@ -32,11 +32,17 @@ Function Remove-UnityCIFSShare { #cifsShareDelete [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'ID of the CIFS share')] - [String[]]$ID + $ID ) Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/storageResource//action/modifyFilesystem' + $Type = 'Share CIFS' + $TypeName = 'UnityCIFSShare' + $StatusCode = 204 } Process { @@ -49,26 +55,36 @@ Function Remove-UnityCIFSShare { Foreach ($i in $ID) { - # Determine input and convert to UnityFilesystem object - Switch ($i.GetType().name) + # Determine input and convert to object if necessary + Switch ($i.GetType().Name) { "String" { - $share = get-UnityCIFSShare -Session $Sess -ID $i - $ShareID = $share.id - $filesystemID = $share.filesystem.id + $Object = get-UnityCIFSShare -Session $Sess -ID $i + $ObjectID = $Object.id + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } - "UnityCIFSShare" { + "$TypeName" { Write-Verbose "Input object type is $($i.GetType().Name)" - If ($share = Get-UnityCIFSShare -Session $Sess -ID $i) { - $ShareID = $share.id - $filesystemID = $share.filesystem.id + $ObjectID = $i.id + If ($Object = Get-UnityCIFSShare -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } } - } + } # End Switch + + If ($ObjectID) { - If ($ShareID) { + $UnityStorageRessource = Get-UnitystorageResource -Session $sess | Where-Object {($_.filesystem.id -like $Object.filesystem.id)} - $UnityStorageRessource = Get-UnitystorageResource -Session $sess | Where-Object {($_.filesystem.id -like $filesystemID)} + #### REQUEST BODY # Creation of the body hash $body = @{} @@ -78,35 +94,39 @@ Function Remove-UnityCIFSShare { $cifsShareDeleteParameters = @{} $cifsShareDeleteParameters["cifsShare"] = @{} $cifsShareParameters = @{} - $cifsShareParameters['id'] = $ShareID + $cifsShareParameters['id'] = $ObjectID $cifsShareDeleteParameters["cifsShare"] = $cifsShareParameters $body["cifsShareDelete"] += $cifsShareDeleteParameters - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/storageResource/'+($UnityStorageRessource.id)+'/action/modifyFilesystem' - Write-Verbose "URI: $URI" + ####### 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 + $URI = $URI -replace '',($UnityStorageRessource.id) - #Sending the request - if ($pscmdlet.ShouldProcess($ShareID,"Delete CIFS Share")) { - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" + + if ($pscmdlet.ShouldProcess($Sess.Name,"Delete $Type $ObjectName")) { + #Sending the request + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'POST' -Body $Body } - If ($request.StatusCode -eq '204') { + If ($request.StatusCode -eq $StatusCode) { - Write-Verbose "CIFS Share named $name on filesystem $filesystemName has been deleted" + Write-Verbose "$Type with ID $ObjectID has been deleted" - } + } # End If ($request.StatusCode -eq $StatusCode) } else { - Write-Verbose "CIFS Share $ShareID does not exist on the array $($sess.Name)" - } - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - - End {} -} + 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 \ No newline at end of file diff --git a/Unity-Powershell/Public/Remove-UnityCifsServer.ps1 b/Unity-Powershell/Public/Remove-UnityCifsServer.ps1 index b33ae59..153b420 100644 --- a/Unity-Powershell/Public/Remove-UnityCifsServer.ps1 +++ b/Unity-Powershell/Public/Remove-UnityCifsServer.ps1 @@ -12,28 +12,34 @@ Function Remove-UnityCIFSServer { https://github.com/equelin/Unity-Powershell .PARAMETER Session Specify an UnitySession Object. - .PARAMETER Name - CIFS Server Name or CIFS Server Object + .PARAMETER ID + CIFS Server ID or Object. + .PARAMETER skipUnjoin + Keep SMB server account unjoined in Active Directory after deletion. + .PARAMETER domainUsername + Username for unjoin. + .PARAMETER domainPassword + Password for unjoin. .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 - Remove-UnityCifsServer -Name 'CIFS01' + Remove-UnityCifsServer -ID 'cifs_1' - Delete the Cifs Server named 'CIFS01' + Delete the Cifs Server with ID 'cifs_1' .EXAMPLE Get-UnityCifsServer -Name 'CIFS01' | Remove-UnityCifsServer Delete the Cifs Server named 'CIFS01'. The Cifs Server's informations are provided by the Get-UnityNasServer through the pipeline. #> - [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] + [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'CIFS Server Name or CIFS Server Object')] - $Name, + [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'CIFS Server ID or Object')] + $ID, [Parameter(Mandatory = $false,HelpMessage = 'Keep SMB server account unjoined in Active Directory after deletion')] [bool]$skipUnjoin, [Parameter(Mandatory = $false,HelpMessage = 'Username for unjoin')] @@ -44,6 +50,12 @@ Function Remove-UnityCIFSServer { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/cifsServer/' + $Type = 'CIFS Server' + $TypeName = 'UnityCifsServer' + $StatusCode = 204 } Process { @@ -54,7 +66,9 @@ Function Remove-UnityCIFSServer { If ($Sess.TestConnection()) { - Foreach ($n in $Name) { + Foreach ($i in $ID) { + + #### REQUEST BODY # Creation of the body hash $body = @{} @@ -71,47 +85,60 @@ Function Remove-UnityCIFSServer { $body["domainPassword"] = $domainPassword } - # Determine input and convert to UnityCIFSServer object - Switch ($n.GetType().Name) + ####### END BODY - Do not edit beyond this line + + #Show $body in verbose message + $Json = $body | ConvertTo-Json -Depth 10 + Write-Verbose $Json + + # Determine input and convert to object if necessary + Switch ($i.GetType().Name) { "String" { - $NasServer = Get-UnityCifsServer -Session $Sess -Name $n - $NasServerID = $NasServer.id - $NasServerName = $NasServer.Name + $Object = get-UnityCIFSServer -Session $Sess -ID $i + $ObjectID = $Object.id + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } - "UnityCifsServer" { - Write-Verbose "Input object type is $($n.GetType().Name)" - $NasServerName = $n.Name - If ($NasServer = Get-UnityCifsServer -Session $Sess -Name $NasServerName) { - $NasServerID = $n.id + "$TypeName" { + Write-Verbose "Input object type is $($i.GetType().Name)" + $ObjectID = $i.id + If ($Object = Get-UnityCIFSServer -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } } - } + } # End Switch - If ($NasServerID) { - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/cifsServer/'+$NasServerID - Write-Verbose "URI: $URI" + If ($ObjectID) { + + #Building the URL + $URI = $URI -replace '',$ObjectID - if ($pscmdlet.ShouldProcess($NasServerName,"Delete Cifs Server")) { + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" + + if ($pscmdlet.ShouldProcess($Sess.Name,"Delete $Type $ObjectName")) { #Sending the request - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'DELETE' -Body $body + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'DELETE' -Body $body } - If ($request.StatusCode -eq '204') { + If ($request.StatusCode -eq $StatusCode) { - Write-Verbose "CIFS Server with ID: $id has been deleted" + Write-Verbose "$Type with ID $ObjectID has been deleted" - } + } # End If ($request.StatusCode -eq $StatusCode) } else { - Write-Information -MessageData "LUN $NasServerName does not exist on the array $($sess.Name)" - } - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - - End {} -} + 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 diff --git a/Unity-Powershell/Public/Remove-UnityFileDnsServer.ps1 b/Unity-Powershell/Public/Remove-UnityFileDnsServer.ps1 index 5bda45e..6e8fdff 100644 --- a/Unity-Powershell/Public/Remove-UnityFileDnsServer.ps1 +++ b/Unity-Powershell/Public/Remove-UnityFileDnsServer.ps1 @@ -38,6 +38,12 @@ Function Remove-UnityFileDNSServer { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/fileDNSServer/' + $Type = 'File DNS Server' + $TypeName = 'UnityFileDnsServer' + $StatusCode = 204 } Process { @@ -50,47 +56,54 @@ Function Remove-UnityFileDNSServer { Foreach ($i in $ID) { - # Determine input and convert to UnityFileDnsServer object - Switch ($ID.GetType().Name) + # Determine input and convert to object if necessary + Switch ($i.GetType().Name) { "String" { - $FileDNSServer = get-UnityFileDnsServer -Session $Sess -ID $ID - $FileDNSServerID = $FileDNSServer.id - $FileDNSServerName = $FileDNSServer.Name + $Object = get-UnityFileDNSServer -Session $Sess -ID $i + $ObjectID = $Object.id + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } - "UnityFileDnsServer" { - Write-Verbose "Input object type is $($ID.GetType().Name)" - $FileDNSServerID = $ID.id - If ($FileDNSServer = Get-UnityFileDnsServer -Session $Sess -ID $FileDNSServerID) { - $FileDNSServerName = $ID.name + "$TypeName" { + Write-Verbose "Input object type is $($i.GetType().Name)" + $ObjectID = $i.id + If ($Object = Get-UnityFileDNSServer -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } } - } + } # End Switch + + If ($ObjectID) { + + #Building the URL + $URI = $URI -replace '',$ObjectID - If ($FileDNSServerID) { - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/fileDNSServer/'+$FileDNSServerID - Write-Verbose "URI: $URI" + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" - if ($pscmdlet.ShouldProcess($FileDNSServerID,"Delete File DNS Server")) { + if ($pscmdlet.ShouldProcess($Sess.Name,"Delete $Type $ObjectName")) { #Sending the request - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'DELETE' + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'DELETE' } - If ($request.StatusCode -eq '204') { + If ($request.StatusCode -eq $StatusCode) { - Write-Verbose "File DNS Server with ID: $id has been deleted" + Write-Verbose "$Type with ID $ObjectID has been deleted" - } + } # End If ($request.StatusCode -eq $StatusCode) } else { - Write-Information -MessageData "File DNS $FileDNSServerID does not exist on the array $($sess.Name)" - } - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - - End {} -} + 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 diff --git a/Unity-Powershell/Public/Remove-UnityFileInterface.ps1 b/Unity-Powershell/Public/Remove-UnityFileInterface.ps1 index 4427e81..b76c6fc 100644 --- a/Unity-Powershell/Public/Remove-UnityFileInterface.ps1 +++ b/Unity-Powershell/Public/Remove-UnityFileInterface.ps1 @@ -38,6 +38,12 @@ Function Remove-UnityFileInterface { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/fileInterface/' + $Type = 'File Interface' + $TypeName = 'UnityFileInterface' + $StatusCode = 204 } Process { @@ -50,47 +56,54 @@ Function Remove-UnityFileInterface { Foreach ($i in $ID) { - # Determine input and convert to UnityFileInterface object - Switch ($ID.GetType().Name) + # Determine input and convert to object if necessary + Switch ($i.GetType().Name) { "String" { - $FileInterface = get-UnityFileInterface -Session $Sess -ID $ID - $FileInterfaceID = $FileInterface.id - $FileInterfaceName = $FileInterface.Name + $Object = get-UnityFileInterface -Session $Sess -ID $i + $ObjectID = $Object.id + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } - "UnityFileInterface" { - Write-Verbose "Input object type is $($ID.GetType().Name)" - $FileInterfaceID = $ID.id - If ($FileInterface = Get-UnityFileInterface -Session $Sess -ID $FileInterfaceID) { - $FileInterfaceName = $ID.name + "$TypeName" { + Write-Verbose "Input object type is $($i.GetType().Name)" + $ObjectID = $i.id + If ($Object = Get-UnityFileInterface -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } } - } + } # End Switch + + If ($ObjectID) { + + #Building the URL + $URI = $URI -replace '',$ObjectID - If ($FileInterfaceID) { - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/fileInterface/'+$FileInterfaceID - Write-Verbose "URI: $URI" + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" - if ($pscmdlet.ShouldProcess($FileInterfaceID,"Delete File Interface")) { + if ($pscmdlet.ShouldProcess($Sess.Name,"Delete $Type $ObjectName")) { #Sending the request - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'DELETE' + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'DELETE' } - If ($request.StatusCode -eq '204') { + If ($request.StatusCode -eq $StatusCode) { - Write-Verbose "File Interface with ID: $id has been deleted" + Write-Verbose "$Type with ID $ObjectID has been deleted" - } + } # End If ($request.StatusCode -eq $StatusCode) } else { - Write-Information -MessageData "File Interface $FileInterfaceID does not exist on the array $($sess.Name)" - } - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - - End {} -} + 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 diff --git a/Unity-Powershell/Public/Remove-UnityFilesystem.ps1 b/Unity-Powershell/Public/Remove-UnityFilesystem.ps1 index fd7fb86..14008b9 100644 --- a/Unity-Powershell/Public/Remove-UnityFilesystem.ps1 +++ b/Unity-Powershell/Public/Remove-UnityFilesystem.ps1 @@ -12,16 +12,16 @@ Function Remove-UnityFilesystem { https://github.com/equelin/Unity-Powershell .PARAMETER Session Specify an UnitySession Object. - .PARAMETER Name - Filesystem name or Object. + .PARAMETER ID + Filesystem ID or Object. .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 - Remove-UnityFilesystem -Name 'FS01' + Remove-UnityFilesystem -ID 'fs_1' - Delete the filesystem named 'FS01' + Delete the filesystem named 'fs_1' .EXAMPLE Get-UnityFilesystem -Name 'FS01' | Remove-UnityFilesystem @@ -32,12 +32,18 @@ Function Remove-UnityFilesystem { Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'filesystem Name or filesystem Object')] - $Name + [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Filesystem ID or Object.')] + $ID ) Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/storageResource/' + $Type = 'Filesystem' + $TypeName = 'UnityFilesystem' + $StatusCode = 204 } Process { @@ -48,52 +54,58 @@ Function Remove-UnityFilesystem { If ($Sess.TestConnection()) { - Foreach ($n in $Name) { + Foreach ($i in $ID) { - # Determine input and convert to UnityFilesystem object - Switch ($n.GetType().Name) + # Determine input and convert to object if necessary + Switch ($i.GetType().Name) { "String" { - $filesystem = get-UnityFilesystem -Session $Sess -Name $n - $filesystemID = $filesystem.id - $filesystemName = $n + $Object = get-UnityFilesystem -Session $Sess -ID $i + $ObjectID = $Object.id + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } - "UnityFilesystem" { - Write-Verbose "Input object type is $($n.GetType().Name)" - $filesystemName = $n.Name - If (Get-Unityfilesystem -Session $Sess -Name $n.Name) { - $filesystemID = $n.id + "$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 + } } } - } + } # End Switch + + If ($ObjectID) { - If ($filesystemID) { + $UnityStorageRessource = Get-UnitystorageResource -Session $sess | ? {($_.Name -like $ObjectName) -and ($_.filesystem.id -like $ObjectID)} - $UnityStorageRessource = Get-UnitystorageResource -Session $sess | ? {($_.Name -like $filesystemName) -and ($_.filesystem.id -like $filesystemID)} + #Building the URL + $URI = $URI -replace '',$UnityStorageRessource.id - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/storageResource/' + $UnityStorageRessource.id - Write-Verbose "URI: $URI" + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" - if ($pscmdlet.ShouldProcess($filesystemName,"Delete Filesystem")) { + if ($pscmdlet.ShouldProcess($Sess.Name,"Delete $Type $ObjectName")) { #Sending the request - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'DELETE' + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'DELETE' } - If ($request.StatusCode -eq '204') { + If ($request.StatusCode -eq $StatusCode) { Write-Verbose "Filesystem with ID: $filesystemID has been deleted" } } else { - Write-Verbose "Filesystem $filesystemName does not exist on the array $($sess.Name)" - } - } - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - - End {} -} + 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 diff --git a/Unity-Powershell/Public/Remove-UnityHost.ps1 b/Unity-Powershell/Public/Remove-UnityHost.ps1 index 4a2e21b..27f18f5 100644 --- a/Unity-Powershell/Public/Remove-UnityHost.ps1 +++ b/Unity-Powershell/Public/Remove-UnityHost.ps1 @@ -39,6 +39,12 @@ Function Remove-UnityHost { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/host/' + $Type = 'Host' + $TypeName = 'UnityHost' + $StatusCode = 204 } Process { @@ -51,44 +57,54 @@ Function Remove-UnityHost { Foreach ($i in $ID) { - # Determine input and convert to UnityHost object - Write-Verbose "Input object type is $($I.GetType().Name)" - Switch ($I.GetType().Name) + # Determine input and convert to object if necessary + Switch ($i.GetType().Name) { "String" { - $Host = get-UnityHost -Session $Sess -ID $I - $HostID = $Host.id + $Object = get-UnityHost -Session $Sess -ID $i + $ObjectID = $Object.id + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } - "UnityHost" - { - $HostID = $I.id + "$TypeName" { + Write-Verbose "Input object type is $($i.GetType().Name)" + $ObjectID = $i.id + If ($Object = Get-UnityHost -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } + } } - } + } # End Switch + + If ($ObjectID) { + + #Building the URL + $URI = $URI -replace '',$ObjectID - If ($HostID) { - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/host/'+$HostID - Write-Verbose "URI: $URI" + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" - if ($pscmdlet.ShouldProcess($HostID,"Delete Host")) { + if ($pscmdlet.ShouldProcess($Sess.Name,"Delete $Type $ObjectName")) { #Sending the request - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'DELETE' + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'DELETE' } - If ($request.StatusCode -eq '204') { + If ($request.StatusCode -eq $StatusCode) { - Write-Verbose "host with ID: $id has been deleted" + Write-Verbose "$Type with ID $ObjectID has been deleted" - } + } # End If ($request.StatusCode -eq $StatusCode) } else { - Write-Information -MessageData "host $HostID does not exist on the array $($sess.Name)" - } - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - - End {} -} + 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 diff --git a/Unity-Powershell/Public/Remove-UnityIscsiPortal.ps1 b/Unity-Powershell/Public/Remove-UnityIscsiPortal.ps1 index 85f5c13..906762c 100644 --- a/Unity-Powershell/Public/Remove-UnityIscsiPortal.ps1 +++ b/Unity-Powershell/Public/Remove-UnityIscsiPortal.ps1 @@ -1,4 +1,4 @@ -Function Remove-UnityIscsiPortal { +Function Remove-UnityiSCSIPortal { <# .SYNOPSIS @@ -39,6 +39,12 @@ Function Remove-UnityIscsiPortal { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/iscsiPortal/' + $Type = 'iSCSI Portal' + $TypeName = 'UnityIscsiPortal' + $StatusCode = 204 } Process { @@ -51,43 +57,54 @@ Function Remove-UnityIscsiPortal { Foreach ($i in $ID) { - # Determine input and convert to UnityIscsiPortal object - Write-Verbose "Input object type is $($ID.GetType().Name)" - Switch ($ID.GetType().Name) + # Determine input and convert to object if necessary + Switch ($i.GetType().Name) { "String" { - $IscsiPortal = get-UnityIscsiPortal -Session $Sess -ID $ID - $IscsiPortalID = $IscsiPortal.id + $Object = get-UnityiSCSIPortal -Session $Sess -ID $i + $ObjectID = $Object.id + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } - "UnityIscsiPortal" { - $IscsiPortalID = $ID.id + "$TypeName" { + Write-Verbose "Input object type is $($i.GetType().Name)" + $ObjectID = $i.id + If ($Object = Get-UnityiSCSIPortal -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } + } } - } + } # End Switch + + If ($ObjectID) { + + #Building the URL + $URI = $URI -replace '',$ObjectID - If ($IscsiPortalID) { - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/iscsiPortal/'+$IscsiPortalID - Write-Verbose "URI: $URI" + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" - if ($pscmdlet.ShouldProcess($IscsiPortalID,"Delete iSCSI network portal")) { + if ($pscmdlet.ShouldProcess($Sess.Name,"Delete $Type $ObjectName")) { #Sending the request - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'DELETE' + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'DELETE' } - If ($request.StatusCode -eq '204') { + If ($request.StatusCode -eq $StatusCode) { - Write-Verbose "iSCSI network portal with ID: $id has been deleted" + Write-Verbose "$Type with ID $ObjectID has been deleted" - } + } # End If ($request.StatusCode -eq $StatusCode) } else { - Write-Information -MessageData "iSCSI network portal $IscsiPortalID does not exist on the array $($sess.Name)" - } - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - - End {} -} + 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 diff --git a/Unity-Powershell/Public/Remove-UnityLUN.ps1 b/Unity-Powershell/Public/Remove-UnityLUN.ps1 index bca4f7d..57ad4ed 100644 --- a/Unity-Powershell/Public/Remove-UnityLUN.ps1 +++ b/Unity-Powershell/Public/Remove-UnityLUN.ps1 @@ -12,8 +12,8 @@ Function Remove-UnityLUN { https://github.com/equelin/Unity-Powershell .PARAMETER Session Specify an UnitySession Object. - .PARAMETER Name - LUN Name or Object. + .PARAMETER ID + LUN ID or Object. .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 @@ -32,12 +32,18 @@ Function Remove-UnityLUN { Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN Name or LUN Object')] - $Name + [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN ID or LUN Object')] + $ID ) Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/storageResource/' + $Type = 'LUN Resource' + $TypeName = 'UnityLUN' + $StatusCode = 204 } Process { @@ -48,38 +54,58 @@ Function Remove-UnityLUN { If ($Sess.TestConnection()) { - Foreach ($n in $Name) { + Foreach ($i in $ID) { - # Determine input and convert to UnityLUN object - Switch ($n.GetType().Name) + # Determine input and convert to object if necessary + Switch ($i.GetType().Name) { "String" { - $LUN = get-UnityLUN -Session $Sess -Name $n - $LUNID = $LUN.id - $LUNName = $LUN.Name + $Object = get-UnityLUN -Session $Sess -ID $i + $ObjectID = $Object.id + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } - "UnityLUN" { - Write-Verbose "Input object type is $($n.GetType().Name)" - $LUNName = $n.Name - If ($LUN = Get-UnityLUN -Session $Sess -Name $LUNName) { - $LUNID = $n.id + "$TypeName" { + Write-Verbose "Input object type is $($i.GetType().Name)" + $ObjectID = $i.id + If ($Object = Get-UnityLUN -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } } - } + } # End Switch + + If ($ObjectID) { + + $UnityStorageRessource = Get-UnitystorageResource -Session $sess | ? {($_.Name -like $ObjectName) -and ($_.luns.id -like $ObjectID)} + + #Building the URL + $URI = $URI -replace '',$UnityStorageRessource.id + + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" - If ($LUNID) { - if ($pscmdlet.ShouldProcess($LUNName,"Delete LUN")) { - $LUN | Remove-UnityLUNResource -Session $Sess -Confirm:$false + if ($pscmdlet.ShouldProcess($Sess.Name,"Delete $Type $ObjectName")) { + #Sending the request + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'DELETE' } - } else { - Write-Verbose "LUN $LUNName does not exist on the array $($sess.Name)" - } - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - End {} -} + If ($request.StatusCode -eq $StatusCode) { + + Write-Verbose "$Type with ID $ObjectID has been deleted" + + } # 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 diff --git a/Unity-Powershell/Public/Remove-UnityMgmtInterface.ps1 b/Unity-Powershell/Public/Remove-UnityMgmtInterface.ps1 index 411fccf..d9feb1a 100644 --- a/Unity-Powershell/Public/Remove-UnityMgmtInterface.ps1 +++ b/Unity-Powershell/Public/Remove-UnityMgmtInterface.ps1 @@ -38,6 +38,12 @@ Function Remove-UnityMgmtInterface { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/mgmtInterface/' + $Type = 'Management Interface' + $TypeName = 'UnityMgmtInterface' + $StatusCode = 204 } Process { @@ -50,43 +56,54 @@ Function Remove-UnityMgmtInterface { Foreach ($i in $ID) { - # Determine input and convert to UnityMgmtInterface object - Switch ($ID.GetType().Name) - { - "String" { - $MgmtInterface = get-UnityMgmtInterface -Session $Sess -ID $ID - $MgmtInterfaceID = $MgmtInterface.id - } - "UnityMgmtInterface" { - Write-Verbose "Input object type is $($ID.GetType().Name)" - $MgmtInterfaceID = $ID.id - } - } - - If ($MgmtInterfaceID) { - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/mgmtInterface/'+$MgmtInterfaceID - Write-Verbose "URI: $URI" - - if ($pscmdlet.ShouldProcess($MgmtInterfaceID,"Delete management interface. WARNING: You might be disconnected from the interface.")) { - #Sending the request - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'DELETE' + # Determine input and convert to object if necessary + Switch ($i.GetType().Name) + { + "String" { + $Object = get-UnityMgmtInterface -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-UnityMgmtInterface -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } + } } + } # End Switch - If ($request.StatusCode -eq '204') { + If ($ObjectID) { + + #Building the URL + $URI = $URI -replace '',$ObjectID - Write-Verbose "Management Interface with ID: $id has been deleted" + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" + if ($pscmdlet.ShouldProcess($Sess.Name,"Delete $Type $ObjectName")) { + #Sending the request + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'DELETE' } - } else { - Write-Information -MessageData "Management Interface $MgmtInterfaceID does not exist on the array $($sess.Name)" - } - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - End {} -} + If ($request.StatusCode -eq $StatusCode) { + + Write-Verbose "$Type with ID $ObjectID has been deleted" + + } # 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 diff --git a/Unity-Powershell/Public/Remove-UnityNasServer.ps1 b/Unity-Powershell/Public/Remove-UnityNasServer.ps1 index 1f82b16..4931e85 100644 --- a/Unity-Powershell/Public/Remove-UnityNasServer.ps1 +++ b/Unity-Powershell/Public/Remove-UnityNasServer.ps1 @@ -18,35 +18,41 @@ Function Remove-UnityNASServer { https://github.com/equelin/Unity-Powershell .PARAMETER Session Specifies an UnitySession Object. - .PARAMETER Name - Specifies the NAS server name or Object. + .PARAMETER ID + Specifies the NAS server ID or Object. .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 - Remove-UnityNasServer -Name 'NAS01' + Remove-UnityNasServer -ID 'nas_6' - Delete the Nas Server named 'NAS01' + Delete the Nas Server with ID 'nas_6' .EXAMPLE Get-UnityNasServer -Name 'NAS01' | Remove-UnityNasServer Delete the Nas Server named 'NAS01'. The NAS server's informations are provided by the Get-UnityNasServer through the pipeline. #> - [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] + [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] Param ( #Default Parameters [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), #NasServer - [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Nas server Name or Object')] - $Name + [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Nas server ID or Object')] + $ID ) Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/nasServer/' + $Type = 'NAS Server' + $TypeName = 'UnityNasServer' + $StatusCode = 204 } Process { @@ -57,49 +63,56 @@ Function Remove-UnityNASServer { If ($Sess.TestConnection()) { - Foreach ($n in $Name) { + Foreach ($i in $ID) { - # Determine input and convert to UnityPool object - Switch ($n.GetType().Name) + # Determine input and convert to object if necessary + Switch ($i.GetType().Name) { "String" { - $NasServer = Get-UnityNasServer -Session $Sess -Name $n - $NasServerID = $NasServer.id - $NasServerName = $NasServer.Name + $Object = get-UnityNASServer -Session $Sess -ID $i + $ObjectID = $Object.id + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } - "UnityNasServer" { - Write-Verbose "Input object type is $($n.GetType().Name)" - $NasServerName = $n.Name - If ($NasServer = Get-UnityNasServer -Session $Sess -Name $NasServerName) { - $NasServerID = $n.id + "$TypeName" { + Write-Verbose "Input object type is $($i.GetType().Name)" + $ObjectID = $i.id + If ($Object = Get-UnityNASServer -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } } - } + } # End Switch + + If ($ObjectID) { + + #Building the URL + $URI = $URI -replace '',$ObjectID - If ($NasServerID) { - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/nasServer/'+$NasServerID - Write-Verbose "URI: $URI" + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" - if ($pscmdlet.ShouldProcess($NasServerName,"Delete NAS Server")) { + if ($pscmdlet.ShouldProcess($Sess.Name,"Delete $Type $ObjectName")) { #Sending the request - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'DELETE' + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'DELETE' } - If ($request.StatusCode -eq '204') { + If ($request.StatusCode -eq $StatusCode) { - Write-Verbose "Pool with ID: $id has been deleted" + Write-Verbose "$Type with ID $ObjectID has been deleted" - } + } # End If ($request.StatusCode -eq $StatusCode) } else { - Write-Information -MessageData "LUN $NasServerName does not exist on the array $($sess.Name)" - } - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - - End {} -} + 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 diff --git a/Unity-Powershell/Public/Remove-UnityPool.ps1 b/Unity-Powershell/Public/Remove-UnityPool.ps1 index f3e4e55..9da9033 100644 --- a/Unity-Powershell/Public/Remove-UnityPool.ps1 +++ b/Unity-Powershell/Public/Remove-UnityPool.ps1 @@ -2,9 +2,9 @@ Function Remove-UnityPool { <# .SYNOPSIS - Delete a LUN. + Delete a pool. .DESCRIPTION - Delete a LUN. + Delete a pool. 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 @@ -12,33 +12,39 @@ Function Remove-UnityPool { https://github.com/equelin/Unity-Powershell .PARAMETER Session Specify an UnitySession Object. - .PARAMETER Name - Name of the pool or Pool Object. + .PARAMETER ID + ID of the pool or Pool Object. .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 - Remove-UnityPool -Name 'POOL01' + Remove-UnityPool -ID 'pool_12' - Delete the pool named 'POOL01' + Delete the pool with ID 'pool_12' .EXAMPLE - Get-UnityPool -Name 'POOL01' | Remove-UnityPool + Get-UnityPool -ID 'pool_10' | Remove-UnityPool - Delete the pool named 'POOL01'. The pool's informations are provided by the Get-UnityPool through the pipeline. + Delete the pool with ID 'pool_10'. The pool's informations are provided by the Get-UnityPool through the pipeline. #> - [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] + [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Pool Name or Pool Object')] - $Name + [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Pool ID or Pool Object')] + $ID ) Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/pool/' + $Type = 'Pool' + $TypeName = 'UnityPool' + $StatusCode = 204 } Process { @@ -49,49 +55,56 @@ Function Remove-UnityPool { If ($Sess.TestConnection()) { - Foreach ($n in $Name) { + Foreach ($i in $ID) { - # Determine input and convert to UnityPool object - Switch ($n.GetType().Name) + # Determine input and convert to object if necessary + Switch ($i.GetType().Name) { "String" { - $Pool = get-UnityPool -Session $Sess -Name $n - $PoolID = $Pool.id - $PoolName = $Pool.Name + $Object = get-UnityPool -Session $Sess -ID $i + $ObjectID = $Object.id + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } - "UnityPool" { - Write-Verbose "Input object type is $($n.GetType().Name)" - $PoolName = $n.Name - If ($Pool = Get-UnityPool -Session $Sess -Name $PoolName) { - $PoolID = $n.id + "$TypeName" { + Write-Verbose "Input object type is $($i.GetType().Name)" + $ObjectID = $i.id + If ($Object = Get-UnityPool -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } } - } + } # End Switch + + If ($ObjectID) { + + #Building the URL + $URI = $URI -replace '',$ObjectID - If ($PoolID) { - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/pool/'+$PoolID - Write-Verbose "URI: $URI" + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" - if ($pscmdlet.ShouldProcess($PoolName,"Delete pool")) { + if ($pscmdlet.ShouldProcess($Sess.Name,"Delete $Type $ObjectName")) { #Sending the request - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'DELETE' + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'DELETE' } - If ($request.StatusCode -eq '204') { + If ($request.StatusCode -eq $StatusCode) { - Write-Verbose "Pool with ID: $id has been deleted" + Write-Verbose "$Type with ID $ObjectID has been deleted" - } + } # End If ($request.StatusCode -eq $StatusCode) } else { - Write-Information -MessageData "LUN $PoolName does not exist on the array $($sess.Name)" - } - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - - End {} -} + 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 diff --git a/Unity-Powershell/Public/Remove-UnitySMTPServer.ps1 b/Unity-Powershell/Public/Remove-UnitySMTPServer.ps1 index 7111163..ecbb2ac 100644 --- a/Unity-Powershell/Public/Remove-UnitySMTPServer.ps1 +++ b/Unity-Powershell/Public/Remove-UnitySMTPServer.ps1 @@ -39,6 +39,12 @@ Function Remove-UnitySMTPServer { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/smtpServer/' + $Type = 'SMTP Server' + $TypeName = 'UnitySMTPServer' + $StatusCode = 204 } Process { @@ -51,43 +57,54 @@ Function Remove-UnitySMTPServer { Foreach ($i in $ID) { - # Determine input and convert to UnitySMTPServer object - Write-Verbose "Input object type is $($ID.GetType().Name)" - Switch ($ID.GetType().Name) + # Determine input and convert to object if necessary + Switch ($i.GetType().Name) { "String" { - $SMTPServer = get-UnitySMTPServer -Session $Sess -ID $ID - $SMTPServerID = $SMTPServer.id + $Object = get-UnitySMTPServer -Session $Sess -ID $i + $ObjectID = $Object.id + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } - "UnitySMTPServer" { - $SMTPServerID = $ID.id + "$TypeName" { + Write-Verbose "Input object type is $($i.GetType().Name)" + $ObjectID = $i.id + If ($Object = Get-UnitySMTPServer -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } + } } - } + } # End Switch + + If ($ObjectID) { + + #Building the URL + $URI = $URI -replace '',$ObjectID - If ($SMTPServerID) { - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/smtpServer/'+$SMTPServerID - Write-Verbose "URI: $URI" + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" - if ($pscmdlet.ShouldProcess($SMTPServerID,"Delete File Interface")) { + if ($pscmdlet.ShouldProcess($Sess.Name,"Delete $Type $ObjectName")) { #Sending the request - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'DELETE' + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'DELETE' } - If ($request.StatusCode -eq '204') { + If ($request.StatusCode -eq $StatusCode) { - Write-Verbose "SMTP Server with ID: $id has been deleted" + Write-Verbose "$Type with ID $ObjectID has been deleted" - } + } # End If ($request.StatusCode -eq $StatusCode) } else { - Write-Information -MessageData "SMTP Server $SMTPServerID does not exist on the array $($sess.Name)" - } - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - - End {} -} + 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 diff --git a/Unity-Powershell/Public/Remove-UnityUser.ps1 b/Unity-Powershell/Public/Remove-UnityUser.ps1 index 4ab21ea..2c703a6 100644 --- a/Unity-Powershell/Public/Remove-UnityUser.ps1 +++ b/Unity-Powershell/Public/Remove-UnityUser.ps1 @@ -12,8 +12,8 @@ Function Remove-UnityUser { https://github.com/equelin/Unity-Powershell .PARAMETER Session Specify an UnitySession Object. - .PARAMETER Name - Name of the user or user Object. + .PARAMETER ID + User ID or Object. .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. @@ -33,12 +33,18 @@ Function Remove-UnityUser { Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $false,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'User Name or User Object')] - $Name + [Parameter(Mandatory = $false,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'User ID or Object')] + $ID ) Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/user/' + $Type = 'User' + $TypeName = 'UnityUser' + $StatusCode = 204 } Process { @@ -49,51 +55,56 @@ Function Remove-UnityUser { If ($Sess.TestConnection()) { - Foreach ($n in $Name) { + Foreach ($i in $ID) { - # Determine input and convert to UnityUser object - Switch ($n.GetType().Name) + # Determine input and convert to object if necessary + Switch ($i.GetType().Name) { "String" { - $User = get-UnityUser -Session $Sess -Name $n - $UserID = $User.id - $UserName = $n + $Object = get-UnityUser -Session $Sess -ID $i + $ObjectID = $Object.id + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } - "UnityUser" { - Write-Verbose "Input object type is $($n.GetType().Name)" - $UserName = $n.Name - If ($User = Get-UnityUser -Session $Sess -Name $UserName) { - $UserID = $User.id + "$TypeName" { + Write-Verbose "Input object type is $($i.GetType().Name)" + $ObjectID = $i.id + If ($Object = Get-UnityUser -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } } - } + } # End Switch - If ($UserID) { + If ($ObjectID) { + + #Building the URL + $URI = $URI -replace '',$ObjectID - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/user/'+$UserID - Write-Verbose "URI: $URI" + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" - if ($pscmdlet.ShouldProcess($UserName,"Delete user")) { + if ($pscmdlet.ShouldProcess($Sess.Name,"Delete $Type $ObjectName")) { #Sending the request - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'DELETE' + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'DELETE' } - If ($request.StatusCode -eq '204') { + If ($request.StatusCode -eq $StatusCode) { - Write-Verbose "User with ID: $id has been deleted" + Write-Verbose "$Type with ID $ObjectID has been deleted" - } + } # End If ($request.StatusCode -eq $StatusCode) } else { - Write-Information -MessageData "User $UserName does not exist on the array $($sess.Name)" - } - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - - End { - } -} + 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 diff --git a/Unity-Powershell/Public/Remove-UnityVMwareLUN.ps1 b/Unity-Powershell/Public/Remove-UnityVMwareLUN.ps1 index 28e1d99..df14404 100644 --- a/Unity-Powershell/Public/Remove-UnityVMwareLUN.ps1 +++ b/Unity-Powershell/Public/Remove-UnityVMwareLUN.ps1 @@ -38,6 +38,12 @@ Function Remove-UnityVMwareLUN { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/storageResource/' + $Type = 'VMware LUN' + $TypeName = 'UnityLUN' + $StatusCode = 204 } Process { @@ -50,36 +56,56 @@ Function Remove-UnityVMwareLUN { Foreach ($i in $ID) { - # Determine input and convert to UnityLUN object + # Determine input and convert to object if necessary Switch ($i.GetType().Name) { "String" { - $LUN = get-UnityVMwareLUN -Session $Sess -ID $i - $LUNID = $LUN.id - $LUNName = $i + $Object = get-UnityVMwareLUN -Session $Sess -ID $i + $ObjectID = $Object.id + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } - "UnityLUN" { + "$TypeName" { Write-Verbose "Input object type is $($i.GetType().Name)" - $LUNName = $i.Name - If ($LUN = Get-UnityVMwareLUN -Session $Sess -ID $i.id) { - $LUNID = $i.id + $ObjectID = $i.id + If ($Object = Get-UnityVMwareLUN -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } } - } + } # End Switch + + If ($ObjectID) { + + $UnityStorageResource = Get-UnitystorageResource -Session $sess | Where-Object {($_.Name -like $ObjectName) -and ($_.luns.id -like $ObjectID)} + + #Building the URL + $URI = $URI -replace '',$UnityStorageResource.id + + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" - If ($LUNID) { - if ($pscmdlet.ShouldProcess($LUNName,"Delete VMware LUN")) { - $LUN | Remove-UnityLUNResource -Session $Sess -Confirm:$false + if ($pscmdlet.ShouldProcess($Sess.Name,"Delete $Type $ObjectName")) { + #Sending the request + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'DELETE' } - } else { - Write-Verbose "VMware LUN $LUNName does not exist on the array $($sess.Name)" - } - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - End {} -} + If ($request.StatusCode -eq $StatusCode) { + + Write-Verbose "$Type with ID $ObjectID has been deleted" + + } # 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 diff --git a/Unity-Powershell/Public/Remove-UnityvCenter.ps1 b/Unity-Powershell/Public/Remove-UnityvCenter.ps1 index 56ca708..8db5f68 100644 --- a/Unity-Powershell/Public/Remove-UnityvCenter.ps1 +++ b/Unity-Powershell/Public/Remove-UnityvCenter.ps1 @@ -39,6 +39,12 @@ Function Remove-UnityvCenter { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/hostContainer/' + $Type = 'vCenter' + $TypeName = 'UnityHostContainer' + $StatusCode = 204 } Process { @@ -51,43 +57,54 @@ Function Remove-UnityvCenter { Foreach ($i in $ID) { - # Determine input and convert to UnityvCenter object - Write-Verbose "Input object type is $($I.GetType().Name)" - Switch ($I.GetType().Name) + # Determine input and convert to object if necessary + Switch ($i.GetType().Name) { "String" { - $vCenterServer = get-UnityvCenter -Session $Sess -ID $ID - $vCenterServerID = $vCenterServer.id + $Object = get-UnityvCenter -Session $Sess -ID $i + $ObjectID = $Object.id + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } - "UnityHostContainer" { - $vCenterServerID = $I.id + "$TypeName" { + Write-Verbose "Input object type is $($i.GetType().Name)" + $ObjectID = $i.id + If ($Object = Get-UnityvCenter -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } + } } - } + } # End Switch + + If ($ObjectID) { + + #Building the URL + $URI = $URI -replace '',$ObjectID - If ($vCenterServerID) { - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/hostContainer/'+$vCenterServerID - Write-Verbose "URI: $URI" + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" - if ($pscmdlet.ShouldProcess($vCenterServerID,"Delete vCenter Server")) { + if ($pscmdlet.ShouldProcess($Sess.Name,"Delete $Type $ObjectName")) { #Sending the request - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'DELETE' + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'DELETE' } - If ($request.StatusCode -eq '204') { + If ($request.StatusCode -eq $StatusCode) { - Write-Verbose "vCenter Server with ID: $vCenterServerID has been deleted" + Write-Verbose "$Type with ID $ObjectID has been deleted" - } + } # End If ($request.StatusCode -eq $StatusCode) } else { - Write-Information -MessageData "vCenter Server $vCenterServerID does not exist on the array $($sess.Name)" - } - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - - End {} -} + 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 diff --git a/Unity-Powershell/Public/Set-UnityAlert.ps1 b/Unity-Powershell/Public/Set-UnityAlert.ps1 index 7ab55ee..f46c1a0 100644 --- a/Unity-Powershell/Public/Set-UnityAlert.ps1 +++ b/Unity-Powershell/Public/Set-UnityAlert.ps1 @@ -21,7 +21,7 @@ Function Set-UnityAlert { .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-UnityAlert -ID 'alert_38' -isAcknowledged $True + Set-UnityAlert -ID 'alert_38' -isAcknowledged $true Acknoledge alert with id 'alert_38' #> @@ -33,13 +33,19 @@ Function Set-UnityAlert { $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'ID or Object')] - [String]$ID, - [Parameter(Mandatory = $true,HelpMessage = 'Whether alert is acknowledged.')] - [bool]$isAcknowledged + [String[]]$ID, + [Parameter(Mandatory = $false,HelpMessage = 'Whether alert is acknowledged.')] + [bool]$isAcknowledged = $false ) Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/alert//action/modify' + $Type = 'Pool' + $TypeName = 'UnityAlert' + $StatusCode = 204 } Process { @@ -50,51 +56,71 @@ Function Set-UnityAlert { If ($Sess.TestConnection()) { - # Determine input and convert to UnityAlert object - - Write-Verbose "Input object type is $($ID.GetType().Name)" - Switch ($ID.GetType().Name) - { - "String" { - $Alert = get-UnityAlert -Session $Sess -ID $ID - $AlertID = $Alert.id - } - "UnityAlert" { - $AlertID = $ID.id + Foreach ($i in $ID) { + + # Determine input and convert to object if necessary + Switch ($i.GetType().Name) + { + "String" { + $Object = get-UnityAlert -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-UnityAlert -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } + } + } } - } - If ($AlertID) { + If ($ObjectID) { - # Creation of the body hash - $body = @{} + #### REQUEST BODY - $body["isAcknowledged"] = $isAcknowledged + # Creation of the body hash + $body = @{} - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/alert/'+$AlertID+'/action/modify' - Write-Verbose "URI: $URI" + $body["isAcknowledged"] = $isAcknowledged - #Sending the request - If ($pscmdlet.ShouldProcess($AlertID,"Modify alert")) { - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body - } + ####### END BODY - Do not edit beyond this line - If ($request.StatusCode -eq '204') { + #Show $body in verbose message + $Json = $body | ConvertTo-Json -Depth 10 + Write-Verbose $Json - Write-Verbose "Alert with ID: $AlertID has been modified" + #Building the URL + $URI = $URI -replace '',$ObjectID - Get-UnityAlert -Session $Sess -id $AlertID + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" - } - } else { - Write-Verbose "Alert $AlertID does not exist on the array $($sess.Name)" - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } + #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-UnityAlert -Session $Sess -id $ObjectID - End {} -} + } # 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 diff --git a/Unity-Powershell/Public/Set-UnityCIFSShare.ps1 b/Unity-Powershell/Public/Set-UnityCIFSShare.ps1 index 0d352da..89abce2 100644 --- a/Unity-Powershell/Public/Set-UnityCIFSShare.ps1 +++ b/Unity-Powershell/Public/Set-UnityCIFSShare.ps1 @@ -73,6 +73,12 @@ Function Set-UnityCIFSShare { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/storageResource//action/modifyFilesystem' + $Type = 'CIFS Share' + $TypeName = 'UnityCIFSShare' + $StatusCode = 204 } Process { @@ -85,26 +91,36 @@ Function Set-UnityCIFSShare { Foreach ($i in $ID) { - # Determine input and convert to UnityFilesystem object - Switch ($i.GetType().name) + # Determine input and convert to object if necessary + Switch ($i.GetType().Name) { "String" { - $share = get-UnityCIFSShare -Session $Sess -ID $i - $ShareID = $share.id - $filesystemID = $share.filesystem.id + $Object = get-UnityCIFSShare -Session $Sess -ID $i + $ObjectID = $Object.id + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } - "UnityCIFSShare" { + "$TypeName" { Write-Verbose "Input object type is $($i.GetType().Name)" - If ($share = Get-UnityCIFSShare -Session $Sess -ID $i) { - $ShareID = $share.id - $filesystemID = $share.filesystem.id + $ObjectID = $i.id + If ($Object = Get-UnityCIFSShare -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } } } - If ($ShareID) { + If ($ObjectID) { + + $UnitystorageResource = Get-UnitystorageResource -Session $sess | Where-Object {($_.filesystem.id -like $Object.Filesystem.id)} - $UnityStorageRessource = Get-UnitystorageResource -Session $sess | Where-Object {($_.filesystem.id -like $filesystemID)} + #### REQUEST BODY # Creation of the body hash $body = @{} @@ -114,7 +130,7 @@ Function Set-UnityCIFSShare { $cifsShareModifyParameters = @{} $cifsShareModifyParameters["cifsShare"] = @{} $cifsShare = @{} - $cifsShare['id'] = $ShareID + $cifsShare['id'] = $ObjectID $cifsShareModifyParameters["cifsShare"] = $cifsShare #$cifsShareParameters @@ -161,31 +177,35 @@ Function Set-UnityCIFSShare { $body["cifsShareModify"] += $cifsShareModifyParameters - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/storageResource/'+($UnityStorageRessource.id)+'/action/modifyFilesystem' - Write-Verbose "URI: $URI" + ####### 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 + $URI = $URI -replace '',$UnitystorageResource.id + + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" #Sending the request - if ($pscmdlet.ShouldProcess($ShareID,"Modify CIFS Share")) { - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body + If ($pscmdlet.ShouldProcess($Sess.Name,"Modify $Type $ObjectName")) { + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'POST' -Body $Body } - If ($request.StatusCode -eq '204') { + If ($request.StatusCode -eq $StatusCode) { - Write-Verbose "CIFS Share named $name on filesystem $filesystemName has been modified" + Write-Verbose "$Type with ID $ObjectID has been modified" - Get-UnityFilesystem -Session $Sess -id $filesystemID + Get-UnityCIFSShare -Session $Sess -ID $ObjectID - } + } # End If ($request.StatusCode -eq $StatusCode) } else { - Write-Verbose "CIFS Share $ShareID does not exist on the array $($sess.Name)" - } - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - - End {} -} + 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 diff --git a/Unity-Powershell/Public/Set-UnityDnsServer.ps1 b/Unity-Powershell/Public/Set-UnityDnsServer.ps1 index efe2fcb..032684d 100644 --- a/Unity-Powershell/Public/Set-UnityDnsServer.ps1 +++ b/Unity-Powershell/Public/Set-UnityDnsServer.ps1 @@ -10,6 +10,10 @@ Function Set-UnityDNSServer { 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 addresses + New list of IP addresses to replace the exsting address list for this DNS server. .EXAMPLE Set-UnityDnsServer -Addresses '192.168.0.1','192.168.0.2' @@ -21,12 +25,17 @@ Function Set-UnityDNSServer { [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN Name or LUN Object')] + [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'New list of IP addresses to replace the exsting address list for this DNS server.')] [String[]]$Addresses ) Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/dnsServer//action/modify' + $Type = 'DNS Server' + $StatusCode = 204 } Process { @@ -37,7 +46,11 @@ Function Set-UnityDNSServer { If ($Sess.TestConnection()) { - $DnsServer = Get-UnityDnsServer -Session $Sess + $Object = Get-UnityDnsServer -Session $Sess + + $ObjectID = $Object.id + + #### REQUEST BODY # Creation of the body hash $body = @{} @@ -47,18 +60,26 @@ Function Set-UnityDNSServer { $body["addresses"] += $Addresse } - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/dnsServer/'+($DnsServer.id)+'/action/modify' - Write-Verbose "URI: $URI" + ####### 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 + $URI = $URI -replace '',$ObjectID + + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" #Sending the request - If ($pscmdlet.ShouldProcess($($DnsServer.id),"Modify DNS Server")) { - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body + If ($pscmdlet.ShouldProcess($Sess.Name,"Modify $Type $ObjectID")) { + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'POST' -Body $Body } - If ($request.StatusCode -eq '204') { + If ($request.StatusCode -eq $StatusCode) { - Write-Verbose "DNS Server has been modified" + Write-Verbose "$Type with ID $ObjectID has been modified" Get-UnityDnsServer -Session $Sess } diff --git a/Unity-Powershell/Public/Set-UnityFileDNSServer.ps1 b/Unity-Powershell/Public/Set-UnityFileDNSServer.ps1 index 6a3a668..91486de 100644 --- a/Unity-Powershell/Public/Set-UnityFileDNSServer.ps1 +++ b/Unity-Powershell/Public/Set-UnityFileDNSServer.ps1 @@ -10,29 +10,45 @@ Function Set-UnityFileDnsServer { 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 ID + File DNS Server ID or Object + .PARAMETER domain + DNS domain name + .PARAMETER addresses + The list of DNS server IP addresses + .PARAMETER replicationPolicy + Status of the LDAP list in the NAS server operating as a replication destination. .EXAMPLE Set-UnityFileDnsServer -ID 'dns_1' -ipAddress '192.168.0.1' Change ip of the file DNS server with ID 'dns_1' #> - [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] + [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'File interface ID or Object')] + [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'File DNS Server ID or Object')] $ID, [Parameter(Mandatory = $false,HelpMessage = 'DNS domain name')] [string]$domain, - [Parameter(Mandatory = $false,HelpMessage = 'Prioritized list of one to three IPv4 and/or IPv6 addresses of DNS servers for the domain')] + [Parameter(Mandatory = $false,HelpMessage = 'The list of DNS server IP addresses')] [String[]]$addresses, - [Parameter(Mandatory = $false,HelpMessage = 'replication policy')] + [Parameter(Mandatory = $false,HelpMessage = 'Status of the LDAP list in the NAS server operating as a replication destination.')] [ReplicationPolicyEnum]$replicationPolicy ) Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + # Variables + $URI = '/api/instances/fileDNSServer//action/modify' + $Type = 'File DNS Server' + $TypeName = 'UnityFileDnsServer' + $StatusCode = 204 + } Process { @@ -43,66 +59,81 @@ Function Set-UnityFileDnsServer { If ($Sess.TestConnection()) { - # Determine input and convert to UnityPool object - Switch ($ID.GetType().Name) - { - "String" { - $FileDNSServer = get-UnityFileDNSServer -Session $Sess -ID $ID - $FileDNSServerID = $FileDNSServer.id - $FileDNSServerName = $FileDNSServer.Name - } - "UnityFileInterface" { - Write-Verbose "Input object type is $($ID.GetType().Name)" - $FileDNSServerID = $ID.id - If ($FileDNSServer = Get-UnityFileDNSServer -Session $Sess -ID $FileDNSServerID) { - $FileDNSServerName = $ID.name + Foreach ($i in $ID) { + + # Determine input and convert to object if necessary + Switch ($i.GetType().Name) + { + "String" { + $Object = get-UnityFileDnsServer -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-UnityFileDnsServer -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } + } } } - } - If ($FileDNSServerID) { + If ($ObjectID) { - # Creation of the body hash - $body = @{} + # Creation of the body hash + $body = @{} - #Addresses argument - $body['addresses'] = @() - Foreach ($Addresse in $Addresses) { - $body["addresses"] += $Addresse - } + #Addresses argument + $body['addresses'] = @() + Foreach ($Addresse in $Addresses) { + $body["addresses"] += $Addresse + } - If ($PSBoundParameters.ContainsKey('domain')) { - $body["domain"] = "$($domain)" - } + If ($PSBoundParameters.ContainsKey('domain')) { + $body["domain"] = "$($domain)" + } - If ($PSBoundParameters.ContainsKey('replicationPolicy')) { - $body["replicationPolicy"] = $replicationPolicy - } + If ($PSBoundParameters.ContainsKey('replicationPolicy')) { + $body["replicationPolicy"] = $replicationPolicy + } - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/fileDNSServer/'+$FileDNSServerID+'/action/modify' - Write-Verbose "URI: $URI" + ####### END BODY - Do not edit beyond this line - #Sending the request - If ($pscmdlet.ShouldProcess($FileDNSServerID,"Modify File DNS Server Interface")) { - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body - } + #Show $body in verbose message + $Json = $body | ConvertTo-Json -Depth 10 + Write-Verbose $Json - If ($request.StatusCode -eq '204') { + #Building the URL + $URI = $URI -replace '',$ObjectID - Write-Verbose "File DNS Server with ID: $FileDNSServerID has been modified" + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" - Get-UnityFileDNSServer -Session $Sess -id $FileDNSServerID + #Sending the request + If ($pscmdlet.ShouldProcess($Sess.Name,"Modify $Type $ObjectName")) { + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'POST' -Body $Body + } - } - } else { - Write-Verbose "NAS Server $FileDNSServerID does not exist on the array $($sess.Name)" - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } + If ($request.StatusCode -eq $StatusCode) { + + Write-Verbose "$Type with ID $ObjectID has been modified" + + Get-UnityFileDnsServer -Session $Sess -id $ObjectID - End {} -} + } # 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 diff --git a/Unity-Powershell/Public/Set-UnityFileInterface.ps1 b/Unity-Powershell/Public/Set-UnityFileInterface.ps1 index 2278f8a..3e4bfdd 100644 --- a/Unity-Powershell/Public/Set-UnityFileInterface.ps1 +++ b/Unity-Powershell/Public/Set-UnityFileInterface.ps1 @@ -10,6 +10,31 @@ Function Set-UnityFileInterface { 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 ID + File interface ID or Object + .PARAMETER ipPort + Physical port or link aggregation on the storage processor on which the interface is running + .PARAMETER ipAddress + IP address of the network interface + .PARAMETER netmask + IPv4 netmask for the network interface, if it uses an IPv4 address + .PARAMETER v6PrefixLength + IPv6 prefix length for the interface, if it uses an IPv6 address + .PARAMETER gateway + IPv4 or IPv6 gateway address for the network interface + .PARAMETER vlanId + LAN identifier for the interface. The interface uses the identifier to accept packets that have matching VLAN tags. Values are 1 - 4094. + .PARAMETER isPreferred + Sets the current IP interface as preferred for associated for file-based storage and unsets the previous one + .PARAMETER replicationPolicy + Indicates the status of the NAS server object operating as a replication destination + .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-UnityFileInterface -ID 'if_1' -ipAddress '192.168.0.1' @@ -37,17 +62,17 @@ Function Set-UnityFileInterface { [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 = 'Indicates the status of the NAS server object operating as a replication destination')] - [String]$replicationPolicy + [ReplicationPolicyEnum]$replicationPolicy ) Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" - $ReplicationPolicyEnum = @{ - "Not_Replicated" = "0" - "Replicated" = "1" - "Overridden" = "2" - } + # Variables + $URI = '/api/instances/fileInterface//action/modify ' + $Type = 'File Interface' + $TypeName = 'UnityFileInterface' + $StatusCode = 204 } Process { @@ -58,97 +83,114 @@ Function Set-UnityFileInterface { If ($Sess.TestConnection()) { - # Determine input and convert to UnityPool object - Switch ($ID.GetType().Name) - { - "String" { - $FileInterface = get-UnityFileInterface -Session $Sess -ID $ID - $FileInterfaceID = $FileInterface.id - $FileInterfaceName = $FileInterface.Name - } - "UnityFileInterface" { - Write-Verbose "Input object type is $($ID.GetType().Name)" - $FileInterfaceID = $ID.id - If ($FileInterface = Get-UnityFileInterface -Session $Sess -ID $FileInterfaceID) { - $FileInterfaceName = $ID.name + Foreach ($i in $ID) { + + # Determine input and convert to object if necessary + Switch ($i.GetType().Name) + { + "String" { + $Object = get-UnityFileInterface -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-UnityFileInterface -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } + } } } - } - If ($FileInterfaceID) { + If ($ObjectID) { - # Creation of the body hash - $body = @{} + #### REQUEST BODY - If ($PSBoundParameters.ContainsKey('nasServer')) { - # nasServer argument - $body["nasServer"] = @{} - $FileInterfaceArg = @{} - $FileInterfaceArg["id"] = "$($FileInterface)" - $body["nasServer"] = $FileInterfaceArg - } + # Creation of the body hash + $body = @{} - If ($PSBoundParameters.ContainsKey('ipPort')) { - # ipPort argument - $body["ipPort"] = @{} - $ipPortArg = @{} - $ipPortArg["id"] = "$($ipPort)" - $body["ipPort"] = $ipPortArg - } + If ($PSBoundParameters.ContainsKey('nasServer')) { + # nasServer argument + $body["nasServer"] = @{} + $FileInterfaceArg = @{} + $FileInterfaceArg["id"] = "$($FileInterface)" + $body["nasServer"] = $FileInterfaceArg + } - # ipAddress argument - If ($PSBoundParameters.ContainsKey('ipAddress')) { - $body["ipAddress"] = "$ipAddress" - } + If ($PSBoundParameters.ContainsKey('ipPort')) { + # ipPort argument + $body["ipPort"] = @{} + $ipPortArg = @{} + $ipPortArg["id"] = "$($ipPort)" + $body["ipPort"] = $ipPortArg + } - If ($PSBoundParameters.ContainsKey('netmask')) { - $body["netmask"] = "$netmask" - } + # ipAddress argument + If ($PSBoundParameters.ContainsKey('ipAddress')) { + $body["ipAddress"] = "$ipAddress" + } - If ($PSBoundParameters.ContainsKey('v6PrefixLength')) { - $body["v6PrefixLength"] = "$v6PrefixLength" - } + If ($PSBoundParameters.ContainsKey('netmask')) { + $body["netmask"] = "$netmask" + } - If ($PSBoundParameters.ContainsKey('gateway')) { - $body["gateway"] = "$gateway" - } + If ($PSBoundParameters.ContainsKey('v6PrefixLength')) { + $body["v6PrefixLength"] = "$v6PrefixLength" + } - If ($PSBoundParameters.ContainsKey('vlanId')) { - $body["vlanId"] = $vlanId - } + If ($PSBoundParameters.ContainsKey('gateway')) { + $body["gateway"] = "$gateway" + } - If ($PSBoundParameters.ContainsKey('isPreferred')) { - $body["isPreferred"] = $isPreferred - } + If ($PSBoundParameters.ContainsKey('vlanId')) { + $body["vlanId"] = $vlanId + } - If ($PSBoundParameters.ContainsKey('replicationPolicy')) { - $body["replicationPolicy"] = "$($ReplicationPolicyEnum["$($replicationPolicy)"])" - } + If ($PSBoundParameters.ContainsKey('isPreferred')) { + $body["isPreferred"] = $isPreferred + } - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/fileInterface/'+$FileInterfaceID+'/action/modify' - Write-Verbose "URI: $URI" + If ($PSBoundParameters.ContainsKey('replicationPolicy')) { + $body["replicationPolicy"] = "$replicationPolicy" + } - #Sending the request - If ($pscmdlet.ShouldProcess($FileInterfaceID,"Modify File Interface")) { - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body - } + ####### END BODY - Do not edit beyond this line - If ($request.StatusCode -eq '204') { + #Show $body in verbose message + $Json = $body | ConvertTo-Json -Depth 10 + Write-Verbose $Json - Write-Verbose "Pool with ID: $FileInterfaceID has been modified" + #Building the URL + $URI = $URI -replace '',$ObjectID - Get-UnityFileInterface -Session $Sess -id $FileInterfaceID + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" - } - } else { - Write-Verbose "NAS Server $FileInterfaceID does not exist on the array $($sess.Name)" - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } + #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-UnityFileInterface -Session $Sess -id $ObjectID - End {} -} + } # 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 diff --git a/Unity-Powershell/Public/Set-UnityFilesystem.ps1 b/Unity-Powershell/Public/Set-UnityFilesystem.ps1 index e1e2b19..11f0939 100644 --- a/Unity-Powershell/Public/Set-UnityFilesystem.ps1 +++ b/Unity-Powershell/Public/Set-UnityFilesystem.ps1 @@ -10,6 +10,44 @@ Function Set-UnityFilesystem { 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' @@ -23,10 +61,10 @@ Function Set-UnityFilesystem { $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 = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Filesystem ID or Object')] + [String[]]$ID, [Parameter(Mandatory = $false,HelpMessage = 'New Name of the filesystem')] - [String]$NewName, + [String]$Name, [Parameter(Mandatory = $false,HelpMessage = 'Filesystem Description')] [String]$Description, [Parameter(Mandatory = $false,HelpMessage = 'ID of a protection schedule to apply to the filesystem')] @@ -67,6 +105,12 @@ Function Set-UnityFilesystem { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/storageResource//action/modifyFilesystem' + $Type = 'Filesystem' + $TypeName = 'UnityFilesystem' + $StatusCode = 204 } Process { @@ -77,35 +121,45 @@ Function Set-UnityFilesystem { If ($Sess.TestConnection()) { - Foreach ($n in $Name) { + Foreach ($i in $ID) { - # Determine input and convert to UnityFilesystem object - Switch ($n.GetType().Name) + # Determine input and convert to object if necessary + Switch ($i.GetType().Name) { "String" { - $filesystem = get-UnityFilesystem -Session $Sess -Name $n - $filesystemID = $filesystem.id - $filesystemName = $filesystem.Name + $Object = get-UnityFilesystem -Session $Sess -ID $i + $ObjectID = $Object.id + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } - "UnityFilesystem" { - Write-Verbose "Input object type is $($n.GetType().Name)" - $filesystemName = $n.Name - If ($filesystem = Get-UnityFilesystem -Session $Sess -Name $filesystemName) { - $filesystemID = $n.id + "$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 ($filesystemID) { + If ($ObjectID) { + + $UnitystorageResource = Get-UnitystorageResource -Session $sess | Where-Object {($_.filesystem.id -like $ObjectID)} - $UnityStorageRessource = Get-UnitystorageResource -Session $sess | ? {($_.Name -like $filesystemName) -and ($_.filesystem.id -like $filesystemID)} + #### REQUEST BODY # Creation of the body hash $body = @{} # Name parameter If ($NewName) { - $body["name"] = "$($NewName)" + $body["name"] = "$($Name)" } # Domain parameter @@ -199,31 +253,35 @@ Function Set-UnityFilesystem { $body["snapScheduleParameters"] = $snapScheduleParameters } - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/storageResource/'+($UnityStorageRessource.id)+'/action/modifyFilesystem' - Write-Verbose "URI: $URI" + ####### 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 + $URI = $URI -replace '',$UnitystorageResource.id + + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" #Sending the request - If ($pscmdlet.ShouldProcess($filesystemName,"Modify filesystem")) { - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body + If ($pscmdlet.ShouldProcess($Sess.Name,"Modify $Type $ObjectName")) { + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'POST' -Body $Body } + + If ($request.StatusCode -eq $StatusCode) { - If ($request.StatusCode -eq '204') { - - Write-Verbose "Filesystem with ID: $filesystemID has been modified" + Write-Verbose "$Type with ID $ObjectID has been modified" - Get-UnityFilesystem -Session $Sess -id $filesystemID + Get-UnityFilesystem -Session $Sess -ID $ObjectID - } + } # End If ($request.StatusCode -eq $StatusCode) } 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 {} -} + 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 diff --git a/Unity-Powershell/Public/Set-UnityIscsiPortal.ps1 b/Unity-Powershell/Public/Set-UnityIscsiPortal.ps1 index ad28380..54adac4 100644 --- a/Unity-Powershell/Public/Set-UnityIscsiPortal.ps1 +++ b/Unity-Powershell/Public/Set-UnityIscsiPortal.ps1 @@ -41,7 +41,7 @@ Function Set-UnityIscsiPortal { $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'iSCSI Network Portal ID or Oject')] - [String]$ID, + [String[]]$ID, [Parameter(Mandatory = $false,HelpMessage = 'IPv4 or IPv6 address for the interface.')] [string]$ipAddress, [Parameter(Mandatory = $false,HelpMessage = 'IPv4 netmask for the interface, if the interface uses an IPv4 address.')] @@ -56,6 +56,12 @@ Function Set-UnityIscsiPortal { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/iscsiPortal//action/modify' + $Type = 'iSCSI Portal' + $TypeName = 'UnityIscsiPortal' + $StatusCode = 204 } Process { @@ -66,68 +72,89 @@ Function Set-UnityIscsiPortal { If ($Sess.TestConnection()) { - # Determine input and convert to UnityIscsiPortal object - Write-Verbose "Input object type is $($ID.GetType().Name)" - Switch ($ID.GetType().Name) - { - "String" { - $IscsiPortal = get-UnityIscsiPortal -Session $Sess -ID $ID - $IscsiPortalID = $IscsiPortal.id - } - "UnityIscsiPortal" { - $IscsiPortalID = $ID.id + Foreach ($i in $ID) { + + # Determine input and convert to object if necessary + Switch ($i.GetType().Name) + { + "String" { + $Object = get-UnityIscsiPortal -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-UnityIscsiPortal -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } + } + } } - } - If ($IscsiPortalID) { + If ($ObjectID) { - # Creation of the body hash - $body = @{} + #### REQUEST BODY - If ($PSBoundParameters.ContainsKey('ipAddress')) { - $body["ipAddress"] = $ipAddress - } + # Creation of the body hash + $body = @{} - If ($PSBoundParameters.ContainsKey('netmask')) { - $body["netmask"] = "$($netmask)" - } + If ($PSBoundParameters.ContainsKey('ipAddress')) { + $body["ipAddress"] = $ipAddress + } - If ($PSBoundParameters.ContainsKey('v6PrefixLength')) { - $body["v6PrefixLength"] = "$($v6PrefixLength)" - } + If ($PSBoundParameters.ContainsKey('netmask')) { + $body["netmask"] = "$($netmask)" + } - If ($PSBoundParameters.ContainsKey('vlanId')) { - $body["vlanId"] = "$($vlanId)" - } + If ($PSBoundParameters.ContainsKey('v6PrefixLength')) { + $body["v6PrefixLength"] = "$($v6PrefixLength)" + } - If ($PSBoundParameters.ContainsKey('gateway')) { - $body["gateway"] = "$($gateway)" - } + If ($PSBoundParameters.ContainsKey('vlanId')) { + $body["vlanId"] = "$($vlanId)" + } - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/iscsiPortal/'+$IscsiPortalID+'/action/modify' - Write-Verbose "URI: $URI" + If ($PSBoundParameters.ContainsKey('gateway')) { + $body["gateway"] = "$($gateway)" + } - #Sending the request - If ($pscmdlet.ShouldProcess($IscsiPortalID,"Modify iSCSI Network Portal")) { - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body - } + ####### END BODY - Do not edit beyond this line - If ($request.StatusCode -eq '204') { + #Show $body in verbose message + $Json = $body | ConvertTo-Json -Depth 10 + Write-Verbose $Json - Write-Verbose "iSCSI Network Portal with ID: $IscsiPortalID has been modified" + #Building the URL + $URI = $URI -replace '',$ObjectID - Get-UnityIscsiPortal -Session $Sess -id $IscsiPortalID + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" - } - } else { - Write-Verbose "iSCSI Network Portal $IscsiPortalID does not exist on the array $($sess.Name)" - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } + #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-UnityIscsiPortal -Session $Sess -id $ObjectID - End {} -} + } # 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 diff --git a/Unity-Powershell/Public/Set-UnityLUN.ps1 b/Unity-Powershell/Public/Set-UnityLUN.ps1 index 4201cab..7e436aa 100644 --- a/Unity-Powershell/Public/Set-UnityLUN.ps1 +++ b/Unity-Powershell/Public/Set-UnityLUN.ps1 @@ -10,28 +10,75 @@ Function Set-UnityLUN { 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 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. + .PARAMETER ID + ID or Object. + .PARAMETER Name + New name of the LUN unique to the system. + .PARAMETER Description + New description of the LUN. + .PARAMETER Size + New LUN size. The size parameter can be greater than the current LUN size in this case the LUN is expanded. + .PARAMETER snapSchedule + Snapshot schedule settings for the LUN, as defined by the snapScheduleParameters. + .PARAMETER host + List of host to grant access to LUN. + .PARAMETER accessMask + Host access mask. Might be: + - NoAccess: No access. + - Production: Access to production LUNs only. + - Snapshot: Access to LUN snapshots only. + - Both: Access to both production LUNs and their snapshots. + .PARAMETER append + Add new host access to the existing configuration. + .PARAMETER snapSchedule + Snapshot schedule assigned to the storage resource + .PARAMETER isSnapSchedulePaused + Indicates whether the assigned snapshot schedule is paused. .EXAMPLE Set-UnityLUN -Name 'LUN01' -Description 'Modified description' Change the description of the LUN named LUN01 #> - [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] + [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN Name or LUN Object')] - $Name, + [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'LUN ID or Object')] + [String[]]$ID, [Parameter(Mandatory = $false,HelpMessage = 'New Name of the LUN')] - [String]$NewName, + [String]$Name, [Parameter(Mandatory = $false,HelpMessage = 'New LUN Description')] [String]$Description, [Parameter(Mandatory = $false,HelpMessage = 'New LUN Size in Bytes')] - [uint64]$Size + [uint64]$Size, + [Parameter(Mandatory = $false,HelpMessage = 'ID of a protection schedule to apply to the storage resource')] + [String]$snapSchedule, + [Parameter(Mandatory = $false,HelpMessage = 'Host to grant access to LUN')] + [String[]]$host, + [Parameter(Mandatory = $false,HelpMessage = 'Append Host access to existing configuration')] + [Switch]$append, + [Parameter(Mandatory = $false,HelpMessage = 'Host access mask')] + [HostLUNAccessEnum]$accessMask = 'Production', + [Parameter(Mandatory = $false,HelpMessage = 'Is assigned snapshot schedule is paused ? (Default is false)')] + [bool]$isSnapSchedulePaused = $false ) Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/storageResource//action/modifyLun' + $Type = 'LUN' + $TypeName = 'UnityLUN' + $StatusCode = 204 } Process { @@ -42,79 +89,133 @@ Function Set-UnityLUN { If ($Sess.TestConnection()) { - Foreach ($n in $Name) { + Foreach ($i in $ID) { - # Determine input and convert to UnityLUN object - Switch ($n.GetType().Name) + Switch ($i.GetType().Name) { "String" { - $LUN = get-UnityLUN -Session $Sess -Name $n - $LUNID = $LUN.id - $LUNName = $n + $Object = get-UnityLUN -Session $Sess -ID $i + $ObjectID = $Object.id + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } - "UnityLUN" { - Write-Verbose "Input object type is $($n.GetType().Name)" - $LUNName = $n.Name - If (Get-UnityLUN -Session $Sess -Name $n.Name) { - $LUNID = $n.id + "$TypeName" { + Write-Verbose "Input object type is $($i.GetType().Name)" + $ObjectID = $i.id + If ($Object = Get-UnityLUN -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } } } - If ($LUNID) { + If ($ObjectID) { - $UnityStorageRessource = Get-UnitystorageResource -Session $sess | ? {($_.Name -like $LUNName) -and ($_.luns.id -like $LUNID)} + $UnitystorageResource = Get-UnitystorageResource -Session $sess | Where-Object {($_.Name -like $ObjectName) -and ($_.luns.id -like $ObjectID)} # Creation of the body hash $body = @{} # Name parameter - If ($NewName) { - $body["name"] = "$($NewName)" + If ($PSBoundParameters.ContainsKey('Name')) { + $body["name"] = $Name } # Description parameter - If ($Description) { - $body["description"] = "$($Description)" + If ($PSBoundParameters.ContainsKey('description')) { + $body["description"] = $Description } # lunParameters parameter - If ($Size) { + If (($PSBoundParameters.ContainsKey('size')) -or ($PSBoundParameters.ContainsKey('host'))) { $body["lunParameters"] = @{} $lunParameters = @{} - - If ($Size) { + + If ($PSBoundParameters.ContainsKey('Size')) { $lunParameters["size"] = $($Size) } + If ($PSBoundParameters.ContainsKey('host')) { + + $lunParameters["hostAccess"] = @() + $hostAccess = @() + + foreach ($h in $host) { + $blockHostAccessParam = @{} + $blockHostAccessParam['host'] = @{} + $HostParam = @{} + $HostParam['id'] = $h + $blockHostAccessParam['host'] = $HostParam + $blockHostAccessParam['accessMask'] = $accessMask + $hostAccess += $blockHostAccessParam + } + + If ($PSBoundParameters.ContainsKey('append')) { + + foreach ($h in $LUN.hostAccess) { + + if (-not ($hostAccess.host.id -contains $h.host.id)) { + $hostAccess += $h + } + } + } else { + Write-Warning -Message 'The existing host access parameters will be overwritten by the new settings. It could result to data unavailibility. Use the -Append parameter to add the new settings to the existing configuration. ' + } + + $lunParameters["hostAccess"] = $hostAccess + + } + $body["lunParameters"] = $lunParameters + } - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/storageResource/'+($UnityStorageRessource.id)+'/action/modifyLun' - Write-Verbose "URI: $URI" - - #Sending the request - If ($pscmdlet.ShouldProcess($LUNName,"Modify LUN")) { - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body + #snapScheduleParameters + If ($snapSchedule) { + $body["snapScheduleParameters"] = @{} + $snapScheduleParameters = @{} + $snapScheduleParam = @{} + $snapScheduleParam["id"] ="$($snapSchedule)" + $snapScheduleParameters["snapSchedule"] = $snapScheduleParam + $snapScheduleParameters["isSnapSchedulePaused"]= "$($isSnapSchedulePaused)" + $body["snapScheduleParameters"] = $snapScheduleParameters } - If ($request.StatusCode -eq '204') { + ####### END BODY - Do not edit beyond this line + + #Show $body in verbose message + $Json = $body | ConvertTo-Json -Depth 10 + Write-Verbose $Json - Write-Verbose "LUN with ID: $LUNID has been modified" + #Building the URL + $URI = $URI -replace '',$UnitystorageResource.id - Get-UnityLUN -Session $Sess -id $LUNID + $URL = 'https://'+$sess.Server+$URI + 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 } - } else { - Write-Verbose "LUN $LUNName does not exist on the array $($sess.Name)" - } - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } + + If ($request.StatusCode -eq $StatusCode) { - End {} -} + Write-Verbose "$Type with ID $ObjectID has been modified" + + Get-UnityLUN -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 diff --git a/Unity-Powershell/Public/Set-UnityMgmtInterface.ps1 b/Unity-Powershell/Public/Set-UnityMgmtInterface.ps1 index 5913b11..dcd6ab2 100644 --- a/Unity-Powershell/Public/Set-UnityMgmtInterface.ps1 +++ b/Unity-Powershell/Public/Set-UnityMgmtInterface.ps1 @@ -37,7 +37,7 @@ Function Set-UnityMgmtInterface { [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), [Parameter(Mandatory = $false,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Management interface ID or Object')] - $ID, + [String[]]$ID, [Parameter(Mandatory = $false,Position = 1,HelpMessage = 'IPv4 or IPv6 address for the interface.')] [string]$ipAddress, [Parameter(Mandatory = $false,HelpMessage = 'IPv4 netmask for the interface, if the interface uses an IPv4 address.')] @@ -50,75 +50,102 @@ Function Set-UnityMgmtInterface { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/mgmtInterface//action/modify' + $Type = 'Management Interface' + $TypeName = 'UnityMgmtInterface' + $StatusCode = 204 } Process { Foreach ($sess in $session) { - Write-Verbose "Processing Session: $($sess.Server) with SessionId: $($sess.SessionId)" - - If ($Sess.TestConnection()) { - - # Determine input and convert to UnityMgmtInterface object - Switch ($ID.GetType().Name) - { - "String" { - $MgmtInterface = get-UnityMgmtInterface -Session $Sess -ID $ID - $MgmtInterfaceID = $MgmtInterface.id - } - "UnityMgmtInterface" { - Write-Verbose "Input object type is $($ID.GetType().Name)" - $MgmtInterfaceID = $ID.id - } - } - - If ($MgmtInterfaceID) { - - # Creation of the body hash - $body = @{} - - # ipAddress argument - If ($PSBoundParameters.ContainsKey('ipAddress')) { - $body["ipAddress"] = "$ipAddress" - } - - If ($PSBoundParameters.ContainsKey('netmask')) { - $body["netmask"] = "$netmask" - } - - If ($PSBoundParameters.ContainsKey('v6PrefixLength')) { - $body["v6PrefixLength"] = "$v6PrefixLength" - } - - If ($PSBoundParameters.ContainsKey('gateway')) { - $body["gateway"] = "$gateway" - } - - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/mgmtInterface/'+$MgmtInterfaceID+'/action/modify' - Write-Verbose "URI: $URI" - - #Sending the request - If ($pscmdlet.ShouldProcess($MgmtInterfaceID,"Modify File Interface. WARNING: You might be disconnected from the interface.")) { - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body - } - - If ($request.StatusCode -eq '204') { - - Write-Verbose "Management interface with ID: $MgmtInterfaceID has been modified" - - Get-UnityMgmtInterface -Session $Sess -id $MgmtInterfaceID - - } - } else { - Write-Verbose "Management interface $MgmtInterfaceID does not exist on the array $($sess.Name)" - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - - End {} -} + Foreach ($i in $ID) { + + Write-Verbose "Processing Session: $($sess.Server) with SessionId: $($sess.SessionId)" + + If ($Sess.TestConnection()) { + + # Determine input and convert to object if necessary + Switch ($i.GetType().Name) + { + "String" { + $Object = get-UnityMgmtInterface -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-UnityMgmtInterface -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } + } + } + } + + If ($ObjectID) { + + #### REQUEST BODY + + # Creation of the body hash + $body = @{} + + # ipAddress argument + If ($PSBoundParameters.ContainsKey('ipAddress')) { + $body["ipAddress"] = "$ipAddress" + } + + If ($PSBoundParameters.ContainsKey('netmask')) { + $body["netmask"] = "$netmask" + } + + If ($PSBoundParameters.ContainsKey('v6PrefixLength')) { + $body["v6PrefixLength"] = "$v6PrefixLength" + } + + If ($PSBoundParameters.ContainsKey('gateway')) { + $body["gateway"] = "$gateway" + } + + ####### 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 + $URI = $URI -replace '',$ObjectID + + $URL = 'https://'+$sess.Server+$URI + 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-UnityMgmtInterface -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 diff --git a/Unity-Powershell/Public/Set-UnityMgmtInterfaceSettings.ps1 b/Unity-Powershell/Public/Set-UnityMgmtInterfaceSettings.ps1 index 5ee85f1..c2a4782 100644 --- a/Unity-Powershell/Public/Set-UnityMgmtInterfaceSettings.ps1 +++ b/Unity-Powershell/Public/Set-UnityMgmtInterfaceSettings.ps1 @@ -32,7 +32,7 @@ Function Set-UnityMgmtInterfaceSettings { replace the exsting address list for this DNS server with this new list. #> - [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] + [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), @@ -45,6 +45,11 @@ Function Set-UnityMgmtInterfaceSettings { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/mgmtInterfaceSettings/0/action/modify' + $Type = 'Global management interfaces settings' + $StatusCode = 204 } Process { @@ -55,6 +60,8 @@ Function Set-UnityMgmtInterfaceSettings { If ($Sess.TestConnection()) { + #### REQUEST BODY + # Creation of the body hash $body = @{} @@ -66,27 +73,28 @@ Function Set-UnityMgmtInterfaceSettings { $body["v6ConfigMode"] = $v6ConfigMode } + ####### END BODY - Do not edit beyond this line + + #Show $body in verbose message + $Json = $body | ConvertTo-Json -Depth 10 + Write-Verbose $Json + #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/mgmtInterfaceSettings/0/action/modify' - Write-Verbose "URI: $URI" + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" #Sending the request - If ($pscmdlet.ShouldProcess($($Sess.Server),"Modify mgmt interface settings")) { - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body + If ($pscmdlet.ShouldProcess($Sess.Name,"Modify $Type $ObjectName")) { + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'POST' -Body $Body } - If ($request.StatusCode -eq '204') { + If ($request.StatusCode -eq $StatusCode) { - Write-Verbose "Global management interfaces settings has been modified" + Write-Verbose "$Type with ID $ObjectID has been modified" Get-UnityMgmtInterfaceSettings -Session $Sess - } - - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - - End {} -} + } # End If ($ObjectID) + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/Set-UnityNTPServer.ps1 b/Unity-Powershell/Public/Set-UnityNTPServer.ps1 index e4d7cfb..cc52195 100644 --- a/Unity-Powershell/Public/Set-UnityNTPServer.ps1 +++ b/Unity-Powershell/Public/Set-UnityNTPServer.ps1 @@ -12,17 +12,23 @@ Function Set-UnityNTPServer { 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 Addresses List of NTP server IP addresses. .PARAMETER rebootPrivilege Indicates whether a system reboot of the NTP server is required for setting the system time. + .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-UnityNTPServer -Addresses '192.168.0.1','192.168.0.2' replace the exsting address list for this NTP server with this new list. #> - [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] + [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), @@ -35,6 +41,11 @@ Function Set-UnityNTPServer { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/ntpServer//action/modify' + $Type = 'NTP Server' + $StatusCode = 204 } Process { @@ -45,7 +56,10 @@ Function Set-UnityNTPServer { If ($Sess.TestConnection()) { - $NTPServer = Get-UnityNTPServer -Session $Sess + $Object = Get-UnityNTPServer -Session $Sess + $ObjectID = $Object.id + + #### REQUEST BODY # Creation of the body hash $body = @{} @@ -57,35 +71,33 @@ Function Set-UnityNTPServer { $body["rebootPrivilege"] = $rebootPrivilege - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/ntpServer/'+($NTPServer.id)+'/action/modify' - Write-Verbose "URI: $URI" - - #Sending the request - If ($pscmdlet.ShouldProcess($($NTPServer.id),"Modify NTP Server")) { - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body - } + ####### END BODY - Do not edit beyond this line - Write-Verbose "Request Status Code: $($request.StatusCode)" + #Show $body in verbose message + $Json = $body | ConvertTo-Json -Depth 10 + Write-Verbose $Json - If ($request.StatusCode -eq '204') { + #Building the URL + $URI = $URI -replace '',$ObjectID - Write-Verbose "NTP Server has been modified" + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" - Get-UnityNTPServer -Session $Sess + #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 '202') { - - Write-Host "NTP Server has been modified. Array might reboot depending of the parameters you provided." + If ($request.StatusCode -eq $StatusCode) { - } + Write-Verbose "$Type with ID $ObjectID has been modified" - } else { - Write-Host "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } + Get-UnityPool -Session $Sess -id $ObjectID - End {} -} + } # End If ($request.StatusCode -eq $StatusCode) + } else { + Write-Warning -Message "$Type with ID $i does not exist on the array $($sess.Name)" + } # End If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/Set-UnityNasServer.ps1 b/Unity-Powershell/Public/Set-UnityNasServer.ps1 index e916781..4a47beb 100644 --- a/Unity-Powershell/Public/Set-UnityNasServer.ps1 +++ b/Unity-Powershell/Public/Set-UnityNasServer.ps1 @@ -12,9 +12,9 @@ Function Set-UnityNASServer { https://github.com/equelin/Unity-Powershell .PARAMETER Session Specifies an UnitySession Object. + .PARAMETER ID + NAS Server ID or Object .PARAMETER Name - Specifies the NAS server name. - .PARAMETER NewName Specifies the NAS server new name. NAS server names can contain alphanumeric characters, a single dash, and a single underscore. Server names cannot contain spaces or begin or end with a dash. @@ -50,19 +50,19 @@ Function Set-UnityNASServer { Change the description of the NAS Server named NAS01 #> - [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] + [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] Param ( #Default Parameters [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), #NasServer - [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Pool Name or Pool Object')] - $Name, + [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'NAS Server ID or Object')] + [String[]]$ID, #NasServer Set parameters [Parameter(Mandatory = $false,HelpMessage = 'New Name of the Nas Server')] - [String]$NewName, + [String]$Name, [Parameter(Mandatory = $false,HelpMessage = 'Storage processor ID on which the NAS server will run')] $homeSP, [Parameter(Mandatory = $false,HelpMessage = 'Indicates whether the NAS server is a replication destination')] @@ -81,6 +81,12 @@ Function Set-UnityNASServer { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/nasServer//action/modify' + $Type = 'NAS Server' + $TypeName = 'UnityNasServer' + $StatusCode = 204 } Process { @@ -91,33 +97,41 @@ Function Set-UnityNASServer { If ($Sess.TestConnection()) { - Foreach ($n in $Name) { + Foreach ($i in $ID) { - # Determine input and convert to UnityPool object - Switch ($n.GetType().Name) + # Determine input and convert to object if necessary + Switch ($i.GetType().Name) { "String" { - $NasServer = get-UnityNasServer -Session $Sess -Name $n - $NasServerID = $NasServer.id - $NasServerName = $NasServer.Name + $Object = get-UnityNASServer -Session $Sess -ID $i + $ObjectID = $Object.id + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } - "UnityPool" { - Write-Verbose "Input object type is $($n.GetType().Name)" - $NasServerName = $n.Name - If ($NasServer = Get-UnityNasServer -Session $Sess -Name $NasServerName) { - $NasServerID = $n.id + "$TypeName" { + Write-Verbose "Input object type is $($i.GetType().Name)" + $ObjectID = $i.id + If ($Object = Get-UnityNASServer -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } } } - If ($NasServerID) { + If ($ObjectID) { # Creation of the body hash $body = @{} # Name parameter - If ($NewName) { - $body["name"] = "$($NewName)" + If ($Name) { + $body["name"] = "$($Name)" } # homeSP parameter @@ -152,31 +166,35 @@ Function Set-UnityNASServer { $body["defaultWindowsUser"] = $defaultWindowsUser } - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/nasServer/'+$NasServerID+'/action/modify' - Write-Verbose "URI: $URI" + ####### 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 + $URI = $URI -replace '',$ObjectID + + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" #Sending the request - If ($pscmdlet.ShouldProcess($NasServerName,"Modify NAS Server")) { - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body + If ($pscmdlet.ShouldProcess($Sess.Name,"Modify $Type $ObjectName")) { + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'POST' -Body $Body } - If ($request.StatusCode -eq '204') { + If ($request.StatusCode -eq $StatusCode) { - Write-Verbose "Pool with ID: $NasServerID has been modified" + Write-Verbose "$Type with ID $ObjectID has been modified" - Get-UnityNasServer -Session $Sess -id $NasServerID + Get-UnityNASServer -Session $Sess -id $ObjectID - } + } # End If ($request.StatusCode -eq $StatusCode) } else { - Write-Verbose "NAS Server $NasServerName does not exist on the array $($sess.Name)" - } - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - - End {} -} + 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 diff --git a/Unity-Powershell/Public/Set-UnityPool.ps1 b/Unity-Powershell/Public/Set-UnityPool.ps1 index f4b6cf7..224dd85 100644 --- a/Unity-Powershell/Public/Set-UnityPool.ps1 +++ b/Unity-Powershell/Public/Set-UnityPool.ps1 @@ -17,15 +17,15 @@ Function Set-UnityPool { 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. - .PARAMETER Name - Name of the pool or Pool Object. + .PARAMETER ID + ID of the pool or Pool Object. .PARAMETER NewName New name of the pool. .PARAMETER Description Description of the pool. - .PARAMETER virtualDisk + .PARAMETER AddVirtualDisk Virtual Disks only with associated parameters to add to the pool. See examples for details. - .PARAMETER raidGroup + .PARAMETER AddraidGroup Parameters to add RAID groups to the pool (disk group, number of disks, RAID level, stripe length). See examples for details. .PARAMETER isFASTCacheEnabled Specify whether to enable FAST Cache on the storage pool. @@ -46,28 +46,28 @@ Function Set-UnityPool { .PARAMETER snapSpaceHarvestLowThreshold Specify the snapshot space used low watermark to trigger auto-delete on the storage pool. .EXAMPLE - Set-UnityPool -Name 'Pool01' -Description 'Modified description' + Set-UnityPool -ID 'pool_10' -Description 'Modified description' - Change the description of the Pool named Pool01 + Change the description of the pool with ID 'pool_10' .EXAMPLE - Set-UnityPool -Name 'Pool01' -AddVirtualDisk @{'id'='vdisk_1';'tier'='Performance'} + Set-UnityPool -ID 'pool_10' -AddVirtualDisk @{'id'='vdisk_1';'tier'='Performance'} - Add a virtual disk 'vdisk_1' to the pool named 'Pool01' + Add a virtual disk 'vdisk_1' to the pool with ID 'pool_10' .EXAMPLE - Set-UnityPool -Name 'Pool01' -AddraidGroup @{"id"='dg_8';"numDisks"= 8; 'raidType'='RAID6'; 'stripeWidth'='8'} + Set-UnityPool -ID 'pool_10' -AddraidGroup @{"id"='dg_8';"numDisks"= 8; 'raidType'='RAID6'; 'stripeWidth'='8'} - Add a raid group 'dg_8' to the pool named 'Pool01' + Add a raid group 'dg_8' to the pool with ID 'pool_10' #> - [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High',DefaultParameterSetName="RaidGroup")] + [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High',DefaultParameterSetName="RaidGroup")] Param ( #Default Parameters [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), #UnityPool - [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Pool Name or Pool Object')] - $Name, + [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Pool ID or Pool Object')] + [String[]]$ID, [Parameter(Mandatory = $false,HelpMessage = 'New Name of the Pool')] [String]$NewName, [Parameter(Mandatory = $false,HelpMessage = 'Pool Description')] @@ -99,6 +99,12 @@ Function Set-UnityPool { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + # Variables + $URI = '/api/instances/pool//action/modify' + $Type = 'Pool' + $TypeName = 'UnityPool' + $StatusCode = 204 + $tier = @{ "Extreme_Performance" = "10" "Performance" = "20" @@ -126,26 +132,36 @@ Function Set-UnityPool { If ($Sess.TestConnection()) { - Foreach ($n in $Name) { + Foreach ($i in $ID) { - # Determine input and convert to UnityPool object - Switch ($n.GetType().Name) + # Determine input and convert to object if necessary + Switch ($i.GetType().Name) { "String" { - $Pool = get-UnityPool -Session $Sess -Name $n - $PoolID = $Pool.id - $PoolName = $Pool.Name + $Object = get-UnityPool -Session $Sess -ID $i + $ObjectID = $Object.id + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } - "UnityPool" { - Write-Verbose "Input object type is $($n.GetType().Name)" - $PoolName = $n.Name - If ($Pool = Get-UnityPool -Session $Sess -Name $PoolName) { - $PoolID = $n.id + "$TypeName" { + Write-Verbose "Input object type is $($i.GetType().Name)" + $ObjectID = $i.id + If ($Object = Get-UnityPool -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } } } - If ($PoolID) { + If ($ObjectID) { + + #### REQUEST BODY # Creation of the body hash $body = @{} @@ -239,31 +255,35 @@ Function Set-UnityPool { $body["isFASTVpScheduleEnabled"] = $isFASTVpScheduleEnabled } - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/pool/'+$PoolID+'/action/modify' - Write-Verbose "URI: $URI" + ####### 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 + $URI = $URI -replace '',$ObjectID + + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" #Sending the request - If ($pscmdlet.ShouldProcess($Sess.Name,"Modify Pool $($PoolName)")) { - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body + If ($pscmdlet.ShouldProcess($Sess.Name,"Modify $Type $ObjectName")) { + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'POST' -Body $Body } - If ($request.StatusCode -eq '204') { + If ($request.StatusCode -eq $StatusCode) { - Write-Verbose "Pool with ID: $PoolID has been modified" + Write-Verbose "$Type with ID $ObjectID has been modified" - Get-UnityPool -Session $Sess -id $PoolID + Get-UnityPool -Session $Sess -id $ObjectID - } + } # End If ($request.StatusCode -eq $StatusCode) } else { - Write-Verbose "Pool $PoolName does not exist on the array $($sess.Name)" - } - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - - End {} -} + 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 diff --git a/Unity-Powershell/Public/Set-UnitySMTPServer.ps1 b/Unity-Powershell/Public/Set-UnitySMTPServer.ps1 index 3819496..9861e0b 100644 --- a/Unity-Powershell/Public/Set-UnitySMTPServer.ps1 +++ b/Unity-Powershell/Public/Set-UnitySMTPServer.ps1 @@ -2,9 +2,9 @@ Function Set-UnitySMTPServer { <# .SYNOPSIS - Modifies CIFS share. + Modifies SMTP Server. .DESCRIPTION - Modifies CIFS share. + Modifies SMTP 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 @@ -21,9 +21,9 @@ Function Set-UnitySMTPServer { .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-UnitySMTPServer -ID 'SMBShare_1' -Description 'New description' + Set-UnitySMTPServer -ID 'default' -Address smtp.example.com - Modifies the CIFS share with id 'SMBShare_1' + Modifies the default SMTP Server #> [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] @@ -33,13 +33,19 @@ Function Set-UnitySMTPServer { $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'ID of the SMTP Server')] - [String]$ID, + [String[]]$ID, [Parameter(Mandatory = $true,HelpMessage = 'IP address of the SMTP server.')] [String]$address ) Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/smtpServer//action/modify' + $Type = 'SMTP Server' + $TypeName = 'UnitySMTPServer' + $StatusCode = 204 } Process { @@ -50,51 +56,71 @@ Function Set-UnitySMTPServer { If ($Sess.TestConnection()) { - # Determine input and convert to UnitySMTPServer object - - Write-Verbose "Input object type is $($ID.GetType().Name)" - Switch ($ID.GetType().Name) - { - "String" { - $SMTPServer = get-UnitySMTPServer -Session $Sess -ID $ID - $SMTPServerID = $SMTPServer.id - } - "UnitySMTPServer" { - $SMTPServerID = $ID.id + Foreach ($i in $ID) { + + # Determine input and convert to object if necessary + Switch ($i.GetType().Name) + { + "String" { + $Object = get-UnitySMTPServer -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-UnitySMTPServer -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } + } + } } - } - If ($SMTPServerID) { + If ($ObjectID) { - # Creation of the body hash - $body = @{} + #### REQUEST BODY - $body["address"] = $address + # Creation of the body hash + $body = @{} - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/smtpServer/'+$SMTPServerID+'/action/modify' - Write-Verbose "URI: $URI" + $body["address"] = $address - #Sending the request - If ($pscmdlet.ShouldProcess($SMTPServerID,"Modify SMTP Server")) { - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body - } + ####### END BODY - Do not edit beyond this line - If ($request.StatusCode -eq '204') { + #Show $body in verbose message + $Json = $body | ConvertTo-Json -Depth 10 + Write-Verbose $Json - Write-Verbose "SMTP Server with ID: $SMTPServerID has been modified" + #Building the URL + $URI = $URI -replace '',$ObjectID - Get-UnitySMTPServer -Session $Sess -id $SMTPServerID + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" - } - } else { - Write-Verbose "SMTP Server $SMTPServerID does not exist on the array $($sess.Name)" - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } + #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-UnitySMTPServer -Session $Sess -id $ObjectID - End {} -} + } # 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 diff --git a/Unity-Powershell/Public/Set-UnitySystem.ps1 b/Unity-Powershell/Public/Set-UnitySystem.ps1 new file mode 100644 index 0000000..74ac426 --- /dev/null +++ b/Unity-Powershell/Public/Set-UnitySystem.ps1 @@ -0,0 +1,149 @@ +Function Set-UnitySystem { + + <# + .SYNOPSIS + Modifies Unity storage system. + .DESCRIPTION + Modifies Unity storage system. + 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 ID + ID or Object. + .PARAMETER name + New name of the Unity + .PARAMETER isUpgradeCompleted + Indicates whether to manually mark an upgrade process completed. + .PARAMETER isEulaAccepted + Indicates whether to accept the End User License Agreement (EULA). + .PARAMETER isAutoFailbackEnabled + Indicates whether to enable the automatic failback of NAS servers in the system. + .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-UnitySystem -ID '0' -isEULAAccepted $True + + Accept the EULA. + #> + + [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] + Param ( + #Default Parameters + [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] + $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), + + [Parameter(Mandatory = $false,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'ID or Object')] + [String]$ID = '0', + [Parameter(Mandatory = $false,HelpMessage = 'New name of the Unity')] + [String]$name, + [Parameter(Mandatory = $false,HelpMessage = 'Indicates whether to manually mark an upgrade process completed')] + [bool]$isUpgradeCompleted, + [Parameter(Mandatory = $false,HelpMessage = 'Indicates whether to accept the End User License Agreement (EULA)')] + [bool]$isEulaAccepted, + [Parameter(Mandatory = $false,HelpMessage = 'Indicates whether to enable the automatic failback of NAS servers in the system')] + [bool]$isAutoFailbackEnabled + ) + + Begin { + Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/system//action/modify' + $Type = 'System' + $TypeName = 'UnitySystem' + $StatusCode = 204 + } + + Process { + + Foreach ($sess in $session) { + + Write-Verbose "Processing Session: $($sess.Server) with SessionId: $($sess.SessionId)" + + If ($Sess.TestConnection()) { + + # Determine input and convert to object if necessary + Switch ($ID.GetType().Name) + { + "String" { + $Object = get-UnitySystem -Session $Sess -ID $ID + $ObjectID = $Object.id + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } + } + "$TypeName" { + Write-Verbose "Input object type is $($ID.GetType().Name)" + $ObjectID = $ID.id + If ($Object = Get-UnitySystem -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } + } + } + } + + If ($ObjectID) { + + #### REQUEST BODY + + # Creation of the body hash + $body = @{} + + If ($PSBoundParameters.ContainsKey('name')) { + $body["name"] = $name + } + + If ($PSBoundParameters.ContainsKey('isUpgradeCompleted')) { + $body["isUpgradeCompleted"] = $isUpgradeCompleted + } + + If ($PSBoundParameters.ContainsKey('isEulaAccepted')) { + $body["isEulaAccepted"] = $isEulaAccepted + } + + If ($PSBoundParameters.ContainsKey('isAutoFailbackEnabled')) { + $body["isAutoFailbackEnabled"] = $isAutoFailbackEnabled + } + + ####### 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 + $URI = $URI -replace '',$ObjectID + + $URL = 'https://'+$sess.Server+$URI + 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-UnitySystem -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 If ($Sess.TestConnection()) + } # End Foreach ($sess in $session) + } # End Process +} # End Function diff --git a/Unity-Powershell/Public/Set-UnityUser.ps1 b/Unity-Powershell/Public/Set-UnityUser.ps1 index cd05fa4..2733467 100644 --- a/Unity-Powershell/Public/Set-UnityUser.ps1 +++ b/Unity-Powershell/Public/Set-UnityUser.ps1 @@ -10,6 +10,25 @@ Function Set-UnityUser { 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 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. + .PARAMETER ID + User ID or Object. + .PARAMETER role + User role. Might be: + - administrator + - storageadmin + - vmadmin + - operator + .PARAMETER newPassword + New password for the user + .PARAMETER oldPassword + Initial password for the user. .EXAMPLE Set-UnityUser -Name 'User' -Role 'operator' @@ -24,18 +43,25 @@ Function Set-UnityUser { Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), - [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'User Name or User Object')] - $Name, + [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'User ID or Object')] + [String[]]$ID, [Parameter(Mandatory = $false,HelpMessage = 'User role. It mights be administrator, storageadmin, vmadmin or operator')] + [ValidateSet('administrator', 'storageadmin', 'vmadmin', 'operator')] [String]$Role, [Parameter(Mandatory = $false,HelpMessage = 'User Password')] - [String]$Password, + [String]$newPassword, [Parameter(Mandatory = $false,HelpMessage = 'User Password')] [String]$oldPassword ) Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/user//action/modify' + $Type = 'User' + $TypeName = 'UnityUser' + $StatusCode = 204 } Process { @@ -46,31 +72,42 @@ Function Set-UnityUser { If ($Sess.TestConnection()) { - Foreach ($n in $Name) { + Foreach ($i in $ID) { - # Determine input and convert to UnityUser object - Switch ($n.GetType().Name) + # Determine input and convert to object if necessary + Switch ($i.GetType().Name) { "String" { - $User = get-UnityUser -Session $Sess -Name $n - $UserID = $User.id - $UserName = $n + $Object = get-UnityUser -Session $Sess -ID $i + $ObjectID = $Object.id + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } - "UnityUser" { - Write-Verbose "Input object type is $($n.GetType().Name)" - $UserName = $n.Name - If (Get-UnityUser -Session $Sess -Name $n.Name) { - $UserID = $n.id + "$TypeName" { + Write-Verbose "Input object type is $($i.GetType().Name)" + $ObjectID = $i.id + If ($Object = Get-UnityUser -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } } } - If ($UserID) { + If ($ObjectID) { + + #### REQUEST BODY + # Creation of the body hash $body = @{} # Role parameter - $body["id"] = "$($UserID)" + $body["id"] = "$($ObjectID)" # role parameter If ($Role) { @@ -80,35 +117,38 @@ Function Set-UnityUser { # oldPassword parameter If ($password -and $oldPassword) { $body["oldPassword"] = "$($oldPassword)" - $body["password"] = "$($password)" + $body["password"] = "$($newPassword)" } - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/user/'+$UserID+'/action/modify' - Write-Verbose "URI: $URI" + ####### 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 + $URI = $URI -replace '',$ObjectID + + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" #Sending the request - If ($pscmdlet.ShouldProcess($UserName,"Modify User")) { - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body + If ($pscmdlet.ShouldProcess($Sess.Name,"Modify $Type $ObjectName")) { + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'POST' -Body $Body } - If ($request.StatusCode -eq '204') { + If ($request.StatusCode -eq $StatusCode) { - Write-Verbose "User with ID: $id has been modified" + Write-Verbose "$Type with ID $ObjectID has been modified" - Get-UnityUser -Session $Sess -id $UserID + Get-UnityUser -Session $Sess -id $ObjectID - } + } # End If ($request.StatusCode -eq $StatusCode) } else { - Write-Information -MessageData "User $UserName does not exist on the array $($sess.Name)" - } - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - - End { - } -} + 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 diff --git a/Unity-Powershell/Public/Set-UnityVMwareLUN.ps1 b/Unity-Powershell/Public/Set-UnityVMwareLUN.ps1 index 3500911..9f6ff35 100644 --- a/Unity-Powershell/Public/Set-UnityVMwareLUN.ps1 +++ b/Unity-Powershell/Public/Set-UnityVMwareLUN.ps1 @@ -51,7 +51,7 @@ Function Set-UnityVMwareLUN { Grant 'production' access to host 'Host_12' to VMware bock LUN with ID 'sv_78'. #> - [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] + [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')] Param ( [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')] $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}), @@ -77,6 +77,12 @@ Function Set-UnityVMwareLUN { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" + + # Variables + $URI = '/api/instances/storageResource//action/modifyVmwareLun' + $Type = 'VMware LUN' + $TypeName = 'UnityLun' + $StatusCode = 204 } Process { @@ -87,29 +93,35 @@ Function Set-UnityVMwareLUN { If ($Sess.TestConnection()) { - Foreach ($I in $ID) { + Foreach ($i in $ID) { - # Determine input and convert to an object - Write-Verbose "Input object type is $($I.GetType().Name)" - Switch ($I.GetType().Name) + Switch ($i.GetType().Name) { "String" { - $LUN = get-UnityVMwareLUN -Session $Sess -ID $I - $LUNID = $LUN.idget - $LUNName = $LUN.Name + $Object = get-UnityVMwareLUN -Session $Sess -ID $i + $ObjectID = $Object.id + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } - "UnityLUN" { - Write-Verbose "Input object type is $($n.GetType().Name)" - $LUNName = $I.Name - If ($LUN = Get-UnityVMwareLUN -Session $Sess -ID $I.id) { - $LUNID = $LUN.id + "$TypeName" { + Write-Verbose "Input object type is $($i.GetType().Name)" + $ObjectID = $i.id + If ($Object = Get-UnityVMwareLUN -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } } } - If ($LUNID) { + If ($ObjectID) { - $UnityStorageRessource = Get-UnitystorageResource -Session $sess | Where-Object {($_.Name -like $LUNName) -and ($_.luns.id -like $LUNID)} + $UnitystorageResource = Get-UnitystorageResource -Session $sess | Where-Object {($_.Name -like $ObjectName) -and ($_.luns.id -like $ObjectID)} # Creation of the body hash $body = @{} @@ -179,35 +191,35 @@ Function Set-UnityVMwareLUN { $body["snapScheduleParameters"] = $snapScheduleParameters } - #Displaying request's body + ####### END BODY - Do not edit beyond this line + + #Show $body in verbose message $Json = $body | ConvertTo-Json -Depth 10 - Write-Verbose $Json + Write-Verbose $Json + + #Building the URL + $URI = $URI -replace '',$UnitystorageResource.id - #Building the URI - $URI = 'https://'+$sess.Server+'/api/instances/storageResource/'+($UnityStorageRessource.id)+'/action/modifyVmwareLun ' - Write-Verbose "URI: $URI" + $URL = 'https://'+$sess.Server+$URI + Write-Verbose "URL: $URL" #Sending the request - If ($pscmdlet.ShouldProcess($LUNName,"Modify LUN")) { - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body + If ($pscmdlet.ShouldProcess($Sess.Name,"Modify $Type $ObjectName")) { + $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'POST' -Body $Body } + + If ($request.StatusCode -eq $StatusCode) { - If ($request.StatusCode -eq '204') { - - Write-Verbose "LUN with ID: $LUNID has been modified" + Write-Verbose "$Type with ID $ObjectID has been modified" - Get-UnityVMwareLUN -Session $Sess -id $LUNID + Get-UnityVMwareLUN -Session $Sess -ID $ObjectID - } + } # End If ($request.StatusCode -eq $StatusCode) } else { - Write-Verbose "VMware LUN $LUNName does not exist on the array $($sess.Name)" - } - } - } else { - Write-Information -MessageData "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - - End {} -} + 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 diff --git a/Unity-Powershell/Public/Set-UnityvCenter.ps1 b/Unity-Powershell/Public/Set-UnityvCenter.ps1 index 78526af..9ed1083 100644 --- a/Unity-Powershell/Public/Set-UnityvCenter.ps1 +++ b/Unity-Powershell/Public/Set-UnityvCenter.ps1 @@ -150,7 +150,7 @@ Function Set-UnityvCenter { } 'ImportHosts' { - $recommendation = Get-UnityHostContainerReco -Session $Sess -Address $vCenterServer.address -Username $Username -Password $Password + $recommendation = Get-UnityHostContainerReco -Session $Sess -Address $vCenterServer.address -Username $Username -Password $Password Foreach ($Host in $recommendation.potentialHosts) { diff --git a/Unity-Powershell/Public/Update-UnityvCenter.ps1 b/Unity-Powershell/Public/Update-UnityvCenter.ps1 index e2d2956..4fa6aa0 100644 --- a/Unity-Powershell/Public/Update-UnityvCenter.ps1 +++ b/Unity-Powershell/Public/Update-UnityvCenter.ps1 @@ -32,7 +32,7 @@ Function Update-UnityvCenter { #vCenter [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'ID or Object of a vCenter server')] - $ID, + [String[]]$ID, [Parameter(Mandatory = $true,ParameterSetName="Refresh",HelpMessage = 'Refresh all the hosts managed by the host container.')] [switch]$Refresh, [Parameter(Mandatory = $true,ParameterSetName="RefreshAll",HelpMessage = 'Refresh all known vCenters and ESX servers.')] @@ -42,8 +42,11 @@ Function Update-UnityvCenter { Begin { Write-Verbose "Executing function: $($MyInvocation.MyCommand)" - #Initialazing arrays - $ResultCollection = @() + # Variables + $URI = '/api/instances/storageResource//action/modifyLun' + $Type = 'vCenter' + $TypeName = 'UnityvCenterServer' + $StatusCode = 204 } Process { @@ -51,56 +54,69 @@ Function Update-UnityvCenter { Write-Verbose "Processing Session: $($sess.Server) with SessionId: $($sess.SessionId)" + If ($Sess.TestConnection()) { + Foreach ($i in $ID) { - Write-Verbose "Input object type is $($ID.GetType().Name)" Switch ($i.GetType().Name) { "String" { - $vCenterServer = get-UnityvCenter -Session $Sess -ID $i - $vCenterServerID = $vCenterServer.id + $Object = get-UnityvCenter -Session $Sess -ID $i + $ObjectID = $Object.id + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } } - "UnityvCenterServer" { - $vCenterServerID = $i.id + "$TypeName" { + Write-Verbose "Input object type is $($i.GetType().Name)" + $ObjectID = $i.id + If ($Object = Get-UnityvCenter -Session $Sess -ID $ObjectID) { + If ($Object.Name) { + $ObjectName = $Object.Name + } else { + $ObjectName = $ObjectID + } + } } } - # Creation of the body hash - $body = @{} + If ($ObjectID) { - # serviceType parameter - $body["doRescan"] = $True + # Creation of the body hash + $body = @{} - If ($Sess.TestConnection()) { + # serviceType parameter + $body["doRescan"] = $True - #Building the URI - Switch ($PsCmdlet.ParameterSetName) { - 'Refresh' { - $URI = 'https://'+$sess.Server+'/api/instances/hostContainer/'+$vCenterServerID+'/action/refresh' + #Building the URI + Switch ($PsCmdlet.ParameterSetName) { + 'Refresh' { + $URI = 'https://'+$sess.Server+'/api/instances/hostContainer/'+$ObjectID+'/action/refresh' + } + 'RefreshAll' { + $URI = 'https://'+$sess.Server+'/api/types/hostContainer/action/refreshAll' + } } - 'RefreshAll' { - $URI = 'https://'+$sess.Server+'/api/types/hostContainer/action/refreshAll' - } - } - Write-Verbose "URI: $URI" + Write-Verbose "URI: $URI" - #Sending the request - $request = Send-UnityRequest -uri $URI -Session $Sess -Method 'POST' -Body $Body + #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 $StatusCode) { - If ($request.StatusCode -eq '204') { - - Write-Information -MessageData "vCenter(s) refreshed successfully" - - } - } else { - Write-Warning "You are no longer connected to EMC Unity array: $($Sess.Server)" - } - } - } - } + Write-Verbose "$Type with ID $ObjectID has been refreshed" - End {} -} + Get-UnityvCenter -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 diff --git a/Unity-Powershell/Unity-Powershell.psd1 b/Unity-Powershell/Unity-Powershell.psd1 index d74a37b..6a2efff 100644 --- a/Unity-Powershell/Unity-Powershell.psd1 +++ b/Unity-Powershell/Unity-Powershell.psd1 @@ -12,7 +12,7 @@ RootModule = 'Unity-Powershell.psm1' # Version number of this module. -ModuleVersion = '0.7.0' +ModuleVersion = '0.8.0' # ID used to uniquely identify this module GUID = '586e7e62-9753-4fd6-91b6-89d8d89d69a2' diff --git a/Unity-Powershell/Unity-Powershell.psm1 b/Unity-Powershell/Unity-Powershell.psm1 index 98c66d2..83e7b78 100644 --- a/Unity-Powershell/Unity-Powershell.psm1 +++ b/Unity-Powershell/Unity-Powershell.psm1 @@ -49,6 +49,7 @@ Class UnitySession { } Catch { $this.IsConnected = $false + Write-Warning -Message "You are no longer connected to EMC Unity array: $($this.Server)" return $false } @@ -74,6 +75,8 @@ Class UnitySystem { [string]$internalModel [string]$platform [string]$macAddress + [bool]$isEULAAccepted + [bool]$isUpgradeComplete } Class UnityUser { diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000..fa8cbc2 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,20 @@ +# See http://www.appveyor.com/docs/appveyor-yml for many more options + +#Publish to PowerShell Gallery with this key +environment: + NuGetApiKey: + secure: UIr9SZkDLqMe2EjAP2CBmvomalY6sRAenwlLYR3fRDdyUhB1/RO7nsvYFRGM36RD + +# Allow WMF5 (i.e. PowerShellGallery functionality) +os: WMF 5 + +# Skip on updates to the readme. +# We can force this by adding [skip ci] or [ci skip] anywhere in commit message +skip_commits: + message: /updated readme.*|update readme.*s/ + +build: false + +#Kick off the CI/CD pipeline +test_script: + - ps: . .\build.ps1 \ No newline at end of file diff --git a/build.ps1 b/build.ps1 new file mode 100644 index 0000000..dd07415 --- /dev/null +++ b/build.ps1 @@ -0,0 +1,53 @@ +function Resolve-Module +{ + [Cmdletbinding()] + param + ( + [Parameter(Mandatory)] + [string[]]$Name + ) + Process + { + foreach ($ModuleName in $Name) + { + $Module = Get-Module -Name $ModuleName -ListAvailable + Write-Verbose -Message "Resolving Module $($ModuleName)" + + if ($Module) + { + $Version = $Module | Measure-Object -Property Version -Maximum | Select-Object -ExpandProperty Maximum + $GalleryVersion = Find-Module -Name $ModuleName -Repository PSGallery | Measure-Object -Property Version -Maximum | Select-Object -ExpandProperty Maximum + + if ($Version -lt $GalleryVersion) + { + if ((Get-PSRepository -Name PSGallery).InstallationPolicy -ne 'Trusted') { Set-PSRepository -Name PSGallery -InstallationPolicy Trusted } + + Write-Verbose -Message "$($ModuleName) Installed Version [$($Version.tostring())] is outdated. Installing Gallery Version [$($GalleryVersion.tostring())]" + Install-Module -Name $ModuleName -Force + Import-Module -Name $ModuleName -Force -RequiredVersion $GalleryVersion + } + else + { + Write-Verbose -Message "Module Installed, Importing $($ModuleName)" + Import-Module -Name $ModuleName -Force -RequiredVersion $Version + } + } + else + { + Write-Verbose -Message "$($ModuleName) Missing, installing Module" + Install-Module -Name $ModuleName -Force + Import-Module -Name $ModuleName -Force -RequiredVersion $Version + } + } + } +} + +# Grab nuget bits, install modules, set build variables, start build. +Get-PackageProvider -Name NuGet -ForceBootstrap | Out-Null + +Resolve-Module Psake, PSDeploy, Pester, BuildHelpers + +Set-BuildEnvironment + +Invoke-psake .\psake.ps1 +exit ( [int]( -not $psake.build_success ) ) \ No newline at end of file diff --git a/psake.ps1 b/psake.ps1 new file mode 100644 index 0000000..e550e7d --- /dev/null +++ b/psake.ps1 @@ -0,0 +1,86 @@ +# PSake makes variables declared here available in other scriptblocks +# Init some things +Properties { + # Find the build folder based on build system + $ProjectRoot = $ENV:BHProjectPath + if(-not $ProjectRoot) + { + $ProjectRoot = $PSScriptRoot + } + + $Timestamp = Get-date -uformat "%Y%m%d-%H%M%S" + $PSVersion = $PSVersionTable.PSVersion.Major + $TestFile = "TestResults_PS$PSVersion`_$TimeStamp.xml" + $lines = '----------------------------------------------------------------------' + + $Verbose = @{} + if($ENV:BHCommitMessage -match "!verbose") + { + $Verbose = @{Verbose = $True} + } +} + +Task Default -Depends Deploy + +Task Init { + $lines + Set-Location $ProjectRoot + "Build System Details:" + Get-Item ENV:BH* + "`n" +} + +Task Test -Depends Init { + $lines + "`n`tSTATUS: Testing with PowerShell $PSVersion" + + # Gather test results. Store them in a variable and file + $TestResults = Invoke-Pester -Path $ProjectRoot\Tests -PassThru -OutputFormat NUnitXml -OutputFile "$ProjectRoot\$TestFile" + + # In Appveyor? Upload our tests! #Abstract this into a function? + If($ENV:BHBuildSystem -eq 'AppVeyor') + { + (New-Object 'System.Net.WebClient').UploadFile( + "https://ci.appveyor.com/api/testresults/nunit/$($env:APPVEYOR_JOB_ID)", + "$ProjectRoot\$TestFile" ) + } + + Remove-Item "$ProjectRoot\$TestFile" -Force -ErrorAction SilentlyContinue + + # Failed tests? + # Need to tell psake or it will proceed to the deployment. Danger! + if($TestResults.FailedCount -gt 0) + { + Write-Error "Failed '$($TestResults.FailedCount)' tests, build failed" + } + "`n" +} + +Task Build -Depends Test { + $lines + + # Load the module, read the exported functions, update the psd1 FunctionsToExport + Set-ModuleFunctions + + # Bump the module version + Try + { + $Version = Get-NextPSGalleryVersion -Name $env:BHProjectName -ErrorAction Stop + Update-Metadata -Path $env:BHPSModuleManifest -PropertyName ModuleVersion -Value $Version -ErrorAction stop + } + Catch + { + "Failed to update version for '$env:BHProjectName': $_.`nContinuing with existing version" + } +} + +Task Deploy -Depends Build { + $lines + + $Params = @{ + Path = $ProjectRoot + Force = $true + Recurse = $false # We keep psdeploy artifacts, avoid deploying those : ) + } + Invoke-PSDeploy @Verbose @Params +} \ No newline at end of file