2016-10-07 20:14:26 +02:00
package azurerm
import (
"fmt"
"net/http"
2017-02-01 18:17:51 +01:00
"regexp"
2016-10-07 20:14:26 +02:00
"strings"
"github.com/Azure/azure-sdk-for-go/arm/network"
"github.com/hashicorp/errwrap"
"github.com/hashicorp/terraform/helper/resource"
2017-02-01 18:17:51 +01:00
"github.com/hashicorp/terraform/helper/schema"
2016-10-07 20:14:26 +02:00
)
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 ( "Error Getting LoadBalancer Name and Group: {{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 ) {
2016-12-06 09:39:47 +01:00
if lb == nil || lb . LoadBalancerPropertiesFormat == nil || lb . LoadBalancerPropertiesFormat . BackendAddressPools == nil {
2016-10-07 20:14:26 +02:00
return nil , - 1 , false
}
2016-12-06 09:39:47 +01:00
for i , apc := range * lb . LoadBalancerPropertiesFormat . BackendAddressPools {
2016-10-07 20:14:26 +02:00
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 ) {
2016-12-06 09:39:47 +01:00
if lb == nil || lb . LoadBalancerPropertiesFormat == nil || lb . LoadBalancerPropertiesFormat . FrontendIPConfigurations == nil {
2016-10-07 20:14:26 +02:00
return nil , - 1 , false
}
2016-12-06 09:39:47 +01:00
for i , feip := range * lb . LoadBalancerPropertiesFormat . FrontendIPConfigurations {
2016-10-07 20:14:26 +02:00
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 ) {
2016-12-06 09:39:47 +01:00
if lb == nil || lb . LoadBalancerPropertiesFormat == nil || lb . LoadBalancerPropertiesFormat . LoadBalancingRules == nil {
2016-10-07 20:14:26 +02:00
return nil , - 1 , false
}
2016-12-06 09:39:47 +01:00
for i , lbr := range * lb . LoadBalancerPropertiesFormat . LoadBalancingRules {
2016-10-07 20:14:26 +02:00
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 ) {
2016-12-06 09:39:47 +01:00
if lb == nil || lb . LoadBalancerPropertiesFormat == nil || lb . LoadBalancerPropertiesFormat . InboundNatRules == nil {
2016-10-07 20:14:26 +02:00
return nil , - 1 , false
}
2016-12-06 09:39:47 +01:00
for i , nr := range * lb . LoadBalancerPropertiesFormat . InboundNatRules {
2016-10-07 20:14:26 +02:00
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 ) {
2016-12-06 09:39:47 +01:00
if lb == nil || lb . LoadBalancerPropertiesFormat == nil || lb . LoadBalancerPropertiesFormat . InboundNatPools == nil {
2016-10-07 20:14:26 +02:00
return nil , - 1 , false
}
2016-12-06 09:39:47 +01:00
for i , np := range * lb . LoadBalancerPropertiesFormat . InboundNatPools {
2016-10-07 20:14:26 +02:00
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 ) {
2016-12-06 09:39:47 +01:00
if lb == nil || lb . LoadBalancerPropertiesFormat == nil || lb . LoadBalancerPropertiesFormat . Probes == nil {
2016-10-07 20:14:26 +02:00
return nil , - 1 , false
}
2016-12-06 09:39:47 +01:00
for i , p := range * lb . LoadBalancerPropertiesFormat . Probes {
2016-10-07 20:14:26 +02:00
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 )
}
2016-12-06 09:39:47 +01:00
return res , * res . LoadBalancerPropertiesFormat . ProvisioningState , nil
2016-10-07 20:14:26 +02:00
}
}
func validateLoadBalancerPrivateIpAddressAllocation ( v interface { } , k string ) ( ws [ ] string , errors [ ] error ) {
value := strings . ToLower ( v . ( string ) )
if value != "static" && value != "dynamic" {
errors = append ( errors , fmt . Errorf ( "LoadBalancer Allocations can only be Static or Dynamic" ) )
}
return
}
2017-02-01 18:17:51 +01:00
// sets the loadbalancer_id in the ResourceData from the sub resources full id
func loadBalancerSubResourceStateImporter ( d * schema . ResourceData , m interface { } ) ( [ ] * schema . ResourceData , error ) {
r , err := regexp . Compile ( ` .+\/loadBalancers\/.+?\/ ` )
if err != nil {
return nil , err
}
lbID := strings . TrimSuffix ( r . FindString ( d . Id ( ) ) , "/" )
parsed , err := parseAzureResourceID ( lbID )
if err != nil {
return nil , fmt . Errorf ( "unable to parse loadbalancer id from %s" , d . Id ( ) )
}
if parsed . Path [ "loadBalancers" ] == "" {
return nil , fmt . Errorf ( "parsed ID is invalid" )
}
d . Set ( "loadbalancer_id" , lbID )
return [ ] * schema . ResourceData { d } , nil
}