Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions pkg/provider/difftracker/config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package difftracker
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add the boilerplate.


import "fmt"

// Config holds the configuration values needed by DiffTracker
// to perform Azure operations without depending on the entire AzureCloud struct
// This allows DiffTracker to be more modular and testable
type Config struct {
// Azure subscription ID
SubscriptionID string

// Azure resource group name
ResourceGroup string

// Azure location/region
Location string

// Service Gateway resource name
ServiceGatewayResourceName string

// Full Service Gateway resource ID
ServiceGatewayID string

// Virtual Network name (required for backend pool configuration)
VNetName string
}

// Validate checks if the configuration has all required fields
func (c *Config) Validate() error {
if c.SubscriptionID == "" {
return fmt.Errorf("config validation failed: SubscriptionID is required")
}
if c.ResourceGroup == "" {
return fmt.Errorf("config validation failed: ResourceGroup is required")
}
if c.Location == "" {
return fmt.Errorf("config validation failed: Location is required")
}
if c.ServiceGatewayResourceName == "" {
return fmt.Errorf("config validation failed: ServiceGatewayResourceName is required")
}
if c.ServiceGatewayID == "" {
return fmt.Errorf("config validation failed: ServiceGatewayID is required")
}
if c.VNetName == "" {
return fmt.Errorf("config validation failed: VNetName is required")
}
return nil
}
63 changes: 63 additions & 0 deletions pkg/provider/difftracker/difftracker.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package difftracker

import (
"fmt"

"k8s.io/client-go/kubernetes"
"k8s.io/klog/v2"
"sigs.k8s.io/cloud-provider-azure/pkg/azclient"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

usually we put an empty line between k8s.io and sigs.k8s.io.

utilsets "sigs.k8s.io/cloud-provider-azure/pkg/util/sets"
)

// InitializeDiffTracker creates and initializes a new DiffTracker with the given state and configuration.
// It validates the configuration and ensures all required dependencies are present.
// Panics if critical dependencies (config, networkClientFactory, kubeClient) are invalid.
func InitializeDiffTracker(K8s K8s_State, NRP NRP_State, config Config, networkClientFactory azclient.ClientFactory, kubeClient kubernetes.Interface) *DiffTracker {
// Validate configuration
if err := config.Validate(); err != nil {
panic(fmt.Sprintf("InitializeDiffTracker: %v", err))
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the thought here to have a panic instead of return an error here? Will we recover the panic in the goroutine where the difftracker is used? If so why not just emit an error here?
If we do need a panic here for some reason, I think the better place to panic is the caller, as the caller control the workflow, and provider/difftracker is more like a tool directory and shouldn't control the code workflow.

}

// Validate required dependencies
if networkClientFactory == nil {
panic("InitializeDiffTracker: networkClientFactory must not be nil")
}
if kubeClient == nil {
panic("InitializeDiffTracker: kubeClient must not be nil")
}

klog.V(2).Infof("InitializeDiffTracker: initializing with config: subscription=%s, resourceGroup=%s, location=%s",
config.SubscriptionID, config.ResourceGroup, config.Location)

// If any field is nil, initialize it
if K8s.Services == nil {
K8s.Services = utilsets.NewString()
}
if K8s.Egresses == nil {
K8s.Egresses = utilsets.NewString()
}
if K8s.Nodes == nil {
K8s.Nodes = make(map[string]Node)
}
if NRP.LoadBalancers == nil {
NRP.LoadBalancers = utilsets.NewString()
}
if NRP.NATGateways == nil {
NRP.NATGateways = utilsets.NewString()
}
if NRP.Locations == nil {
NRP.Locations = make(map[string]NRPLocation)
}

diffTracker := &DiffTracker{
K8sResources: K8s,
NRPResources: NRP,

// Configuration and clients
config: config,
networkClientFactory: networkClientFactory,
kubeClient: kubeClient,
}

return diffTracker
}
Loading
Loading