param ( [parameter(Mandatory=$true, HelpMessage="Cluster IP address")] [string]$Cluster, [parameter(Mandatory=$true, HelpMessage="Volume name")] [string]$VolumeName, [parameter(Mandatory=$true, HelpMessage="Storage Virtual Machine name")] [string]$VserverName ) # connect to cluster Connect-WfaCluster $Cluster $lastConnectedCluster = $Cluster $clusterInfo = Get-NcCluster # Testing volume existence. As this command doesn't throw exception if # ErrorAction is 'Stop' and the volume isn't found. So, an explicit check. $vol = Get-NcVol -Name $VolumeName -Vserver $VserverName if(!$vol) { throw "Volume '$VolumeName' not found on Storage Virtual Machine '$VserverName'" } # Validating that existing vsm relationships in which the target volume is the source # can be removed from their destination clusters. # vsm relationships in which the target volume is source $vsmAsSource = Get-NcSnapmirrorDestination -SourceVolume $volumename #CMW_ADD # looping through vsm relationships in which the target volume is the source # and testing credential existence for destination clusters in those relationships # so we want to remove relationships from the destinations and not from source if ($vsmAsSource){ foreach($vsm in $vsmAsSource){ try{ $vserverpeer = Get-NcVserverPeer -Vserver $VserverName -PeerVserver $vsm.DestinationVserver if ($vserverpeer.PeerCluster -ne $global:CurrentNcController.Name){ Connect-WfaCluster $vserverpeer.PeerCluster $lastConnectedCluster = $vserverpeer.PeerCluster } Remove-NcSnapmirror -Source $vsm.SourceLocation -Destination $vsm.DestinationLocation -Confirm:$false -ErrorAction Stop } catch{ Get-WFALogger -Warn -message $("Could not remove the VSM relationship from " + $VolumeName + "-->" +$vsm.DestinationVserver + ":" + $vsm.DestinationVolume + " "+$_.Exception.Message) try { Connect-WfaCluster $Cluster if ($vol.state -eq 'offline'){$vol | set-ncvol -online} $vsm | Invoke-NcSnapmirrorRelease -RelationshipInfoOnly -Confirm:$false $vol | set-ncvol -offline } catch{ Get-WFALogger -Warn -message $("Could not release the VSM relationship from " + $VolumeName + "-->" +$vsm.DestinationVserver + ":" + $vsm.DestinationVolume + " "+$_.Exception.Message) } } } } # removing vsm relationships in which the target volume is destination # connect back to original target cluster only if the last connected cluster was another # comparing based on hostname and ipaddress if($lastConnectedCluster -ne $Cluster -and $lastConnectedCluster -ne $clusterInfo.ClusterName) { Connect-WfaCluster $Cluster } $vsmAsDestination = Get-NcSnapmirror | where{$_.DestinationVserver -eq $VServerName -and $_.DestinationVolume -eq $VolumeName -and ($_.DestinationCluster -eq $Cluster -or $_.DestinationCluster -eq $clusterInfo.ClusterName)} if($vsmAsDestination) { if($vsmAsDestination.GetType().BaseType.Name -eq "Array") { $totalVsmAsDestination = $vsmAsDestination.Length } else { $totalVsmAsDestination = 1 } $totalLocalRemovedVsms = 0 foreach($vsm in $vsmAsDestination) { try{ Remove-NcSnapmirror -Source $vsm.SourceLocation -Destination $vsm.DestinationLocation -Confirm:$false -ErrorAction Stop Get-WFALogger -Info -Message $("VSM Relationship successfully removed on local cluster '" + $vsm.DestinationCluster + "' (source: " + $vsm.SourceLocation + ", destination: " + $vsm.DestinationLocation + ")") $totalLocalRemovedVsms++ } catch { Get-WFALogger -Warn -message $("Unable to remove relationship on local cluster (source: " + $vsm.SourceLocation + ", destination: " + $vsm.DestinationLocation+"). " + $_.Exception.Message) } } if($totalLocalRemovedVsms -lt $totalVsmAsDestination) { throw "One or more VSM relationships were not removed. Aborting removal of the volume" } } # Dismount the volume from the Storage Virtual Machine namespace if it is not the Storage Virtual Machine root volume if (!$vol.VolumeStateAttributes.IsVserverRoot) { Get-WFALogger -Info -message $("Dismounting volume: " + $VolumeName + " on Storage Virtual Machine " + $VserverName) Dismount-NcVol -Name $VolumeName -VserverContext $VserverName -Force -ErrorAction Stop } $volState = (Get-NcVol -Name $VolumeName -VserverContext $VserverName).State if($volState -ne "offline") { Get-WFALogger -Info -message $("Offlining volume: " + $VolumeName + " on Storage Virtual Machine " + $VserverName) Set-NcVol -Name $VolumeName -VserverContext $VserverName -Offline -ErrorAction Stop } Get-WFALogger -Info -message $("Destroying volume: " + $VolumeName + " on Storage Virtual Machine " + $VserverName) Remove-NcVol -Name $VolumeName -VserverContext $VserverName -Confirm:$false -ErrorAction Stop