Skip to content

Commit

Permalink
provider/azurerm: Add AzureRM Loadbalancer resource
Browse files Browse the repository at this point in the history
Adds support for the elusive Azure LoadBalancer

* [x] `azurerm_lb`
* [x] `azurerm_lb_backend_address_pool`
* [x] `azurerm_lb_rule`
* [x] `azurerm_lb_nat_rule`
* [x] `azurerm_lb_probe`
* [x] `azurerm_lb_nat_pool`

Test Results:

```
make testacc TEST=./builtin/providers/azurerm TESTARGS='-run=TestAccAzureRMLoadbalancer'
==> Checking that code complies with gofmt requirements...
go generate $(go list ./... | grep -v /terraform/vendor/)
TF_ACC=1 go test ./builtin/providers/azurerm -v
-run=TestAccAzureRMLoadbalancer -timeout 120m
=== RUN   TestAccAzureRMLoadbalancerBackEndAddressPool_basic
--- PASS: TestAccAzureRMLoadbalancerBackEndAddressPool_basic (207.26s)
=== RUN   TestAccAzureRMLoadbalancerBackEndAddressPool_removal
--- PASS: TestAccAzureRMLoadbalancerBackEndAddressPool_removal (165.89s)
=== RUN   TestAccAzureRMLoadbalancerNatRule_basic
--- PASS: TestAccAzureRMLoadbalancerNatRule_basic (179.30s)
=== RUN   TestAccAzureRMLoadbalancerNatRule_removal
--- PASS: TestAccAzureRMLoadbalancerNatRule_removal (180.73s)
=== RUN   TestAccAzureRMLoadbalancerRule_basic
--- PASS: TestAccAzureRMLoadbalancerRule_basic (170.40s)
=== RUN   TestAccAzureRMLoadbalancerRule_removal
--- PASS: TestAccAzureRMLoadbalancerRule_removal (204.23s)
=== RUN   TestAccAzureRMLoadbalancer_basic
--- PASS: TestAccAzureRMLoadbalancer_basic (136.03s)
=== RUN   TestAccAzureRMLoadbalancer_frontEndConfig
--- PASS: TestAccAzureRMLoadbalancer_frontEndConfig (214.47s)
=== RUN   TestAccAzureRMLoadbalancer_tags
--- PASS: TestAccAzureRMLoadbalancer_tags (215.52s)
=== RUN   TestAccAzureRMLoadbalancerProbe_basic
--- PASS: TestAccAzureRMLoadbalancerProbe_basic (183.36s)
=== RUN   TestAccAzureRMLoadbalancerProbe_removal
--- PASS: TestAccAzureRMLoadbalancerProbe_removal (185.86s)
=== RUN   TestAccAzureRMLoadbalancerNatPool_basic
--- PASS: TestAccAzureRMLoadbalancerNatPool_basic (161.47s)
=== RUN   TestAccAzureRMLoadbalancerNatPool_removal
--- PASS: TestAccAzureRMLoadbalancerNatPool_removal (167.38s)
PASS
ok      github.com/hashicorp/terraform/builtin/providers/azurerm
1673.852s
```
  • Loading branch information
stack72 committed Oct 5, 2016
1 parent 4548e24 commit f7c8bd0
Show file tree
Hide file tree
Showing 16 changed files with 2,752 additions and 3 deletions.
148 changes: 148 additions & 0 deletions builtin/providers/azurerm/loadbalancer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
package azurerm

import (
"fmt"
"github.com/Azure/azure-sdk-for-go/arm/network"
"github.com/hashicorp/errwrap"
"github.com/hashicorp/terraform/helper/resource"
"net/http"
"strings"
)

func resourceGroupAndLBNameFromId(loadBalancerId string) (string, string, error) {
id, err := parseAzureResourceID(loadBalancerId)
if err != nil {
return "", "", err
}
name := id.Path["loadBalancers"]
resGroup := id.ResourceGroup

return resGroup, name, nil
}

func retrieveLoadbalancerById(loadBalancerId string, meta interface{}) (*network.LoadBalancer, bool, error) {
loadBalancerClient := meta.(*ArmClient).loadBalancerClient

resGroup, name, err := resourceGroupAndLBNameFromId(loadBalancerId)
if err != nil {
return nil, false, errwrap.Wrapf("TODO: error message {{err}}", err)
}

resp, err := loadBalancerClient.Get(resGroup, name, "")
if err != nil {
if resp.StatusCode == http.StatusNotFound {
return nil, false, nil
}
return nil, false, fmt.Errorf("Error making Read request on Azure Loadbalancer %s: %s", name, err)
}

return &resp, true, nil
}

