providers/azure/load_balancer.go (178 lines of code) (raw):

// Copyright 2020 The Terraformer Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package azure import ( "context" "log" "regexp" "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2020-03-01/network" "github.com/Azure/go-autorest/autorest" "github.com/GoogleCloudPlatform/terraformer/terraformutils" "github.com/hashicorp/go-azure-helpers/authentication" ) type LoadBalancerGenerator struct { AzureService } func (g *LoadBalancerGenerator) listLoadBalancerProbes(resourceGroupName string, loadBalancerName string) ([]terraformutils.Resource, error) { var resources []terraformutils.Resource ctx := context.Background() subscriptionID := g.Args["config"].(authentication.Config).SubscriptionID resourceManagerEndpoint := g.Args["config"].(authentication.Config).CustomResourceManagerEndpoint LoadBalancerProbesClient := network.NewLoadBalancerProbesClientWithBaseURI(resourceManagerEndpoint, subscriptionID) LoadBalancerProbesClient.Authorizer = g.Args["authorizer"].(autorest.Authorizer) loadBalancerProbeIterator, err := LoadBalancerProbesClient.ListComplete(ctx, resourceGroupName, loadBalancerName) if err != nil { return nil, err } for loadBalancerProbeIterator.NotDone() { loadBalancerProbe := loadBalancerProbeIterator.Value() // NOTE: // This works out the loadBalancer resource id from current probe // /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/group1/providers/Microsoft.Network/loadBalancers/lb1 // /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/group1/providers/Microsoft.Network/loadBalancers/lb1/probes/probe1 // // As the related data_source in azurerm provider works by starting to look up with loadbalancer_id // https://github.com/terraform-providers/terraform-provider-azurerm/blob/v2.18.0/azurerm/internal/services/network/lb_probe_resource.go#L186 re := regexp.MustCompile(`/probes/.*$`) loadBalancerID := re.ReplaceAllLiteralString(*loadBalancerProbe.ID, "") resources = append(resources, terraformutils.NewResource( *loadBalancerProbe.ID, *loadBalancerProbe.Name, "azurerm_lb_probe", g.ProviderName, map[string]string{ "loadbalancer_id": loadBalancerID, }, []string{}, map[string]interface{}{}, )) if err := loadBalancerProbeIterator.Next(); err != nil { log.Println(err) break } } return resources, nil } func (g *LoadBalancerGenerator) listInboundNatRules(resourceGroupName string, loadBalancerName string) ([]terraformutils.Resource, error) { var resources []terraformutils.Resource ctx := context.Background() subscriptionID := g.Args["config"].(authentication.Config).SubscriptionID resourceManagerEndpoint := g.Args["config"].(authentication.Config).CustomResourceManagerEndpoint InboundNatRulesClient := network.NewInboundNatRulesClientWithBaseURI(resourceManagerEndpoint, subscriptionID) InboundNatRulesClient.Authorizer = g.Args["authorizer"].(autorest.Authorizer) InboundNatRuleIterator, err := InboundNatRulesClient.ListComplete(ctx, resourceGroupName, loadBalancerName) if err != nil { return nil, err } for InboundNatRuleIterator.NotDone() { InboundNatRule := InboundNatRuleIterator.Value() // NOTE: // Similar to above explanation, work out loadbalancer_id for azurerm datasource impl re := regexp.MustCompile(`/inboundNatRules/.*$`) loadBalancerID := re.ReplaceAllLiteralString(*InboundNatRule.ID, "") resources = append(resources, terraformutils.NewResource( *InboundNatRule.ID, *InboundNatRule.Name, "azurerm_lb_nat_rule", g.ProviderName, map[string]string{ "loadbalancer_id": loadBalancerID, }, []string{}, map[string]interface{}{}, )) if err := InboundNatRuleIterator.Next(); err != nil { log.Println(err) break } } return resources, nil } func (g *LoadBalancerGenerator) listLoadBalancerBackendAddressPools(resourceGroupName string, loadBalancerName string) ([]terraformutils.Resource, error) { var resources []terraformutils.Resource ctx := context.Background() subscriptionID := g.Args["config"].(authentication.Config).SubscriptionID resourceManagerEndpoint := g.Args["config"].(authentication.Config).CustomResourceManagerEndpoint LoadBalancerBackendAddressPoolsClient := network.NewLoadBalancerBackendAddressPoolsClientWithBaseURI(resourceManagerEndpoint, subscriptionID) LoadBalancerBackendAddressPoolsClient.Authorizer = g.Args["authorizer"].(autorest.Authorizer) loadBalancerBackendAddressPoolIterator, err := LoadBalancerBackendAddressPoolsClient.ListComplete(ctx, resourceGroupName, loadBalancerName) if err != nil { return nil, err } for loadBalancerBackendAddressPoolIterator.NotDone() { loadBalancerBackendAddressPool := loadBalancerBackendAddressPoolIterator.Value() // NOTE: // Similar to above explanation, work out loadbalancer_id for azurerm datasource impl re := regexp.MustCompile(`/backendAddressPools/.*$`) loadBalancerID := re.ReplaceAllLiteralString(*loadBalancerBackendAddressPool.ID, "") resources = append(resources, terraformutils.NewResource( *loadBalancerBackendAddressPool.ID, *loadBalancerBackendAddressPool.Name, "azurerm_lb_backend_address_pool", g.ProviderName, map[string]string{ "loadbalancer_id": loadBalancerID, }, []string{}, map[string]interface{}{}, )) if err := loadBalancerBackendAddressPoolIterator.Next(); err != nil { log.Println(err) break } } return resources, nil } func (g *LoadBalancerGenerator) listAndAddForLoadBalancers() ([]terraformutils.Resource, error) { var resources []terraformutils.Resource ctx := context.Background() subscriptionID := g.Args["config"].(authentication.Config).SubscriptionID resourceManagerEndpoint := g.Args["config"].(authentication.Config).CustomResourceManagerEndpoint LoadBalancersClient := network.NewLoadBalancersClientWithBaseURI(resourceManagerEndpoint, subscriptionID) LoadBalancersClient.Authorizer = g.Args["authorizer"].(autorest.Authorizer) var ( loadBalancerIterator network.LoadBalancerListResultIterator err error ) if rg := g.Args["resource_group"].(string); rg != "" { loadBalancerIterator, err = LoadBalancersClient.ListComplete(ctx, rg) } else { loadBalancerIterator, err = LoadBalancersClient.ListAllComplete(ctx) } if err != nil { return nil, err } for loadBalancerIterator.NotDone() { loadBalancer := loadBalancerIterator.Value() resources = append(resources, terraformutils.NewSimpleResource( *loadBalancer.ID, *loadBalancer.Name, "azurerm_lb", g.ProviderName, []string{})) id, err := ParseAzureResourceID(*loadBalancer.ID) if err != nil { return nil, err } probes, err := g.listLoadBalancerProbes(id.ResourceGroup, *loadBalancer.Name) if err != nil { return nil, err } resources = append(resources, probes...) inboundNatRules, err := g.listInboundNatRules(id.ResourceGroup, *loadBalancer.Name) if err != nil { return nil, err } resources = append(resources, inboundNatRules...) backendAddressPools, err := g.listLoadBalancerBackendAddressPools(id.ResourceGroup, *loadBalancer.Name) if err != nil { return nil, err } resources = append(resources, backendAddressPools...) if err := loadBalancerIterator.Next(); err != nil { log.Println(err) return resources, err } } return resources, nil } func (g *LoadBalancerGenerator) InitResources() error { functions := []func() ([]terraformutils.Resource, error){ g.listAndAddForLoadBalancers, } for _, f := range functions { resources, err := f() if err != nil { return err } g.Resources = append(g.Resources, resources...) } return nil }