Skip to content

Commit

Permalink
[Load Balancer] Using Subnets instead of VirtualNetworks to link per …
Browse files Browse the repository at this point in the history
…IP configured in the BackendAddressPool (#1118)

* subnets instead of vnets

* added test changes

* more test changes

* more test changes

* test-changes

* lints

* updated lints

* test changes

* Revert "test changes"

This reverts commit 64d77a3.

* restoring support for vnets

* tests updates

* test-edit

* fixing tests agin

* fix-test

* update tests

* fix-test

* test-changes

* tests

* lints

* lints

* remove

* lints

* not ignoring vnets

* updating notes
  • Loading branch information
memeghaj authored Jun 25, 2024
1 parent caf6e87 commit 92e027f
Show file tree
Hide file tree
Showing 8 changed files with 99 additions and 26 deletions.
1 change: 1 addition & 0 deletions RELEASE_NOTES.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ Release Notes
=============
## vNext
* App Service: Automatic support for App Insights on Linux.
* LoadBalancer: Linking BackendAddressPool IPs to subnets instead of vnets if configured.

## 1.8.11
* Service Bus: Added support for setting max message size.
Expand Down
5 changes: 4 additions & 1 deletion docs/content/api-overview/resources/load-balancer.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ The Load Balancer builder (`loadBalancer`) creates load balancers that can distr
| backendAddressPool | load_balancer | The name of a load balancer these should be added to (used when adding to a pool for an existing load balancer). |
| backendAddressPool | vnet | Specifies a virtual network in the same deployment where the backend services are connected. |
| backendAddressPool | link_to_vnet | Specifies an existing virtual network where the backend services are connected. |
| backendAddressPool | subnet | Specifies a subnet in the same deployment where the backend services are connected. |
| backendAddressPool | link_to_subnet | Specifies an existing subnet where the backend services are connected. |
| backendAddressPool | add_ip_addresses | Adds IP addresses to the backend pool. |
| loadBalancerProbe | name | The name of the load balancer probe. |
| loadBalancerProbe | protocol | The protocol to use for the probe - default is TCP. |
Expand Down Expand Up @@ -67,7 +69,7 @@ arm {
add_address_spaces [ "10.0.1.0/24" ]
add_subnets [
subnet {
name "my-services"
name "my-subnet"
prefix "10.0.1.0/24"
add_delegations [
SubnetDelegationService.ContainerGroups
Expand All @@ -88,6 +90,7 @@ arm {
backendAddressPool {
name "lb-backend"
vnet "my-vnet"
subnet "my-subnet"
add_ip_addresses [
"10.0.1.4"
"10.0.1.5"
Expand Down
5 changes: 3 additions & 2 deletions samples/scripts/loadbalancer.fsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ let (lb: LoadBalancer) = {
FrontendIpConfigs = [
{|
Name = ResourceName "LoadBalancerFrontend"
PublicIp = Some(publicIPAddresses.resourceId "lb-test-pip")
AddressVersion = Network.AddressVersion.IPv4
PublicIp = Some (publicIPAddresses.resourceId "lb-test-pip")
PrivateIpAllocationMethod = PrivateIpAddress.DynamicPrivateIp
Subnet = None
|}
Expand Down Expand Up @@ -79,7 +80,7 @@ arm {

add_subnets [
subnet {
name "my-services"
name "my-subnet"
prefix "10.0.1.0/24"
add_delegations [ SubnetDelegationService.ContainerGroups ]
}
Expand Down
28 changes: 21 additions & 7 deletions src/Farmer/Arm/LoadBalancer.fs
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ type BackendAddressPool = {
{|
Name: ResourceName
VirtualNetwork: LinkedResource option
Subnet: LinkedResource option
IpAddress: System.Net.IPAddress
|} list
} with
Expand All @@ -169,9 +170,14 @@ type BackendAddressPool = {
yield loadBalancers.resourceId this.LoadBalancer

for addr in this.LoadBalancerBackendAddresses do
match addr.VirtualNetwork with
| Some(Managed vnetId) -> yield vnetId
| _ -> ()
if (addr.Subnet |> Option.isSome) then
match addr.Subnet with
| Some(Managed subnetId) -> yield subnetId
| _ -> ()
else
match addr.VirtualNetwork with
| Some(Managed vnetId) -> yield vnetId
| _ -> ()
}
|> Set.ofSeq

Expand All @@ -185,11 +191,19 @@ type BackendAddressPool = {
name = addr.Name.Value
properties = {|
ipAddress = string addr.IpAddress
virtualNetwork =
match addr.VirtualNetwork with
| Some(Managed vnetId) -> {| id = vnetId.Eval() |}
| Some(Unmanaged vnetId) -> {| id = vnetId.Eval() |}
subnet =
match addr.Subnet with
| Some(Managed subnetId) -> {| id = subnetId.Eval() |}
| Some(Unmanaged subnetId) -> {| id = subnetId.Eval() |}
| None -> Unchecked.defaultof<_>
vnet =
match addr.Subnet with
| None ->
match addr.VirtualNetwork with
| Some(Managed vnetId) -> {| id = vnetId.Eval() |}
| Some(Unmanaged vnetId) -> {| id = vnetId.Eval() |}
| None -> Unchecked.defaultof<_>
| Some _ -> Unchecked.defaultof<_>
|}
|})
|}
Expand Down
41 changes: 40 additions & 1 deletion src/Farmer/Builders/Builders.LoadBalancer.fs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ module Farmer.Builders.LoadBalancer

open System
open Farmer
open Farmer.Arm
open Farmer.Arm.LoadBalancer
open Farmer.Arm.Network
open Farmer.LoadBalancer
Expand Down Expand Up @@ -110,6 +111,7 @@ type BackendAddressPoolConfig = {
LoadBalancer: ResourceName
LoadBalancerBackendAddresses: System.Net.IPAddress list
VirtualNetwork: LinkedResource option
Subnet: LinkedResource option
} with

interface IBuilder with
Expand All @@ -128,8 +130,9 @@ type BackendAddressPoolConfig = {
this.LoadBalancerBackendAddresses
|> List.mapi (fun idx addr -> {|
Name = ResourceName $"addr{idx}"
VirtualNetwork = this.VirtualNetwork
IpAddress = addr
Subnet = this.Subnet
VirtualNetwork = this.VirtualNetwork
|})
}
]
Expand All @@ -140,6 +143,7 @@ type BackendAddressPoolBuilder() =
LoadBalancer = ResourceName.Empty
LoadBalancerBackendAddresses = []
VirtualNetwork = None
Subnet = None
}

/// Sets the name of the backend address pool.
Expand All @@ -153,6 +157,7 @@ type BackendAddressPoolBuilder() =
LoadBalancer = ResourceName lb
}


/// Links to an existing vnet for addresses for this pool.
[<CustomOperation "link_to_vnet">]
member _.LinkToVirtualNetwork(state: BackendAddressPoolConfig, vnet: string) = {
Expand Down Expand Up @@ -187,6 +192,40 @@ type BackendAddressPoolBuilder() =
VirtualNetwork = Some(Managed(virtualNetworks.resourceId vnetConfig.Name))
}

/// Links to an existing subnet for addresses for this pool.
[<CustomOperation "link_to_subnet">]
member _.LinkToSubnet(state: BackendAddressPoolConfig, subnet: string) = {
state with
Subnet = Some(Unmanaged(subnets.resourceId (ResourceName subnet)))
}

member _.LinkToSubnet(state: BackendAddressPoolConfig, subnet: ResourceId) = {
state with
Subnet = Some(Unmanaged subnet)
}

member _.LinkToSubnet(state: BackendAddressPoolConfig, subnetConfig: SubnetConfig) = {
state with
Subnet = Some(Unmanaged(subnets.resourceId subnetConfig.Name))
}

/// Links to a subnet that is defined in this same deployment.
[<CustomOperation "subnet">]
member _.Subnet(state: BackendAddressPoolConfig, subnet: string) = {
state with
Subnet = Some(Managed(subnets.resourceId (ResourceName subnet)))
}

member _.Subnet(state: BackendAddressPoolConfig, subnet: ResourceId) = {
state with
Subnet = Some(Managed subnet)
}

member _.Subnet(state: BackendAddressPoolConfig, subnetConfig: SubnetConfig) = {
state with
Subnet = Some(Managed(subnets.resourceId subnetConfig.Name))
}

/// Adds IP addresses for this backend pool.
[<CustomOperation "add_ip_addresses">]
member _.IpAddresses(state: BackendAddressPoolConfig, backendAddresses: string list) = {
Expand Down
6 changes: 4 additions & 2 deletions src/Tests/JsonRegression.fs
Original file line number Diff line number Diff line change
Expand Up @@ -403,11 +403,12 @@ let tests =
test "LoadBalancer" {
let myVnet = vnet {
name "my-vnet"

add_address_spaces [ "10.0.1.0/24" ]

add_subnets [
subnet {
name "my-services"
name "my-subnet"
prefix "10.0.1.0/24"
add_delegations [ SubnetDelegationService.ContainerGroups ]
}
Expand All @@ -428,8 +429,9 @@ let tests =
add_backend_pools [
backendAddressPool {
name "lb-backend"
vnet "my-vnet"
add_ip_addresses [ "10.0.1.4"; "10.0.1.5" ]
vnet "my-vnet"
subnet "my-subnet"
}
]

Expand Down
25 changes: 19 additions & 6 deletions src/Tests/LoadBalancer.fs
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ let tests =
add_backend_pools [
backendAddressPool {
name "lb-backend"
link_to_subnet "my-subnet"
link_to_vnet "my-vnet"
add_ip_addresses [ "10.0.1.4"; "10.0.1.5" ]
}
Expand Down Expand Up @@ -189,14 +190,26 @@ let tests =
Expect.equal resource.Name "lb/lb-backend" "Incorrect name for backend address pool"
}

test "Backend pool for existing vnet" {
let myVnet = vnet { name "my-vnet" }
test "Backend pool for existing subnet" {

let myVnet = vnet {
name "my-vnet"
add_address_spaces [ "10.0.1.0/24" ]

add_subnets [
subnet {
name "my-subnet"
prefix "10.0.1.0/24"
}
]
}

let backendPool = backendAddressPool {
name "backend-services"
load_balancer "existing-lb"
link_to_vnet myVnet
add_ip_addresses [ "10.0.1.4"; "10.0.1.5"; "10.0.1.6" ]
link_to_vnet myVnet
link_to_subnet myVnet.Subnets[0]
}

let template = arm { add_resource backendPool }
Expand All @@ -206,14 +219,14 @@ let tests =

Expect.equal pool.LoadBalancer (ResourceName "existing-lb") "Pool had incorrect load balancer"

let expectedVnet =
Unmanaged(Farmer.Arm.Network.virtualNetworks.resourceId (ResourceName "my-vnet"))
let expectedSubnet =
Unmanaged(Farmer.Arm.Network.subnets.resourceId (ResourceName "my-subnet"))

Expect.hasLength pool.LoadBalancerBackendAddresses 3 "Pool should have 3 addresses"

pool.LoadBalancerBackendAddresses
|> List.iter (fun addr ->
Expect.equal addr.VirtualNetwork (Some expectedVnet) "Pool did not have expected vnet")
Expect.equal addr.Subnet (Some expectedSubnet) "Pool did not have expected subnet")
}

test "Setting backend pool on VM NIC" {
Expand Down
14 changes: 7 additions & 7 deletions src/Tests/test-data/load-balancer.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
},
"subnets": [
{
"name": "my-services",
"name": "my-subnet",
"properties": {
"addressPrefix": "10.0.1.0/24",
"delegations": [
Expand Down Expand Up @@ -109,7 +109,7 @@
"apiVersion": "2020-11-01",
"dependsOn": [
"[resourceId('Microsoft.Network/loadBalancers', 'lb')]",
"[resourceId('Microsoft.Network/virtualNetworks', 'my-vnet')]"
"[resourceId('Microsoft.Network/virtualNetworks/subnets', 'my-subnet')]"
],
"name": "lb/lb-backend",
"properties": {
Expand All @@ -118,17 +118,17 @@
"name": "addr0",
"properties": {
"ipAddress": "10.0.1.4",
"virtualNetwork": {
"id": "[resourceId('Microsoft.Network/virtualNetworks', 'my-vnet')]"
"subnet": {
"id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', 'my-subnet')]"
}
}
},
{
"name": "addr1",
"properties": {
"ipAddress": "10.0.1.5",
"virtualNetwork": {
"id": "[resourceId('Microsoft.Network/virtualNetworks', 'my-vnet')]"
"subnet": {
"id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', 'my-subnet')]"
}
}
}
Expand All @@ -150,4 +150,4 @@
"type": "Microsoft.Network/publicIPAddresses"
}
]
}
}

0 comments on commit 92e027f

Please sign in to comment.