BrownField/Networking/VPN-SDWAN/NSX-T/Scripts/New-IfNotExist-Tier1GW.ps1 (310 lines of code) (raw):
function New-IfNotExist-Tier1GW {
param(
[string]$avsnsxTmanager,
[string]$nsxtUserName,
[SecureString]$nsxtPassword,
[string]$tier1GatewayName,
[string]$dhcpProfileName,
[string]$tier1GatewayIp = $null,
[string]$tier1GatewaySubnet = $null,
[string]$tier1GatewayASN = $null,
[string]$tier1GatewayBgpPeerIp = $null,
[string]$tier1GatewayBgpPeerASN = $null
)
$dhcpProfile = $null
$dhcpProfile = Get-Tier1GW -avsnsxTmanager $avsnsxTmanager `
-nsxtUserName $nsxtUserName `
-nsxtPassword $nsxtPassword `
-tier1GatewayName $tier1GatewayName
if ($null -eq $dhcpProfile) {
Write-Host "Creating Tier1 Gateway: '$tier1GatewayName'"
$dhcpProfile = New-Tier1GW -avsnsxTmanager $avsnsxTmanager `
-nsxtUserName $nsxtUserName `
-nsxtPassword $nsxtPassword `
-tier1GatewayName $tier1GatewayName `
-dhcpProfileName $dhcpProfileName `
-tier1GatewayIp $tier1GatewayIp `
-tier1GatewaySubnet $tier1GatewaySubnet `
-tier1GatewayASN $tier1GatewayASN `
-tier1GatewayBgpPeerIp $tier1GatewayBgpPeerIp `
-tier1GatewayBgpPeerASN $tier1GatewayBgpPeerASN
}
return $dhcpProfile
}
function Get-Tier1GW {
param(
[string]$avsnsxTmanager,
[string]$nsxtUserName,
[SecureString]$nsxtPassword,
[string]$tier1GatewayName
)
$nsxTT1url = "$avsnsxTmanager/policy/api/v1/infra/tier-1s"
try {
$response = Invoke-APIRequest -method "Get" `
-url $nsxTT1url `
-avsnsxtUrl $avsnsxTmanager `
-avsnsxtUserName $nsxtUserName `
-avsnsxtPassword $nsxtPassword
if ($null -eq $response -or $null -eq $response.results) {
return $null
}
return $response.results | ForEach-Object {
if ($_.display_name -eq $tier1GatewayName) {
$dhcpProfile = Get-DHCPProfile -avsnsxTmanager $avsnsxTmanager `
-nsxtUserName $nsxtUserName `
-nsxtPassword $nsxtPassword `
-tier1GatewayName $tier1GatewayName `
-dhcpProfileName $_.dhcp_config_paths[0].split("/")[-1]
$dhcpServerAddress = $dhcpProfile.DHCPServer_Address
Write-Host "Tier1 Gateway '$tier1GatewayName' with DHCP Server '$dhcpServerAddress' already exists"
return $dhcpProfile
}
}
}
catch {
Write-Error "Failed to get NSX-T T1 Gateways: $_"
return $null
}
}
function New-Tier1GW {
param(
[string]$avsnsxTmanager,
[string]$nsxtUserName,
[SecureString]$nsxtPassword,
[string]$tier1GatewayName,
[string]$dhcpProfileName,
[string]$tier1GatewayIp = $null,
[string]$tier1GatewaySubnet = $null,
[string]$tier1GatewayASN = $null,
[string]$tier1GatewayBgpPeerIp = $null,
[string]$tier1GatewayBgpPeerASN = $null
)
$nsxTT1url = "$avsnsxTmanager/policy/api/v1/infra?enforce_revision_check=true"
#$nsxTT1url = "$avsnsxTmanager/policy/api/v1/infra"
try {
$tier0GatewayName = Get-Tier0_Name -avsnsxTmanager $avsnsxTmanager `
-nsxtUserName $nsxtUserName `
-nsxtPassword $nsxtPassword `
-tier1GatewayName $tier1GatewayName
$edgeClusterPath = Get-EdgeCluster_Path -avsnsxTmanager $avsnsxTmanager `
-nsxtUserName $nsxtUserName `
-nsxtPassword $nsxtPassword `
-tier1GatewayName $tier1GatewayName
$dhcpProfile = Get-DHCPProfile -avsnsxTmanager $avsnsxTmanager `
-nsxtUserName $nsxtUserName `
-nsxtPassword $nsxtPassword `
-tier1GatewayName $tier1GatewayName `
-dhcpProfileName $dhcpProfileName
if ($null -eq $dhcpProfile -or
$null -eq $dhcpProfile.DHCPProfile_Path -or
$null -eq $dhcpProfile.DHCPServer_Address) {
Write-Host "Failed to get DHCP Profile. Creating a new one..."
$dhcpProfile = New-DHCPProfile -avsnsxTmanager $avsnsxTmanager `
-nsxtUserName $nsxtUserName `
-nsxtPassword $nsxtPassword `
-tier1GatewayName $tier1GatewayName `
-dhcpProfileName $dhcpProfileName `
-edgeClusterPath $edgeClusterPath
}
if ($null -eq $edgeClusterPath -or
$null -eq $tier0GatewayName -or
$null -eq $dhcpProfile.DHCPProfile_Path -or
$null -eq $dhcpProfile.DHCPServer_Address) {
Write-Host "Either Edge Cluster Path, Tier0 Gateway Name or DHCP Profile is null. Exiting..."
return $false
}
$body = @{
resource_type = "Infra"
children = @(
@{
resource_type = "ChildTier1"
Tier1 = @{
resource_type = "Tier1"
ha_mode = "ACTIVE_STANDBY"
route_advertisement_types = @(
"TIER1_STATIC_ROUTES"
"TIER1_CONNECTED"
"TIER1_DNS_FORWARDER_IP"
"TIER1_IPSEC_LOCAL_ENDPOINT"
)
display_name = $tier1GatewayName
tier0_path = "/infra/tier-0s/$tier0GatewayName"
failover_mode = "NON_PREEMPTIVE"
id = $tier1GatewayName
children = @(
@{
resource_type = "ChildLocaleServices"
LocaleServices = @{
resource_type = "LocaleServices"
id = "default"
edge_cluster_path = $edgeClusterPath
}
}
)
dhcp_config_paths = @($dhcpProfile.DHCPProfile_Path)
}
}
)
}
$response = Invoke-APIRequest -method "PATCH" `
-url $nsxTT1url `
-avsnsxtUrl $avsnsxTmanager `
-avsnsxtUserName $nsxtUserName `
-avsnsxtPassword $nsxtPassword `
-body ($body | ConvertTo-Json -Depth 10)
if ($response.StatusCode -eq 200) {
return $dhcpProfile
}
}
catch {
Write-Error "Failed to create NSX-T T1 Gateway: $_"
return $null
}
}
function Get-EdgeCluster_Path {
param(
[string]$avsnsxTmanager,
[string]$nsxtUserName,
[SecureString]$nsxtPassword,
[string]$tier1GatewayName
)
$edgeclusterPathUrl = "$avsnsxTmanager/policy/api/v1/infra/sites/default/enforcement-points/default/edge-clusters"
try {
$response = Invoke-APIRequest -method "Get" `
-url $edgeclusterPathUrl `
-avsnsxtUrl $avsnsxTmanager `
-avsnsxtUserName $nsxtUserName `
-avsnsxtPassword $nsxtPassword
if ($null -eq $response -or $null -eq $response.results -or $response.results.Count -eq 0) {
return $null
}
return $response.results[0].path
}
catch {
Write-Error "Failed to get NSX-T Edge Cluster Path: $_"
return $null
}
}
function Get-Tier0_Name {
param(
[string]$avsnsxTmanager,
[string]$nsxtUserName,
[SecureString]$nsxtPassword,
[string]$tier1GatewayName
)
$t0nameUrl = "$avsnsxTmanager/policy/api/v1/infra/tier-0s"
try {
$response = Invoke-APIRequest -method "Get" `
-url $t0nameUrl `
-avsnsxtUrl $avsnsxTmanager `
-avsnsxtUserName $nsxtUserName `
-avsnsxtPassword $nsxtPassword
if ($null -eq $response -or $null -eq $response.results -or $response.results.Count -eq 0) {
return $null
}
return $response.results[0].display_name
}
catch {
Write-Error "Failed to get NSX-T Tier-0 Name: $_"
return $null
}
}
function Get-DHCPProfile {
param(
[string]$avsnsxTmanager,
[string]$nsxtUserName,
[SecureString]$nsxtPassword,
[string]$tier1GatewayName,
[string]$dhcpProfileName
)
$dhcpProfileUrl = "$avsnsxTmanager/policy/api/v1/infra/dhcp-server-configs"
try {
$response = Invoke-APIRequest -method "Get" `
-url $dhcpProfileUrl `
-avsnsxtUrl $avsnsxTmanager `
-avsnsxtUserName $nsxtUserName `
-avsnsxtPassword $nsxtPassword
if ($null -eq $response -or $null -eq $response.results -or $response.results.Count -eq 0) {
return $null
}
foreach ($result in $response.results) {
if ($result.display_name -eq $dhcpProfileName) {
return @{
DHCPProfile_Path = $result.path
DHCPServer_Address = $result.server_address
}
}
}
return $null
}
catch {
Write-Error "Failed to get DHCP Profile: $_"
return $null
}
}
function New-DHCPProfile {
param(
[string]$avsnsxTmanager,
[string]$nsxtUserName,
[SecureString]$nsxtPassword,
[string]$tier1GatewayName,
[string]$dhcpProfileName,
[string]$edgeClusterPath
)
$dhcpProfileUrl = "$avsnsxTmanager/policy/api/v1/infra/dhcp-server-configs/$dhcpProfileName"
try {
$dhcpServerAddress = Get-RandomRFC1918Address
$body = @{
resource_type = "DhcpServerConfig"
display_name = $dhcpProfileName
id = $dhcpProfileName
server_address = $dhcpServerAddress
edge_cluster_path = $edgeClusterPath
}
$response = Invoke-APIRequest -method "Put" `
-url $dhcpProfileUrl `
-avsnsxtUrl $avsnsxTmanager `
-avsnsxtUserName $nsxtUserName `
-avsnsxtPassword $nsxtPassword `
-body ($body | ConvertTo-Json -Depth 10)
if ($null -eq $response -or $null -eq $response.path) {
return $null
} else {
return @{
DHCPProfile_Path = $response.path
DHCPServer_Address = $dhcpServerAddress
}
}
}
catch {
Write-Error "Failed to get DHCP Profile: $_"
return $null
}
}
function Get-RandomRFC1918Address {
try {
$range = Get-Random -Minimum 1 -Maximum 4
switch ($range) {
1 {
$ip = "10.$(Get-Random -Minimum 0 -Maximum 255)." +
"$(Get-Random -Minimum 0 -Maximum 255)." +
"1/24"
}
2 {
$ip = "172.$(Get-Random -Minimum 16 -Maximum 31)." +
"$(Get-Random -Minimum 0 -Maximum 255)." +
"1/24"
}
3 {
$ip = "192.168.$(Get-Random -Minimum 0 -Maximum 255)." +
"1/24"
}
}
Write-Host "Creating DHCP Server IP: $ip"
return $ip
}
catch {
Write-Error "Failed to Create DHCP IP address: $_"
return $null
}
}