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 }