Functions/CSP/Portal/Set-B1Host.ps1

function Set-B1Host {
    <#
    .SYNOPSIS
        Updates an existing NIOS-X Host

    .DESCRIPTION
        This function is used to update an existing NIOS-X Host

    .PARAMETER Name
        The name of the NIOS-X Host to update.

    .PARAMETER NewName
        Use -NewName to update the name of the NIOS-X Host

    .PARAMETER IP
        The IP of the NIOS-X Host to update.

    .PARAMETER TimeZone
        The TimeZone to set the NIOS-X Host to, i.e "Europe/London"

    .PARAMETER Space
        The name of the IP Space to assign the NIOS-X Host to

    .PARAMETER Description
        The description to update the NIOS-X Host to

    .PARAMETER Location
        The updated Location for the specific NIOS-X Host. Using the value 'None' will set it to Empty

    .PARAMETER Tags
        A list of tags to apply to this
         Host. This will overwrite existing tags.

    .PARAMETER Object
        The host object to update. Accepts pipeline input from Get-B1Host

    .PARAMETER Force
        Perform the operation without prompting for confirmation. By default, this function will not prompt for confirmation unless $ConfirmPreference is set to Medium.

    .EXAMPLE
        PS> Set-B1Host -Name "ddihost1.mydomain.corp" -IP "10.10.20.11" -TimeZone "Europe/London" -Space "Global"

    .EXAMPLE
        PS> Get-B1Host -Name "ddihost1.mydomain.corp" | Set-B1Host -NewName "mynewhostname.mydomain.corp"

    .FUNCTIONALITY
        NIOS-X

    #>

    [CmdletBinding(
      SupportsShouldProcess,
      ConfirmImpact = 'Medium'
    )]
    param(
      [Parameter(ParameterSetName="Default")]
      [String]$Name,
      [Parameter(ParameterSetName="Default")]
      [String]$IP,
      [String]$NewName,
      [String]$Space,
      [String]$TimeZone,
      [String]$Description,
      [String]$Location,
      [Parameter(ParameterSetName="Default")]
      [System.Object]$Tags,
      [Parameter(
        ValueFromPipeline = $true,
        ParameterSetName="Pipeline",
        Mandatory=$true
      )]
      [System.Object]$Object,
      [Switch]$Force
    )

    process {
      $ConfirmPreference = Confirm-ShouldProcess $PSBoundParameters
      if ($Object) {
          $SplitID = $Object.id.split('/')
          if (("$($SplitID[0])/$($SplitID[1])") -ne "infra/host") {
              $Object = Get-B1Host -id $($Object.id) -Detailed
              if (-not $Object) {
                Write-Error "Error. Unsupported pipeline object. This function only supports 'infra/host' objects as input"
                return $null
              }
              $HostID = $Object.id
          } else {
            $HostID = $SplitID[2]
          }
      } else {
          if ($IP) {
            $Object = Get-B1Host -IP $IP -Strict
            if (!($Object)) {
                Write-Host "On-Prem Host $IP does not exist." -ForegroundColor Gray
            }
          } elseif ($Name) {
            $Object = Get-B1Host -Name $Name -Strict
            if (!($Object)) {
                Write-Host "On-Prem Host $Name does not exist." -ForegroundColor Gray
            }
          }
          $HostID = $Object.id
      }

      $NewObj = $Object | Select-Object * -ExcludeProperty id,configs,created_at

      if ($NewName) {
        $NewObj.display_name = $NewName
      }
      if ($TimeZone) {$NewObj.timezone = $TimeZone}
      if ($Space) {
        if ($NewObj.ip_space) {
            $NewObj.ip_space = (Get-B1Space -Name $Space -Strict).id
        } else {
            $NewObj | Add-Member -MemberType NoteProperty -Name "ip_space" -Value (Get-B1Space -Name $Space -Strict).id
        }
      }
      if ($Description) {
        if ($NewObj.description) {
            $NewObj.description = $Description
        } else {
            $NewObj | Add-Member -MemberType NoteProperty -Name "description" -Value $Description
        }
      }
      if ($Location) {
        if ($Location -eq 'None') {
          if ($NewObj.location) {
            $NewObj.location_id = $null
          } else {
              $NewObj | Add-Member -MemberType NoteProperty -Name "location_id" -Value $null
          }
        } else {
          $LocationID = (Get-B1Location -Name $Location -Strict).id
          if ($LocationID) {
            if ($NewObj.location) {
              $NewObj.location_id = $LocationID
            } else {
                $NewObj | Add-Member -MemberType NoteProperty -Name "location_id" -Value $LocationID
            }
          } else {
            Write-Error "Unable to find Location: $($Location)"
            return $null
          }
        }
      }
      if ($Tags) {
        if ($NewObj.tags) {
            $NewObj.tags = $Tags
        } else {
            $NewObj | Add-Member -MemberType NoteProperty -Name "tags" -Value $Tags
        }
      }

      $JSON = $NewObj | Select-Object * -ExcludeProperty id,configs,created_at | ConvertTo-Json -Depth 10 -Compress

      if($PSCmdlet.ShouldProcess("Update NIOS-X Host`n$(JSONPretty($JSON))","Update NIOS-X Host: $($NewObj.display_name) ($($NewObj.id))",$MyInvocation.MyCommand)){
        $Results = Invoke-CSP -Method PUT -Uri "$(Get-B1CSPUrl)/api/infra/v1/hosts/$HostID" -Data $JSON | Select-Object -ExpandProperty result -ErrorAction SilentlyContinue
        if ($($Results.id.split('/')[2]) -eq $($HostID)) {
          Write-Host "Updated NIOS-X Host Configuration $($NewObj.display_name) successfuly." -ForegroundColor Green
          return $Results
        } else {
          Write-Error "Failed to update NIOS-X Host Configuration on $($NewObj.display_name)."
          return $Results
        }
      }
    }
}