diff --git a/SetDatastoreTag.ps1 b/SetDatastoreTag.ps1 deleted file mode 100755 index 23708e5..0000000 --- a/SetDatastoreTag.ps1 +++ /dev/null @@ -1,198 +0,0 @@ -<# - .SYNOPSIS - A brief description of the file. - - .DESCRIPTION - Given a list of Datastore Names, this script will assign a Tag to them - - .PARAMETER csvFile - String representing the full path of the file - The file must be structured like this: - ----------------------------- - Tag1,Tag2,Tag3,Tag4 - IPv4-iSCSI-SiteA,Tag1,Tag3 - IPv4-NFS-SiteA,Tag2,Tag4 - ... - ----------------------------- - - .NOTES - =========================================================================== - Created on: 31/03/2017 11:16 - Created by: Alessio Rocchi - Organization: VMware - Filename: SetDatastoreTag.ps1 - =========================================================================== -#> -[CmdletBinding()] -param -( - [Parameter(Mandatory = $true, - ValueFromPipeline = $true)] - [ValidateNotNullOrEmpty()] - [System.String]$csvFile, - [Parameter(Mandatory = $true, - ValueFromPipeline = $true)] - [ValidateNotNullOrEmpty()] - [String]$vCenter, - [Parameter(ValueFromPipeline = $true, - Position = 2)] - [AllowNull()] - [String]$Username, - [Parameter(Position = 3)] - [AllowNull()] - [String]$Password -) - -Import-Module -Name VMware.VimAutomation.Core -ErrorAction SilentlyContinue | Out-Null - -class vcConnector : System.IDisposable -{ - [String]$Username - [String]$Password - [String]$vCenter - [PSObject]$server - - static [vcConnector]$instance - - vcConnector($Username, $Password, $vCenter) - { - Import-Module -Name VMware.VimAutomation.Core -ErrorAction SilentlyContinue | Out-Null - - $this.Username = $Username - $this.Password = $Password - $this.vCenter = $vCenter - $this.connect() - } - - vcConnector($vcCredential, $vCenter) - { - Import-Module -Name VMware.VimAutomation.Core -ErrorAction SilentlyContinue | Out-Null - - $this.vcCredential = $vcCredential - $this.vCenter = $vCenter - $this.connect() - } - - [void] hidden connect() - { - try - { - if ([String]::IsNullOrEmpty($this.Username) -or [String]::IsNullOrEmpty($this.Password)) - { - $vcCredential = Get-Credential - Connect-VIServer -Server $this.vCenter -Credential $this.vcCredential -WarningAction SilentlyContinue -ErrorAction Stop | Out-Null - } - else - { - Connect-VIServer -Server $this.vCenter -User $this.Username -Password $this.Password -WarningAction SilentlyContinue -ErrorAction Stop - } - Write-Debug("Connected to vCenter: {0}" -f $this.vCenter) - } - catch - { - Write-Error($Error[0].Exception.Message) - exit - } - } - - - [void] Dispose() - { - Write-Debug("Called Dispose Method of Instance: {0}" -f ($this)) - Disconnect-VIServer -WarningAction SilentlyContinue -Server $this.vCenter -Force -Confirm:$false | Out-Null - } - - static [vcConnector] GetInstance() - { - if ([vcConnector]::instance -eq $null) - { - [vcConnector]::instance = [vcConnector]::new() - } - - return [vcConnector]::instance - } -} - -class Content{ - [System.Collections.Generic.List[System.String]]$availableTags - [System.Collections.Generic.List[System.String]]$elements - - Content() - { - } - - Content([String]$filePath) - { - if ((Test-Path -Path $filePath) -eq $false) - { - throw ("Cannot find file: {0}" -f ($filePath)) - } - try - { - # Cast the Get-Content return type to Generic List of Strings in order to avoid fixed-size array - $this.elements = [System.Collections.Generic.List[System.String]](Get-Content -Path $filePath -ea SilentlyContinue -wa SilentlyContinue) - $this.availableTags = $this.elements[0].split(',') - # Delete the first element aka availableTags - $this.elements.RemoveAt(0) - } - catch - { - throw ("Error reading the file: {0}" -f ($filePath)) - } - } -} - -try -{ - $vc = [vcConnector]::new($Username, $Password, $vCenter) - $csvContent = [Content]::new($csvFile) - - Write-Host("Available Tags: {0}" -f ($csvContent.availableTags)) - - foreach ($element in $csvContent.elements) - { - [System.Collections.Generic.List[System.String]]$splittedList = $element.split(',') - # Get the Datastore Name - [System.String]$datastoreName = $splittedList[0] - # Removing Datastore Name - $splittedList.RemoveAt(0) - # Create a List of Tags which will be assigned to the Datastore - [System.Collections.Generic.List[PSObject]]$tagsToAssign = $splittedList | ForEach-Object { Get-Tag -Name $_ } - Write-Host("Tags to assign to Datastore: {0} are: {1}" -f ($datastoreName, $tagsToAssign)) - # Get Datastore object by the given Datastore Name, first field of the the line - $datastore = Get-Datastore -Name $datastoreName -ea Stop - # Iterate the assigned Datastore Tags - foreach ($tag in ($datastore | Get-TagAssignment)) - { - # Check if the current tag is one of the available ones. - if ($tag.Tag.Name -in $csvContent.availableTags) - { - # Remove the current assigned Tag - Write-Host("Removing Tag: {0}" -f ($tag)) - Remove-TagAssignment -TagAssignment $tag -Confirm:$false - } - } - # Finally add the new set of tags to the Datastore - foreach ($tag in $tagsToAssign) - { - Write-Host("Trying to assign Tag: {0} to Datastore: {1}" -f ($tag.Name, $datastoreName)) - # Assign the Tag - New-TagAssignment -Entity $datastore -Tag $tag - } - } -} -catch [VMware.VimAutomation.Sdk.Types.V1.ErrorHandling.VimException.VimException] -{ - Write-Error("VIException: {0}" -f ($Error[0].Exception.Message)) - exit -} -catch -{ - Write-Error $Error[0].Exception.Message - exit -} -finally -{ - # Let be assured that the vc connection will be disposed. - $vc.Dispose() -}