Framework/Abstracts/AzSdkRoot.ps1

Set-StrictMode -Version Latest
class AzSdkRoot: EventBase
{ 
    [SubscriptionContext] $SubscriptionContext;

    AzSdkRoot([string] $subscriptionId)
    {   
        [Helpers]::AbstractClass($this, [AzSdkRoot]);
        
        #Set up subscription
        $this.SubscriptionContext = [SubscriptionContext]@{
            SubscriptionId = $subscriptionId;
            Scope = "/subscriptions/$subscriptionId";
        };

        $this.SetAzureContext();
    }    
    
    hidden [void] SetAzureContext()
    {
        $isContextNull = $false;
        $currentContext = $null;
        try 
        { 
            $currentContext = Get-AzureRmContext -ErrorAction Stop   
        } 
        catch  
        { 
            $isContextNull = $true 
        }

        if(($null -eq $currentContext) -or $isContextNull)
        {
            $this.PublishCustomMessage("No active Azure login session found. Initiating login flow...", [MessageType]::Warning);

            $currentContext = Add-AzureRmAccount

            try 
            { 
                $currentContext = Get-AzureRmContext -ErrorAction Stop   
            } 
            catch  
            { 
                throw [System.ArgumentException] ("Subscription Id [" + $this.SubscriptionContext.SubscriptionId + "] is invalid or you may not have permissions.")
            }
        }

        if($currentContext.Subscription -and $currentContext.Subscription.SubscriptionId)
        {
            if($currentContext.Subscription.SubscriptionId -ne $this.SubscriptionContext.SubscriptionId)
            {
                $currentContext = Set-AzureRmContext -SubscriptionId $this.SubscriptionContext.SubscriptionId -ErrorAction Stop   
            
                # $currentContext will contain the desired subscription (or $null if id is wrong or no permission)
                if ($null -eq $currentContext)
                {
                    throw [System.ArgumentException] ("Invalid Subscription Id: [" + $this.SubscriptionContext.SubscriptionId + "]")
                }
            } 
        }
        else
        {
            throw [System.ArgumentException] ("Subscription Id [" + $this.SubscriptionContext.SubscriptionId + "] is invalid or you may not have permissions.")
        }

        if ($null -ne $currentContext)
        {
            $this.SubscriptionContext.SubscriptionName = $currentContext.Subscription.SubscriptionName;
        }
    }

    [PSObject] LoadServerConfigFile([string] $fileName)
    {
        return [ConfigurationManager]::LoadServerConfigFile($fileName);
    }    

    hidden [AzSdkRootEventArgument] CreateRootEventArgumentObject() 
    {
        return [AzSdkRootEventArgument]@{
            SubscriptionContext = $this.SubscriptionContext;
        };
    }

    hidden [void] PublishAzSdkRootEvent([string] $eventType, [MessageData[]] $messages) 
    {
        [AzSdkRootEventArgument] $arguments = $this.CreateRootEventArgumentObject();

        if($messages)
        {
            $arguments.Messages += $messages;
        }

        $this.PublishEvent($eventType, $arguments);
    }

    hidden [void] PublishAzSdkRootEvent([string] $eventType, [string] $message, [MessageType] $messageType) 
    {
        if (-not [string]::IsNullOrEmpty($message)) 
        {
            [MessageData] $data = [MessageData]@{
                Message = $message;
                MessageType = $messageType;
            };
            $this.PublishAzSdkRootEvent($eventType, $data);
        }
        else 
        {
            [MessageData[]] $blankMessages = @();
            $this.PublishAzSdkRootEvent($eventType, $blankMessages);
        }        
    }

    hidden [void] PublishAzSdkRootEvent([string] $eventType, [PSObject] $dataObject) 
    {
        if ($dataObject) 
        {
            [MessageData] $data = [MessageData]@{
                DataObject = $dataObject;
            };
            $this.PublishAzSdkRootEvent($eventType, $data);
        }
        else 
        {
            [MessageData[]] $blankMessages = @();
            $this.PublishAzSdkRootEvent($eventType, $blankMessages);
        }        
    }

    [void] PublishCustomMessage([MessageData[]] $messages) 
    {
        if($messages)
        {
            $this.PublishAzSdkRootEvent([AzSdkRootEvent]::CustomMessage, $messages);
        }
    }
    
    [void] CommandProcessing([MessageData[]] $messages) 
    {
        if($messages)
        {
            $this.PublishAzSdkRootEvent([AzSdkRootEvent]::CommandProcessing, $messages);
        }
    }

    [void] PublishRunIdentifier([System.Management.Automation.InvocationInfo] $invocationContext) 
    {
        if($invocationContext)
        {
            $this.InvocationContext = $invocationContext;
        }
        $this.RunIdentifier = $this.GenerateRunIdentifier();
        $this.PublishAzSdkRootEvent([AzSdkRootEvent]::GenerateRunIdentifier, [MessageData]::new($this.RunIdentifier, $invocationContext));
    }
    
    hidden [string[]] ConvertToStringArray([string] $stringArray)
    {
        $result = @();
        if(-not [string]::IsNullOrWhiteSpace($stringArray))
        {
            $result += $stringArray.Split(',', [StringSplitOptions]::RemoveEmptyEntries) | 
                            Where-Object { -not [string]::IsNullOrWhiteSpace($_) } |
                            ForEach-Object { $_.Trim() } |
                            Select-Object -Unique;
        }
        return $result;
    }
}