Skip to content

ipam: Add allocator-independent ENI AllocationResult builder#45089

Merged
pippolo84 merged 1 commit intomainfrom
pr/HadrienPatte/buildENIAllocationResult
Apr 1, 2026
Merged

ipam: Add allocator-independent ENI AllocationResult builder#45089
pippolo84 merged 1 commit intomainfrom
pr/HadrienPatte/buildENIAllocationResult

Conversation

@HadrienPatte
Copy link
Copy Markdown
Member

Add buildENIAllocationResult which derives ENI-specific metadata by matching an allocated IP against each ENI's Addresses and Prefixes lists. This replaces the CRD allocator's inline ENI branch in buildAllocationResult, which looked up the ENI by AllocationIP.Resource (ENI ID).

The IP-based lookup is needed for the multi-pool allocator, as it allocates IPs from CIDRs without tracking per-IP resource metadata. The eniContainsIP helper covers all cases:

  • IP is a secondary ENI IP: under eni.Addresses
  • IP belongs to a delegated prefix: under eni.Prefixes
  • IP is ENI primary IP (necessary for when UsePrimaryAddress is enabled): under eni.IP

Relates to cilium/design-cfps#87

Add `buildENIAllocationResult` which derives ENI-specific metadata by
matching an allocated IP against each ENI's Addresses and Prefixes lists.
This replaces the CRD allocator's inline ENI branch in
`buildAllocationResult`, which looked up the ENI by
`AllocationIP.Resource` (ENI ID).

The IP-based lookup is needed for the multi-pool allocator, as it
allocates IPs from CIDRs without tracking per-IP resource metadata. The
`eniContainsIP` helper covers all cases:
* IP is a secondary ENI IP: under `eni.Addresses`
* IP belongs to a delegated prefix: under `eni.Prefixes`
* IP is ENI primary IP (necessary for when `UsePrimaryAddress` is
  enabled): under `eni.IP`

Relates to cilium/design-cfps#87

Signed-off-by: Hadrien Patte <hadrien.patte@datadoghq.com>
@maintainer-s-little-helper maintainer-s-little-helper bot added the dont-merge/needs-release-note-label The author needs to describe the release impact of these changes. label Mar 31, 2026
@HadrienPatte HadrienPatte added area/eni Impacts ENI based IPAM. release-note/misc This PR makes changes that have no direct user impact. area/ipam IP address management, including cloud IPAM labels Mar 31, 2026
@maintainer-s-little-helper maintainer-s-little-helper bot removed dont-merge/needs-release-note-label The author needs to describe the release impact of these changes. labels Mar 31, 2026
@HadrienPatte
Copy link
Copy Markdown
Member Author

/test

@HadrienPatte HadrienPatte marked this pull request as ready for review March 31, 2026 22:47
@HadrienPatte HadrienPatte requested a review from a team as a code owner March 31, 2026 22:47
@HadrienPatte HadrienPatte requested a review from pippolo84 March 31, 2026 22:47
Copy link
Copy Markdown
Member

@pippolo84 pippolo84 left a comment

Choose a reason for hiding this comment

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

Thanks!

If you are up to it, I suggest a follow up PR to clean buildAllocationResult and move Azure and AlibabaCloud code too in separate functions.

@pippolo84 pippolo84 added this pull request to the merge queue Apr 1, 2026
@maintainer-s-little-helper maintainer-s-little-helper bot added the ready-to-merge This PR has passed all tests and received consensus from code owners to merge. label Apr 1, 2026
Merged via the queue into main with commit 3cd7f91 Apr 1, 2026
565 of 580 checks passed
@pippolo84 pippolo84 deleted the pr/HadrienPatte/buildENIAllocationResult branch April 1, 2026 11:17
HadrienPatte added a commit to DataDog/cilium that referenced this pull request Apr 3, 2026
Replace the CRD allocator with the multi-pool allocator for ENI IPAM mode
on the agent side. Previous PRs cilium#45110 and cilium#45124 ensure the operator
already supports this new agent setup.

