core/Resources/Scripts/remove_machine.ps1

Param(
    [Parameter(Mandatory)]
    [string[]]$VmNames,
    [Parameter(Mandatory)]
    $EnvironmentName,

    [string]$ScriptsFolderPath = ".\Resources\Scripts"
)

. "$ScriptsFolderPath\dashboard_common.ps1"

$nc_resource_group = $null
$resourceGroupName = $null

function GetUploadedVms {
    param(
        [string]$ResourceGroup
    )
    $vms = @(Get-AzVM -ResourceGroupName $ResourceGroup  -ErrorAction Stop | ForEach-Object {
            $nicId = $_.NetworkProfile.NetworkInterfaces[0].Id
            $nicName = ($nicId -split "/")[-1]
            $nic = Get-AzNetworkInterface -ResourceGroupName $ResourceGroup -Name $nicName -ErrorAction Stop
            $privateIp = $nic.IpConfigurations[0].PrivateIpAddress
            [PSCustomObject]@{
                Name               = $_.Name
                Location           = $_.Location
                VmSize             = $_.HardwareProfile.VmSize
                OsType             = $_.StorageProfile.OsDisk.OsType
                Zone               = ($_.Zones[0])
                Publisher          = $_.StorageProfile.ImageReference.Publisher
                Offer              = $_.StorageProfile.ImageReference.Offer
                Sku                = $_.StorageProfile.ImageReference.Sku
                Version            = $_.StorageProfile.ImageReference.Version
                NIC                = $_.NetworkProfile.NetworkInterfaces.id
                StorageAccountType = $_.StorageProfile.OsDisk.ManagedDisk.StorageAccountType
                Disk               = $_.StorageProfile.OsDisk.Name
                Tags               = $_.Tags
                PrivateIp          = $privateIp
            }
        } )
    return $vms
}


function RemoveResources {
    param(
        [string]$VmName,
        [string]$DiskName,
        [string]$NetworkInterfaceName,
        [string]$PublicIpName,
        [string]$ResourceGroup,
        [bool]$UseForce
    )
    
    if ($UseForce) {
        Remove-AzVM -ResourceGroupName $ResourceGroup -Name $VmName -Force -ErrorAction SilentlyContinue
        Remove-AzDisk -ResourceGroupName $ResourceGroup -DiskName $DiskName -Force -ErrorAction SilentlyContinue
        Remove-AzNetworkInterface -Name $NetworkInterfaceName -ResourceGroupName $ResourceGroup -Force -ErrorAction SilentlyContinue
        Remove-AzPublicIpAddress -Name $PublicIpName -ResourceGroupName $ResourceGroup -Force -ErrorAction SilentlyContinue
    }
    else {
        Remove-AzVM -ResourceGroupName $ResourceGroup -Name $VmName -ErrorAction SilentlyContinue
        Remove-AzDisk -ResourceGroupName $ResourceGroup -DiskName $DiskName -ErrorAction SilentlyContinue
        Remove-AzNetworkInterface -Name $NetworkInterfaceName -ResourceGroupName $ResourceGroup -ErrorAction SilentlyContinue
        Remove-AzPublicIpAddress -Name $PublicIpName -ResourceGroupName $ResourceGroup -ErrorAction SilentlyContinue
    } 
}


$diskNames = [System.Collections.ArrayList]@()
$networkInterfaceNames = [System.Collections.ArrayList]@()
$publicIpNames = [System.Collections.ArrayList]@()


function CreateLists {
    param(
        $vms
    )

    for ($j = 0; $j -lt $VmNames.Length; $j++) {
        $vmFound = $false
        for ($i = 0; $i -lt $($vms | Measure-Object).Count ; $i++) {
            if ($VmNames[$j] -eq $vms[$i].name) {
                if (
                    -not $vms[$i].Tags.ContainsKey("ServerType") -or
                    $vms[$i].Tags["ServerType"] -ne "NCache"
                ) {
                    throw "$($VmNames[$j]) doesn't contain NCache Server"
                }
                $diskNames.Add($vms[$i].Disk) | Out-Null
                $nicList = $vms[$i].NIC -split '/'
                $nicCount = $nicList[$nicList.Count - 1]
                $networkInterfaceNames.Add($nicCount) | Out-Null
                $publicIpNames.Add("NC-PUBLIC_IP-$EnvironmentName-$($vms[$i].name)") | Out-Null
                $vmFound = $true
                break
            }
        }
        if ($vmFound -eq $false) {
            throw "$($VmNames[$j]) not found in ResourceGroup"
        }
    }
}

