From 99d1fa6f7a32f9e8bb5108304e4cc4858cef3f8c Mon Sep 17 00:00:00 2001 From: Wael Hamze Date: Wed, 17 Apr 2019 15:26:51 +0100 Subject: [PATCH] Added Script to reset online instance using new API --- .../ResetOnlineInstance.ps1 | 213 ++++++++++++++++++ ...rm.Framework.CI.PowerShell.Scripts.pssproj | 2 + 2 files changed, 215 insertions(+) create mode 100644 MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.PowerShell.Scripts/ResetOnlineInstance.ps1 diff --git a/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.PowerShell.Scripts/ResetOnlineInstance.ps1 b/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.PowerShell.Scripts/ResetOnlineInstance.ps1 new file mode 100644 index 00000000..ebf9c1a0 --- /dev/null +++ b/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.PowerShell.Scripts/ResetOnlineInstance.ps1 @@ -0,0 +1,213 @@ +# +# ProvisionOnlineInstance.ps1 +# +[CmdletBinding()] +param( +[string]$ApiUrl, +[string]$Username, +[string]$Password, +[string]$InstanceName, +[string]$DomainName, +[string]$FriendlyName, +[string]$Purpose, +[string]$TargetReleaseName = 'Dynamics 365, version 9.0', +[string[]]$TemplateNames, +[string]$LanguageId, +[string]$PreferredCulture, +[string]$CurrencyCode, +[string]$CurrencyName, +[int]$CurrencyPrecision, +[string]$CurrencySymbol, +[string]$SecurityGroupId, +[string]$SecurityGroupName, +[bool]$WaitForCompletion = $false, +[int]$SleepDuration = 3, +[string]$PSModulePath +) + +$ErrorActionPreference = "Stop" + +Write-Verbose 'Entering ResetOnlineInstance.ps1' + +#Parameters +Write-Verbose "ApiUrl = $ApiUrl" +Write-Verbose "Username = $Username" +Write-Verbose "InstanceName = $InstanceName" +Write-Verbose "DomainName = $DomainName" +Write-Verbose "FriendlyName = $FriendlyName" +Write-Verbose "Purpose = $Purpose" +Write-Verbose "PreferredCulture = $PreferredCulture" +Write-Verbose "TargetReleaseName = $TargetReleaseName" +Write-Verbose "TemplateNames = $TemplateNames" +Write-Verbose "LanguageId = $LanguageId" +Write-Verbose "CurrencyCode = $CurrencyCode" +Write-Verbose "CurrencyName = $CurrencyName" +Write-Verbose "CurrencyPrecision = $CurrencyPrecision" +Write-Verbose "CurrencySymbol = $CurrencySymbol" +Write-Verbose "SecurityGroupId = $SecurityGroupId" +Write-Verbose "SecurityGroupName = $SecurityGroupName" +Write-Verbose "WaitForCompletion = $WaitForCompletion" +Write-Verbose "SleepDuration = $SleepDuration" +Write-Verbose "PSModulePath = $PSModulePath" + +#Script Location +$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition +Write-Verbose "Script Path: $scriptPath" + +#Set Security Protocol +& "$scriptPath\SetTlsVersion.ps1" + +#Load Online Management Module +$xrmOnlineModule = $scriptPath + "\Microsoft.Xrm.OnlineManagementAPI.dll" + +if ($PSModulePath) +{ + $xrmOnlineModule = $PSModulePath + "\Microsoft.Xrm.OnlineManagementAPI.dll" +} + +Write-Verbose "Importing Online Management Module: $xrmOnlineModule" +Import-Module $xrmOnlineModule +Write-Verbose "Imported Online Management Module" + +#Create Credentials +$SecPassword = ConvertTo-SecureString $Password -AsPlainText -Force +$Cred = New-Object System.Management.Automation.PSCredential ($Username, $SecPassword) + +."$scriptPath\OnlineInstanceFunctions.ps1" + +$instance = Get-XrmInstanceByName -ApiUrl $ApiUrl -Cred $Cred -InstanceName $InstanceName + +if ($instance -eq $null) +{ + throw "$InstanceName not found" +} + +Write-Host "Resetting instance $InstanceName $($instance.Id)" + +$instance + +$InstanceInfoParams = @{ + BaseLanguage = $LanguageId + DomainName = $DomainName + FriendlyName = $FriendlyName + TargetReleaseName = $TargetReleaseName + Purpose = $Purpose + TemplateList = $TemplateNames +} + +if ($PreferredCulture -ne 0) +{ + $InstanceInfoParams.PreferredCulture = $PreferredCulture +} +if ($CurrencyCode -ne '') +{ + $InstanceInfoParams.CurrencyCode = $CurrencyCode +} +if ($CurrencyName -ne '') +{ + $InstanceInfoParams.CurrencyName = $CurrencyName +} +if ($CurrencyPrecision -ne 0) +{ + $InstanceInfoParams.CurrencyPrecision = $CurrencyPrecision +} +if ($CurrencySymbol -ne '') +{ + $InstanceInfoParams.CurrencySymbol = $CurrencySymbol +} + +if ($SecurityGroupName -ne '') +{ + Write-Verbose "Importing Module AzureAD" + Import-Module AzureAD + Write-Verbose "Imported Module AzureAD" + + $group = Get-AzureADGroup -Filter "DisplayName eq '$SecurityGroupName'" + + if ($group -ne $null) + { + $SecurityGroupId = $group.ObjectId + } + if ($group -eq $null) + { + throw "$SecurityGroupName not found" + } +} + +if ($SecurityGroupId -ne '') +{ + $InstanceInfoParams.SecurityGroupId = $SecurityGroupId +} + +$instanceInfo = New-CrmInstanceResetRequestInfo @InstanceInfoParams + +$operation = Reset-CrmInstance -ApiUrl $ApiUrl -Credential $Cred -TargetInstanceIdToReset $instance.Id -ResetInstanceRequestDetails $instanceInfo + +$OperationId = $operation.OperationId +$OperationStatus = $operation.Status + +Write-Host "Reset started OperationId: $OperationId - Status: $OperationStatus" -ForegroundColor Green + +if ($operation.Errors.Count -gt 0) +{ + $errorMessage = $operation.Errors[0].Description + throw "Errors encountered : $errorMessage" +} + +if ($WaitForCompletion -and ($OperationStatus -ne "Succeeded")) +{ + Write-Host "Waiting for AsyncOperation to complete" + + $status = Wait-XrmOperation -ApiUrl $ApiUrl -Cred $Cred -operationId $operation.OperationId + + $status + + if ($status.Status -ne "Succeeded") + { + throw "Operation status: $status.Status" + } +} +else +{ + Write-Verbose "Skipped waiting for Async Operation" +} + +if ($WaitForCompletion) +{ + #Sometimes reset is created but the API still returns old id + #Added this delay to give chance for operation to progress. + + Write-Host "Starting Sleep for 60 seconds" + + Start-Sleep -Seconds 60 + + #$provisioning = $true + #while ($provisioning) + #{ + # Write-Verbose "Starting Sleep for $SleepDuration seconds" + + # Start-Sleep -Seconds $SleepDuration + + # Write-Verbose "Attempting to retrieve instance: $DomainName" + + # $newInstance = Get-XrmInstanceByName -ApiUrl $ApiUrl -Cred $Cred -InstanceName $DomainName + + # if ($newInstance) + # { + # $State = $newInstance.State + + # Write-Host "Instance Id: $($newInstance.Id) - State: $State" + + # if (($State -eq "Ready") -and ($newInstance.Id -ne $instance.Id)) + # { + # $provisioning = $false + # } + # } + # else + # { + # Write-Host "Instance: $DomainName not found" + # } + #} +} + +Write-Verbose 'Leaving ResetOnlineInstance.ps1' diff --git a/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.PowerShell.Scripts/Xrm.Framework.CI.PowerShell.Scripts.pssproj b/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.PowerShell.Scripts/Xrm.Framework.CI.PowerShell.Scripts.pssproj index d822d546..788eeb1e 100644 --- a/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.PowerShell.Scripts/Xrm.Framework.CI.PowerShell.Scripts.pssproj +++ b/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.PowerShell.Scripts/Xrm.Framework.CI.PowerShell.Scripts.pssproj @@ -33,6 +33,7 @@ + @@ -43,6 +44,7 @@ +