The new `eniMultiPoolAllocator` is a light wrapper on the standard
`multiPoolAllocator` that enriches `AllocationResult` with ENI-specific
required metadata via `buildENIAllocationResult` (see cilium#45089).

Key differences from the standard multi-pool allocator:
* `AllowFirstLastIPs` is enabled so /28 prefix delegation ranges are
  fully allocatable (see cilium#45025 and cilium#45082).
* `LinearPreAlloc` uses a simple `inUse + preAlloc` formula for demand
  computation instead of `neededIPCeil` rounding. This matches the CRD
  allocator's `calculateNeededIPs` semantics and is necessary to ensure
  the operator can recover the exact IP usage from the demand signal
  (requested - preAllocate) (see cilium#45124).
* No dependency on `CiliumPodIPPool` CRDs, pools are managed by the
  operator via Spec.IPAM.Pools.Allocated (see cilium#45110).

The agents now read CIDRs from `Spec.IPAM.Pools.Allocated`, allocate IPs
locally, and write aggregate demand to `Spec.IPAM.Pools.Requested`. They
no longer writes per-IP usage to `Status.IPAM.Used`, achieving a
reduction of kubernetes API pressure.

Relates to cilium/design-cfps#87

Signed-off-by: Hadrien Patte <hadrien.patte@datadoghq.com>
HadrienPatte added a commit to DataDog/cilium that referenced this pull request Apr 3, 2026
Replace the CRD allocator with the multi-pool allocator for ENI IPAM mode
on the agent side. Previous PRs cilium#45110 and cilium#45124 ensure the operator
already supports this new agent setup.

The new `eniMultiPoolAllocator` is a light wrapper on the standard
`multiPoolAllocator` that enriches `AllocationResult` with ENI-specific
required metadata via `buildENIAllocationResult` (see cilium#45089).

Key differences from the standard multi-pool allocator:
* `AllowFirstLastIPs` is enabled so /28 prefix delegation ranges are
  fully allocatable (see cilium#45025 and cilium#45082).
* `LinearPreAlloc` uses a simple `inUse + preAlloc` formula for demand
  computation instead of `neededIPCeil` rounding. This matches the CRD
  allocator's `calculateNeededIPs` semantics and is necessary to ensure
  the operator can recover the exact IP usage from the demand signal
  (requested - preAllocate) (see cilium#45124).
* No dependency on `CiliumPodIPPool` CRDs, pools are managed by the
  operator via Spec.IPAM.Pools.Allocated (see cilium#45110).

The agents now read CIDRs from `Spec.IPAM.Pools.Allocated`, allocate IPs
locally, and write aggregate demand to `Spec.IPAM.Pools.Requested`. They
no longer writes per-IP usage to `Status.IPAM.Used`, achieving a
reduction of kubernetes API pressure.

Relates to cilium/design-cfps#87

Signed-off-by: Hadrien Patte <hadrien.patte@datadoghq.com>
HadrienPatte added a commit that referenced this pull request Apr 3, 2026
Replace the CRD allocator with the multi-pool allocator for ENI IPAM mode
on the agent side. Previous PRs #45110 and #45124 ensure the operator
already supports this new agent setup.

The new `eniMultiPoolAllocator` is a light wrapper on the standard
`multiPoolAllocator` that enriches `AllocationResult` with ENI-specific
required metadata via `buildENIAllocationResult` (see #45089).

Key differences from the standard multi-pool allocator:
* `AllowFirstLastIPs` is enabled so /28 prefix delegation ranges are
  fully allocatable (see #45025 and #45082).
* `LinearPreAlloc` uses a simple `inUse + preAlloc` formula for demand
  computation instead of `neededIPCeil` rounding. This matches the CRD
  allocator's `calculateNeededIPs` semantics and is necessary to ensure
  the operator can recover the exact IP usage from the demand signal
  (requested - preAllocate) (see #45124).
* No dependency on `CiliumPodIPPool` CRDs, pools are managed by the
  operator via Spec.IPAM.Pools.Allocated (see #45110).

The agents now read CIDRs from `Spec.IPAM.Pools.Allocated`, allocate IPs
locally, and write aggregate demand to `Spec.IPAM.Pools.Requested`. They
no longer writes per-IP usage to `Status.IPAM.Used`, achieving a
reduction of kubernetes API pressure.

Relates to cilium/design-cfps#87

Signed-off-by: Hadrien Patte <hadrien.patte@datadoghq.com>
HadrienPatte added a commit that referenced this pull request Apr 4, 2026
Replace the CRD allocator with the multi-pool allocator for ENI IPAM mode
on the agent side. Previous PRs #45110 and #45124 ensure the operator
already supports this new agent setup.

The new `eniMultiPoolAllocator` is a light wrapper on the standard
`multiPoolAllocator` that enriches `AllocationResult` with ENI-specific
required metadata via `buildENIAllocationResult` (see #45089).

Key differences from the standard multi-pool allocator:
* `AllowFirstLastIPs` is enabled so /28 prefix delegation ranges are
  fully allocatable (see #45025 and #45082).
* `LinearPreAlloc` uses a simple `inUse + preAlloc` formula for demand
  computation instead of `neededIPCeil` rounding. This matches the CRD
  allocator's `calculateNeededIPs` semantics and is necessary to ensure
  the operator can recover the exact IP usage from the demand signal
  (requested - preAllocate) (see #45124).
* No dependency on `CiliumPodIPPool` CRDs, pools are managed by the
  operator via Spec.IPAM.Pools.Allocated (see #45110).

The agents now read CIDRs from `Spec.IPAM.Pools.Allocated`, allocate IPs
locally, and write aggregate demand to `Spec.IPAM.Pools.Requested`. They
no longer writes per-IP usage to `Status.IPAM.Used`, achieving a
reduction of kubernetes API pressure.

Relates to cilium/design-cfps#87

Signed-off-by: Hadrien Patte <hadrien.patte@datadoghq.com>
HadrienPatte added a commit that referenced this pull request Apr 4, 2026
Replace the CRD allocator with the multi-pool allocator for ENI IPAM mode
on the agent side. Previous PR #45124 ensures the operator already
supports this new agent setup.

The new `eniMultiPoolAllocator` is a light wrapper on the standard
`multiPoolAllocator` that enriches `AllocationResult` with ENI-specific
required metadata via `buildENIAllocationResult` (see #45089).

Key differences from the standard multi-pool allocator:
* `AllowFirstLastIPs` is enabled so /28 prefix delegation ranges are
  fully allocatable (see #45025 and #45082).
* `LinearPreAlloc` uses a simple `inUse + preAlloc` formula for demand
  computation instead of `neededIPCeil` rounding. This matches the CRD
  allocator's `calculateNeededIPs` semantics and is necessary to ensure
  the operator can recover the exact IP usage from the demand signal
  (requested - preAllocate) (see #45124).
* No dependency on `CiliumPodIPPool` CRDs, pools are instead populated
  by the agent from `Status.ENI.ENIs` which is maintained by the
  operator.

The agents now read CIDRs from `Status.ENI.ENIs`, allocate IPs locally,
and write aggregate demand to `Spec.IPAM.Pools.Requested`. They
no longer writes per-IP usage to `Status.IPAM.Used`, achieving a
reduction of kubernetes API pressure.

Relates to cilium/design-cfps#87

Signed-off-by: Hadrien Patte <hadrien.patte@datadoghq.com>
HadrienPatte added a commit that referenced this pull request Apr 4, 2026
Replace the CRD allocator with the multi-pool allocator for ENI IPAM mode
on the agent side. Previous PR #45124 ensures the operator already
supports this new agent setup.

The new `eniMultiPoolAllocator` is a light wrapper on the standard
`multiPoolAllocator` that enriches `AllocationResult` with ENI-specific
required metadata via `buildENIAllocationResult` (see #45089).

Key differences from the standard multi-pool allocator:
* `AllowFirstLastIPs` is enabled so /28 prefix delegation ranges are
  fully allocatable (see #45025 and #45082).
* `LinearPreAlloc` uses a simple `inUse + preAlloc` formula for demand
  computation instead of `neededIPCeil` rounding. This matches the CRD
  allocator's `calculateNeededIPs` semantics and is necessary to ensure
  the operator can recover the exact IP usage from the demand signal
  (requested - preAllocate) (see #45124).
* No dependency on `CiliumPodIPPool` CRDs, pools are instead populated
  by the agent from `Status.ENI.ENIs` which is maintained by the
  operator.

The agents now read CIDRs from `Status.ENI.ENIs`, allocate IPs locally,
and write aggregate demand to `Spec.IPAM.Pools.Requested`. They
no longer writes per-IP usage to `Status.IPAM.Used`, achieving a
reduction of kubernetes API pressure.

Relates to cilium/design-cfps#87

Signed-off-by: Hadrien Patte <hadrien.patte@datadoghq.com>
HadrienPatte added a commit that referenced this pull request Apr 5, 2026
Replace the CRD allocator with the multi-pool allocator for ENI IPAM mode
on the agent side. Previous PR #45124 ensures the operator already
supports this new agent setup.

The new `eniMultiPoolAllocator` is a light wrapper on the standard
`multiPoolAllocator` that enriches `AllocationResult` with ENI-specific
required metadata via `buildENIAllocationResult` (see #45089).

Key differences from the standard multi-pool allocator:
* `AllowFirstLastIPs` is enabled so /28 prefix delegation ranges are
  fully allocatable (see #45025 and #45082).
* `LinearPreAlloc` uses a simple `inUse + preAlloc` formula for demand
  computation instead of `neededIPCeil` rounding. This matches the CRD
  allocator's `calculateNeededIPs` semantics and is necessary to ensure
  the operator can recover the exact IP usage from the demand signal
  (requested - preAllocate) (see #45124).
* No dependency on `CiliumPodIPPool` CRDs, pools are instead populated
  by the agent from `Status.ENI.ENIs` which is maintained by the
  operator.

The agents now read CIDRs from `Status.ENI.ENIs`, allocate IPs locally,
and write aggregate demand to `Spec.IPAM.Pools.Requested`. They
no longer writes per-IP usage to `Status.IPAM.Used`, achieving a
reduction of kubernetes API pressure.

Relates to cilium/design-cfps#87

Signed-off-by: Hadrien Patte <hadrien.patte@datadoghq.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/eni Impacts ENI based IPAM. area/ipam IP address management, including cloud IPAM ready-to-merge This PR has passed all tests and received consensus from code owners to merge. release-note/misc This PR makes changes that have no direct user impact.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants