DSCResources/MSFT_WorkflowManagerFarm/MSFT_WorkflowManagerFarm.psm1

Import-Module ServiceBus -ErrorAction SilentlyContinue
Import-Module WorkflowManager -ErrorAction SilentlyContinue

function Get-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Collections.Hashtable])]
    param
    (
        [parameter(Mandatory = $true)]
        [System.String]
        [ValidateSet("Present", "Absent")]
        $Ensure,

        [parameter(Mandatory = $true)]
        [System.String]
        $DatabaseServer,

        [parameter(Mandatory = $true)]
        [System.Management.Automation.PSCredential]
        $CertAutoGenerationKey,

        [parameter(Mandatory = $true)]
        [System.Management.Automation.PSCredential]
        $RunAsAccount,

        [parameter(Mandatory = $false)]
        [System.String]
        $ServiceBusFarmDB = "SBManagementDB",

        [parameter(Mandatory = $false)]
        [System.String]
        $ServiceBusGatewayDB = "SBGatewayDatabase",

        [parameter(Mandatory = $false)]
        [System.String]
        $ServiceBusMessageContainerDB = "SBMessageContainer01",

        [parameter(Mandatory = $false)]
        [System.String]
        $WorkflowManagerFarmDB = "WFManagementDB",

        [parameter(Mandatory = $false)]
        [System.String]
        $WorkflowManagerInstanceDB = "WFInstanceManagementDB",

        [parameter(Mandatory = $false)]
        [System.String]
        $WorkflowManagerResourceDB = "WFResourceManagementDB",

        [parameter(Mandatory = $false)]
        [System.Boolean]
        $EnableFirewallRules = $false,

        [parameter(Mandatory = $false)]
        [System.Boolean]
        $EnableHttpPort = $false,

        [parameter(Mandatory = $false)]
        [System.String]
        $SBNamespace = "ServiceBus"
    )

    Write-Verbose -Message "Getting settings for Workflow Manager farm"

    Confirm-WmfDscEnvironmentVariables

    $result = @{}
    try
    {
        $WFFarm = Get-WFFarm
        $SBNamespace = Get-SBNamespace | Select-Object -First 1

        if ($WFFarm.WFFarmDBConnectionString -match 'Initial Catalog=(.*?);')
        {
            $WFFarmDB = $Matches[1]
        }

        if ($WFFarm.WFFarmDBConnectionString -match 'Data Source=(.*?);')
        {
            $dbServer = $Matches[1]
        }

        if ($WFFarm.InstanceDBConnectionString -match 'Initial Catalog=(.*?);')
        {
            $WFInstanceDB = $Matches[1]
        }

        if ($WFFarm.ResourceDBConnectionString -match 'Initial Catalog=(.*?);')
        {
            $WFResourceDB = $Matches[1]
        }

        $SBFarm = Get-SBFarm
        if ($SBFarm.SBFarmDBConnectionString -match 'Initial Catalog=(.*?);')
        {
            $SBFarmDB = $Matches[1]
        }

        if ($SBFarm.GatewayDBConnectionString -match 'Initial Catalog=(.*?);')
        {
            $SBGatewayDB = $Matches[1]
        }

        $SBMessageContainer = Get-SBMessageContainer
        if ($SBMessageContainer.ConnectionString -match 'Initial Catalog=(.*?);')
        {
            $SBMessageContainerDB = $Matches[1]
        }

        $result = @{
            Ensure                       = "Present"
            DatabaseServer               = $dbServer
            CertAutoGenerationKey        = $CertAutoGenerationKey
            FarmAccount                  = $FarmAccount
            RunAsPassword                = $RunAsPassword
            ServiceBusFarmDB             = $SBFarmDB
            ServiceBusGatewayDB          = $SBGatewayDB
            ServiceBusMessageContainerDB = $SBMessageContainerDB
            WorkflowManagerFarmDB        = $WFFarmDB
            WorkflowManagerInstanceDB    = $WFInstanceDB
            WorkflowManagerResourceDB    = $WFResourceDB
            EnableFirewallRules          = $EnableFirewallRules
            EnableHttpPort               = $EnableHttpPort
            SBNamespace                  = $SBNamespace.Name
        }
    }
    catch
    {
        $result = @{
            Ensure                       = "Absent"
            DatabaseServer               = $null
            CertAutoGenerationKey        = $null
            FarmAccount                  = $null
            RunAsPassword                = $null
            ServiceBusFarmDB             = $null
            ServiceBusGatewayDB          = $null
            ServiceBusMessageContainerDB = $null
            WorkflowManagerFarmDB        = $null
            WorkflowManagerInstanceDB    = $null
            WorkflowManagerResourceDB    = $null
            EnableFirewallRules          = $null
            EnableHttpPort               = $null
            SBNamespace                  = $null
        }
    }

    return $result
}


