PowervRLICloud.psm1

#Author - Munishpal Makhija

# ===========================================================================
# Created by: Munishpal Makhija
# Release Date: 10/12/2022
# Organization: VMware
# Version: 1.0
# Blog: https://munishpalmakhija.com
# Twitter: @munishpal_singh
# ===========================================================================


####################### Get-vRLI-CloudCommands #########################

function Get-vRLI-CloudCommands {
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 10/12/2022
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Returns all cmdlets for vRLI Cloud
      .DESCRIPTION
          This cmdlet will allow you to return all cmdlets included in the Power vRLI Cloud Module
      .EXAMPLE
          Get-vRLI-CloudCommands
      .EXAMPLE
          Get-Command -Module PowervRLICloud
      .NOTES
          You can either use this cmdlet or the Get-Command cmdlet as seen in Example 2
  #>

      Get-Command -Module PowervRLICloud
  
  }
  
  ####################### Connect-vRLI-Cloud #########################
  
  function Connect-vRLI-Cloud
  {
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.1
      Date: 03/13/2023
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Connects to vRLI Cloud and gets CSP Access Token to be used with APIs
      .DESCRIPTION
          This cmdlet creates $global:defaultvRLICConnection object
      .EXAMPLE
          Connect-vRLI-Cloud -APIToken $APIToken
          Input APIToken as Secure String by using Read-Host "$APIToken = Read-Host -AsSecureString"
  #>

      param (
      [Parameter (Mandatory=$true)]
        # vRLI Cloud API Token
        [ValidateNotNullOrEmpty()]
        [Security.SecureString]$APIToken,
        [Parameter (Mandatory=$False)]
          # Deployment Name
          [ValidateNotNullOrEmpty()]
          [String]$Region="us"      
    )  
    if (($PSVersionTable.PSVersion.Major -eq 6)) {
       $API = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($APIToken)) 
    }
    elseif (($PSVersionTable.PSVersion.Major -eq 7)) {
       $API = ConvertFrom-SecureString -SecureString $APIToken -AsPlainText
    }
    $csp_host = "console.cloud.vmware.com"  
    $url = "https://$csp_host/csp/gateway/am/api/auth/api-tokens/authorize?source=PowervRLICloud"
    $headers = @{"Accept"="application/json";
   "Content-Type"="application/x-www-form-urlencoded";
  }
  $payload = @{"refresh_token"=$API;}
  #$body= $payload | Convertto-Json
  $response = Invoke-RestMethod -Uri $url -Method Post -Headers $headers -Body $payload -ErrorAction:Stop
    if($response)
    {
      #$response = ($response | ConvertFrom-Json)
      function Get-JWTDetails {
          [cmdletbinding()]
          param(
              [Parameter(Mandatory = $true, ValueFromPipeline = $true, Position = 0)]
              [string]$token
          )
          if (!$token.Contains(".") -or !$token.StartsWith("eyJ")) { Write-Error "Invalid token" -ErrorAction Stop }
  
          # Token
          foreach ($i in 0..1) {
              $data = $token.Split('.')[$i].Replace('-', '+').Replace('_', '/')
              switch ($data.Length % 4) {
                  0 { break }
                  2 { $data += '==' }
                  3 { $data += '=' }
              }
          }
          $decodedToken = [System.Text.Encoding]::UTF8.GetString([convert]::FromBase64String($data)) | ConvertFrom-Json 
          Write-Verbose "JWT Token:"
          Write-Verbose $decodedToken
          # Signature
          foreach ($i in 0..2) {
              $sig = $token.Split('.')[$i].Replace('-', '+').Replace('_', '/')
              switch ($sig.Length % 4) {
                  0 { break }
                  2 { $sig += '==' }
                  3 { $sig += '=' }
              }
          }
          Write-Verbose "JWT Signature:"
          Write-Verbose $sig
          $decodedToken | Add-Member -Type NoteProperty -Name "sig" -Value $sig
  
          # Convert Expiry time to PowerShell DateTime
          $orig = (Get-Date -Year 1970 -Month 1 -Day 1 -hour 0 -Minute 0 -Second 0 -Millisecond 0)
          $timeZone = Get-TimeZone
          $utcTime = $orig.AddSeconds($decodedToken.exp)
          $offset = $timeZone.GetUtcOffset($(Get-Date)).TotalMinutes #Daylight saving needs to be calculated
          $localTime = $utcTime.AddMinutes($offset)     # Return local time,
          $decodedToken | Add-Member -Type NoteProperty -Name "expiryDateTime" -Value $localTime
                  
          # Time to Expiry
          $timeToExpiry = ($localTime - (get-date))
          $decodedToken | Add-Member -Type NoteProperty -Name "timeToExpiry" -Value $timeToExpiry
  
          return $decodedToken
      }
    $token = $response.access_token
    $results = Get-JWTDetails($token)
  
      #$sd = ($results.perms | grep -i "log-intelligence").Split("/")[1]
      $sd = (($results.perms | Select-String -Pattern "log-intelligence").Line).Split("/")[1]
      #$si = (($results.perms | grep -i "log-intelligence").Split(":")[1]).Split("/")[0]
      $si = ((($results.perms | Select-String -Pattern "log-intelligence").Line).Split(":")[1]).Split("/")[0]
      
      $org_id = $results.context_name
  
      if ($Region -eq "us")
      {
        $apiurl = "api.mgmt.cloud.vmware.com"
        $dataurl = "data.mgmt.cloud.vmware.com"
      }
      else
      {
          $apiurl = $Region + ".api.mgmt.cloud.vmware.com"
          $dataurl = $Region + "data.mgmt.cloud.vmware.com"
      }    
      # Setup a custom object to contain the parameters of the connection, including the URL to the CSP API & Access token
      $connection = [pscustomObject] @{
        "Server" = $apiurl      
        "CSPToken" = $response.access_token
        "DataURL" = $dataurl
        "OrgId" = $org_id
        "ServiceId" = $sd
        "ServiceInstance" = $si
        "CSPHost" = $csp_host
      }
  
      # Remember this as the default connection
      Set-Variable -name defaultvRLICConnection -value $connection -scope Global
  
      # Return the connection
      $connection
    }
  }
  
  ####################### Disconnect-vRLI-Cloud #########################
  
  function Disconnect-vRLI-Cloud
  {
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 10/12/2022
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Destroys $global:defaultvRLICConnection object if it exists
      .DESCRIPTION
          REST is not connection oriented, so there really isnt a connect/disconnect concept. It destroys $global:defaultvRLICConnection object if it exists
      .EXAMPLE
          Disconnect-vRLI-Cloud
  #>

      if (Get-Variable -Name defaultvRLICConnection -scope global ) {
          Remove-Variable -name defaultvRLICConnection -scope global
      }
  }
  
  
  ######################### Get-AlertDefinitions #########################
  
  function Get-AlertDefinitions
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 10/12/2022
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Returns vRLIC Alert Definitions in a particular Org
      .DESCRIPTION
          This cmdlet retrieves vRLIC Alert Definitions in a particular Org
      .EXAMPLE
          Get-AlertDefinitions | where{$_.name -match "Test"}
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection     
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              $vrlic_uri = "/vrlic/api/v1/alert"
              $url = $Connection.Server
              $vrlic_url = "https://"+ $url+ $vrlic_uri+ "?source=PowervRLICloud"
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $response = Invoke-RestMethod -Uri $vrlic_url -Method Get -Headers $vrlic_headers -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              $response       
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in retrieving vRLIC Alert Definitions"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  ######################### Remove-AlertDefinition #########################
  
  function Remove-AlertDefinition
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 10/12/2022
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Deletes vRLIC Alert Definition in a particular Org
      .DESCRIPTION
          This cmdlet deletes vRLIC Alert Definition in a particular Org
      .EXAMPLE
          Remove-AlertDefinition -AlertName "Test"
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection,
        [Parameter (Mandatory=$true)]
          # Alert Definition Name
          [ValidateNotNullOrEmpty()]
          [string]$AlertName           
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              $r = Get-AlertDefinitions | where{$_.name -eq $AlertName}
              $vrlic_uri = "/vrlic/api/v1/alert/"
              $url = $Connection.Server
              $vrlic_url = "https://"+ $url+ $vrlic_uri+ $r.id+ "?source=PowervRLICloud"
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $response = Invoke-RestMethod -Uri $vrlic_url -Method DELETE -Headers $vrlic_headers -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              $response       
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in deleting vRLIC Alert Definitions"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  ######################### Get-AlertInstanceById #########################
  
  function Get-AlertInstanceById
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 10/12/2022
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Returns vRLIC Alert Instance in a particular Org
      .DESCRIPTION
          This cmdlet retrieves vRLIC Alert Instance in a particular Org
      .EXAMPLE
          Get-AlertInstanceById -Id "xxx444"
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection,
        [Parameter (Mandatory=$true)]
          # Alert Instance ID
          [ValidateNotNullOrEmpty()]
          [string]$Id              
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              $vrlic_uri = "/vrlic/api/v1/alert/instances/"
              $url = $Connection.Server
              $vrlic_url = "https://"+ $url+ $vrlic_uri+ $Id+ "?source=PowervRLICloud"
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $response = Invoke-RestMethod -Uri $vrlic_url -Method Get -Headers $vrlic_headers -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              $response       
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in retrieving vRLIC Alert Instances"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  ######################### Get-AlertInstances #########################
  
  function Get-AlertInstances
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 10/12/2022
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Returns vRLIC all Alert Instances in a particular Org
      .DESCRIPTION
          This cmdlet retrieves vRLIC all Alert Instances in a particular Org
      .EXAMPLE
          Get-AlertInstances -Duration 60
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection,
        [Parameter (Mandatory=$true)]
        # Duration in Mins
        [ValidateNotNullOrEmpty()]
        [string]$Duration                
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              $vrlic_uri = "/vrlic/api/v1/alert/instances/query"
              $url = $Connection.Server
              $vrlic_url = "https://"+ $url+ $vrlic_uri+ $Id+ "?source=PowervRLICloud"
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $end=get-date
              $start=$end.AddMinutes(-$Duration)
              $start_ms=([DateTimeOffset]$start).ToUnixTimeMilliseconds()
              $end_ms=([DateTimeOffset]$end).ToUnixTimeMilliseconds()
              $vrlic_body = "{`n `"namespace`": `"com.vmware.li`",`n `"resultLimit`": 500,`n `"startTime`": $start_ms,`n `"endTime`": $end_ms`n}"               
              $response = Invoke-RestMethod -Uri $vrlic_url -Method Post -Headers $vrlic_headers -Body $vrlic_body -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              $nextpage = $response.nextPageLink
  
              $body = "{`n `"resultLimit`": 500,`n `"nextPageLink`": `"$nextpage`" `n}"
              $r = Invoke-RestMethod -Uri $vrlic_url -Method Post -Headers $vrlic_headers -Body $body -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck
              $r.alertInstanceColl
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in retrieving vRLIC Alert Instances"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  
  ######################### Get-ContentPack-Dashboards #########################
  
  function Get-ContentPack-Dashboards
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 10/12/2022
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Returns vRLIC Content Pack Dashboards in a particular Org
      .DESCRIPTION
          This cmdlet retrieves vRLIC Content Pack Dashboards in a particular Org
      .EXAMPLE
          Get-ContentPack-Dashboards | where{$_.name -match "Test"}
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection     
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              $vrlic_uri = "/vrlic/api/v1/content/dashboards/CONTENT_PACK"
              $url = $Connection.Server
              $vrlic_url = "https://"+ $url+ $vrlic_uri+ "?source=PowervRLICloud"
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $response = Invoke-RestMethod -Uri $vrlic_url -Method Get -Headers $vrlic_headers -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              $response.dashboards       
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in retrieving vRLIC Content Pack Dashboards"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  
  ######################### Get-Favourite-Dashboards #########################
  
  function Get-Favourite-Dashboards
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 10/12/2022
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Returns vRLIC Favourite Dashboards in a particular Org
      .DESCRIPTION
          This cmdlet retrieves vRLIC Favourite Dashboards in a particular Org
      .EXAMPLE
          Get-ContentPack-Dashboards | where{$_.name -match "Test"}
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection     
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              $vrlic_uri = "/vrlic/api/v1/content/dashboards/favourites"
              $url = $Connection.Server
              $vrlic_url = "https://"+ $url+ $vrlic_uri+ "?source=PowervRLICloud"
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $response = Invoke-RestMethod -Uri $vrlic_url -Method Get -Headers $vrlic_headers -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              $response.dashboards       
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in retrieving vRLIC Favourite Dashboards"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  ######################### Get-Userdefined-Dashboards #########################
  
  function Get-Userdefined-Dashboards
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 10/12/2022
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Returns vRLIC User Defined Dashboards in a particular Org
      .DESCRIPTION
          This cmdlet retrieves vRLIC User Defined Dashboards in a particular Org
      .EXAMPLE
          Get-Userdefined-Dashboards | where{$_.name -match "Test"}
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection     
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              $vrlic_uri = "/vrlic/api/v1/content/dashboards/USER_DEFINED"
              $url = $Connection.Server
              $vrlic_url = "https://"+ $url+ $vrlic_uri+ "?source=PowervRLICloud"
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $response = Invoke-RestMethod -Uri $vrlic_url -Method Get -Headers $vrlic_headers -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              $response.dashboards       
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in retrieving vRLIC User Defined Dashboards"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  ######################### Post-Query-Request #########################
  
  function Post-Query-Request
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 10/12/2022
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Creates a log query in a particular Org
      .DESCRIPTION
          This cmdlet creates a log query in a particular Org
      .EXAMPLE
          Post-Query-Request -SQlQuery "SELECT * FROM logs ORDER BY ingest_timestamp DESC" -Duration 60
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection,
        [Parameter (Mandatory=$true)]
          # SQL Query
          [ValidateNotNullOrEmpty()]
          [string]$SQLQuery,
          [Parameter (Mandatory=$true)]
          # Duration in Mins
          [ValidateNotNullOrEmpty()]
          [string]$Duration                      
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              $vrlic_uri = "/vrlic/api/v1/query/"
              $url = $Connection.Server
              $vrlic_url = "https://"+ $url+ $vrlic_uri+ "?source=PowervRLICloud"
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $end=get-date
              $start=$end.AddMinutes(-$Duration)
              $start_ms=([DateTimeOffset]$start).ToUnixTimeMilliseconds()
              $end_ms=([DateTimeOffset]$end).ToUnixTimeMilliseconds()
              $vrlic_body = "{`n `"logQuery`": `"$SQLQuery`",`n `"start`": $start_ms,`n `"end`": $end_ms`n} "               
              $response = Invoke-RestMethod -Uri $vrlic_url -Method Post -Headers $vrlic_headers -Body $vrlic_body -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              $response.id       
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in posting vRLIC query request"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  ######################### Get-QueryResponse #########################
  
  function Get-QueryResponse
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 10/12/2022
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Returns vRLIC gets a log query by id in a particular Org
      .DESCRIPTION
          This cmdlet retrieves vRLIC log query by id in a particular Org
      .EXAMPLE
          Get-QueryResponse
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection,
        [Parameter (Mandatory=$true)]
          # Query ID
          [ValidateNotNullOrEmpty()]
          [string]$QueryId         
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              $vrlic_uri = "/vrlic/api/v1/query/"
              $url = $Connection.Server
              $vrlic_url = "https://"+ $url+ $vrlic_uri+ $QueryId+ "?source=PowervRLICloud"
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $response = Invoke-RestMethod -Uri $vrlic_url -Method Get -Headers $vrlic_headers -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              $response       
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer validGet-Date, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in retrieving vRLIC Log Query"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  
  ######################### Get-Roles #########################
  
  function Get-Roles
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 10/12/2022
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Returns vRLIC roles in a particular Org
      .DESCRIPTION
          This cmdlet retrieves vRLIC roles in a particular Org
      .EXAMPLE
          Get-Roles | where{$_.name -match "Test"}
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection    
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              $vrlic_uri = "/vrlic/api/v1/access-control/role"
              $url = $Connection.Server
              $vrlic_url = "https://"+ $url+ $vrlic_uri+ "?source=PowervRLICloud"
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $response = Invoke-RestMethod -Uri $vrlic_url -Method Get -Headers $vrlic_headers -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              $response.content      
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in retrieving vRLIC Roles"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  ######################### Get-CurrentRole #########################
  
  function Get-CurrentRole
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 10/12/2022
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Returns vRLIC current role in a particular Org
      .DESCRIPTION
          This cmdlet retrieves vRLIC current role in a particular Org
      .EXAMPLE
          Get-CurrentRole
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection    
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              $vrlic_uri = "/vrlic/api/v1/access-control/role/current"
              $url = $Connection.Server
              $vrlic_url = "https://"+ $url+ $vrlic_uri+ "?source=PowervRLICloud"
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $response = Invoke-RestMethod -Uri $vrlic_url -Method Get -Headers $vrlic_headers -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              $response      
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in retrieving vRLIC Current Role"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  ######################### Get-Datasets #########################
  
  function Get-Datasets
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 10/12/2022
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Returns vRLIC roles in a particular Org
      .DESCRIPTION
          This cmdlet retrieves vRLIC roles in a particular Org
      .EXAMPLE
          Get-Datasets | where{$_.name -match "Test"}
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection    
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              $vrlic_uri = "/vrlic/api/v1/access-control/dataset"
              $url = $Connection.Server
              $vrlic_url = "https://"+ $url+ $vrlic_uri+ "?source=PowervRLICloud"
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $response = Invoke-RestMethod -Uri $vrlic_url -Method Get -Headers $vrlic_headers -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              $response.content      
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in retrieving vRLIC Datasets"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  ######################### Get-CurrentDataset #########################
  
  function Get-CurrentDataset
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 10/12/2022
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Returns vRLIC current dataset in a particular Org
      .DESCRIPTION
          This cmdlet retrieves vRLIC current dataset in a particular Org
      .EXAMPLE
          Get-CurrentDataset
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection    
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              $vrlic_uri = "/vrlic/api/v1/access-control/dataset/current"
              $url = $Connection.Server
              $vrlic_url = "https://"+ $url+ $vrlic_uri+ "?source=PowervRLICloud"
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $response = Invoke-RestMethod -Uri $vrlic_url -Method Get -Headers $vrlic_headers -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              $response      
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in retrieving vRLIC Current Dataset"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  ######################### Create-AccessKey #########################
  
  function Create-AccessKey
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 10/12/2022
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Creates vRLIC Access Key in a particular Org
      .DESCRIPTION
          This cmdlet creates vRLIC Access Key in a particular Org
      .EXAMPLE
          Create-AccessKey -KeyName "MMTest"
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection,
        [Parameter (Mandatory=$true)]
          # Key Name
          [ValidateNotNullOrEmpty()]
          [string]$KeyName            
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              $vrlic_uri = "/vrlic/api/v1/resources/access-keys"
              $url = $Connection.Server
              $vrlic_url = "https://"+ $url+ $vrlic_uri+ "?source=PowervRLICloud"
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $vrlic_body = "{`n `"name`": `"$KeyName`"`n}"            
              $response = Invoke-RestMethod -Uri $vrlic_url -Method Post -Headers $vrlic_headers -Body $vrlic_body -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              $response      
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in creating vRLIC Access Keys "
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  
  ######################### Get-AccessKey #########################
  
  function Get-AccessKey
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 10/12/2022
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Returns vRLIC Access Key details in a particular Org
      .DESCRIPTION
          This cmdlet retrieves vRLIC Access Key details in a particular Org
      .EXAMPLE
          Get-AccessKey -KeyName "MMTest"
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection,
        [Parameter (Mandatory=$true)]
          # Name
          [ValidateNotNullOrEmpty()]
          [string]$KeyName            
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              $r=Get-CurrentDataset
              $keyId= $r.cspOrgId+ "-"+ $KeyName+ "?source=PowervRLICloud"
              $vrlic_uri = "/vrlic/api/v1/resources/access-keys/"
              $url = $Connection.Server
              $vrlic_url = "https://"+ $url+ $vrlic_uri+ $keyId
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $response = Invoke-RestMethod -Uri $vrlic_url -Method Get -Headers $vrlic_headers -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              $response      
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in retrieving vRLIC Access Keys "
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  
  ######################### Remove-AccessKey #########################
  
  function Remove-AccessKey
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 10/12/2022
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Deletes vRLIC Access Key in a particular Org
      .DESCRIPTION
          This cmdlet deletes vRLIC Access Key in a particular Org
      .EXAMPLE
          Remove-AccessKey -Name "MMTest"
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection,
        [Parameter (Mandatory=$true)]
          # Key Name
          [ValidateNotNullOrEmpty()]
          [string]$KeyName            
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              $r=Get-CurrentDataset
              $keyId= $r.cspOrgId+ "-"+ $KeyName+ "?source=PowervRLICloud"
              $vrlic_uri = "/vrlic/api/v1/resources/access-keys/"
              $url = $Connection.Server
              $vrlic_url = "https://"+ $url+ $vrlic_uri+ $keyId
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $response = Invoke-RestMethod -Uri $vrlic_url -Method DELETE -Headers $vrlic_headers -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              if ($response){
                  Write-Host -ForegroundColor Green "Access Key removed successfully" 
                  break
              }      
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in deleting vRLIC Access Key "
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  
  ######################### Get-SubscriptionStatus #########################
  
  function Get-SubscriptionStatus
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 10/12/2022
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Returns vRLIC Subscription Status in a particular Org
      .DESCRIPTION
          This cmdlet retrieves vRLIC Subscription Status in a particular Org
      .EXAMPLE
          Get-SubscriptionStatus | where{$_.name -match "Test"}
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection    
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              $vrlic_uri = "/vrlic/api/v1/subscriptions/status"
              $url = $Connection.Server
              $vrlic_url = "https://"+ $url+ $vrlic_uri+ "?source=PowervRLICloud"
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $response = Invoke-RestMethod -Uri $vrlic_url -Method Get -Headers $vrlic_headers -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              $response.usage      
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in retrieving vRLIC Subscription Status"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  ######################### Get-UsageReport #########################
  
  function Get-UsageReport
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.1
      Date: 03/13/2023
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Returns vRLIC Usage Report in a particular Org
      .DESCRIPTION
          This cmdlet retrieves vRLIC Usage Report in a particular Org
      .EXAMPLE
          Get-UsageReport -UsageType DATA_INGESTED_BILLABLE_V2 -Duration 1440
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection,
        [Parameter (Mandatory=$true)]
          # Usage Type
          [ValidateNotNullOrEmpty()]
          [string]$UsageType,
        [Parameter (Mandatory=$false)]
          # Duration in Mins
          [ValidateNotNullOrEmpty()]
          [string]$Duration=8                             
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              $vrlic_uri = "/vrlic/api/v1/billing/usage-reports"
              $url = $Connection.Server
              $usage_type=$UsageType
              $end=get-date
              $start=$end.AddMinutes(-$Duration)
              $start_ms=([DateTimeOffset]$start).ToUnixTimeMilliseconds()
              $end_ms=([DateTimeOffset]$end).ToUnixTimeMilliseconds()            
              $vrlic_url = "https://"+ $url+ $vrlic_uri+ "?usageType="+ $usage_type+ "&start="+ $start_ms+ "&end="+ $end_ms
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $response = Invoke-RestMethod -Uri $vrlic_url -Method Get -Headers $vrlic_headers -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              $response.usage.$usage_type  
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in retrieving vRLIC Usage Report"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  ######################### Post-LogsTovRLICloud #########################
  
  function Post-LogsTovRLICloud
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 03/13/2023
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Ingest log message in a particular Org
      .DESCRIPTION
          This cmdlet ingests log message in a particular Org
      .EXAMPLE
          Post-LogsTovRLICloud -AccessKeyName $AccessKeyName -LogMessage $LogMessage
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection,
        [Parameter (Mandatory=$true)]
          # Access Key Name
          [ValidateNotNullOrEmpty()]
          [string]$AccessKeyName,
          [Parameter (Mandatory=$true)]
          # Log Message
          [ValidateNotNullOrEmpty()]
          [string]$LogMessage                      
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              $vrlic_uri = "/le-mans/v1/streams/ingestion-pipeline-stream"
              $url = $Connection.DataURL
              $vrlic_url = "https://"+ $url+ $vrlic_uri+ "?source=PowervRLICloud"
              $AccessKey = Get-AccessKey -KeyName $AccessKeyName
              $cspauthtoken= $AccessKey.key
              $hostname = hostname
              $d=get-date
              $log_timestamp=([DateTimeOffset]$d).ToUnixTimeMilliseconds()         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $vrlic_body = "[`n {`n `"text`": `"$LogMessage`"`n `"source_hostname`": `"$hostname`"`n `"log_source`": `"powervrlicloud`"`n `"log_timestamp`": `"$log_timestamp`"`n }`n] "              
              $response = Invoke-RestMethod -Uri $vrlic_url -Method Post -Headers $vrlic_headers -Body $vrlic_body -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              $response      
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error senging logs to vRLI Cloud"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  ######################### Post-LogsToCloudProxy #########################
  
  function Post-LogsToCloudProxy
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 03/13/2023
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Ingest log message in a particular Org via Cloud Proxy
      .DESCRIPTION
          This cmdlet ingests log message in a particular Org via Cloud Proxy
      .EXAMPLE
          Post-LogsToCloudProxy -CloudProxyIP $CloudProxyIP -LogMessage $LogMessage
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection,
        [Parameter (Mandatory=$true)]
          # Cloud Proxy IP
          [ValidateNotNullOrEmpty()]
          [string]$CloudProxyIP,
          [Parameter (Mandatory=$true)]
          # Log Message
          [ValidateNotNullOrEmpty()]
          [string]$LogMessage                             
    )
      $vrlic_uri = ":9000/log-forwarder/ingest"
      $vrlic_url = "http://"+ $CloudProxyIP+ $vrlic_uri+ "?source=PowervRLICloud"
      $hostname = hostname
      $d=get-date
      $log_timestamp=([DateTimeOffset]$d).ToUnixTimeMilliseconds()   
  
      $vrlic_headers = @{"Accept"="*/*";
      "Content-Type"="application/json"; 
      }
      $vrlic_body = "{`n `"source_hostname`": `"$hostname`",`n `"log_source`": `"powervrlicloud`",`n `"text`": `"$LogMessage`",`n `"log_timestamp`": `"$log_timestamp`"`n}"
              
      $response = Invoke-RestMethod -Uri $vrlic_url -Method Post -Headers $vrlic_headers -Body $vrlic_body -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
      $response.result    
  }
  ######################### Search-UserInOrg #########################
  
  function Search-UserInOrg
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 03/13/2023
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Search User in a particular Org
      .DESCRIPTION
          This cmdlet Search User in a particular Org
      .EXAMPLE
          Search-UserInOrg -UserEmail $UserEmail
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection,
        [Parameter (Mandatory=$False)]
          # User Email
          [ValidateNotNullOrEmpty()]
          [string]$UserEmail                         
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              
              $orgId = $Connection.OrgId
              $csp_host = $Connection.CSPHost
              $fullurl = "https://$csp_host/csp/gateway/am/api/v2/users/search"
  
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $vrlic_body = "{`n `"searchTerm`": `"$UserEmail`"`n}"
              $response = Invoke-RestMethod -Uri $fullurl -Method Post -Headers $vrlic_headers -Body $vrlic_body -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck
              $response.results
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error Searching for the user"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  ######################### Get-UserServiceRoles #########################
  
  function Get-UserServiceRoles
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 03/13/2023
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Returns User Service Roles in a particular Org
      .DESCRIPTION
          This cmdlet retrieves User Service Roles in a particular Org
      .EXAMPLE
          Get-UserServiceRoles -UserEmail $UserEmail
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection,
          [Parameter (Mandatory=$true)]
          # User Email
          [ValidateNotNullOrEmpty()]
          [string]$UserEmail           
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              $orgId = $Connection.OrgId
              $u = Search-UserInOrg -UserEmail $UserEmail
              $userid = $u.userId
              $csp_host = $Connection.CSPHost            
              $fullurl = "https://$csp_host/csp/gateway/am/api/v2/users/$userid/orgs/$orgId/service-roles?source=PowervRLICloud"
  
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $response = Invoke-RestMethod -Uri $fullurl -Method Get -Headers $vrlic_headers -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              $response.serviceRoles.serviceRoles     
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in retrieving User Service Roles"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  ######################### Invite-NewUserTovRLICloudService #########################
  
  function Invite-NewUserTovRLICloudService
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 03/13/2023
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Add/Invite User to vRLI Cloud Service in a particular Org
      .DESCRIPTION
          This cmdlet Adds/Invites User to vRLI Cloud Service in a particular Org
      .EXAMPLE
          Invite-NewUserTovRLICloudService -UserEmail $UserEmail
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection,
        [Parameter (Mandatory=$False)]
          # Org Role Name
          [ValidateNotNullOrEmpty()]
          [string]$OrgRoleName = "org_member",
          [Parameter (Mandatory=$true)]
          # User Email
          [ValidateNotNullOrEmpty()]
          [string]$UserEmail,
        [Parameter (Mandatory=$False)]
          # vRLI Cloud Service Role Name
          [ValidateNotNullOrEmpty()]
          [string]$ServiceRoleName = "log-intelligence:user"                          
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              
              $orgId = $Connection.OrgId
              $csp_host = $Connection.CSPHost
              $fullurl = "https://$csp_host/csp/gateway/am/api/orgs/$orgId/invitations"
  
              $sd = $Connection.ServiceId
              $id = $Connection.ServiceInstance
              $instanceid = "instance:"+ $id
  
              $serviceDefinition = "/csp/gateway/slc/api/definitions/external/"+ $sd 
  
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
  
              $vrlic_body = "{`n `"skipNotify`": false,`n `"usernames`": [`n `"$UserEmail`"`n ],`n `"organizationRoles`": [`n {`n `"name`": `"$OrgRoleName`",`n `"expiresAt`": null`n }`n ],`n `"serviceRolesDtos`": [`n {`n `"serviceRoles`": [`n {`n `"name`": `"$ServiceRoleName`",`n `"expiresAt`": null,`n `"resource`": `"$instanceid`"`n }`n ],`n `"serviceDefinitionLink`": `"$serviceDefinition`"`n }`n ]`n}"
               
              $response = Invoke-RestMethod -Uri $fullurl -Method Post -Headers $vrlic_headers -Body $vrlic_body -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck
  
              $response       
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error inviting New User to vRLI Cloud"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  ######################### Add-UserTovRLICloudService #########################
  
  function Add-UserTovRLICloudService
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 03/13/2023
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Add's User to vRLI Cloud Service in a particular Org
      .DESCRIPTION
          This cmdlet Add's User to vRLI Cloud Service in a particular Org
      .EXAMPLE
          Add-UserTovRLICloudService -UserEmail $UserEmail
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection,
          [Parameter (Mandatory=$true)]
          # User Email
          [ValidateNotNullOrEmpty()]
          [string]$UserEmail,
        [Parameter (Mandatory=$False)]
          # vRLI Cloud Service Role Name
          [ValidateNotNullOrEmpty()]
          [string]$ServiceRoleName = "log-intelligence:user"                                 
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              
              $orgId = $Connection.OrgId
              $sd = $Connection.ServiceId
              $id = $Connection.ServiceInstance
              $instanceid = "instance:"+ $id
              $u = Search-UserInOrg -UserEmail $UserEmail
              $userid = $u.userId
              $csp_host = $Connection.CSPHost
              $fullurl = "https://$csp_host/csp/gateway/am/api/v3/users/$userid/orgs/$orgId/roles"
  
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
  
              $vrlic_body = "{`n `"serviceRoles`": [`n {`n `"serviceDefinitionId`": `"$sd`",`n `"rolesToAdd`": [`n {`n `"name`": `"$ServiceRoleName`",`n `"resource`": `"instance:$id`",`n `"membershipType`": `"DIRECT`"`n }`n ]`n }`n ],`n `"notifyUsers`": false`n}"
               
              $response = Invoke-RestMethod -Uri $fullurl -Method Patch -Headers $vrlic_headers -Body $vrlic_body -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck
  
              $response       
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error Adding User to vRLI Cloud Service"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  ######################### Remove-UserFromvRLICloudService #########################
  
  function Remove-UserFromvRLICloudService
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 03/13/2023
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Remove User from vRLI Cloud Service in a particular Org
      .DESCRIPTION
          This cmdlet Remove User from vRLI Cloud Service in a particular Org
      .EXAMPLE
          Remove-UserFromvRLICloudService -UserEmail $UserEmail
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection,
          [Parameter (Mandatory=$true)]
          # User Email
          [ValidateNotNullOrEmpty()]
          [string]$UserEmail                         
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              
              $orgId = $Connection.OrgId
              $sd = $Connection.ServiceId
              $id = $Connection.ServiceInstance
              $instanceid = "instance:"+ $id
              $u = Search-UserInOrg -UserEmail $UserEmail
              $userid = $u.userId
              $roles = Get-UserServiceRoles -UserEmail $UserEmail | where{$_.name -match "log-intelligence"}
              $rolename = $roles.name
              $csp_host = $Connection.CSPHost 
              $fullurl = "https://$csp_host/csp/gateway/am/api/v3/users/$userid/orgs/$orgId/roles"
  
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
  
              $vrlic_body = "{`n `"serviceRoles`": [`n {`n `"serviceDefinitionId`": `"$sd`",`n `"rolesToRemove`": [`n {`n `"name`": `"$rolename`",`n `"resource`": `"instance:$id`",`n `"membershipType`": `"DIRECT`"`n }`n ]`n }`n ],`n `"notifyUsers`": false`n}"
  
              $response = Invoke-RestMethod -Uri $fullurl -Method Patch -Headers $vrlic_headers -Body $vrlic_body -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck
  
              $response       
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error Removing User from vRLI Cloud Service"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  ######################### Remove-UserFromOrg #########################
  
  function Remove-UserFromOrg
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 03/13/2023
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Remove User from a particular Org
      .DESCRIPTION
          This cmdlet Remove User from a particular Org
      .EXAMPLE
          Remove-UserFromOrg -UserEmail $UserEmail
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection,
          [Parameter (Mandatory=$true)]
          # User Email
          [ValidateNotNullOrEmpty()]
          [string]$UserEmail                         
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              
              $orgId = $Connection.OrgId
              $u = Search-UserInOrg -UserEmail $UserEmail
              $userid = $u.userId
              $csp_host = $Connection.CSPHost
              $fullurl = "https://$csp_host/csp/gateway/am/api/v2/orgs/$orgId/users"
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
  
              $vrlic_body = "{`n `"ids`": [`n `"$userid`"`n ]`n}"
  
              $response = Invoke-RestMethod -Uri $fullurl -Method DELETE -Headers $vrlic_headers -Body $vrlic_body -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck
  
              $response       
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error removing user from Org "
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  ######################### Get-Tags #########################
  
  function Get-Tags
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 09/11/2023
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Returns vRLIC Tags in a particular Org
      .DESCRIPTION
          This cmdlet retrieves vRLIC Tags in a particular Org
      .EXAMPLE
          Get-Tags | where{$_.name -match "Test"}
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection,
        [Parameter (Mandatory=$False)]
          # Size
          [ValidateNotNullOrEmpty()]
          [string]$Size=20         
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              $vrlic_uri = "/vrlic/api/v1/tags?size=$Size&sort=asc"
              $url = $Connection.Server
              $vrlic_url = "https://"+ $url+ $vrlic_uri+ "&source=PowervRLICloud"
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $response = Invoke-RestMethod -Uri $vrlic_url -Method Get -Headers $vrlic_headers -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              $response.content      
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in retrieving vRLIC Tags"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  ######################### Create-Tag #########################
  
  function Create-Tag
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 09/11/2023
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Creates a tag in a particular Org
      .DESCRIPTION
          This cmdlet creates a tag in a particular Org
      .EXAMPLE
          Create-Tag -Name "MMPowervRLICloudTest"
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection,
        [Parameter (Mandatory=$true)]
          #Name
          [ValidateNotNullOrEmpty()]
          [string]$Name                     
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              $vrlic_uri = "/vrlic/api/v1/tags/"
              $url = $Connection.Server
              $vrlic_url = "https://"+ $url+ $vrlic_uri+ "?source=PowervRLICloud"
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $vrlic_body = "{
                  `"name`": `"$Name`"
              }"
               
              $response = Invoke-RestMethod -Uri $vrlic_url -Method Post -Headers $vrlic_headers -Body $vrlic_body -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              $response     
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in creating vRLIC Tag"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  ######################### Remove-Tag #########################
  
  function Remove-Tag
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 09/11/2023
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Deletes vRLIC Tag in a particular Org
      .DESCRIPTION
          This cmdlet deletes vRLIC Tag in a particular Org
      .EXAMPLE
          Remove-Tag -Name "MMPowervRLICloudTest"
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection,
        [Parameter (Mandatory=$true)]
          # Name
          [ValidateNotNullOrEmpty()]
          [string]$Name            
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              $tag=Get-Tags | where{$_.name -match "$Name"}
              $tagId=$tag.id
              $vrlic_uri = "/vrlic/api/v1/tags/"
              $url = $Connection.Server
              $vrlic_url = "https://"+ $url+ $vrlic_uri+ $tagId+ "?source=PowervRLICloud"
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $response = Invoke-RestMethod -Uri $vrlic_url -Method DELETE -Headers $vrlic_headers -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              if ($response){
                  Write-Host -ForegroundColor Green "Tag removed successfully" 
                  break
              }      
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in deleting vRLIC Tag "
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  ######################### Get-vSphereConfig #########################
  
  function Get-vSphereConfig
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 09/11/2023
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Returns vRLIC vSphere configs in a particular Org
      .DESCRIPTION
          This cmdlet retrieves vRLIC vSphere configs in a particular Org
      .EXAMPLE
          Get-vSphereConfig | where{$_.hostname -match "lab.local"}
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection       
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              $vrlic_uri = "/vrlic/api/v1/vsphere/configs"
              $url = $Connection.Server
              $vrlic_url = "https://"+ $url+ $vrlic_uri+ "?source=PowervRLICloud"
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $response = Invoke-RestMethod -Uri $vrlic_url -Method Get -Headers $vrlic_headers -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              $response.content      
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in retrieving vRLIC vSphere Configs"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  ######################### Get-WebhookConfig #########################
  
  function Get-WebhookConfig
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 09/11/2023
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Returns vRLIC Webhook Config in a particular Org
      .DESCRIPTION
          This cmdlet retrieves vRLIC Webhook Config in a particular Org
      .EXAMPLE
          Get-WebhookConfig | where{$_.name -match "Test"}
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection       
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              $vrlic_uri = "/vrlic/api/v1/notification/webhook-configurations"
              $url = $Connection.Server
              $vrlic_url = "https://"+ $url+ $vrlic_uri+ "?source=PowervRLICloud"
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $response = Invoke-RestMethod -Uri $vrlic_url -Method Get -Headers $vrlic_headers -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              $response.content      
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in retrieving vRLIC Webhook Configs"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  ######################### Get-Fields #########################
  
  function Get-Fields
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 09/11/2023
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Returns vRLIC Fields in a particular Org
      .DESCRIPTION
          This cmdlet retrieves vRLIC Fields in a particular Org
      .EXAMPLE
          Get-Fields | where{$_.displayName -match "test"}
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection,
        [Parameter (Mandatory=$False)]
          # QuerySource
          [ValidateNotNullOrEmpty()]
          [string]$FieldType="LOGS"            
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              $vrlic_uri = "/vrlic/api/v1/query/fields?type=$FieldType"
              $url = $Connection.Server
              $vrlic_url = "https://"+ $url+ $vrlic_uri
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $response = Invoke-RestMethod -Uri $vrlic_url -Method Get -Headers $vrlic_headers -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              $response.fields      
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in retrieving vRLIC Fields"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  ######################### Create-QueryDefinition #########################
  
  function Create-QueryDefinition
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 09/11/2023
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Creates an Query Definition in a particular Org
      .DESCRIPTION
          This cmdlet an Query Definition in a particular Org
      .EXAMPLE
          $payload = Get-Content ./config.json | ConvertTo-Json
          Create-QueryDefinition -QueryPayload $payload
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection,
        [Parameter (Mandatory=$true)]
          #Query Payload
          [ValidateNotNullOrEmpty()]
          [string]$QueryPayload                               
    )
    If (-Not $global:defaultvRLICConnection)
      {
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      }
    else
      {
        try {
              $vrlic_uri = "/vrlic/api/v1/query-definitions"
              $url = $Connection.Server
              $vrlic_url = "https://"+ $url+ $vrlic_uri
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $vrlic_body = $QueryPayload | ConvertFrom-Json 
              $response = Invoke-RestMethod -Uri $vrlic_url -Method Post -Headers $vrlic_headers -Body $vrlic_body -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              $response     
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in creating vRLIC Query Definition"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  
  ######################### Get-QueryDefinitions #########################
  
  function Get-QueryDefinitions
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 09/11/2023
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Returns vRLIC Query Definitions in a particular Org
      .DESCRIPTION
          This cmdlet retrieves vRLIC Query Definitions in a particular Org
      .EXAMPLE
          Get-QueryDefinitions | where{$_.name -match "MM_PowervRLI"}
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection,
        [Parameter (Mandatory=$False)]
          # Size
          [ValidateNotNullOrEmpty()]
          [string]$PageSize=200,
        [Parameter (Mandatory=$False)]
          # QuerySource
          [ValidateNotNullOrEmpty()]
          [string]$QuerySource="USER_DEFINED"              
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              $vrlic_uri = "/vrlic/api/v1/query-definitions"
              $url = $Connection.Server
              $vrlic_url = "https://"+ $url+ $vrlic_uri+ "?size=$PageSize&source="+ $QuerySource
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $response = Invoke-RestMethod -Uri $vrlic_url -Method Get -Headers $vrlic_headers -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              $response.content 
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in retrieving vRLIC Query Definitions"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  ######################### Remove-QueryDefinition #########################
  
  function Remove-QueryDefinition
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 09/11/2023
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Deletes vRLIC Query Definition in a particular Org
      .DESCRIPTION
          This cmdlet deletes vRLIC Query Definition in a particular Org
      .EXAMPLE
          Remove-QueryDefinition -QueryName "MMPowervRLICloudTest"
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection,
        [Parameter (Mandatory=$true)]
          # Name
          [ValidateNotNullOrEmpty()]
          [string]$QueryName            
    )
    If (-Not $global:defaultvRLICConnection) 
      { 
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      } 
    else
      {
        try {
              $query=Get-QueryDefinitions | where{$_.name -match "$QueryName"}
              $queryId=$query.id
              $vrlic_uri = "/vrlic/api/v1/query-definitions/"
              $url = $Connection.Server
              $vrlic_url = "https://"+ $url+ $vrlic_uri+ $queryId+ "?source=PowervRLICloud"
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $response = Invoke-RestMethod -Uri $vrlic_url -Method DELETE -Headers $vrlic_headers -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              if ($response){
                  Write-Host -ForegroundColor Green "Query Definition removed successfully" 
                  break
              }      
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in deleting vRLIC Query Definition "
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}
  ######################### Create-AlertDefinition #########################
  
  function Create-AlertDefinition
  {
  
  <#
      .NOTES
      ==============================================================================================================================================
      Created by: Munishpal Makhija
      Version: 1.0
      Date: 09/11/2023
      Organization: VMware
      Blog: https://munishpalmakhija.com
      ==============================================================================================================================================
  
      .SYNOPSIS
          Creates an Alert Definition in a particular Org
      .DESCRIPTION
          This cmdlet creates an Alert Definition in a particular Org
      .EXAMPLE
          $alertpayload = Get-Content ./alert.json | ConvertTo-Json
          Create-AlertDefinition -AlertPayload $alertpayload
  #>

      param (
      [Parameter (Mandatory=$False)]
        # vRLIC Connection object
        [ValidateNotNullOrEmpty()]
        [PSCustomObject]$Connection=$defaultvRLICConnection,
        [Parameter (Mandatory=$true)]
          #Alert Payload
          [ValidateNotNullOrEmpty()]
          [string]$AlertPayload                               
    )
    If (-Not $global:defaultvRLICConnection)
      {
        Write-error "Not Connected to vRLI Cloud, please use Connect-vRLI-Cloud"
      }
    else
      {
        try {
              $vrlic_uri = "/vrlic/api/v1/alert"
              $url = $Connection.Server
              $vrlic_url = "https://"+ $url+ $vrlic_uri
              $cspauthtoken= $Connection.CSPToken         
              $vrlic_headers = @{"Accept"="application/json";
              "Content-Type"="application/json";
              "Authorization"="Bearer $cspauthtoken"; 
              }
              $vrlic_body = $AlertPayload | ConvertFrom-Json             
              $response = Invoke-RestMethod -Uri $vrlic_url -Method Post -Headers $vrlic_headers -Body $vrlic_body -ErrorAction:Stop -SkipCertificateCheck:$SkipSSLCheck 
              $response     
            } catch {
              if($_.Exception.Response.StatusCode -eq "Unauthorized") {
                  Write-Host -ForegroundColor Red "`nvRLI Cloud Session is no longer valid, please re-run the Connect-vRLI-Cloud cmdlet to retrieve a new token`n"
                  break
              } 
              else {
                  Write-Error "Error in creating vRLIC Alert Definition"
                  Write-Error "`n($_.Exception.Message)`n"
                  break
              }
      }
  }}