DSCResources/ROSSLab/ROSSLab.schema.psm1

configuration ROSSLab {
<#
    .SYNOPSIS
        Creates the RES ONE Service Store single node lab deployment.
#>

    param (
        ## RES ONE Service Store database server name/instance (equivalient to DBSERVER).
        [Parameter(Mandatory)] [ValidateNotNullOrEmpty()]
        [System.String] $DatabaseServer,
        
        ## Microsoft SQL username/password to create (equivalent to DBUSER/DBPASSWORD).
        [Parameter(Mandatory)]
        [System.Management.Automation.PSCredential] $Credential,
        
        ## Microsoft SQL database credentials used to create the database (equivalient to DBCREATEUSER/DBCREATEPASSWORD).
        [Parameter(Mandatory)]
        [System.Management.Automation.PSCredential] $SQLCredential,
        
        ## RES ONE Service Store Catalog Services password (equivalient to CATALOGSERVICESPASSWORD).
        [Parameter(Mandatory)]
        [System.Management.Automation.PSCredential] $CatalogServicesCredential,
        
        ## File path containing the RES ONE Service Store MSIs or the literal path to the legacy console/Sync Tool MSI.
        [Parameter(Mandatory)] [ValidateNotNullOrEmpty()]
        [System.String] $Path,
        
        ## RES ONE Service Store component version to be installed, i.e. 8.0.3.0
        [Parameter(Mandatory)] [ValidateNotNullOrEmpty()]
        [System.String] $Version,
        
        ## Host header for the RES ONE Service Store
        [Parameter(Mandatory)] [ValidateNotNullOrEmpty()]
        [System.String] $HostHeader,
        
        ## RES ONE Service Store default (NetBIOS) domain name.
        [Parameter(Mandatory)] [System.String] $DefaultDomain,
        
        ## RES ONE Service Store database name (equivalient to DBNAME).
        [Parameter()] [ValidateNotNullOrEmpty()]
        [System.String] $DatabaseName = 'RESONEServiceStore',
        
        ## NOTE: Only HTTP binding is supported by the installer; HTTPS binding will need to be managed by another DSC resource/configuration.
        [Parameter()]
        [System.Int32] $Port = 80,
        
        ## The target node's architecture.
        [Parameter()] [ValidateSet('x64','x86')]
        [System.String] $Architecture = 'x64',
        
        [Parameter()] [ValidateSet('Present','Absent')]
        [System.String] $Ensure = 'Present'
    )

    Import-DscResource -ModuleName xPSDesiredStateConfiguration;
    
    ## Can't import RESONEServiceStore composite resource due to circular references!
    Import-DscResource -Name ROSSDatabase, ROSSTransactionEngine, ROSSCatalogServices, ROSSWebPortal, ROSSManagementPortal;

    ## If path -match '\.msi$', throw.
    if ($Path -match '\.msi$') {
        throw "Specified path '$Path' does not point to a directory.";
    }

    if ($Ensure -eq 'Present') {
        
        ROSSDatabase 'ROSSLabDatabase' {
            DatabaseServer = $DatabaseServer;
            DatabaseName = $DatabaseName;
            Credential = $Credential;
            SQLCredential = $SQLCredential;
            CatalogServicesCredential = $CatalogServicesCredential;
            Path = $Path;
            Version = $Version;
            Architecture = $Architecture;
            IsLiteralPath = $false;
            Ensure = $Ensure;
        }

        ROSSTransactionEngine 'ROSSLabTransactionEngine' {
            DatabaseServer = $DatabaseServer;
            DatabaseName = $DatabaseName;
            Credential = $Credential;
            Path = $Path;
            Version = $Version;
            Architecture = $Architecture;
            IsLiteralPath = $false;
            Ensure = $Ensure;
            DependsOn = '[ROSSDatabase]ROSSLabDatabase';
        }
    
        ROSSCatalogServices 'ROSSLabCatalogServices' {
            DatabaseServer = $DatabaseServer;
            DatabaseName = $DatabaseName;
            Credential = $Credential;
            Path = $Path;
            Version = $Version;
            Architecture = $Architecture;
            IsLiteralPath = $false;
            Ensure = $Ensure;
            DependsOn = '[ROSSDatabase]ROSSLabDatabase';
        }
    
        ROSSWebPortal 'ROSSLabWebPortal' {
            CatalogServicesCredential = $CatalogServicesCredential;
            CatalogServicesHost = 'localhost';
            DefaultDomain = $DefaultDomain;
            HostHeader = $HostHeader;
            Port = $Port;
            Path = $Path;
            Version = $Version;
            IsLiteralPath = $false;
            Ensure = $Ensure;
        }
    
        ROSSManagementPortal 'ROSSLabManagementPortal' {
            HostHeader = $HostHeader;
            Port = $Port;
            Path = $Path;
            Version = $Version;
            IsLiteralPath = $false;
            Ensure = $Ensure;
            DependsOn = '[ROSSDatabase]ROSSLabDatabase';
        }
        
    }
    elseif ($Ensure -eq 'Absent') {
        
        ROSSManagementPortal 'ROSSLabManagementPortal' {
            HostHeader = $HostHeader;
            Port = $Port;
            Path = $Path;
            Version = $Version;
            IsLiteralPath = $false;
            Ensure = $Ensure;
        }
        
        ROSSWebPortal 'ROSSLabWebPortal' {
            CatalogServicesCredential = $CatalogServicesCredential;
            CatalogServicesHost = 'localhost';
            DefaultDomain = $DefaultDomain;
            HostHeader = $HostHeader;
            Port = $Port;
            Path = $Path;
            Version = $Version;
            IsLiteralPath = $false;
            Ensure = $Ensure;
        }
        
        ROSSCatalogServices 'ROSSLabCatalogServices' {
            DatabaseServer = $DatabaseServer;
            DatabaseName = $DatabaseName;
            Credential = $Credential;
            Path = $Path;
            Version = $Version;
            Architecture = $Architecture;
            IsLiteralPath = $false;
            Ensure = $Ensure;
        }
        
        ROSSTransactionEngine 'ROSSLabTransactionEngine' {
            DatabaseServer = $DatabaseServer;
            DatabaseName = $DatabaseName;
            Credential = $Credential;
            Path = $Path;
            Version = $Version;
            Architecture = $Architecture;
            IsLiteralPath = $false;
            Ensure = $Ensure;
        }
        
         ROSSDatabase 'ROSSLabDatabase' {
            DatabaseServer = $DatabaseServer;
            DatabaseName = $DatabaseName;
            Credential = $Credential;
            SQLCredential = $SQLCredential;
            CatalogServicesCredential = $CatalogServicesCredential;
            Path = $Path;
            Version = $Version;
            Architecture = $Architecture;
            IsLiteralPath = $false;
            Ensure = $Ensure;
            DependsOn = '[ROSSCatalogServices]ROSSLabCatalogServices', '[ROSSTransactionEngine]ROSSLabTransactionEngine';
        }

    }
    
    xFirewall 'ROALabDispatcherFirewall' {
        Name = 'RES ITS Catalog Services';
        Action = 'Allow';
        Direction = 'Inbound';
        DisplayName = 'RES ITS Catalog Services';
        Enabled = $true;
        Profile = 'Any';
        Program = 'C:\Program Files\RES Software\IT Store\Catalog Services\resocs.exe'
        Description = 'RES ONE Automation Dispatcher Service';
        Ensure = $Ensure;
        DependsOn = '[ROSSCatalogServices]CatalogServices';
    }

} #end configuration ROSSLab