function Set-TargetResource
{
    [CmdletBinding()]
    param
    (
        [parameter(Mandatory = $true)]
        [System.String]
        [ValidateSet("Present", "Absent")]
        $Ensure,

        [parameter(Mandatory = $true)]
        [System.String]
        $DatabaseServer,

        [parameter(Mandatory = $true)]
        [System.Management.Automation.PSCredential]
        $CertAutoGenerationKey,

        [parameter(Mandatory = $true)]
        [System.Management.Automation.PSCredential]
        $RunAsAccount,

        [parameter(Mandatory = $false)]
        [System.String]
        $ServiceBusFarmDB = "SBManagementDB",

        [parameter(Mandatory = $false)]
        [System.String]
        $ServiceBusGatewayDB = "SBGatewayDatabase",

        [parameter(Mandatory = $false)]
        [System.String]
        $ServiceBusMessageContainerDB = "SBMessageContainer01",

        [parameter(Mandatory = $false)]
        [System.String]
        $WorkflowManagerFarmDB = "WFManagementDB",

        [parameter(Mandatory = $false)]
        [System.String]
        $WorkflowManagerInstanceDB = "WFInstanceManagementDB",

        [parameter(Mandatory = $false)]
        [System.String]
        $WorkflowManagerResourceDB = "WFResourceManagementDB",

        [parameter(Mandatory = $false)]
        [System.Boolean]
        $EnableFirewallRules = $false,

        [parameter(Mandatory = $false)]
        [System.Boolean]
        $EnableHttpPort = $false,

        [parameter(Mandatory = $false)]
        [System.String]
        $SBNamespace = "ServiceBus"
    )

    Write-Verbose -Message "Updating settings for Workflow Manager farm"

    Confirm-WmfDscEnvironmentVariables

    if ($Ensure.ToLower() -eq "present")
    {
        $SBFADBConnstring = "Data Source={0};Initial Catalog={1};Integrated Security=True;Encrypt=False" -f $DatabaseServer,$ServiceBusFarmDB
        $SBGWDBConnstring = "Data Source={0};Initial Catalog={1};Integrated Security=True;Encrypt=False" -f $DatabaseServer,$ServiceBusGatewayDB
        $SBMCDBConnstring = "Data Source={0};Initial Catalog={1};Integrated Security=True;Encrypt=False" -f $DatabaseServer,$ServiceBusMessageContainerDB

        New-SBFarm -SBFarmDBConnectionString $SBFADBConnstring `
                   -GatewayDBConnectionString $SBGWDBConnstring `
                   -MessageContainerDBConnectionString $SBMCDBConnstring `
                   -RunAsAccount $RunAsAccount.UserName `
                   -CertificateAutoGenerationKey $CertAutoGenerationKey.Password

        Add-SBHost -SBFarmDBConnectionString $SBFADBConnstring `
                   -RunAsPassword $RunAsAccount.Password `
                   -EnableFirewallRules $EnableFirewallRules `
                   -CertificateAutoGenerationKey $CertAutoGenerationKey.Password

        New-SBNamespace -Name $SBNamespace `
                        -AddressingScheme 'Path' `
                        -ManageUsers $RunAsAccount.UserName

        $WFFADBConnstring = "Data Source={0};Initial Catalog={1};Integrated Security=True;Encrypt=False" -f $DatabaseServer,$WorkflowManagerFarmDB
        $WFINDBConnstring = "Data Source={0};Initial Catalog={1};Integrated Security=True;Encrypt=False" -f $DatabaseServer,$WorkflowManagerInstanceDB
        $WFREDBConnstring = "Data Source={0};Initial Catalog={1};Integrated Security=True;Encrypt=False" -f $DatabaseServer,$WorkflowManagerResourceDB

        New-WFFarm -WFFarmDBConnectionString $WFFADBConnstring `
                   -InstanceDBConnectionString $WFINDBConnstring `
                   -ResourceDBConnectionString $WFREDBConnstring `
                   -RunAsAccount $RunAsAccount.UserName `
                   -CertificateAutoGenerationKey $CertAutoGenerationKey.Password

        $SBConfig = Get-SBClientConfiguration -Namespaces $SBNamespace

        if ($EnableHttpPort)
        {
            Add-WFHost -WFFarmDBConnectionString $WFFADBConnstring `
                       -RunAsPassword $RunAsAccount.Password `
                       -EnableFirewallRules $EnableFirewallRules `
                       -CertificateAutoGenerationKey $CertAutoGenerationKey.Password `
                       -SBClientConfiguration $SBConfig `
                       -EnableHttpPort
        }
        else
        {
            Add-WFHost -WFFarmDBConnectionString $WFFADBConnstring `
                       -RunAsPassword $RunAsAccount.Password `
                       -EnableFirewallRules $EnableFirewallRules `
                       -CertificateAutoGenerationKey $CertAutoGenerationKey.Password `
                       -SBClientConfiguration $SBConfig
        }
    }
    else
    {
        Write-Verbose -Message "Removing the current server from the Workflow Farm"
        Remove-SBHost
        Remove-WFHost
    }
}


