From 8db1fe37a24fc657065aa7a8e8ba99e2c7b16891 Mon Sep 17 00:00:00 2001 From: Jake Robinson Date: Fri, 9 Apr 2021 00:34:58 -0400 Subject: [PATCH] Vmware Cloud Partner Navigator Example Module --- .../navigator.psm1 | 572 ++++++++++++++++++ 1 file changed, 572 insertions(+) create mode 100644 Modules/VMwareCloudPartnerNavigator/navigator.psm1 diff --git a/Modules/VMwareCloudPartnerNavigator/navigator.psm1 b/Modules/VMwareCloudPartnerNavigator/navigator.psm1 new file mode 100644 index 0000000..c5587c0 --- /dev/null +++ b/Modules/VMwareCloudPartnerNavigator/navigator.psm1 @@ -0,0 +1,572 @@ +<# +.SYNOPSIS + +Connects to VMware Cloud Partner Navigator + +.DESCRIPTION + +Uses refresh token to call the Navigator IAM API and get an access token that is stored in $Global:NavigatorConnection.accessToken + +.PARAMETER RefreshToken +VMware Cloud Services Refresh Token + +.PARAMETER Server +Used by VMware to connect to internal development instances of Navigator. + +.INPUTS + +None. + +.OUTPUTS + +None. Access Token is written to $Global:NavigatorConnection + +.EXAMPLE + +PS> Connect-Navigator -RefreshToken 12312313134123141234234525234523412341234234252451234123123123 + +#> +function Connect-Navigator { + [CmdletBinding()] + param ( + [Parameter(Mandatory = $true)] + [String]$RefreshToken, + [String]$server = "https://console.navigator.vmware.com" + ) + + begin { + + } + + process { + $connectionParams = @{ + uri = "$($server)/cphub/api/auth/v1/authn/accesstoken"; + userAgent = "Navigator-PowerShell"; + contentType = "application/json"; + headers = @{ + "X-XSRF-TOKEN" = "j4QPhAAZ-jwDjc4uI1Z8URuXJTqa9U4Y23rg"; + }; + body = @{refreshToken = $refreshToken} | ConvertTo-Json; + method = "POST"; + } + try { + $response = Invoke-WebRequest @connectionParams + $Global:NavigatorConnection = @{server = $server; accessToken = (ConvertFrom-Json $response.Content).accessToken} + } + catch { + Write-Host $PSItem.Exception.Message -ForegroundColor RED + } + + } + end { + + } +} + +<# +.SYNOPSIS + +Retrieves Navigator Provider and Tenant organizations + +.DESCRIPTION + +Retrieves Navigator Provider and Tenant organizations + +.PARAMETER OrgId +Specifies a specific OrgId to retrieve + +.PARAMETER DisplayName +Retrieves orgs with specified display name + +.PARAMETER OrgType +Can be used to search for "PROVIDER" or "TENANT" org types + +.INPUTS + +None. + +.OUTPUTS + +Navigator Org Objects + +.EXAMPLE + +PS> Get-NavigatorOrg -DisplayName "Foo" -OrgType "TENANT" + +.EXAMPLE + +PS> Get-NavigatorOrg -OrgId c28e8c89-d03d-4572-9be1-5f13edb82af6 + +#> +function Get-NavigatorOrg { + [CmdletBinding(DefaultParameterSetName = 'byNameAndType')] + param ( + # Parameter help description + [Parameter(ParameterSetName = 'byOrgId')] + [String]$OrgID, + # Parameter help description + [Parameter(ParameterSetName = 'byNameAndType',Position=0)] + [String]$DisplayName, + # Parameter help description + [Parameter(ParameterSetName = 'byNameAndType')] + [String]$OrgType + ) + + begin { + + } + + process { + $headers = @{ + "csp-auth-token" = $Global:NavigatorConnection.accessToken; + } + + if ($orgId) { + try { + $orgData = Invoke-WebRequest ` + -Uri "$($Global:NavigatorConnection.server)/cphub/api/core/v1/mgmt/orgs/$($orgId)/" ` + -Headers $headers + Write-Verbose $orgData + + if ($orgData) { + $content = ConvertFrom-Json $orgData.Content + $content + } + + } + catch { + Write-Host $PSItem.Exception.Message -ForegroundColor RED + } + } + else { + $response = Invoke-WebRequest ` + -Uri "$($Global:NavigatorConnection.server)/cphub/api/auth/v1/loggedinuser/orgs" ` + -Headers $headers + + $orgIDs = (ConvertFrom-Json $response.Content).loggedInUserOrgs + + foreach ($orgID in $orgIDs) { + $orgData = $null + try { + $orgData = Invoke-WebRequest ` + -Uri "$($Global:NavigatorConnection.server)/cphub/api/core/v1/mgmt/orgs/$($orgID)/" ` + -Headers $headers + Write-Verbose $orgData + + if ($orgData) { + $content = ConvertFrom-Json $orgData.Content + + if ($orgType) { + $content = $content | Where-Object orgType -eq $orgType + } + if ($DisplayName) { + $content = $content | Where-Object DisplayName -like $DisplayName + } + $content | Add-Member -NotePropertyName orgId -NotePropertyValue $content.id + $content + } + } + + catch { + #Write-Host $PSItem.Exception.Message -ForegroundColor RED + # Had to comment this catch out because we get 404s for orgs we belong to that are not navigator orgs. + } + } + } + } + + end { + + } +} + +<# +.SYNOPSIS + +Gets support requests for a given organization + +.DESCRIPTION + +Gets support requests for a given organization + +.PARAMETER OrgId +Specifies a specific OrgID for which to retrieve support requests + +.INPUTS + +Navigator Org Object + +.OUTPUTS + +Navigator Support Ticket Object + +.EXAMPLE + +PS> Get-NavigatorSupportRequest -OrgId d7f32037-b9b5-41ec-9394-ba3edbbc9cac + +.EXAMPLE + +PS> Get-NavigatorOrg -OrgId d7f32037-b9b5-41ec-9394-ba3edbbc9cac | Get-NavigatorSupportRequest +#> +function Get-NavigatorSupportRequest { + [CmdletBinding()] + param ( + # Parameter help description + [Parameter(Mandatory=$true, + ValueFromPipelineByPropertyName=$true)] + [String] + $orgID + ) + + begin { + + } + + process { + $tickets = @() + $headers = @{ + "csp-auth-token" = $Global:NavigatorConnection.accessToken; + } + try { + $response = Invoke-WebRequest ` + -Headers $headers ` + -Uri "$($Global:NavigatorConnection.server)/cphub/api/support/v1/orgs/$orgID/support-requests?includeTenantOrgs=true&pageLimit=100&pageStart=1&userTicketsOnly=false" + Write-Verbose $response + #Write-Verbose ($response.Content | ConvertFrom-Json).supportTickets + if ($response.Content) { + $tickets += ($response.Content | ConvertFrom-Json).supportTickets + } + } + catch { + Write-Host $PSItem.Exception.Message -ForegroundColor RED + } + + $tickets + } + + end { + + } +} + +function Get-NavigatorSupportRequestMetadata { + [CmdletBinding()] + param ( + [Parameter(Mandatory=$true, + ValueFromPipelineByPropertyName=$true)] + [String]$ParentOrgId, + [Parameter(Mandatory=$true, + ValueFromPipelineByPropertyName=$true)] + [String]$OrgId + ) + + begin { + + } + + process { + $headers = @{ + "csp-auth-token" = $Global:NavigatorConnection.accessToken; + } + + try { + $response = Invoke-WebRequest ` + -Headers $headers ` + -Uri "$($Global:NavigatorConnection.server)/cphub/api/support/v1/orgs/$ParentOrgId/support-requests/metadata?tenantId=$OrgId" + Write-Verbose $response + + $jsonResponse = $response | ConvertFrom-Json + + + } + catch { + Write-Host $PSItem.Exception.Message -ForegroundColor RED + } + } + + end { + + } +} + +<# +.SYNOPSIS + +Gets subscriptions for a given organization + +.DESCRIPTION + +Gets subscriptions for a given organization + +.PARAMETER OrgId +Specifies a specific OrgID for which to retrieve subscriptions + +.INPUTS + +Navigator Org Object + +.OUTPUTS + +Navigator Subscription Object + +.EXAMPLE + +PS> Get-NavigatorSubscriptions -OrgId d7f32037-b9b5-41ec-9394-ba3edbbc9cac + +.EXAMPLE + +PS> Get-NavigatorOrg -OrgId d7f32037-b9b5-41ec-9394-ba3edbbc9cac | Get-NavigatorSubscriptions +#> +function Get-NavigatorSubscriptions { + [CmdletBinding()] + param ( + [String]$OrgId + ) + + begin { + + } + + process { + $headers = @{ + "csp-auth-token" = $Global:NavigatorConnection.accessToken; + } + try { + $response = Invoke-WebRequest ` + -Headers $headers ` + -Uri "$($Global:NavigatorConnection.server)/cphub/api/billing/v1/orgs/$OrgId/subscriptions?allTenants=true" + Write-Verbose $response + + $response | ConvertFrom-Json + } + catch { + Write-Host $PSItem.Exception.Message -ForegroundColor RED + } + } + + end { + + } +} + +<# +.SYNOPSIS + +Gets usage report for a given organization + +.DESCRIPTION + +Gets usage report for a given organization + +.PARAMETER OrgId +Specifies a specific OrgID for which to retrieve usage + +.INPUTS + +Navigator Org Object + +.OUTPUTS + +Navigator usage report Object + +.EXAMPLE + +PS> Get-NavigatorUsageReport -OrgId d7f32037-b9b5-41ec-9394-ba3edbbc9cac + +.EXAMPLE + +PS> Get-NavigatorOrg -OrgId d7f32037-b9b5-41ec-9394-ba3edbbc9cac | Get-NavigatorUsageReport +#> +function Get-NavigatorUsageReport { + [CmdletBinding()] + param ( + [String]$OrgId + ) + + begin { + + } + + process { + $headers = @{ + "csp-auth-token" = $Global:NavigatorConnection.accessToken; + } + try { + $response = Invoke-WebRequest ` + -Headers $headers ` + -Uri "$($Global:NavigatorConnection.server)/cphub/api/billing/v1/orgs/$OrgId/usage-report?abd=false&detailView=false&providerReport=false" + Write-Verbose $response + + $response | ConvertFrom-Json + } + catch { + Write-Host $PSItem.Exception.Message -ForegroundColor RED + } + } + + end { + + } +} + +<# +.SYNOPSIS + +Creates a new Customer Organization in VMware Cloud Partner Navigator + +.DESCRIPTION + +Creates a new Customer Organization in VMware Cloud Partner Navigator + + +-City "Zionsville" -State "IN" -Zip "46077" -Country "US" -Domain "example.com" -verbose + +.PARAMETER OrgId +Specifies a specific OrgID for which to retrieve subscriptions +.PARAMETER DisplayName +Specifies the short name for the organization +.PARAMETER CompanyName +Full company name of the organization +.PARAMETER AddressLine1 +Address for the organization +.PARAMETER AddressLine2 +Additional address line for the organization if needed +.PARAMETER City +City of the organization +.PARAMETER State +State of the organization +.PARAMETER Zip +Zip Code of the organizaiton +.PARAMETER Country +2-letter country code of the organization +.PARAMETER Domain +Domain name of the organization +.PARAMETER OrgId + + +.INPUTS + +Navigator Provider Org Object + +.OUTPUTS + +Navigator Customer Record Object + +.EXAMPLE + +PS> New-NavigatorCustomer -OrgId d7f32037-b9b5-41ec-9394-ba3edbbc9cac -DisplayName Neptune -CompanyName Neptune -AddressLine1 "123 Fake St." -City "Zionsville" -State "IN" -Zip "46077" -Country "US" -Domain "example.com" -verbose + +.EXAMPLE + +PS> Get-NavigatorOrg -OrgId d7f32037-b9b5-41ec-9394-ba3edbbc9cac | New-NavigatorCustomer -DisplayName Neptune -CompanyName Neptune -AddressLine1 "123 Fake St." -City "Zionsville" -State "IN" -Zip "46077" -Country "US" -Domain "example.com" -verbose +#> +function New-NavigatorCustomer { + [CmdletBinding()] + param ( + [Parameter(Mandatory=$true, + ValueFromPipelineByPropertyName=$true)] + [String]$OrgId, + [Parameter(Mandatory=$true)] + [String]$DisplayName, + [Parameter(Mandatory=$true)] + [String]$CompanyName, + [String]$TenantType = "DEFAULT", + # [String]$AdminUserEmail, # Call fails if this is provided. + [Parameter(Mandatory=$true)] + [String]$Domain, + [Parameter(Mandatory=$true)] + [String]$AddressLine1, + [String]$AddressLine2 = '', + [Parameter(Mandatory=$true)] + [String]$City, + [Parameter(Mandatory=$true)] + [String]$State, + [Parameter(Mandatory=$true)] + [String]$Zip, + [Parameter(Mandatory=$true)] + [String]$Country, # Country list has to come from /csp/gateway/iam/vmwid/api/user-registration/configuration/countries + [String]$Tag = '' + ) + + begin { + if ($Country.Length -ne 2) { + Write-Error -Message "Please use 2 letter country code." -ErrorAction Stop + } + } + + process { + $headers = @{ + "csp-auth-token" = $Global:NavigatorConnection.accessToken + "Content-Type" = "application/json" + } + + $body = @{ + 'displayName' = $DisplayName + 'companyName' = $CompanyName + 'tenantType' = $TenantType + 'adminUserEmail' = "" + 'domain' = $Domain + 'addressLine1' = $AddressLine1 + 'addressLine2' = $AddressLine2 + 'city' = $City + 'state' = $State + 'zip' = $Zip + 'country' = $Country + 'tag' = $Tag + } + try { + Write-Verbose ($body | ConvertTo-Json) + $response = Invoke-WebRequest ` + -Headers $headers ` + -Uri "$($Global:NavigatorConnection.server)/cphub/api/core/v1/mgmt/orgs/$OrgId/tenants" ` + -Method "POST" ` + -Body ($body | ConvertTo-Json) + Write-Verbose $response + + $response | ConvertFrom-Json + } + catch { + Write-Host $PSItem.Exception.Message -ForegroundColor RED + } + } + + end { + + } +} + +### GET CMDLET TEMPLATE SNIPPET +### COPY AND PASTE THIS FOR CREATING NEW GET CMDLET +# function Get-Navigator... { +# [CmdletBinding()] +# param ( +# [String]$OrgId +# ) + +# begin { + +# } + +# process { +# $headers = @{ +# "csp-auth-token" = $Global:NavigatorConnection.accessToken; +# } +# try { +# $response = Invoke-WebRequest ` +# -Headers $headers ` +# -Uri "$($Global:NavigatorConnection.server)/cphub/api/..." +# Write-Verbose $response + +# $response | ConvertFrom-Json +# } +# catch { +# Write-Host $PSItem.Exception.Message -ForegroundColor RED +# } +# } + +# end { + +# } +# } + +Export-ModuleMember *