public/onboarding.ps1

function New-NimbusEnvironment {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true,
            Position = 0,
            HelpMessage = 'Enter your Azure Subscription Id where to deploy Nimbus assets')]
        [Alias('s', 'sub')]
        [guid]$SubscriptionId,

        [Parameter(Mandatory = $true,
            Position = 1,
            HelpMessage = 'Enter the Azure resource group name for Nimbus assets')]
        [Alias('r', 'resGrp')]
        [ValidateNotNullOrEmpty()]
        [string]$resourceGroupName,

        [Parameter(Mandatory = $true,
            Position = 2,
            HelpMessage = 'Enter the resource prefix for Nimbus assets')]
        [Alias('p', 'prefix')]
        [ValidateNotNullOrEmpty()]
        [string]$resourcePrefix,

        [Parameter(Mandatory = $true,
            Position = 3,
            HelpMessage = 'Enter the Azure location where Nimbus assets should be deployed: "Australia East", "Australia Southeast", "Brazil South", "Canada Central", "Central India", "Central US", "East Asia", "East US", "East US 2", "France Central", "Japan East", "Korea Central", "North Central US", "North Europe", "South Africa North", "South Central US", "Southeast Asia", "UK South", "West Central US", "West Europe", "West US", "West US 2')]
        [Alias('l', 'loc')]
        [validateSet("Australia East", "Australia Southeast", "Brazil South", "Canada Central", "Central India", "Central US", "East Asia", "East US", "East US 2", "France Central", "Japan East", "Korea Central", "North Central US", "North Europe", "South Africa North", "South Central US", "Southeast Asia", "UK South", "West Central US", "West Europe", "West US", "West US 2")]
        [string]$location,

        [Parameter(Mandatory = $true,
            Position = 4,
            HelpMessage = 'Provide a list emails of approvers, has to be separated with a semicolon ( ";" )')]
        [string]$approvers,

        [Parameter(Mandatory = $false,
            Position = 5)]
        [Alias('d', 'dom')]
        [ValidateSet('portal_nimbload_com' , 'portal_luware_cloud', 'portal_stage_nimbdev_com', 'portal_uat_nimbdev_com')]
        [string]$domain = 'placeholder'
    )

    Check-Module
    
    $nimbusDomain = $mapper.$domain.domain
    if ( $resourceGroupName -notmatch '[a-zA-Z0-9]+' ) {
        "Resource Group Name not valid, please provide a resource group name matching the following regex: '[a-zA-Z0-9]+'"
        exit 
    }
    if ( $resourcePrefix -notmatch '[a-zA-Z0-9]+' ) {
        "Resource Prefix not valid, please provide a prefix matching the following regex: '[a-zA-Z0-9]+'"
        exit 
    }

    $azureCredentials = New-CredentialsPrompt "Azure"
    New-AzureLogin $azureCredentials $SubscriptionId
    $runbookCredentials = New-CredentialsPrompt "AzureAd"
    New-AzureAdLogin $runbookCredentials
    $webSession, $tenant = New-NimbusLogin -domain $nimbusDomain

    $deploymentParameters = @{
        ResourceGroupName             = $resourceGroupName

        prefix                        = $resourcePrefix
        location                      = $location.ToLower() -replace '\s'
        recipients                    = $approvers
        "nimbus-credentials-user"     = $runbookCredentials.UserName
        "nimbus-credentials-password" = $runbookCredentials.Password
        "nimbus-environment"          = "'$domain'"

        Verbose                       = $true
    }

    if ( $env:localTesting ) {
        $deploymentParameters.TemplateFile = "artifacts/template.json"
    }
    else {
        $deploymentParameters.TemplateUri = "https://$nimbusDomain/api/manifests/template.json"
    }

    $resourceGroup = Get-AzResourceGroup -ResourceGroupName $resourceGroupName -ErrorAction SilentlyContinue
    if ( -not $resourceGroup ) {
        Write-Output "Resource Group doesn't exist, creating it"
        $resourceGroup = New-AzResourceGroup -ResourceGroupName $resourceGroupName -Location $location
    }

    $deployment = New-AzResourceGroupDeployment @deploymentParameters
    $callbackUrl = [System.Text.Encoding]::UTF8.GetString( [System.Convert]::FromBase64String( $deployment.outputs.callbackUrl.value ) )

    if ( -not $env:localTesting ) {
        # todo: error handling
        Invoke-RestMethod "https://$nimbusDomain/api/ms-flow-driver/v1/RunBooks/$tenant" `
            -Method:Put `
            -ContentType 'application/json' `
            -Body ( '"{0}"' -f $callbackUrl ) ` # need to send quoted string
            -UseBasicParsing `
            -WebSession $webSession
    }

    $path = "https://portal.azure.com/#@{0}/resource{1}/providers/Microsoft.Web/connections/{2}" -f ( ( Get-AzContext ).Tenant.Id ), $resourceGroup.ResourceId, $resourcePrefix 
    Write-Output "Please, configure and authorize the following connections:"
    Write-Output "$path-automation/edit"
    Write-Output "$path-office365/edit"

    Cleanup-Environment
}
# SIG # Begin signature block
# MIINMwYJKoZIhvcNAQcCoIINJDCCDSACAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUDfvbladpMhRvwOKS5LPqtGbR
# pJCgggpxMIIFGjCCBAKgAwIBAgIQAZyhpG3mRP4nVXpkMz8jhDANBgkqhkiG9w0B
# AQsFADB2MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD
# VQQLExB3d3cuZGlnaWNlcnQuY29tMTUwMwYDVQQDEyxEaWdpQ2VydCBTSEEyIEhp
# Z2ggQXNzdXJhbmNlIENvZGUgU2lnbmluZyBDQTAeFw0xOTA1MjEwMDAwMDBaFw0y
# MjA1MjUxMjAwMDBaMFkxCzAJBgNVBAYTAkNIMRAwDgYDVQQIDAdaw7xyaWNoMRAw
# DgYDVQQHDAdaw7xyaWNoMRIwEAYDVQQKEwlMdXdhcmUgQUcxEjAQBgNVBAMTCUx1
# d2FyZSBBRzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANx3Pfx2CKUz
# Ot9W7Scb5rrrnI7m7jOkVG4X2Owj+hJJuEjTA3wIfA/6ay4Wa/Qv+MMdlsv6NRt4
# TgYUMRexmfGgKT7iy4AIebBuyS1lg2gmT/25xGtqO3TPqfhstLNEfcKMaMM2ZEZm
# vCZbiAs3zP1G2oS94DWcCnDCjmPPll30nlOig+ZQGqBuhvNiZ/DGhnYRtrHoRx40
# 7iZjcixgPjkey9IGN6WEUYnhJ712npXTWWUIpiSZ2U475DxLWbEQ7bPHnLsivVNg
# 59f4Jnf8pyqhNelrbGrTeLOuF4JyE5a8Mt2Bc58NCLWT4I9bz8N/7Uk3+RZFtD3O
# Cv4nO2h7mG0CAwEAAaOCAb8wggG7MB8GA1UdIwQYMBaAFGedDyAJDMyKOuWCRnJi
# /PHMkOVAMB0GA1UdDgQWBBQthLJG1fU0R5j9FwY+vNZOT2lf4DAOBgNVHQ8BAf8E
# BAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwbQYDVR0fBGYwZDAwoC6gLIYqaHR0
# cDovL2NybDMuZGlnaWNlcnQuY29tL3NoYTItaGEtY3MtZzEuY3JsMDCgLqAshipo
# dHRwOi8vY3JsNC5kaWdpY2VydC5jb20vc2hhMi1oYS1jcy1nMS5jcmwwTAYDVR0g
# BEUwQzA3BglghkgBhv1sAwEwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGln
# aWNlcnQuY29tL0NQUzAIBgZngQwBBAEwgYgGCCsGAQUFBwEBBHwwejAkBggrBgEF
# BQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMFIGCCsGAQUFBzAChkZodHRw
# Oi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRTSEEySGlnaEFzc3VyYW5j
# ZUNvZGVTaWduaW5nQ0EuY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQAD
# ggEBAEl5ctCYW1yDBEcpCwfycyG6vhbpQ8U2wfOQeQI5DmXImLS3spcyXO+Xfn13
# Eh/BL0gXFIi1ybM0wRG/EimU1ag/uQpCtsTRWfq2vJ96LqLf8UxRYGVw+N+IM/8e
# dXAKLexYb/ta4cvByjbJpoiJAJtYN32OclXRD5ph8yehuflmu+rw9TCVuPCa7hkO
# mah1L3n59tGneFGd9ZbWvqknQUAZcuKQrOofTKDb9oZKYjk2JJF7aTcjnHMuDo/X
# t+uHNCmhAuPyEy5Fa+RwdFptPLhudGH3WtNr4+5As2UsBDxm3gHxCiTUMIdnXChj
# 9jLvqhx3P5Rtsl4VZbBcqy/nqo4wggVPMIIEN6ADAgECAhALfhCQPDhJD/ovZ5qH
# oae5MA0GCSqGSIb3DQEBCwUAMGwxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdp
# Q2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xKzApBgNVBAMTIkRp
# Z2lDZXJ0IEhpZ2ggQXNzdXJhbmNlIEVWIFJvb3QgQ0EwHhcNMTMxMDIyMTIwMDAw
# WhcNMjgxMDIyMTIwMDAwWjB2MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNl
# cnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMTUwMwYDVQQDEyxEaWdp
# Q2VydCBTSEEyIEhpZ2ggQXNzdXJhbmNlIENvZGUgU2lnbmluZyBDQTCCASIwDQYJ
# KoZIhvcNAQEBBQADggEPADCCAQoCggEBALRKXn0HD0HexPV2Fja9cf/PP09zS5zR
# Df5Ky1dYXoUW3QIVVJnwjzwvTQJ4EGjI2DVLP8H3Z86YHK4zuS0dpApUk8SFot81
# sfXxPKezNPtdSMlGyWJEvEiZ6yhJU8M9j8AO3jWY6WJR3z1rQGHuBEHaz6dcVpbR
# +Uy3RISHmGnlgrkT5lW/yJJwkgoxb3+LMqvPa1qfYsQ+7r7tWaRTfwvxUoiKewpn
# JMuQzezSTTRMsOG1n5zG9m8szebKU3QBn2c13jhJLc7tOUSCGXlOGrK1+7t48Elm
# p8/6XJZ1kosactn/UJJTzD7CQzIJGoYTaTz7gTIzMmR1cygmHQgwOwcCAwEAAaOC
# AeEwggHdMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGGMBMGA1Ud
# JQQMMAoGCCsGAQUFBwMDMH8GCCsGAQUFBwEBBHMwcTAkBggrBgEFBQcwAYYYaHR0
# cDovL29jc3AuZGlnaWNlcnQuY29tMEkGCCsGAQUFBzAChj1odHRwOi8vY2FjZXJ0
# cy5kaWdpY2VydC5jb20vRGlnaUNlcnRIaWdoQXNzdXJhbmNlRVZSb290Q0EuY3J0
# MIGPBgNVHR8EgYcwgYQwQKA+oDyGOmh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9E
# aWdpQ2VydEhpZ2hBc3N1cmFuY2VFVlJvb3RDQS5jcmwwQKA+oDyGOmh0dHA6Ly9j
# cmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEhpZ2hBc3N1cmFuY2VFVlJvb3RDQS5j
# cmwwTwYDVR0gBEgwRjA4BgpghkgBhv1sAAIEMCowKAYIKwYBBQUHAgEWHGh0dHBz
# Oi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCgYIYIZIAYb9bAMwHQYDVR0OBBYEFGed
# DyAJDMyKOuWCRnJi/PHMkOVAMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSYJhoIAu9j
# ZCvDMA0GCSqGSIb3DQEBCwUAA4IBAQBqDv9+E3wGpUvALoz5U2QJ4rpYkTBQ7Myf
# 4dOoL0hGNhgp0HgoX5hWQA8eur2xO4dc3FvYIA3tGhZN1REkIUvxJ2mQE+sRoQHa
# /bVOeVl1vTgqasP2jkEriqKL1yxRUdmcoMjjTrpsqEfSTtFoH4wCVzuzKWqOaiAq
# ufIAYmS6yOkA+cyk1LqaNdivLGVsFnxYId5KMND66yRdBsmdFretSkXTJeIM8ECq
# XE2sfs0Ggrl2RmkI2DK2gv7jqVg0QxuOZ2eXP2gxFjY4lT6H98fDr516dxnZ3pO1
# /W4r/JT5PbdMEjUsML7ojZ4FcJpIE/SM1ucerDjnqPOtDLd67GftMYICLDCCAigC
# AQEwgYowdjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcG
# A1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTE1MDMGA1UEAxMsRGlnaUNlcnQgU0hBMiBI
# aWdoIEFzc3VyYW5jZSBDb2RlIFNpZ25pbmcgQ0ECEAGcoaRt5kT+J1V6ZDM/I4Qw
# CQYFKw4DAhoFAKB4MBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcN
# AQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUw
# IwYJKoZIhvcNAQkEMRYEFOXvwpjHLPaVbujTFEhD0suag463MA0GCSqGSIb3DQEB
# AQUABIIBAKcVPb48UdCqa42ERFIXN9nO7YmW85JOXRergPsO6ePBRwxcOuyuOnRt
# IKV5aapG2hc8z5FEJUN3MAccOxgShBvd8QX8f7nnfOVU6OzhA4nC3Aufn0XVqnks
# JHJL1PLyY5hP6qz8IblRgNinLlVjF0SRA+EywAUeqOPx4GQXNVa8Ii3zhB4htEV7
# CHMQ322pAslqhtnWzc8D9VmL7NEzTe42rhdYzeNZ2bUVolbjK6mv1sQYL0gepYJs
# hZnHwDYuivQMf80zIlROZIq66XqSHOy3KAcPN6gOtfhgiBR68rCK5dCZz/syGrxd
# pEnLl9a+/xh0psBo5PBe2ksmEcPAnWA=
# SIG # End signature block