function Test-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Boolean])]
    param
    (
        [parameter(Mandatory = $true)]
        [System.String]
        [ValidateSet("Present", "Absent")]
        $Ensure,

        [parameter(Mandatory = $true)]
        [System.String]
        $DatabaseServer,

        [parameter(Mandatory = $true)]
        [System.Management.Automation.PSCredential]
        $CertAutoGenerationKey,

        [parameter(Mandatory = $true)]
        [System.Management.Automation.PSCredential]
        $RunAsAccount,

        [parameter(Mandatory = $false)]
        [System.String]
        $ServiceBusFarmDB = "SBManagementDB",

        [parameter(Mandatory = $false)]
        [System.String]
        $ServiceBusGatewayDB = "SBGatewayDatabase",

        [parameter(Mandatory = $false)]
        [System.String]
        $ServiceBusMessageContainerDB = "SBMessageContainer01",

        [parameter(Mandatory = $false)]
        [System.String]
        $WorkflowManagerFarmDB = "WFManagementDB",

        [parameter(Mandatory = $false)]
        [System.String]
        $WorkflowManagerInstanceDB = "WFInstanceManagementDB",

        [parameter(Mandatory = $false)]
        [System.String]
        $WorkflowManagerResourceDB = "WFResourceManagementDB",

        [parameter(Mandatory = $false)]
        [System.Boolean]
        $EnableFirewallRules = $false,

        [parameter(Mandatory = $false)]
        [System.Boolean]
        $EnableHttpPort = $false,

        [parameter(Mandatory = $false)]
        [System.String]
        $SBNamespace = "ServiceBus"
    )

    Write-Verbose -Message "Testing settings of Workflow Manager farm"

    Confirm-WmfDscEnvironmentVariables

    $result = Get-TargetResource @PSBoundParameters

    return ($result.Ensure -eq $Ensure)
}

Export-ModuleMember -Function *-TargetResource