Public/zone.ps1

function Get-CSZone {
    <#
    .SYNOPSIS
        Lists zones in CloudStack.
    
    .DESCRIPTION
        Retrieves a list of zones with optional filtering by ID, name,
        availability, or other parameters.
    
    .PARAMETER Id
        Filter by zone ID
    
    .PARAMETER Name
        Filter by zone name (exact match)
    
    .PARAMETER Keyword
        Filter by keyword (partial match on name)
    
    .PARAMETER Available
        Filter by availability (true/false)
    
    .PARAMETER DomainId
        Filter by domain ID
    
    .PARAMETER NetworkType
        Filter by network type (Advanced or Basic)
    
    .PARAMETER ShowCapacities
        Show zone capacities (CPU, memory, storage)
    
    .PARAMETER Tags
        Filter by tags (comma-separated list)
    
    .EXAMPLE
        Get-CSZone
        Lists all zones
    
    .EXAMPLE
        Get-CSZone -Name "zone1"
        Gets a specific zone by name
    
    .EXAMPLE
        Get-CSZone -Available $true
        Lists all available zones
    
    .EXAMPLE
        Get-CSZone -NetworkType Advanced
        Lists all zones with Advanced networking
    
    .EXAMPLE
        Get-CSZone -ShowCapacities $true
        Lists all zones with capacity information
    #>

    [CmdletBinding(DefaultParameterSetName='Default')]
    param(
        [Parameter(ParameterSetName='ById')]
        [string]$Id,
        
        [Parameter(ParameterSetName='ByName')]
        [string]$Name,
        
        [Parameter(ParameterSetName='Default')]
        [string]$Keyword,
        
        [Parameter(ParameterSetName='Default')]
        [bool]$Available,
        
        [Parameter(ParameterSetName='Default')]
        [string]$DomainId,
        
        [Parameter(ParameterSetName='Default')]
        [ValidateSet('Advanced', 'Basic')]
        [string]$NetworkType,
        
        [Parameter(ParameterSetName='Default')]
        [bool]$ShowCapacities,
        
        [Parameter(ParameterSetName='Default')]
        [string]$Tags
    )
    
    # Build parameters
    $apiParams = @{}
    
    if ($PSBoundParameters.ContainsKey('Id')) {
        $apiParams['id'] = $Id
    }
    
    if ($PSBoundParameters.ContainsKey('Name')) {
        $apiParams['name'] = $Name
    }
    
    if ($PSBoundParameters.ContainsKey('Keyword')) {
        $apiParams['keyword'] = $Keyword
    }
    
    if ($PSBoundParameters.ContainsKey('Available')) {
        $apiParams['available'] = $Available.ToString().ToLower()
    }
    
    if ($PSBoundParameters.ContainsKey('DomainId')) {
        $apiParams['domainid'] = $DomainId
    }
    
    if ($PSBoundParameters.ContainsKey('NetworkType')) {
        $apiParams['networktype'] = $NetworkType
    }
    
    if ($PSBoundParameters.ContainsKey('ShowCapacities')) {
        $apiParams['showcapacities'] = $ShowCapacities.ToString().ToLower()
    }
    
    if ($PSBoundParameters.ContainsKey('Tags')) {
        $apiParams['tags'] = $Tags
    }
    
    # Make the API call
    $response = Invoke-CSApiRequest -Command 'listZones' -Parameters $apiParams
    Write-Verbose ($apiParams | Out-String)
    
    # Return the zone list
    if ($response.listzonesresponse.zone) {
        return $response.listzonesresponse.zone
    }
    else {
        Write-Verbose "No zones found matching the criteria."
        return $null
    }
}

function New-CSZone {
    <#
    .SYNOPSIS
        Creates a CloudStack zone.

    .DESCRIPTION
        Wraps CloudStack's createZone API. Provide the external and internal
        DNS servers, a zone name, and either Basic or Advanced networking.

    .PARAMETER Dns1
        Primary external (public) DNS server

    .PARAMETER InternalDns1
        Primary internal DNS server used by system VMs

    .PARAMETER Name
        Name for the zone

    .PARAMETER NetworkType
        The zone's network type: Basic or Advanced

    .PARAMETER AllocationState
        Initial allocation state: Enable or Disable

    .PARAMETER Dns2
        Secondary external (public) DNS server

    .PARAMETER Domain
        Network domain suffix for guest networks in the zone

    .PARAMETER DomainId
        Restrict the zone to this domain (for a dedicated zone)

    .PARAMETER GuestCidrAddress
        The guest CIDR for an Advanced zone (for example 10.20.0.0/16)

    .PARAMETER InternalDns2
        Secondary internal DNS server

    .PARAMETER Ip6Dns1
        Primary IPv6 DNS server

    .PARAMETER Ip6Dns2
        Secondary IPv6 DNS server

    .PARAMETER IsEdge
        Create the zone as an edge zone

    .PARAMETER LocalStorageEnabled
        Allow instances in the zone to use host-local storage

    .PARAMETER SecurityGroupEnabled
        Enable security groups (Basic networking, or shared networks in Advanced)

    .EXAMPLE
        New-CSZone -Name 'Detroit-1' -NetworkType Advanced -Dns1 '10.0.0.10' -InternalDns1 '10.0.0.11' -Domain 'detroit.example.com' -GuestCidrAddress '10.20.0.0/16'

        Creates an Advanced-networking zone.

    .EXAMPLE
        New-CSZone -Name 'Edge-1' -NetworkType Basic -Dns1 '10.0.0.10' -InternalDns1 '10.0.0.11' -SecurityGroupEnabled

        Creates a Basic-networking zone with security groups enabled.
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true)][string]$Dns1,
        [Parameter(Mandatory=$true)][string]$InternalDns1,
        [Parameter(Mandatory=$true)][string]$Name,
        [Parameter(Mandatory=$true)][ValidateSet('Basic', 'Advanced')][string]$NetworkType,
        [ValidateSet('Enable', 'Disable')][string]$AllocationState,
        [string]$Dns2,
        [string]$Domain,
        [string]$DomainId,
        [string]$GuestCidrAddress,
        [string]$InternalDns2,
        [string]$Ip6Dns1,
        [string]$Ip6Dns2,
        [switch]$IsEdge,
        [switch]$LocalStorageEnabled,
        [switch]$SecurityGroupEnabled
    )
    $apiParams = @{ dns1 = $Dns1; internaldns1 = $InternalDns1; name = $Name; networktype = $NetworkType }
    $parameterMap = @{ AllocationState = 'allocationstate'; Dns2 = 'dns2'; Domain = 'domain'; DomainId = 'domainid'; GuestCidrAddress = 'guestcidraddress'; InternalDns2 = 'internaldns2'; Ip6Dns1 = 'ip6dns1'; Ip6Dns2 = 'ip6dns2' }
    foreach ($parameter in $parameterMap.Keys) { if ($PSBoundParameters.ContainsKey($parameter)) { $apiParams[$parameterMap[$parameter]] = (Get-Variable -Name $parameter -ValueOnly) } }
    if ($IsEdge) { $apiParams['isedge'] = 'true' }
    if ($LocalStorageEnabled) { $apiParams['localstorageenabled'] = 'true' }
    if ($SecurityGroupEnabled) { $apiParams['securitygroupenabled'] = 'true' }
    Invoke-CSApiRequest -Command 'createZone' -Parameters $apiParams
}