Framework/Core/SVT/SVTIaasBase.ps1

Set-StrictMode -Version Latest
class SVTIaasBase: AzSVTBase
{
    hidden [PSObject] $ResourceObject;
    hidden [PSObject[]] $vNetNics;
    hidden [PSObject[]] $vNetNicsWIssues;
    hidden [PSObject[]] $vNetPIPIssues;
    hidden [PSObject[]] $vNetNicsOutput;

    SVTIaasBase([string] $subscriptionId, [string] $resourceGroupName, [string] $resourceName):
        Base($subscriptionId, $resourceGroupName, $resourceName)
    {
        $this.GetResourceObject();
        $this.GetvNetNics($this.ResourceObject.Subnets);
        $this.GetvnetNicsProperties($this.vNetNics);
    }

    SVTIaasBase([string] $subscriptionId, [SVTResource] $svtResource):
        Base($subscriptionId, $svtResource)
    {
        $this.GetResourceObject();
        $this.GetvNetNics($this.ResourceObject.Subnets);
        $this.GetvnetNicsProperties($this.vNetNics);
    }

    hidden [PSObject] GetResourceObject()
    {
        if (-not $this.ResourceObject) {
            $this.ResourceObject = Get-AzVirtualNetwork -ResourceGroupName $this.ResourceContext.ResourceGroupName `
                                             -Name $this.ResourceContext.ResourceName
            if(-not $this.ResourceObject)
            {
                throw ([SuppressedException]::new(("Resource '{0}' not found under Resource Group '{1}'" -f ($this.ResourceContext.ResourceName), ($this.ResourceContext.ResourceGroupName)), [SuppressedExceptionType]::InvalidOperation))
            }
        }
        return $this.ResourceObject;
    }

    hidden [PSObject[]] GetvNetNics($VNetSubnets)
    {
        if([FeatureFlightingManager]::GetFeatureStatus("EnableVnetFixForSub",$($this.SubscriptionContext.SubscriptionId)))
        {
            if (-not $this.vNetNics)
            {
                $this.vNetNicsWIssues = @();
                $VNetSubnets | ForEach-Object{
                    Set-Variable -Name currentsubnet -Scope Local -Value $_
                    if($null -ne $currentsubnet.IpConfigurations )
                    {
                            $currentsubnet.IpConfigurations | ForEach-Object{
                            Set-Variable -Name currentipconfig -Scope Local -Value $_
                            if($currentipconfig.Id.Contains("Microsoft.Network/networkInterfaces"))
                            {
                                    $currentipconfig = $currentipconfig.Id.ToLower()
                                    $nicresourceid =  $currentipconfig.Substring(0,$currentipconfig.LastIndexOf("ipconfigurations")-1)
                                    try
                                    {
                                        #<TODO: Perf Issue - Get-AzResource is called in foreach which will Provider list and perform issue. Resource Ids can be passed from base location>
                                        $nic = Get-AzResource -ResourceId $nicresourceid
                                        $this.vNetNics += $nic
                                    }
                                    catch
                                    {
                                        $this.vNetNicsWIssues += $nicresourceid;
                                    }                                
                            }
                        }
                    }
                }
            }
            return $this.vNetNics;
        }
        else
        {
            if (-not $this.vNetNics)
            {
                $this.vNetNicsWIssues = @();
                $VNetSubnets | ForEach-Object{
                    Set-Variable -Name currentsubnet -Scope Local -Value $_
                    if($null -ne $currentsubnet.IpConfigurations )
                    {
                            $currentsubnet.IpConfigurations | ForEach-Object{
                            Set-Variable -Name currentipconfig -Scope Local -Value $_
                            if($currentipconfig.Id.Contains("Microsoft.Network/networkInterfaces"))
                            {
                                    $currentipconfig = $currentipconfig.Id.ToLower()
                                    $nicresourceid =  $currentipconfig.Substring(0,$currentipconfig.LastIndexOf("ipconfigurations")-1)
                                    try
                                    {
                                        #<TODO: Perf Issue - Get-AzResource is called in foreach which will Provider list and perform issue. Resource Ids can be passed from base location>
                                        $nic = Get-AzResource -ResourceId $nicresourceid
                                        $this.vNetNics += $nic
                                    }
                                    catch
                                    {
                                        $this.vNetNicsWIssues += $nicresourceid;
                                    }                                
                            }
                        }
                    }
                }
            }
            return $this.vNetNics;            
        }
    }

    hidden [PSObject[]] GetvnetNicsProperties($vNetNics)
    {
        if([FeatureFlightingManager]::GetFeatureStatus("EnableVnetFixForSub",$($this.SubscriptionContext.SubscriptionId)))
        {    if(-not $this.vNetNicsOutput)
            {
                if($null -ne $vNetNics )
                {
                    $this.vNetPIPIssues = @();
                    $tempVNetNICS = [array]($vNetNics)
                    $tempVNetNICS | ForEach-Object{
                        Set-Variable -Name nic -Scope Local -Value $_
                        Set-Variable -Name nicproperties -Scope Local -Value $_.Properties
                        try
                        {
                            $out = ""| Select-Object NICName, VMName, VMId, PrimaryStatus, NetworkSecurityGroupName,NetworkSecurityGroupId, PublicIpAddress, PrivateIpAddress,  EnableIPForwarding, IpConfigurations
                            $out.NICName = $nic.Name
                            $out.IpConfigurations = $nicproperties.IpConfigurations
                            $out.EnableIPForwarding = $nicproperties.EnableIPForwarding
                            $PublicIpAddresses = @()
                            $PrivateIpAddresses = @()
                            $nicproperties.IpConfigurations | ForEach-Object{
                                Set-Variable -Name ipconfiguration -Scope Local -Value $_
                                try
                                {
                                    if(($ipconfiguration | Get-Member -Name "Properties") -and ($ipconfiguration.Properties | Get-Member -Name "PublicIpAddress") -and $ipconfiguration.Properties.PublicIpAddress)
                                    {
                                        $IPResource = Get-AzResource -ResourceId $ipconfiguration.Properties.PublicIpAddress.Id
                                        $pubResourceName = Get-AzPublicIpAddress -Name $IPResource.Name -ResourceGroupName $IPResource.ResourceGroupName
                                        $PublicIpAddresses += $pubResourceName.IpAddress
                                    }
                                    $PrivateIpAddresses += $ipconfiguration.Properties.PrivateIpAddress
                                }
                                catch
                                {
                                    $this.vNetPIPIssues += $ipconfiguration
                                }
                            }
                            $out.PublicIpAddress = ([System.String]::Join(";",$PublicIpAddresses))
                            $out.PrivateIpAddress = ([System.String]::Join(";",$PrivateIpAddresses))

                            if(($nicproperties | Get-Member -Name "VirtualMachine") -and $nicproperties.VirtualMachine )
                            {
                                $vmresource = Get-AzResource -ResourceId $nicproperties.VirtualMachine.Id
                                $out.VMName = $vmresource.Name
                            }
                            else {
                                $out.VMName = ""
                            }
                            if($null -ne ($nicproperties | Get-Member primary))
                            {
                                $out.PrimaryStatus = $nicproperties.primary
                            }

                            if(($nicproperties | Get-Member -Name "NetworkSecurityGroup") -and $nicproperties.NetworkSecurityGroup)
                            {
                                $nsgresource = Get-AzResource -ResourceId $nicproperties.NetworkSecurityGroup.Id
                                $out.NetworkSecurityGroupName = $nsgresource.Name
                            }
                            $this.vNetNicsOutput += $out
                        }
                        catch
                        {
                            #eat the exception. Error nic is already added to the list
                        }
                    }
                    $this.vNetNicsOutput = [array]($this.vNetNicsOutput)
                }
            }
            return $this.vNetNicsOutput;
        }
        else
        {
            if(-not $this.vNetNicsOutput)
            {
                if($null -ne $vNetNics )
                {
                    $this.vNetPIPIssues = @();
                    $tempVNetNICS = [array]($vNetNics)
                    $tempVNetNICS | ForEach-Object{
                        Set-Variable -Name nic -Scope Local -Value $_
                        Set-Variable -Name nicproperties -Scope Local -Value $_.Properties
                        try
                        {
                            $out = ""| Select-Object NICName, VMName, VMId, PrimaryStatus, NetworkSecurityGroupName,NetworkSecurityGroupId, PublicIpAddress, PrivateIpAddress,  EnableIPForwarding, IpConfigurations
                            $out.NICName = $nic.Name
                            $out.IpConfigurations = $nicproperties.IpConfigurations
                            $out.EnableIPForwarding = $nicproperties.EnableIPForwarding
                            $PublicIpAddresses = @()
                            $PrivateIpAddresses = @()
                            $nicproperties.IpConfigurations | ForEach-Object{
                                Set-Variable -Name ipconfiguration -Scope Local -Value $_
                                try
                                {
                                    if(($ipconfiguration | Get-Member -Name "Properties") -and ($ipconfiguration.Properties | Get-Member -Name "PublicIpAddress") -and $ipconfiguration.Properties.PublicIpAddress)
                                    {
                                        $IPResource = Get-AzResource -ResourceId $ipconfiguration.Properties.PublicIpAddress.Id
                                        $pubResourceName = Get-AzPublicIpAddress -Name $IPResource.Name -ResourceGroupName $IPResource.ResourceGroupName
                                        $PublicIpAddresses += $pubResourceName.IpAddress
                                    }
                                    $PrivateIpAddresses += $ipconfiguration.Properties.PrivateIpAddress
                                }
                                catch
                                {
                                    $this.vNetPIPIssues += $ipconfiguration
                                }
                            }
                            $out.PublicIpAddress = ([System.String]::Join(";",$PublicIpAddresses))
                            $out.PrivateIpAddress = ([System.String]::Join(";",$PrivateIpAddresses))

                            if(($nicproperties | Get-Member -Name "VirtualMachine") -and $nicproperties.VirtualMachine )
                            {
                                $vmresource = Get-AzResource -ResourceId $nicproperties.VirtualMachine.Id
                                $out.VMName = $vmresource.Name
                            }
                            else {
                                $out.VMName = ""
                            }
                            if($null -ne ($nicproperties | Get-Member primary))
                            {
                                $out.PrimaryStatus = $nicproperties.primary
                            }

                            if(($nicproperties | Get-Member -Name "NetworkSecurityGroup") -and $nicproperties.NetworkSecurityGroup)
                            {
                                $nsgresource = Get-AzResource -ResourceId $nicproperties.NetworkSecurityGroup.Id
                                $out.NetworkSecurityGroupName = $nsgresource.Name
                            }
                            $this.vNetNicsOutput += $out
                        }
                        catch
                        {
                            #eat the exception. Error nic is already added to the list
                        }
                    }
                    $this.vNetNicsOutput = [array]($this.vNetNicsOutput)
                }
            }
            return $this.vNetNicsOutput;
        }

        
    }
}