Lib/AppManagement.ps1



function AppMgmt_SolutionPublish([string]$SCHost, [string]$Solution, [pscredential]$Credential, [bool]$TwoStepMode, [string]$CallingFunction)
{
    LogMessage -Function $($MyInvocation.Mycommand) -Phase 1 -Stream 2 -Message "Solution path: $Solution"

    $SCUser = $Credential.UserName
    $SCPass = $Credential.GetNetworkCredential().Password
    $publishId = 0

    LogMessage -Function $($MyInvocation.Mycommand) -Phase 1 -Stream 2 -Message "Reading file"
    $solutionFile = [System.IO.File]::ReadAllBytes($Solution)

    LogMessage -Function $($MyInvocation.Mycommand) -Phase 1 -Stream 2 -Message "Publishing"
    $publishResult = SCWS_SolutionPack_PublishWith2StepOption -SCHost $SCHost -SCUser $SCUser -SCPass $SCPass -Solution $solutionFile -TwoStepMode $TwoStepMode

    $publishId = $publishResult.publishId

    LogMessage -Function $($MyInvocation.Mycommand) -Phase 1 -Stream 2 -Message "Publish id is: $publishId"

    # Check if publishId is valid
    if (-not $publishId -or ($publishId -eq 0))
    {
        # If pubid is not valid, get error message from Service Center and output them to the verbose stream
        if ($publishResult.Messages)
        {
            foreach ($publishMessage in $publishResult.Messages)
            {
                # Service Center messages will be send as the calling function
                LogMessage -Function $CallingFunction -Phase 1 -Stream 0 -Message "Service Center: $($publishMessage.Message) - $($publishMessage.Detail)"
            }
        }

        # Throw an exception to the calling function
        throw "Error while trying to publish the solution $Solution"
    }

    return $publishResult
}

function AppMgmt_GetPublishResults([string]$SCHost, [int]$PublishId, [pscredential]$Credential, [string]$CallingFunction, [int]$AfterMessageId = 0)
{
    LogMessage -Function $($MyInvocation.Mycommand) -Phase 1 -Stream 2 -Message "Getting publishing results for publish id $PublishId"

    $SCUser = $Credential.UserName
    $SCPass = $Credential.GetNetworkCredential().Password

    $finished = $false

    $resultsCount = [pscustomobject]@{
        Errors        = 0
        Warnings      = 0
        LastMessageId = $AfterMessageId
    }

    while (-not $finished)
    {
        LogMessage -Function $($MyInvocation.Mycommand) -Phase 1 -Stream 2 -Message "Getting publication messages from service center at $SCHost"
        $objMessages = SCWS_SolutionPack_GetPublicationMessages -SCHost $SCHost -SCUser $SCUser -SCPass $SCPass -PublishId $PublishId -AfterMessageId $resultsCount.LastMessageId

        $finished = $objMessages.Finished

        LogMessage -Function $($MyInvocation.Mycommand) -Phase 1 -Stream 2 -Message "Found $($objMessages.Messages.Count)"
        foreach ($message in $objMessages.Messages)
        {
            # Service Center messages will be send as the calling function
            LogMessage -Function $CallingFunction -Phase 1 -Stream 0 -Message "Service Center: $($message.Message) - $($message.Detail)"

            # Log the last message id
            $resultsCount.LastMessageId = $objMessages.LastMessageId

            # Gather the results
            switch ($message.Type)
            {
                'Warning'
                {
                    LogMessage -Function $($MyInvocation.Mycommand) -Phase 1 -Stream 2 -Message "Adding warning to results counter"
                    $resultsCount.Warnings ++
                }
                'Error'
                {
                    LogMessage -Function $($MyInvocation.Mycommand) -Phase 1 -Stream 2 -Message "Adding error to results counter"
                    $resultsCount.Errors ++
                }
                'PublishStop'
                {
                    LogMessage -Function $($MyInvocation.Mycommand) -Phase 1 -Stream 2 -Message "Publish Step-1 is finished"
                    $finished = $true
                }
            }
        }

        if (-not $finished)
        {
            LogMessage -Function $($MyInvocation.Mycommand) -Phase 1 -Stream 2 -Message "Publish is still running"
            Start-Sleep -Seconds 1
        }
    }

    LogMessage -Function $($MyInvocation.Mycommand) -Phase 1 -Stream 2 -Message "Publish finished"
    LogMessage -Function $($MyInvocation.Mycommand) -Phase 1 -Stream 2 -Message "Errors count: $($resultsCount.Errors)"
    LogMessage -Function $($MyInvocation.Mycommand) -Phase 1 -Stream 2 -Message "Warnings count: $($resultsCount.Warnings)"
    LogMessage -Function $($MyInvocation.Mycommand) -Phase 1 -Stream 2 -Message "LastMessageId: $($resultsCount.LastMessageId)"
    LogMessage -Function $($MyInvocation.Mycommand) -Phase 1 -Stream 2 -Message "Returnig publish results"

    # Return results. The calling function should know what to do with this
    return $resultsCount
}

