Functions/BloxOneDDI/Start-B1DiagnosticTask.ps1

function Start-B1DiagnosticTask {
    <#
    .SYNOPSIS
        Initiates a BloxOneDDI Diagnostic Task

    .DESCRIPTION
        This function is used to initiate a BloxOneDDI Diagnostic Task

    .PARAMETER OnPremHost
        The name/fqdn of the BloxOneDDI Host to run the task against

    .PARAMETER Traceroute
        This switch indicates you want to use the traceroute test

    .PARAMETER Target
        This is used as the target for the traceroute test

    .PARAMETER Port
        This is used as the port for the traceroute test

    .PARAMETER DNSTest
        This switch indicates you want to use the dns test

    .PARAMETER FQDN
        This is used as the fqdn for the dns test

    .PARAMETER NTPTest
        This switch indicates you want to use the ntp test

    .PARAMETER DNSConfiguration
        This switch indicates you want to return the DNS Configuration file

    .PARAMETER DHCPConfiguration
        This switch indicates you want to return the DHCP Configuration file

    .PARAMETER WaitForOutput
        Indicates whether the function should wait for results to be returned from the diagnostic task, or start it in the background only. This defaults to $true

    .PARAMETER id
        The id of the BloxOneDDI Host to run the diagnostic task on. Accepts pipeline input

    .EXAMPLE
        PS> Start-B1DiagnosticTask -DNSTest -FQDN "google.com"

    .EXAMPLE
        PS> Start-B1DiagnosticTask -DHCPConfiguration
   
    .FUNCTIONALITY
        BloxOneDDI
    
    .FUNCTIONALITY
        Tasks
    #>

  param(
    [String]$OnPremHost,
    [parameter(ParameterSetName="traceroute",Mandatory=$true)]
    [Switch]$Traceroute,
    [parameter(ParameterSetName="dnstest")]
    [Switch]$DNSTest,
    [parameter(ParameterSetName="ntptest")]
    [Switch]$NTPTest,
    [parameter(ParameterSetName="dnsconf")]
    [Switch]$DNSConfiguration,
    [parameter(ParameterSetName="dhcpconf")]
    [Switch]$DHCPConfiguration,
    [parameter(ParameterSetName="traceroute",Mandatory=$true)]
    [String]$Target,
    [parameter(ParameterSetName="traceroute",Mandatory=$false)]
    [String]$Port,
    [parameter(ParameterSetName="dnstest",Mandatory=$true)]
    [String]$FQDN,
    [parameter(Mandatory=$false)]
    [Switch]$WaitForOutput = $true,
    [Parameter(
      ValueFromPipelineByPropertyName = $true
    )]
    [String]$id
  )

  process {
    if ($OnPremHost -and $id) {
      Write-Host "Error. -OnPremHost and -id are mutually exclusive. Please select only one parameter" -ForegroundColor Red
      break
    } elseif (!$OnPremHost -and !$id) {
      Write-Host "Error. You must specify either -OnPremHost or -id" -ForegroundColor Red
      break
    }
  
    if ($id) {
      $OPH = Get-B1Host -id $id
    } else {
      $OPH = Get-B1Host -Name $OnPremHost -Strict
    }
  
    if ($OPH.ophid) {
      if ($Traceroute) {
        $splat = @{
          "ophid" = $OPH.ophid
          "cmd" = @{
            "name" = "traceroute"
            "args" = @{
              "target" = $Target
              "port" = $Port
            }
          }
        }
      }
  
      if ($DNSTest) {
        $splat = @{
          "ophid" = $OPH.ophid
          "cmd" = @{
            "name" = "dns_test"
            "args" = @{
              "domain_name" = $FQDN
            }
          }
        }
      }

      if ($NTPTest) {
        $splat = @{
          "ophid" = $OPH.ophid
          "cmd" = @{
            "name" = "ntp_test"
          }
        }
      }


      if ($DNSConfiguration) {
        $splat = @{
          "ophid" = $OPH.ophid
          "cmd" = @{
            "name" = "dns_conf"
          }
        }
      }

      if ($DHCPConfiguration) {
        $splat = @{
          "ophid" = $OPH.ophid
          "cmd" = @{
            "name" = "dhcp_conf"
          }
        }
      }

      $splat = $splat | ConvertTo-Json
      if ($Debug) {$splat}
      $Result = Query-CSP -Method POST -Uri "$(Get-B1CSPUrl)/atlas-onprem-diagnostic-service/v1/task" -Data $splat | Select-Object -ExpandProperty result -ErrorAction SilentlyContinue
      if ($Result) {
        if ($WaitForOutput) {
          while ((Get-B1DiagnosticTask -id $Result.id).status -eq "InProgress") {
            Write-Host "Waiting for task to complete on $($OPH.display_name).." -ForegroundColor Yellow
            Wait-Event -Timeout 5
          }
          if ($DNSConfiguration) {
            $Job = Get-B1DiagnosticTask -id $Result.id -Download
          } elseif ($DHCPConfiguration) {
            $Job = Get-B1DiagnosticTask -id $Result.id -Download | Select-Object -ExpandProperty Dhcp4 -ErrorAction SilentlyContinue
          } else {
            $Job = Get-B1DiagnosticTask -id $Result.id
          }
          if ($Job) {
            return $Job
          } else {
            Write-Host "Job failed on $($OPH.display_name)." -ForegroundColor Red
          }
        } else {
          return $Result
        }
      }
    }
  }
}