function RemoveNodeFromCachesLinux {
    param(
        $deletedVms 
    )
    $cmd = ""
    foreach ($vm in $deletedVms) {
        $cachesList = @()

        if ($vm.Tags.ContainsKey("Caches") -and -not [string]::IsNullOrWhiteSpace($vm.Tags["Caches"])) {
            $cachesList = $vm.Tags["Caches"].Split(",") | Where-Object { -not [string]::IsNullOrWhiteSpace($_) }
        }

        foreach ($cache in $cachesList) {
            $cmd += "/opt/ncache/bin/tools/remove-node -cacheName $cache -server $($vm.PrivateIp)"
            if ($cmd) { $cmd += "; " }  
        }
        if ($cachesList.Count -gt 0) {
            $result = Invoke-AzVMRunCommand -ResourceGroupName $resourceGroupName -VMName $vm.Name -CommandId 'RunShellScript' -ScriptString $cmd
            foreach ($val in $result.Value) {
                Write-Host $val.Message
            }
        }
        else {
            Write-Host "Skipping VM $($vm.Name), no caches found."
        }
        $cmd = ""
    }
}


function RemoveNodeFromCachesWindows {
    param(
        $deletedVms 
    )
    $cmd = ""
    foreach ($vm in $deletedVms) {
        $cachesList = @()

        if ($vm.Tags.ContainsKey("Caches") -and -not [string]::IsNullOrWhiteSpace($vm.Tags["Caches"])) {
            $cachesList = $vm.Tags["Caches"].Split(",") | Where-Object { -not [string]::IsNullOrWhiteSpace($_) }
        }

        foreach ($cache in $cachesList) {
            $cmd += "Remove-Node -CacheName $cache -Server $($vm.PrivateIp)"
            $cmd += "`n"
        }
        if ($cachesList.Count -gt 0) {
            $result = Invoke-AzVMRunCommand -ResourceGroupName $resourceGroupName -VMName $vm.Name -CommandId 'RunPowerShellScript' -ScriptString $cmd
            foreach ($val in $result.Value) {
                Write-Host $val.Message
            }
        }
        else {
            Write-Host "Skipping VM $($vm.Name), no caches found."
        }
        $cmd = ""
    }
}

function RemoveVmsFromCaches {
    param(
        $vms
    )
    $deletedVms = $vms | Where-Object { $VmNames -contains $_.Name }
    if ($nc_resource_group.Tags["OsType"] -eq "Windows") {
        RemoveNodeFromCachesWindows -deletedVms $deletedVms
    }
    else {
        RemoveNodeFromCachesLinux -deletedVms $deletedVms
    }

}

function ExecuteCommands {
    
    $nc_resource_group = Get-AzResourceGroup -ErrorAction Stop | Where-Object { $_.Tags -and $_.Tags.Contains("EnvironmentName") -and $_.Tags["EnvironmentName"] -eq $EnvironmentName } 
    if (-not $nc_resource_group) {
        throw "No such environment exists"
    }
    $resourceGroupName = $nc_resource_group.ResourceGroupName
    $vms = GetUploadedVms -ResourceGroup $resourceGroupName
    RemoveVmsFromCaches -vms $vms
    CreateLists -vms $vms
    Write-Host "Removing virtual machines..."
    for ($i = 0; $i -lt $VmNames.Length; $i++) {
        RemoveResources -VmName $VmNames[$i] -DiskName $diskNames[$i] -NetworkInterfaceName $networkInterfaceNames[$i] -PublicIpName $publicIpNames[$i] -ResourceGroup $resourceGroupName -UseForce $true
    }

    $deletedVms = $vms | Where-Object { $VmNames -contains $_.Name }
    foreach ($vm in $deletedVms) {
        $cachesList = @()
        if ($vm.Tags.ContainsKey("Caches") -and -not [string]::IsNullOrWhiteSpace($vm.Tags["Caches"])) {
            $cachesList = $vm.Tags["Caches"].Split(",") | Where-Object { -not [string]::IsNullOrWhiteSpace($_) }
        }
        foreach ($cache in $cachesList) {
            Update-NcAzDashboards -ScriptsFolderPath $ScriptsFolderPath -ResourceGroupName $resourceGroupName -CacheName $cache -SkipClient
        }
    }
}

if (-not (Get-AzContext)) {
    Connect-AzAccount
    if (Get-AzContext) {
        ExecuteCommands
    }
}

else {
    ExecuteCommands
}