func findLoadBalancerBackEndAddressPoolByName(lb *network.LoadBalancer, name string) (*network.BackendAddressPool, int, bool) {
if lb == nil || lb.Properties == nil || lb.Properties.BackendAddressPools == nil {
return nil, -1, false
}

for i, apc := range *lb.Properties.BackendAddressPools {
if apc.Name != nil && *apc.Name == name {
return &apc, i, true
}
}

return nil, -1, false
}

func findLoadBalancerFrontEndIpConfigurationByName(lb *network.LoadBalancer, name string) (*network.FrontendIPConfiguration, int, bool) {
if lb == nil || lb.Properties == nil || lb.Properties.FrontendIPConfigurations == nil {
return nil, -1, false
}

for i, feip := range *lb.Properties.FrontendIPConfigurations {
if feip.Name != nil && *feip.Name == name {
return &feip, i, true
}
}

return nil, -1, false
}

func findLoadBalancerRuleByName(lb *network.LoadBalancer, name string) (*network.LoadBalancingRule, int, bool) {
if lb == nil || lb.Properties == nil || lb.Properties.LoadBalancingRules == nil {
return nil, -1, false
}

for i, lbr := range *lb.Properties.LoadBalancingRules {
if lbr.Name != nil && *lbr.Name == name {
return &lbr, i, true
}
}

return nil, -1, false
}

func findLoadBalancerNatRuleByName(lb *network.LoadBalancer, name string) (*network.InboundNatRule, int, bool) {
if lb == nil || lb.Properties == nil || lb.Properties.InboundNatRules == nil {
return nil, -1, false
}

for i, nr := range *lb.Properties.InboundNatRules {
if nr.Name != nil && *nr.Name == name {
return &nr, i, true
}
}

return nil, -1, false
}

func findLoadBalancerNatPoolByName(lb *network.LoadBalancer, name string) (*network.InboundNatPool, int, bool) {
if lb == nil || lb.Properties == nil || lb.Properties.InboundNatPools == nil {
return nil, -1, false
}

for i, np := range *lb.Properties.InboundNatPools {
if np.Name != nil && *np.Name == name {
return &np, i, true
}
}

return nil, -1, false
}

func findLoadBalancerProbeByName(lb *network.LoadBalancer, name string) (*network.Probe, int, bool) {
if lb == nil || lb.Properties == nil || lb.Properties.Probes == nil {
return nil, -1, false
}

for i, p := range *lb.Properties.Probes {
if p.Name != nil && *p.Name == name {
return &p, i, true
}
}

return nil, -1, false
}

func loadbalancerStateRefreshFunc(client *ArmClient, resourceGroupName string, loadbalancer string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
res, err := client.loadBalancerClient.Get(resourceGroupName, loadbalancer, "")
if err != nil {
return nil, "", fmt.Errorf("Error issuing read request in loadbalancerStateRefreshFunc to Azure ARM for Loadbalancer '%s' (RG: '%s'): %s", loadbalancer, resourceGroupName, err)
}

return res, *res.Properties.ProvisioningState, nil
}
}

func validateLoadbalancerPrivateIpAddressAllocation(v interface{}, k string) (ws []string, errors []error) {
value := strings.ToLower(v.(string))
allocations := map[string]bool{
"static": true,
"dynamic": true,
}

if !allocations[value] {
errors = append(errors, fmt.Errorf("Loadbalancer Allocations can only be Static or Dynamic"))
}
return
}
14 changes: 11 additions & 3 deletions builtin/providers/azurerm/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,17 @@ func Provider() terraform.ResourceProvider {

ResourcesMap: map[string]*schema.Resource{
// These resources use the Azure ARM SDK
"azurerm_availability_set": resourceArmAvailabilitySet(),
"azurerm_cdn_endpoint": resourceArmCdnEndpoint(),
"azurerm_cdn_profile": resourceArmCdnProfile(),
"azurerm_availability_set": resourceArmAvailabilitySet(),
"azurerm_cdn_endpoint": resourceArmCdnEndpoint(),
"azurerm_cdn_profile": resourceArmCdnProfile(),

"azurerm_lb": resourceArmLoadbalancer(),
"azurerm_lb_backend_address_pool": resourceArmLoadbalancerBackendAddressPool(),
"azurerm_lb_nat_rule": resourceArmLoadbalancerNatRule(),
"azurerm_lb_nat_pool": resourceArmLoadbalancerNatPool(),
"azurerm_lb_probe": resourceArmLoadbalancerProbe(),
"azurerm_lb_rule": resourceArmLoadbalancerRule(),

"azurerm_local_network_gateway": resourceArmLocalNetworkGateway(),
"azurerm_network_interface": resourceArmNetworkInterface(),
"azurerm_network_security_group": resourceArmNetworkSecurityGroup(),
Expand Down
Loading

0 comments on commit f7c8bd0

Please sign in to comment.