CloudAccount/CloudAccount.psm1
using module '../Common/Result' Import-Module -Name @(Join-Path $PSScriptRoot .. | Join-Path -ChildPath Util | Join-Path -ChildPath Util) function Get-RMCloudAccountsForCurrentProject { param( [string] $AccountType ) $LoginStatus = Test-UserLoggedIn if ($LoginStatus.ReturnCode -eq [RMReturn]::ERROR) { return $LoginStatus } $CurrentProjectId = Get-Variable -Name "RMContext-CurrentProjectId" -ValueOnly $PageIndex = 0 $HeartBeatingCloudAccounts = @{} $NonHeartBeatingCloudAccounts = @{} do { $Response = Get-RMCloudAccountInternal -OrganizationId $CurrentProjectId -AccountType $AccountType -PageNumber $PageIndex foreach ($ResponseContent in $Response.content) { if ([bool]($ResponseContent.PSObject.Properties.name -match "appliance") -and $ResponseContent.appliance.heartbeat_status) { $HeartBeatingCloudAccounts.Add($ResponseContent.name, $ResponseContent) } else { $NonHeartBeatingCloudAccounts.Add($ResponseContent.name, $ResponseContent) } } $PageIndex++ } while ($PageIndex -lt $Response.page.totalPages) return $HeartBeatingCloudAccounts, $NonHeartBeatingCloudAccounts } function Get-RMCloudAccountByName { param( [string] $CloudAccountName, [string] $AccountType, [bool] $VMBasedAppliancesOnly ) $HeartBeatingCloudAccounts, $NonHeartBeatingCloudAccounts = Get-RMCloudAccountsForCurrentProject -AccountType $AccountType if ($VMBasedAppliancesOnly) { $HeartBeatingCloudAccounts, $NonHeartBeatingCloudAccounts, $OtherCloudAccounts = ` Get-RMVMBasedCloudAccount -HeartBeatingCloudAccount $HeartBeatingCloudAccounts ` -NonHeartBeatingCloudAccount $NonHeartBeatingCloudAccounts -AccountType $AccountType if ($OtherCloudAccounts.Keys -contains $CloudAccountName) { return $null, "The TargetCloud '$CloudAccountName' does not support VM-based migrations" } } if($NonHeartBeatingCloudAccounts.Keys -contains $CloudAccountName) { return $null, "The TargetCloud '$CloudAccountName' is not ready for use, please provide a different target cloud" } if ($HeartBeatingCloudAccounts.Keys -notcontains $CloudAccountName) { Throw [System.Management.Automation.ItemNotFoundException]::new(` "Invalid target cloud name '$CloudAccountName'") } return $HeartBeatingCloudAccounts[$CloudAccountName], $null } function Get-CachedCloudAttribute { param( [System.Object] $CloudAccount ) $RMLoginResult = Get-Variable -Name "RMContext-UserLogin" -ValueOnly $Uri = Get-Variable -Name "RMContext-ReactorURI" -ValueOnly $Headers = @{ Accept = "application/json" Cookie = $RMLoginResult } $Params = @{ Method = "Get" Uri = $Uri + "/cloudaccounts/" + $CloudAccount.id + "/cachedattributes" Headers = $Headers } return Invoke-RMRestMethod -Params $Params } function Get-CloudAttributesSummary { param( [System.Object] $CloudAccount ) $RMLoginResult = Get-Variable -Name "RMContext-UserLogin" -ValueOnly $Uri = Get-Variable -Name "RMContext-ReactorURI" -ValueOnly $Headers = @{ Accept = "application/json" Cookie = $RMLoginResult } $Params = @{ Method = "Get" Uri = $Uri + "/cloudaccounts/" + $CloudAccount.id + "/attributes?summary=true" Headers = $Headers } return Invoke-RMRestMethod -Params $Params } function Get-RMCloudAttributesByRegion { param( [System.Object] $CloudAccount, [string] $RegionName ) $RMLoginResult = Get-Variable -Name "RMContext-UserLogin" -ValueOnly $Uri = Get-Variable -Name "RMContext-ReactorURI" -ValueOnly $Headers = @{ Accept = "application/json" Cookie = $RMLoginResult } $Params = @{ Method = "Get" Uri = $Uri + "/cloudaccounts/" + $CloudAccount.id + "/attributes?region=" + $RegionName Headers = $Headers } return Invoke-RMRestMethod -Params $Params } function Get-RMCloudAttributesByProjectAndZone { param ( [System.Object] $CloudAccount, [string] $ProjectName, [string] $Region, [string] $Zone ) $RMLoginResult = Get-Variable -Name "RMContext-UserLogin" -ValueOnly $Uri = Get-Variable -Name "RMContext-ReactorURI" -ValueOnly $Headers = @{ Accept = "application/json" Cookie = $RMLoginResult } $URL = $Uri + "/cloudaccounts/" + $CloudAccount.id + "/attributes?project=" + $ProjectName if (![string]::IsNullOrWhiteSpace($Zone) -and ![string]::IsNullOrWhiteSpace($Region)) { $URL = $Uri + "/cloudaccounts/" + $CloudAccount.id + "/attributes?project=" + $ProjectName + "®ion=" + $Region + "&zone=" + $Zone } $Params = @{ Method = "Get" Uri = $URL Headers = $Headers } return Invoke-RMRestMethod -Params $Params } function Get-RMCloudAccountInternal { param( [string] $OrganizationId, [string] $AccountType, [int] $PageNumber ) $RMLoginResult = Get-Variable -Name "RMContext-UserLogin" $Uri = Get-Variable -Name "RMContext-ReactorURI" $Headers = @{ Accept = "application/json" Cookie = $RMLoginResult.Value } if (![string]::IsNullOrWhiteSpace($AccountType)) { $URI = $Uri.Value + "/organizations/" + $OrganizationId + "/cloudaccounts?type=" + $AccountType + "&size=25&page=" + $PageNumber + "&sort=created_at%2Cdesc" } else { $URI = $Uri.Value + "/organizations/" + $OrganizationId + "/cloudaccounts?size=25&page=" + $PageNumber + "&sort=created_at%2Cdesc" } $Params = @{ Method = "Get" Uri = $URI Headers = $Headers } return Invoke-RMRestMethod -Params $Params } function Read-RMCloudAccount { param( [string] $UserMessage, [string] $AccountType, [bool] $VMBasedAppliancesOnly ) $HeartBeatingCloudAccounts, $NonHeartBeatingCloudAccounts = Get-RMCloudAccountsForCurrentProject -AccountType $AccountType # OtherCloudAccounts contains both non-VMbased cloud accounts (used only for validation) $OtherCloudAccounts = @{} if ($VMBasedAppliancesOnly) { $HeartBeatingCloudAccounts, $NonHeartBeatingCloudAccounts, $OtherCloudAccounts = ` Get-RMVMBasedCloudAccount -HeartBeatingCloudAccount $HeartBeatingCloudAccounts ` -NonHeartBeatingCloudAccount $NonHeartBeatingCloudAccounts -AccountType $AccountType } while ($true) { $CloudAccountName = "" if (0 -eq $HeartBeatingCloudAccounts.Keys.Count) { $CloudAccountName = Read-Host $UserMessage } elseif (1 -eq $HeartBeatingCloudAccounts.Keys.Count) { $CloudAccountName = $HeartBeatingCloudAccounts.Keys[0] $UserPrompt = $UserMessage + " [" + $CloudAccountName + "]" $ReadValue = Read-Host $UserPrompt if ("" -ne $ReadValue) { $CloudAccountName = $ReadValue } } else { $CloudAccountNames = $HeartBeatingCloudAccounts.Keys -join "," $UserPrompt = $UserMessage + " (" + $CloudAccountNames + ")" $CloudAccountName = Read-Host $UserPrompt } if ([string]::IsNullOrWhiteSpace($CloudAccountName)) { Write-RMError -Message "Target cloud is required" continue } if ($VMBasedAppliancesOnly -and $OtherCloudAccounts.Keys -contains $CloudAccountName) { Write-RMError -Message "The target cloud '$CloudAccountName' does not support VM-based migrations" continue } if($NonHeartBeatingCloudAccounts.Keys -contains $CloudAccountName) { Write-RMError -Message "The target cloud '$CloudAccountName' is not ready for use, please enter a different target cloud" continue } if ($HeartBeatingCloudAccounts.Keys -notcontains $CloudAccountName) { Write-RMError -Message "Invalid target cloud name" continue } return $HeartBeatingCloudAccounts[$CloudAccountName] } } function Get-RMVMBasedCloudAccount { param( [hashtable] $HeartBeatingCloudAccount, [hashtable] $NonHeartBeatingCloudAccount, [string] $AccountType ) $VMBasedHeartBeatingCloudAccount = @{} $VMBasedNonHeartBeatingCloudAccount = @{} $OtherCloudAccounts = @{} foreach ($CloudAccount in $HeartBeatingCloudAccount.Values) { if(($AccountType -eq "rivermeadow_standalone" ` -and $CloudAccount.appliance.cloud_configuration.vsphere.vm_level_migrations_enabled) ` -or $CloudAccount.appliance.vm_level_migration_enabled ` -or ($AccountType -eq "openshift" ` -and $CloudAccount.appliance.source_workers.Count -gt 0)) { $VMBasedHeartBeatingCloudAccount.Add($CloudAccount.name, $CloudAccount) } else { $OtherCloudAccounts.Add($CloudAccount.name, $CloudAccount) } } foreach ($CloudAccount in $NonHeartBeatingCloudAccount.Values) { if (-not([bool]($CloudAccount.PSObject.Properties.name -match "appliance") -and ` $null -ne $CloudAccount.appliance -and ` [bool]($CloudAccount.appliance.PSObject.Properties.name -match "cloud_configuration") -and ` $null -ne $CloudAccount.appliance.cloud_configuration -and ` [bool]($CloudAccount.appliance.cloud_configuration.PSObject.Properties.name -match "vsphere") -and ` $null -ne $CloudAccount.appliance.cloud_configuration.vsphere) -or $CloudAccount.appliance.cloud_configuration.vsphere.vm_level_migrations_enabled -or $CloudAccount.appliance.vm_level_migration_enabled) { $VMBasedNonHeartBeatingCloudAccount.Add($CloudAccount.name, $CloudAccount) } else { $OtherCloudAccounts.Add($CloudAccount.name, $CloudAccount) } } return $VMBasedHeartBeatingCloudAccount, $VMBasedNonHeartBeatingCloudAccount, $OtherCloudAccounts } function Get-RMCloudAttributesByProjectId { param( [System.Object] $CloudAccount, [string] $ProjectId ) $RMLoginResult = Get-Variable -Name "RMContext-UserLogin" -ValueOnly $Uri = Get-Variable -Name "RMContext-ReactorURI" -ValueOnly $Headers = @{ Accept = "application/json" Cookie = $RMLoginResult } $Params = @{ Method = "Get" Uri = $Uri + "/cloudaccounts/" + $CloudAccount.id + "/attributes?project=" + $ProjectId Headers = $Headers } return Invoke-RMRestMethod -Params $Params } function Get-RMCloudAttributesByProjectIdAndRegionAndZone { param( [System.Object] $CloudAccount, [string] $ProjectId, [string] $Region, [string] $Zone ) $RMLoginResult = Get-Variable -Name "RMContext-UserLogin" -ValueOnly $Uri = Get-Variable -Name "RMContext-ReactorURI" -ValueOnly $Headers = @{ Accept = "application/json" Cookie = $RMLoginResult } $Params = @{ Method = "Get" Uri = $Uri + "/cloudaccounts/" + $CloudAccount.id + "/attributes?project=" + $ProjectId + "®ion=" + $Region + "&zone=" + $Zone Headers = $Headers } return Invoke-RMRestMethod -Params $Params } Export-ModuleMember -Function Get-RMCloudAccountsForCurrentProject, Get-RMCloudAccountByName, ` Get-CachedCloudAttribute, Get-CloudAttributesSummary, Read-RMCloudAccount, Get-RMVMBasedCloudAccountBySource, ` Get-RMCloudAttributesByRegion, Get-RMCloudAttributesByProjectAndZone, Get-RMCloudAttributesByProjectId, ` Get-RMCloudAttributesByProjectIdAndRegionAndZone |