function AppMgmt_SolutionPublishContinue([string]$SCHost, [int]$PublishId, [pscredential]$Credential)
{
    LogMessage -Function $($MyInvocation.Mycommand) -Phase 1 -Stream 2 -Message "Continuing publishid $PublishId"

    $SCUser = $Credential.UserName
    $SCPass = $Credential.GetNetworkCredential().Password

    SCWS_SolutionPack_PublishContinue -SCHost $SCHost -SCUser $SCUser -SCPass $SCPass -PublishId $PublishId
}

function AppMgmt_SolutionPublishStop([string]$SCHost, [int]$PublishId, [pscredential]$Credential)
{
    LogMessage -Function $($MyInvocation.Mycommand) -Phase 1 -Stream 2 -Message "Continuing publishid $PublishId"

    $SCUser = $Credential.UserName
    $SCPass = $Credential.GetNetworkCredential().Password

    WSSC_SolutionPack_PublishAbort -SCHost $SCHost -SCUser $SCUser -SCPass $SCPass -PublishId $PublishId
}

function AppMgmt_GetModules([string]$SCHost, [pscredential]$Credential)
{
    LogMessage -Function $($MyInvocation.Mycommand) -Phase 1 -Stream 2 -Message "Getting modules from $SCHost"

    $SCUser = $Credential.UserName
    $SCPass = $Credential.GetNetworkCredential().Password

    $result = SCWS_Modules_Get -SCHost $SCHost -SCUser $SCUser -SCPass $SCPass

    LogMessage -Function $($MyInvocation.Mycommand) -Phase 1 -Stream 2 -Message "Returning $($result.Count) modules"

    return $result
}

function AppMgmt_GetApplications([string]$SCHost, [pscredential]$Credential)
{
    LogMessage -Function $($MyInvocation.Mycommand) -Phase 1 -Stream 2 -Message "Getting modules from $SCHost"

    $SCUser = $Credential.UserName
    $SCPass = $Credential.GetNetworkCredential().Password

    $result = SCWS_Applications_Get -SCHost $SCHost -SCUser $SCUser -SCPass $SCPass

    LogMessage -Function $($MyInvocation.Mycommand) -Phase 1 -Stream 2 -Message "Returning $($result.Count) modules"

    return $result
}

function AppMgmt_ModulesPublish([string]$SCHost, [object[]]$Modules, [pscredential]$Credential, [string]$StagingName, [bool]$TwoStepMode, [string]$CallingFunction)
{
    LogMessage -Function $($MyInvocation.Mycommand) -Phase 1 -Stream 2 -Message "Publishing $($Modules.Count) modules to $SCHost"

    $SCUser = $Credential.UserName
    $SCPass = $Credential.GetNetworkCredential().Password
    $publishId = 0

    # Init array with modules to publish in the expected format
    $modulesToPublish = @()

    foreach($moduleToPublish in $Modules)
    {
        $moduleObject = [pscustomobject]@{
            REST_Module        = [pscustomobject]@{
                Name = $moduleToPublish.Name
                Key  = $moduleToPublish.Key
                Kind = $moduleToPublish.Kind
            }
        }
        $modulesToPublish += $moduleObject
    }

    $publishResult = SCWS_Staging_PublishWith2StepOption -SCHost $SCHost -SCUser $SCUser -SCPass $SCPass -ModulesToPublish $modulesToPublish -StagingName $StagingName -TwoStepMode $TwoStepMode

    $publishId = $publishResult.publishId
    LogMessage -Function $($MyInvocation.Mycommand) -Phase 1 -Stream 2 -Message "Publish id is: $publishId"

    # Check if publishId is valid
    if (-not $publishId -or ($publishId -eq 0))
    {
        # If pubid is not valid, get error message from Service Center and output them to the verbose stream
        if ($publishResult.Messages)
        {
            foreach ($publishMessage in $publishResult.Messages)
            {
                # Service Center messages will be send as the calling function
                LogMessage -Function $CallingFunction -Phase 1 -Stream 0 -Message "Service Center: $($publishMessage.REST_PublicationMessage.Message) - $($publishMessage.REST_PublicationMessage.Detail)"
            }
        }

        # Throw an exception to the calling function
        throw "Error while trying to publish modules"
    }

    return $publishResult
}