Functions/BloxOne/BloxOneDDI/New-B1DHCPConfigProfile.ps1

function New-B1DHCPConfigProfile {
    <#
    .SYNOPSIS
        Creates a new DHCP Config Profile in BloxOneDDI

    .DESCRIPTION
        This function is used to create a new DHCP Config Profile in BloxOneDDI

    .PARAMETER Name
        The name of the new DHCP Config Profile

    .PARAMETER Description
        The description of the new DHCP Config Profile

    .PARAMETER DHCPOptions
        A list of DHCP Options you want to apply to the new DHCP Config Profile.

    .PARAMETER DDNSDomain
        Optionally specify a DDNS Domain for the DHCP Config Profile

    .PARAMETER DDNSZones
        A list of DDNS Zones to apply to this DHCP Config Profile

    .PARAMETER Tags
        Any tags you want to apply to the new DHCP Config Profile

    .EXAMPLE
        PS> $DHCPOptions = @()
        PS> $DHCPOptions += @{"type"="option";"option_code"=(Get-B1DHCPOptionCode -Name "routers").id;"option_value"="10.10.100.1";}

        PS> New-B1DHCPConfigProfile -Name "Profile Name" -Description "Profile Description" -DHCPOptions $DHCPOptions -DDNSZones "prod.mydomain.corp","100.10.in-addr.arpa"
    
    .FUNCTIONALITY
        BloxOneDDI
    #>

    param(
      [Parameter(Mandatory=$true)]
      [String]$Name,
      [String]$Description,
      [System.Object]$DHCPOptions = @(),
      [String]$DDNSDomain,
      [System.Object]$DDNSZones,
      [System.Object]$Tags
    )
    $ConfigProfile = Get-B1DHCPConfigProfile -Name $Name -Strict -IncludeInheritance
    if ($ConfigProfile) {
        Write-Host "The DHCP Config Profile: $Name already exists." -ForegroundColor Yellow
    } else {
        Write-Host "Creating DHCP Config Profile: $Name..." -ForegroundColor Gray

        $splat = @{
            "name" = $Name
            "comment" = $Description
            "dhcp_options" = $DHCPOptions
            "dhcp_options_v6" = @()
            "inheritance_sources" = @{
                "dhcp_options" = @{
                    "action" = "inherit"
                    "value" = @()
                }
                "dhcp_options_v6" = @{
                    "action" = "inherit"
                    "value" = @()
                }
                "ddns_block" = @{
                    "action" = "override"
                }
                "ddns_hostname_block" = @{
                    "action" = "inherit"
                }
                "ddns_update_on_renew" = @{
                    "action" = "inherit"
                }
                "ddns_conflict_resolution_mode" = @{
                    "action" = "inherit"
                }
                "ddns_client_update" = @{
                    "action" = "inherit"
                }
                "hostname_rewrite_block" = @{
                    "action" = "inherit"
                }
            }
        }

        if ($DDNSZones) {
            $splat.inheritance_sources.ddns_block.action = "override"
            $splat.dhcp_config = @{}
            $splat.ddns_enabled = $true
            $splat.ddns_send_updates = $true
            
            $ConfigProfileJson = @()
            foreach ($DDNSZone in $DDNSZones) {
                $DDNSZone = $DDNSZone.TrimEnd(".")
                $AuthZone = Get-B1AuthoritativeZone -FQDN $DDNSZone -View $DNSView -Strict
                if ($AuthZone) {
                    $AuthZoneSplat = @{
                        "zone" = $AuthZone.id
                    }
                    $AuthZoneSplat = $AuthZoneSplat | ConvertTo-Json | ConvertFrom-Json
                    $ConfigProfileJson += $AuthZoneSplat
                } else {
                    Write-Host "Error: Authoritative Zone not found." -ForegroundColor Red
                }
                $ToUpdate += $DDNSZone
            }
            $splat.ddns_zones = $ConfigProfileJson
        }

        if ($Tags) {
            $splat | Add-Member -MemberType NoteProperty -Name "tags" -Value $Tags
        }

        if ($DDNSDomain) {
            $splat.ddns_domain = $DDNSDomain
        }
        
        $splat = $splat | ConvertTo-Json -Depth 4

        $Result = Invoke-CSP -Method POST -Uri "dhcp/server" -Data $splat | Select-Object -ExpandProperty result
        
        if ($($Result).name -eq $Name) {
            Write-Host "DHCP Config Profile: $Name created successfully." -ForegroundColor Green
            return $Result
        } else {
            Write-Host "Failed to create DHCP Config Profile: $Name" -ForegroundColor Red
            break
        }
    }
}