github.com/cilium/cilium@v1.16.2/pkg/ipam/allocator/azure/azure.go (about)

     1  // SPDX-License-Identifier: Apache-2.0
     2  // Copyright Authors of Cilium
     3  
     4  package azure
     5  
     6  import (
     7  	"context"
     8  	"fmt"
     9  
    10  	operatorMetrics "github.com/cilium/cilium/operator/metrics"
    11  	operatorOption "github.com/cilium/cilium/operator/option"
    12  	apiMetrics "github.com/cilium/cilium/pkg/api/metrics"
    13  	azureAPI "github.com/cilium/cilium/pkg/azure/api"
    14  	azureIPAM "github.com/cilium/cilium/pkg/azure/ipam"
    15  	"github.com/cilium/cilium/pkg/ipam"
    16  	"github.com/cilium/cilium/pkg/ipam/allocator"
    17  	ipamMetrics "github.com/cilium/cilium/pkg/ipam/metrics"
    18  	"github.com/cilium/cilium/pkg/logging"
    19  	"github.com/cilium/cilium/pkg/logging/logfields"
    20  	"github.com/cilium/cilium/pkg/metrics"
    21  )
    22  
    23  var log = logging.DefaultLogger.WithField(logfields.LogSubsys, "ipam-allocator-azure")
    24  
    25  // AllocatorAzure is an implementation of IPAM allocator interface for Azure
    26  type AllocatorAzure struct{}
    27  
    28  // Init in Azure implementation doesn't need to do anything
    29  func (*AllocatorAzure) Init(ctx context.Context) error { return nil }
    30  
    31  // Start kicks of the Azure IP allocation
    32  func (*AllocatorAzure) Start(ctx context.Context, getterUpdater ipam.CiliumNodeGetterUpdater) (allocator.NodeEventHandler, error) {
    33  
    34  	var (
    35  		azMetrics azureAPI.MetricsAPI
    36  		iMetrics  ipam.MetricsAPI
    37  	)
    38  
    39  	log.Info("Starting Azure IP allocator...")
    40  
    41  	log.Debug("Retrieving Azure cloud name via Azure IMS")
    42  	azureCloudName, err := azureAPI.GetAzureCloudName(ctx)
    43  	if err != nil {
    44  		return nil, fmt.Errorf("unable to retrieve Azure cloud name: %w", err)
    45  	}
    46  
    47  	subscriptionID := operatorOption.Config.AzureSubscriptionID
    48  	if subscriptionID == "" {
    49  		log.Debug("SubscriptionID was not specified via CLI, retrieving it via Azure IMS")
    50  		subID, err := azureAPI.GetSubscriptionID(ctx)
    51  		if err != nil {
    52  			return nil, fmt.Errorf("Azure subscription ID was not specified via CLI and retrieving it from the Azure IMS was not possible: %w", err)
    53  		}
    54  		subscriptionID = subID
    55  		log.WithField("subscriptionID", subscriptionID).Debug("Detected subscriptionID via Azure IMS")
    56  	}
    57  
    58  	resourceGroupName := operatorOption.Config.AzureResourceGroup
    59  	if resourceGroupName == "" {
    60  		log.Debug("ResourceGroupName was not specified via CLI, retrieving it via Azure IMS")
    61  		rgName, err := azureAPI.GetResourceGroupName(ctx)
    62  		if err != nil {
    63  			return nil, fmt.Errorf("Azure resource group name was not specified via CLI and retrieving it from the Azure IMS was not possible: %w", err)
    64  		}
    65  		resourceGroupName = rgName
    66  		log.WithField("resourceGroupName", resourceGroupName).Debug("Detected resource group name via Azure IMS")
    67  	}
    68  
    69  	if operatorOption.Config.EnableMetrics {
    70  		azMetrics = apiMetrics.NewPrometheusMetrics(metrics.Namespace, "azure", operatorMetrics.Registry)
    71  		iMetrics = ipamMetrics.NewPrometheusMetrics(metrics.Namespace, operatorMetrics.Registry)
    72  	} else {
    73  		azMetrics = &apiMetrics.NoOpMetrics{}
    74  		iMetrics = &ipamMetrics.NoOpMetrics{}
    75  	}
    76  
    77  	azureClient, err := azureAPI.NewClient(azureCloudName, subscriptionID, resourceGroupName, operatorOption.Config.AzureUserAssignedIdentityID, azMetrics, operatorOption.Config.IPAMAPIQPSLimit, operatorOption.Config.IPAMAPIBurst, operatorOption.Config.AzureUsePrimaryAddress)
    78  	if err != nil {
    79  		return nil, fmt.Errorf("unable to create Azure client: %w", err)
    80  	}
    81  	instances := azureIPAM.NewInstancesManager(azureClient)
    82  	nodeManager, err := ipam.NewNodeManager(instances, getterUpdater, iMetrics, operatorOption.Config.ParallelAllocWorkers, false, false)
    83  	if err != nil {
    84  		return nil, fmt.Errorf("unable to initialize Azure node manager: %w", err)
    85  	}
    86  
    87  	if err := nodeManager.Start(ctx); err != nil {
    88  		return nil, err
    89  	}
    90  
    91  	return nodeManager, nil
    92  }