Skip to content

feat: Support IP Usage stats in VPC Prefix and Subnet#480

Open
hwadekar-nv wants to merge 6 commits intomainfrom
feat/vpc-prefix-usage
Open

feat: Support IP Usage stats in VPC Prefix and Subnet#480
hwadekar-nv wants to merge 6 commits intomainfrom
feat/vpc-prefix-usage

Conversation

@hwadekar-nv
Copy link
Copy Markdown
Contributor

@hwadekar-nv hwadekar-nv commented May 4, 2026

Description

  • Allow IP usage stats which we have currently in IPBlock in VpcPrefix and Subnet in GET/LIST
  • Unit test

Type of Change

  • Feature - New feature or functionality (feat:)
  • Fix - Bug fixes (fix:)
  • Chore - Modification or removal of existing functionality (chore:)
  • Refactor - Refactoring of existing functionality (refactor:)
  • Docs - Changes in documentation or OpenAPI schema (docs:)
  • CI - Changes in GitHub workflows. Requires additional scrutiny (ci:)
  • Version - Issuing a new release version (version:)

Services Affected

  • API - API models or endpoints updated
  • Workflow - Workflow service updated
  • DB - DB DAOs or migrations updated
  • Site Manager - Site Manager updated
  • Cert Manager - Cert Manager updated
  • Site Agent - Site Agent updated
  • RLA - RLA service updated
  • Powershelf Manager - Powershelf Manager updated
  • NVSwitch Manager - NVSwitch Manager updated

Related Issues (Optional)

Breaking Changes

  • This PR contains breaking changes

Testing

  • Unit tests added/updated
  • Integration tests added/updated
  • Manual testing performed
  • No testing required (docs, internal refactor, etc.)

Additional Notes

@hwadekar-nv hwadekar-nv requested a review from a team as a code owner May 4, 2026 19:24
@hwadekar-nv hwadekar-nv self-assigned this May 4, 2026
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 4, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Adds optional IPAM usage statistics to VPC Prefix and Subnet GET endpoints via a new boolean query parameter includeUsageStats. Handlers may load parent IPBlock/IPv4Block, call IPAM helpers to compute usage per-item or per-resource, and return results in API models and OpenAPI; tests and SDK client/models updated.

Changes

VPC Prefix & Subnet IPAM Usage Stats

Layer / File(s) Summary
Data Shape
api/pkg/api/model/vpcprefix.go, api/pkg/api/model/subnet.go
Adds UsageStats *APIIPBlockUsageStats to APIVpcPrefix and APISubnet. NewAPIVpcPrefix and NewAPISubnet signatures gain dbpu *ipam.Usage and populate UsageStats when non-nil.
IPAM Core Implementation
db/pkg/db/ipam/ipam.go
Adds exported errors ErrNilVpcPrefix, ErrNilSubnet, ErrSubnetNoIPv4Prefix; helpers getVpcPrefixCidr, getSubnetIPv4Cidr, cidrPrefixesEqual; and exported functions GetIpamUsageForVpcPrefix and GetIpamUsageForSubnet which resolve child CIDR in parent IPBlock namespace and return Usage() (with full-grant shortcut).
Handler Integration
api/pkg/api/handler/vpcprefix.go, api/pkg/api/handler/subnet.go, api/pkg/api/handler/util/common/common.go
Parses includeUsageStats via ParseIncludeUsageStats, augments include-relations to ensure parent IPBlock/IPv4Block is loaded, invokes IPAM usage helpers (per-item maps for GET-all; single call for GET), and passes usage into model.NewAPIVpcPrefix / model.NewAPISubnet. Create/Update handlers pass nil for usage.
Wiring / Error Handling
api/pkg/api/handler/vpcprefix.go, api/pkg/api/handler/subnet.go
GET-all builds per-item usage maps, logs and skips per-item IPAM errors when computing all results; single-item GET returns internal error if required relation is missing for usage computation.
OpenAPI / Client
openapi/spec.yaml, sdk/standard/api_vpc_prefix.go
Adds includeUsageStats boolean query parameter to VPC-prefix and Subnet GET endpoints and documents a read-only usageStats property on VpcPrefix and Subnet. Generated client gained IncludeUsageStats fluent methods and includes param when set.
Tests
db/pkg/db/ipam/ipam_test.go, api/pkg/api/handler/vpcprefix_test.go, api/pkg/api/handler/subnet_test.go, api/pkg/api/model/vpcprefix_test.go, api/pkg/api/model/subnet_test.go
Adds tests for IPAM usage helpers; extends handler tests to cover invalid/non-boolean and true includeUsageStats cases; adds tests asserting model mapping from *ipam.Usage to API UsageStats.

Generated SDK / Branding and Minor Client Change

Layer / File(s) Summary
Generated SDK Models
sdk/standard/model_vpc_prefix.go, sdk/standard/model_subnet.go
Generated model files updated to include usageStats in VpcPrefix and Subnet with accessors and JSON serialization.
Generated SDK Client
sdk/standard/api_vpc_prefix.go
Adds optional includeUsageStats *bool fields and fluent IncludeUsageStats(bool) methods; request executors append the query param when set.
Generated Headers / Minor Client Fix
sdk/standard/*, sdk/standard/client.go
Many autogenerated files update header comment branding (NCX → NVIDIA). client.go:addFile now closes file immediately and returns close error early; otherwise client logic unchanged.

Sequence Diagram

sequenceDiagram
    participant Client
    participant Handler as API Handler
    participant DAO as DB/DAO
    participant IPAM as IPAM Storage
    participant Model as API Model

    Client->>Handler: GET /.../vpc-prefix?includeUsageStats=true
    Handler->>Handler: ParseIncludeUsageStats -> includeUsageStats=true
    Handler->>DAO: Fetch VpcPrefix(es) (ensure IPBlock relation when requested)
    DAO-->>Handler: VpcPrefix (+ IPBlock)
    Handler->>IPAM: GetIpamUsageForVpcPrefix(ctx, ipamDB, vpcPrefix, ipBlock)
    IPAM->>IPAM: normalize CIDR, check FullGrant, resolve prefix usage
    IPAM-->>Handler: cipam.Usage
    Handler->>Model: NewAPIVpcPrefix(dbObj, statusDetails, usage)
    Model-->>Handler: APIVpcPrefix (with UsageStats)
    Handler-->>Client: 200 OK (includes usageStats)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/vpc-prefix-usage

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 4, 2026

🔐 TruffleHog Secret Scan

No secrets or credentials found!

Your code has been scanned for 700+ types of secrets and credentials. All clear! 🎉

🔗 View scan details

🕐 Last updated: 2026-05-04 19:26:40 UTC | Commit: 57bba30

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
api/pkg/api/handler/vpcprefix.go (1)

717-729: 💤 Low value

Inconsistent error handling between GetAll and Get for missing IPBlock.

In GetAllVpcPrefixHandler (lines 534-536), a missing IPBlock relation logs an error and continues, whereas here in GetVpcPrefixHandler, it returns a 500 Internal Server Error. While returning an error for a single-resource GET is defensible, the inconsistency may confuse API consumers. Consider aligning the behavior or documenting the difference.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@api/pkg/api/handler/vpcprefix.go` around lines 717 - 729, GetVpcPrefixHandler
currently returns a 500 when vpcPrefix.IPBlock is nil (and on
ipam.GetIpamUsageForVpcPrefix errors), which is inconsistent with
GetAllVpcPrefixHandler that only logs and continues; make the behavior
consistent by changing GetVpcPrefixHandler (in the block guarded by
includeUsageStats and the vpcPrefix.IPBlock check) to mirror
GetAllVpcPrefixHandler: log the missing IPBlock (using
logger.Error().Str("vpcPrefixId", vpcPrefix.ID.String()).Msg(...)), do not
return an error—set puVPC to nil or skip usage retrieval—and likewise handle
ipam.GetIpamUsageForVpcPrefix errors by logging and continuing instead of
returning a cutil.NewAPIErrorResponse; update only GetVpcPrefixHandler and keep
the same logging/messages used by GetAllVpcPrefixHandler for consistency.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@api/pkg/api/handler/vpcprefix.go`:
- Around line 717-729: GetVpcPrefixHandler currently returns a 500 when
vpcPrefix.IPBlock is nil (and on ipam.GetIpamUsageForVpcPrefix errors), which is
inconsistent with GetAllVpcPrefixHandler that only logs and continues; make the
behavior consistent by changing GetVpcPrefixHandler (in the block guarded by
includeUsageStats and the vpcPrefix.IPBlock check) to mirror
GetAllVpcPrefixHandler: log the missing IPBlock (using
logger.Error().Str("vpcPrefixId", vpcPrefix.ID.String()).Msg(...)), do not
return an error—set puVPC to nil or skip usage retrieval—and likewise handle
ipam.GetIpamUsageForVpcPrefix errors by logging and continuing instead of
returning a cutil.NewAPIErrorResponse; update only GetVpcPrefixHandler and keep
the same logging/messages used by GetAllVpcPrefixHandler for consistency.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 2378de28-261f-474e-8ce5-8f9048cb1096

📥 Commits

Reviewing files that changed from the base of the PR and between 3e51a84 and 57bba30.

📒 Files selected for processing (7)
  • api/pkg/api/handler/vpcprefix.go
  • api/pkg/api/handler/vpcprefix_test.go
  • api/pkg/api/model/vpcprefix.go
  • api/pkg/api/model/vpcprefix_test.go
  • db/pkg/db/ipam/ipam.go
  • db/pkg/db/ipam/ipam_test.go
  • openapi/spec.yaml

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 4, 2026

Test Results

6 906 tests   - 2 145   6 902 ✅  - 2 149   5m 2s ⏱️ - 2m 19s
  153 suites +    2       0 💤 ±    0 
   14 files   ±    0       0 ❌ ±    0   4 🔥 +4 

For more details on these errors, see this check.

Results for commit 2619daf. ± Comparison against base commit ba78506.

This pull request removes 2155 and adds 10 tests. Note that renamed tests count towards both.
github.com/NVIDIA/infra-controller-rest/api/internal/server ‑ Test_Audit
github.com/NVIDIA/infra-controller-rest/api/internal/server ‑ Test_BodyLimit
github.com/NVIDIA/infra-controller-rest/api/internal/server ‑ Test_InitAPIServer
github.com/NVIDIA/infra-controller-rest/api/internal/server ‑ Test_InitAPIServer/test_initAPIServer_success
github.com/NVIDIA/infra-controller-rest/api/internal/server ‑ Test_InitMetricsServer
github.com/NVIDIA/infra-controller-rest/api/internal/server ‑ Test_InitMetricsServer/test_initMetricsServer_success
github.com/NVIDIA/infra-controller-rest/api/internal/server ‑ Test_InitTemporalClients
github.com/NVIDIA/infra-controller-rest/api/internal/server ‑ Test_InitTemporalClients/test_initTemporalClient_success
github.com/NVIDIA/infra-controller-rest/api/internal/server ‑ Test_NotFoundHandler
github.com/NVIDIA/infra-controller-rest/api/pkg/api ‑ TestNewAPIRoutes
…
github.com/NVIDIA/infra-controller-rest/api/cmd/api ‑ [setup failed]
github.com/NVIDIA/infra-controller-rest/api/internal/server ‑ [setup failed]
github.com/NVIDIA/infra-controller-rest/api/pkg/api ‑ [setup failed]
github.com/NVIDIA/infra-controller-rest/api/pkg/api/handler ‑ [setup failed]
github.com/NVIDIA/infra-controller-rest/api/pkg/api/model ‑ TestNewAPIVpcPrefix_UsageStats
github.com/NVIDIA/infra-controller-rest/api/pkg/api/model ‑ TestNewAPIVpcPrefix_UsageStats/full_usage_maps_all_fields
github.com/NVIDIA/infra-controller-rest/api/pkg/api/model ‑ TestNewAPIVpcPrefix_UsageStats/non-nil_empty_usage_yields_zero-valued_UsageStats
github.com/NVIDIA/infra-controller-rest/api/pkg/api/model ‑ TestNewAPIVpcPrefix_UsageStats/partial_usage_copies_only_populated_fields
github.com/NVIDIA/infra-controller-rest/db/pkg/db/ipam ‑ TestGetIpamUsageForSubnet
github.com/NVIDIA/infra-controller-rest/db/pkg/db/ipam ‑ TestGetIpamUsageForVpcPrefix

♻️ This comment has been updated with latest results.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
sdk/standard/client.go (1)

594-607: ⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

Defer file closure until after io.Copy completes.

The addFile function closes the file descriptor at line 598–600 before invoking io.Copy(part, file) at line 607. This produces a use-after-close error on the file handle, causing multipart uploads to fail. This is a generated file; the fix must be applied at the OpenAPI Generator source and regenerated via make generate-sdk.

The suggested fix uses a deferred cleanup closure to ensure the file is kept open through the copy operation and properly closed afterward, with error chaining to preserve any close-time errors:

Suggested fix
-func addFile(w *multipart.Writer, fieldName, path string) error {
+func addFile(w *multipart.Writer, fieldName, path string) (err error) {
 	file, err := os.Open(filepath.Clean(path))
 	if err != nil {
 		return err
 	}
-	err = file.Close()
-	if err != nil {
-		return err
-	}
+	defer func() {
+		if cerr := file.Close(); err == nil && cerr != nil {
+			err = cerr
+		}
+	}()
 
 	part, err := w.CreateFormFile(fieldName, filepath.Base(path))
 	if err != nil {
 		return err
 	}
 	_, err = io.Copy(part, file)
 
 	return err
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@sdk/standard/client.go` around lines 594 - 607, In addFile, the file is
closed before io.Copy reads from it, causing a use-after-close; change the code
to open the file (os.Open(filepath.Clean(path))) and immediately defer a closure
that closes the file after io.Copy finishes, capturing any close error and
chaining it with the io.Copy error before returning; update the OpenAPI
Generator template that produces sdk/standard/client.go and regenerate the SDK
via make generate-sdk so the fix is applied to generated output.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@sdk/standard/client.go`:
- Around line 594-607: In addFile, the file is closed before io.Copy reads from
it, causing a use-after-close; change the code to open the file
(os.Open(filepath.Clean(path))) and immediately defer a closure that closes the
file after io.Copy finishes, capturing any close error and chaining it with the
io.Copy error before returning; update the OpenAPI Generator template that
produces sdk/standard/client.go and regenerate the SDK via make generate-sdk so
the fix is applied to generated output.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: e01a6e93-93bb-4a81-9d16-dfb862cdbfbc

📥 Commits

Reviewing files that changed from the base of the PR and between 57bba30 and bdadba8.

📒 Files selected for processing (229)
  • sdk/standard/api_allocation.go
  • sdk/standard/api_audit.go
  • sdk/standard/api_dpu_extension_service.go
  • sdk/standard/api_expected_machine.go
  • sdk/standard/api_expected_power_shelf.go
  • sdk/standard/api_expected_switch.go
  • sdk/standard/api_infini_band_partition.go
  • sdk/standard/api_infrastructure_provider.go
  • sdk/standard/api_instance.go
  • sdk/standard/api_instance_type.go
  • sdk/standard/api_ip_block.go
  • sdk/standard/api_machine.go
  • sdk/standard/api_metadata.go
  • sdk/standard/api_network_security_group.go
  • sdk/standard/api_nv_link_logical_partition.go
  • sdk/standard/api_operating_system.go
  • sdk/standard/api_rack.go
  • sdk/standard/api_service_account.go
  • sdk/standard/api_site.go
  • sdk/standard/api_sku.go
  • sdk/standard/api_ssh_key.go
  • sdk/standard/api_ssh_key_group.go
  • sdk/standard/api_subnet.go
  • sdk/standard/api_tenant.go
  • sdk/standard/api_tenant_account.go
  • sdk/standard/api_tray.go
  • sdk/standard/api_user.go
  • sdk/standard/api_vpc.go
  • sdk/standard/api_vpc_peering.go
  • sdk/standard/api_vpc_prefix.go
  • sdk/standard/client.go
  • sdk/standard/configuration.go
  • sdk/standard/model_allocation.go
  • sdk/standard/model_allocation_constraint.go
  • sdk/standard/model_allocation_constraint_create_request.go
  • sdk/standard/model_allocation_constraint_update_request.go
  • sdk/standard/model_allocation_create_request.go
  • sdk/standard/model_allocation_stats.go
  • sdk/standard/model_allocation_status.go
  • sdk/standard/model_allocation_update_request.go
  • sdk/standard/model_audit_entry.go
  • sdk/standard/model_batch_bring_up_rack_request.go
  • sdk/standard/model_batch_instance_create_request.go
  • sdk/standard/model_batch_rack_firmware_update_request.go
  • sdk/standard/model_batch_tray_firmware_update_request.go
  • sdk/standard/model_batch_update_rack_power_state_request.go
  • sdk/standard/model_batch_update_tray_power_state_request.go
  • sdk/standard/model_bmc_info.go
  • sdk/standard/model_bring_up_rack_request.go
  • sdk/standard/model_bring_up_rack_response.go
  • sdk/standard/model_carbide_api_error.go
  • sdk/standard/model_component_diff.go
  • sdk/standard/model_deprecation.go
  • sdk/standard/model_dpu_extension_service.go
  • sdk/standard/model_dpu_extension_service_create_request.go
  • sdk/standard/model_dpu_extension_service_credentials.go
  • sdk/standard/model_dpu_extension_service_deployment.go
  • sdk/standard/model_dpu_extension_service_deployment_request.go
  • sdk/standard/model_dpu_extension_service_deployment_status.go
  • sdk/standard/model_dpu_extension_service_observability.go
  • sdk/standard/model_dpu_extension_service_observability_config.go
  • sdk/standard/model_dpu_extension_service_observability_logging.go
  • sdk/standard/model_dpu_extension_service_observability_prometheus.go
  • sdk/standard/model_dpu_extension_service_status.go
  • sdk/standard/model_dpu_extension_service_summary.go
  • sdk/standard/model_dpu_extension_service_update_request.go
  • sdk/standard/model_dpu_extension_service_version_info.go
  • sdk/standard/model_expected_machine.go
  • sdk/standard/model_expected_machine_create_request.go
  • sdk/standard/model_expected_machine_update_request.go
  • sdk/standard/model_expected_power_shelf.go
  • sdk/standard/model_expected_power_shelf_create_request.go
  • sdk/standard/model_expected_power_shelf_update_request.go
  • sdk/standard/model_expected_switch.go
  • sdk/standard/model_expected_switch_create_request.go
  • sdk/standard/model_expected_switch_update_request.go
  • sdk/standard/model_field_diff.go
  • sdk/standard/model_firmware_update_request.go
  • sdk/standard/model_firmware_update_response.go
  • sdk/standard/model_infini_band_interface.go
  • sdk/standard/model_infini_band_interface_create_request.go
  • sdk/standard/model_infini_band_interface_status.go
  • sdk/standard/model_infini_band_partition.go
  • sdk/standard/model_infini_band_partition_create_request.go
  • sdk/standard/model_infini_band_partition_status.go
  • sdk/standard/model_infini_band_partition_update_request.go
  • sdk/standard/model_infrastructure_provider.go
  • sdk/standard/model_infrastructure_provider_stats.go
  • sdk/standard/model_instance.go
  • sdk/standard/model_instance_count_by_status.go
  • sdk/standard/model_instance_create_request.go
  • sdk/standard/model_instance_delete_request.go
  • sdk/standard/model_instance_status.go
  • sdk/standard/model_instance_type.go
  • sdk/standard/model_instance_type_allocation_stats.go
  • sdk/standard/model_instance_type_capability_create_request.go
  • sdk/standard/model_instance_type_create_request.go
  • sdk/standard/model_instance_type_stats.go
  • sdk/standard/model_instance_type_status.go
  • sdk/standard/model_instance_type_summary.go
  • sdk/standard/model_instance_type_update_request.go
  • sdk/standard/model_instance_update_request.go
  • sdk/standard/model_interface.go
  • sdk/standard/model_interface_create_request.go
  • sdk/standard/model_interface_status.go
  • sdk/standard/model_ip_block.go
  • sdk/standard/model_ip_block_count_by_status.go
  • sdk/standard/model_ip_block_create_request.go
  • sdk/standard/model_ip_block_status.go
  • sdk/standard/model_ip_block_summary.go
  • sdk/standard/model_ip_block_update_request.go
  • sdk/standard/model_ip_block_usage_stats.go
  • sdk/standard/model_machine.go
  • sdk/standard/model_machine_bmc_info.go
  • sdk/standard/model_machine_capability.go
  • sdk/standard/model_machine_count_by_status.go
  • sdk/standard/model_machine_dmi_data.go
  • sdk/standard/model_machine_gpu_info.go
  • sdk/standard/model_machine_gpu_stats.go
  • sdk/standard/model_machine_health.go
  • sdk/standard/model_machine_health_issue.go
  • sdk/standard/model_machine_health_probe_alert.go
  • sdk/standard/model_machine_health_probe_success.go
  • sdk/standard/model_machine_infini_band_interface.go
  • sdk/standard/model_machine_instance_type.go
  • sdk/standard/model_machine_instance_type_create_request.go
  • sdk/standard/model_machine_instance_type_stats.go
  • sdk/standard/model_machine_instance_type_summary.go
  • sdk/standard/model_machine_interface.go
  • sdk/standard/model_machine_metadata.go
  • sdk/standard/model_machine_network_interface.go
  • sdk/standard/model_machine_status.go
  • sdk/standard/model_machine_status_breakdown.go
  • sdk/standard/model_machine_summary.go
  • sdk/standard/model_machine_update_request.go
  • sdk/standard/model_metadata.go
  • sdk/standard/model_network_security_group.go
  • sdk/standard/model_network_security_group_create_request.go
  • sdk/standard/model_network_security_group_propagation_details.go
  • sdk/standard/model_network_security_group_propagation_status.go
  • sdk/standard/model_network_security_group_rule.go
  • sdk/standard/model_network_security_group_status.go
  • sdk/standard/model_network_security_group_update_request.go
  • sdk/standard/model_nv_link_interface.go
  • sdk/standard/model_nv_link_interface_create_request.go
  • sdk/standard/model_nv_link_interface_status.go
  • sdk/standard/model_nv_link_logical_partition.go
  • sdk/standard/model_nv_link_logical_partition_create_request.go
  • sdk/standard/model_nv_link_logical_partition_status.go
  • sdk/standard/model_nv_link_logical_partition_update_request.go
  • sdk/standard/model_operating_system.go
  • sdk/standard/model_operating_system_create_request.go
  • sdk/standard/model_operating_system_site_association.go
  • sdk/standard/model_operating_system_status.go
  • sdk/standard/model_operating_system_update_request.go
  • sdk/standard/model_rack.go
  • sdk/standard/model_rack_component.go
  • sdk/standard/model_rack_filter.go
  • sdk/standard/model_rack_location.go
  • sdk/standard/model_rack_task.go
  • sdk/standard/model_rack_validation_result.go
  • sdk/standard/model_service_account.go
  • sdk/standard/model_site.go
  • sdk/standard/model_site_capabilities.go
  • sdk/standard/model_site_contact.go
  • sdk/standard/model_site_create_request.go
  • sdk/standard/model_site_location.go
  • sdk/standard/model_site_machine_stats.go
  • sdk/standard/model_site_machine_stats_by_allocation.go
  • sdk/standard/model_site_machine_stats_by_health.go
  • sdk/standard/model_site_machine_stats_by_status.go
  • sdk/standard/model_site_machine_stats_by_status_and_health.go
  • sdk/standard/model_site_status.go
  • sdk/standard/model_site_summary.go
  • sdk/standard/model_site_update_request.go
  • sdk/standard/model_sku.go
  • sdk/standard/model_sku_chassis.go
  • sdk/standard/model_sku_components.go
  • sdk/standard/model_sku_cpu.go
  • sdk/standard/model_sku_ethernet_device.go
  • sdk/standard/model_sku_gpu.go
  • sdk/standard/model_sku_infiniband_device.go
  • sdk/standard/model_sku_memory.go
  • sdk/standard/model_sku_storage.go
  • sdk/standard/model_sku_tpm.go
  • sdk/standard/model_ssh_key.go
  • sdk/standard/model_ssh_key_create_request.go
  • sdk/standard/model_ssh_key_group.go
  • sdk/standard/model_ssh_key_group_create_request.go
  • sdk/standard/model_ssh_key_group_site_association.go
  • sdk/standard/model_ssh_key_group_site_association_status.go
  • sdk/standard/model_ssh_key_group_status.go
  • sdk/standard/model_ssh_key_group_update_request.go
  • sdk/standard/model_ssh_key_update_request.go
  • sdk/standard/model_status_detail.go
  • sdk/standard/model_subnet.go
  • sdk/standard/model_subnet_count_by_status.go
  • sdk/standard/model_subnet_create_request.go
  • sdk/standard/model_subnet_status.go
  • sdk/standard/model_subnet_update_request.go
  • sdk/standard/model_tenant.go
  • sdk/standard/model_tenant_account.go
  • sdk/standard/model_tenant_account_count_by_status.go
  • sdk/standard/model_tenant_account_create_request.go
  • sdk/standard/model_tenant_account_status.go
  • sdk/standard/model_tenant_capabilities.go
  • sdk/standard/model_tenant_instance_type_stats.go
  • sdk/standard/model_tenant_stats.go
  • sdk/standard/model_tray.go
  • sdk/standard/model_tray_filter.go
  • sdk/standard/model_tray_position.go
  • sdk/standard/model_update_power_state_request.go
  • sdk/standard/model_update_power_state_response.go
  • sdk/standard/model_user.go
  • sdk/standard/model_vpc.go
  • sdk/standard/model_vpc_count_by_status.go
  • sdk/standard/model_vpc_create_request.go
  • sdk/standard/model_vpc_peering.go
  • sdk/standard/model_vpc_peering_create_request.go
  • sdk/standard/model_vpc_peering_status.go
  • sdk/standard/model_vpc_prefix.go
  • sdk/standard/model_vpc_prefix_create_request.go
  • sdk/standard/model_vpc_prefix_status.go
  • sdk/standard/model_vpc_prefix_update_request.go
  • sdk/standard/model_vpc_status.go
  • sdk/standard/model_vpc_update_request.go
  • sdk/standard/model_vpc_virtualization_update_request.go
  • sdk/standard/response.go
  • sdk/standard/utils.go
✅ Files skipped from review due to trivial changes (227)
  • sdk/standard/model_network_security_group_rule.go
  • sdk/standard/model_allocation_create_request.go
  • sdk/standard/model_dpu_extension_service_observability_prometheus.go
  • sdk/standard/model_dpu_extension_service_deployment_status.go
  • sdk/standard/model_ip_block_status.go
  • sdk/standard/model_infini_band_interface_status.go
  • sdk/standard/model_firmware_update_request.go
  • sdk/standard/model_dpu_extension_service_status.go
  • sdk/standard/api_metadata.go
  • sdk/standard/model_ip_block_summary.go
  • sdk/standard/model_sku_ethernet_device.go
  • sdk/standard/model_sku_chassis.go
  • sdk/standard/model_instance_type_status.go
  • sdk/standard/model_site_status.go
  • sdk/standard/model_dpu_extension_service_version_info.go
  • sdk/standard/model_instance_type_create_request.go
  • sdk/standard/model_site_summary.go
  • sdk/standard/model_tenant_account_status.go
  • sdk/standard/model_batch_bring_up_rack_request.go
  • sdk/standard/model_instance_status.go
  • sdk/standard/model_ssh_key_group_site_association_status.go
  • sdk/standard/model_rack_filter.go
  • sdk/standard/model_instance_type_update_request.go
  • sdk/standard/model_machine_health_probe_alert.go
  • sdk/standard/model_ip_block_update_request.go
  • sdk/standard/model_deprecation.go
  • sdk/standard/model_vpc_status.go
  • sdk/standard/model_dpu_extension_service.go
  • sdk/standard/model_operating_system_status.go
  • sdk/standard/model_nv_link_logical_partition_update_request.go
  • sdk/standard/model_allocation_stats.go
  • sdk/standard/model_subnet_update_request.go
  • sdk/standard/model_subnet_count_by_status.go
  • sdk/standard/model_site_location.go
  • sdk/standard/model_dpu_extension_service_observability_logging.go
  • sdk/standard/model_machine_network_interface.go
  • sdk/standard/model_bring_up_rack_request.go
  • sdk/standard/model_site_machine_stats_by_health.go
  • sdk/standard/model_instance_type_allocation_stats.go
  • sdk/standard/api_operating_system.go
  • sdk/standard/model_sku_gpu.go
  • sdk/standard/model_dpu_extension_service_observability.go
  • sdk/standard/model_operating_system_site_association.go
  • sdk/standard/model_update_power_state_response.go
  • sdk/standard/model_machine_metadata.go
  • sdk/standard/model_vpc_peering_status.go
  • sdk/standard/model_machine_interface.go
  • sdk/standard/model_vpc_prefix_update_request.go
  • sdk/standard/model_rack_validation_result.go
  • sdk/standard/model_tenant.go
  • sdk/standard/api_subnet.go
  • sdk/standard/api_expected_power_shelf.go
  • sdk/standard/model_rack.go
  • sdk/standard/model_instance_type_stats.go
  • sdk/standard/model_ssh_key.go
  • sdk/standard/api_ssh_key_group.go
  • sdk/standard/model_allocation.go
  • sdk/standard/model_machine.go
  • sdk/standard/model_instance.go
  • sdk/standard/api_tenant.go
  • sdk/standard/model_instance_delete_request.go
  • sdk/standard/model_instance_type_capability_create_request.go
  • sdk/standard/model_machine_status.go
  • sdk/standard/model_allocation_constraint_create_request.go
  • sdk/standard/model_field_diff.go
  • sdk/standard/model_audit_entry.go
  • sdk/standard/model_site_machine_stats_by_status_and_health.go
  • sdk/standard/api_infrastructure_provider.go
  • sdk/standard/configuration.go
  • sdk/standard/model_tray_position.go
  • sdk/standard/api_dpu_extension_service.go
  • sdk/standard/model_ip_block.go
  • sdk/standard/model_sku_infiniband_device.go
  • sdk/standard/model_machine_bmc_info.go
  • sdk/standard/model_ssh_key_group_site_association.go
  • sdk/standard/model_machine_health_probe_success.go
  • sdk/standard/model_instance_count_by_status.go
  • sdk/standard/model_tenant_account_create_request.go
  • sdk/standard/model_infrastructure_provider.go
  • sdk/standard/model_subnet_status.go
  • sdk/standard/model_dpu_extension_service_deployment.go
  • sdk/standard/model_allocation_update_request.go
  • sdk/standard/model_dpu_extension_service_observability_config.go
  • sdk/standard/model_rack_location.go
  • sdk/standard/model_site_machine_stats_by_allocation.go
  • sdk/standard/api_expected_machine.go
  • sdk/standard/model_bring_up_rack_response.go
  • sdk/standard/model_subnet_create_request.go
  • sdk/standard/model_tray_filter.go
  • sdk/standard/model_machine_instance_type.go
  • sdk/standard/model_machine_summary.go
  • sdk/standard/model_sku_memory.go
  • sdk/standard/model_ip_block_usage_stats.go
  • sdk/standard/model_expected_machine.go
  • sdk/standard/model_instance_create_request.go
  • sdk/standard/model_allocation_constraint.go
  • sdk/standard/model_nv_link_interface_create_request.go
  • sdk/standard/model_machine_health.go
  • sdk/standard/model_ip_block_count_by_status.go
  • sdk/standard/api_ip_block.go
  • sdk/standard/model_subnet.go
  • sdk/standard/model_nv_link_interface_status.go
  • sdk/standard/model_batch_update_rack_power_state_request.go
  • sdk/standard/model_nv_link_logical_partition.go
  • sdk/standard/model_network_security_group_status.go
  • sdk/standard/model_rack_task.go
  • sdk/standard/model_site_capabilities.go
  • sdk/standard/model_site_machine_stats_by_status.go
  • sdk/standard/model_ssh_key_group_update_request.go
  • sdk/standard/model_sku_components.go
  • sdk/standard/model_tenant_capabilities.go
  • sdk/standard/model_instance_type.go
  • sdk/standard/api_site.go
  • sdk/standard/api_tenant_account.go
  • sdk/standard/model_dpu_extension_service_create_request.go
  • sdk/standard/model_firmware_update_response.go
  • sdk/standard/api_allocation.go
  • sdk/standard/model_tenant_instance_type_stats.go
  • sdk/standard/api_ssh_key.go
  • sdk/standard/model_network_security_group_create_request.go
  • sdk/standard/model_dpu_extension_service_deployment_request.go
  • sdk/standard/model_bmc_info.go
  • sdk/standard/model_dpu_extension_service_summary.go
  • sdk/standard/api_service_account.go
  • sdk/standard/model_ssh_key_group_create_request.go
  • sdk/standard/model_vpc_peering_create_request.go
  • sdk/standard/model_interface.go
  • sdk/standard/model_carbide_api_error.go
  • sdk/standard/model_expected_power_shelf.go
  • sdk/standard/model_sku.go
  • sdk/standard/response.go
  • sdk/standard/api_machine.go
  • sdk/standard/model_machine_gpu_stats.go
  • sdk/standard/api_expected_switch.go
  • sdk/standard/api_user.go
  • sdk/standard/model_vpc_prefix_create_request.go
  • sdk/standard/model_operating_system.go
  • sdk/standard/model_update_power_state_request.go
  • sdk/standard/model_infini_band_partition_status.go
  • sdk/standard/model_status_detail.go
  • sdk/standard/api_infini_band_partition.go
  • sdk/standard/model_tenant_account_count_by_status.go
  • sdk/standard/api_sku.go
  • sdk/standard/model_batch_instance_create_request.go
  • sdk/standard/model_network_security_group_propagation_status.go
  • sdk/standard/model_ssh_key_group_status.go
  • sdk/standard/model_machine_instance_type_create_request.go
  • sdk/standard/model_machine_instance_type_stats.go
  • sdk/standard/model_batch_update_tray_power_state_request.go
  • sdk/standard/model_interface_status.go
  • sdk/standard/model_network_security_group_update_request.go
  • sdk/standard/model_site_update_request.go
  • sdk/standard/model_sku_cpu.go
  • sdk/standard/model_infrastructure_provider_stats.go
  • sdk/standard/model_batch_tray_firmware_update_request.go
  • sdk/standard/model_ssh_key_update_request.go
  • sdk/standard/model_site_contact.go
  • sdk/standard/model_machine_gpu_info.go
  • sdk/standard/model_machine_health_issue.go
  • sdk/standard/model_nv_link_logical_partition_status.go
  • sdk/standard/utils.go
  • sdk/standard/model_sku_tpm.go
  • sdk/standard/api_nv_link_logical_partition.go
  • sdk/standard/api_network_security_group.go
  • sdk/standard/model_tray.go
  • sdk/standard/api_vpc.go
  • sdk/standard/model_infini_band_partition_update_request.go
  • sdk/standard/model_rack_component.go
  • sdk/standard/model_user.go
  • sdk/standard/model_ssh_key_create_request.go
  • sdk/standard/model_batch_rack_firmware_update_request.go
  • sdk/standard/api_instance.go
  • sdk/standard/model_instance_type_summary.go
  • sdk/standard/model_metadata.go
  • sdk/standard/model_machine_infini_band_interface.go
  • sdk/standard/model_expected_power_shelf_update_request.go
  • sdk/standard/model_machine_capability.go
  • sdk/standard/model_tenant_stats.go
  • sdk/standard/api_vpc_peering.go
  • sdk/standard/model_operating_system_create_request.go
  • sdk/standard/model_vpc_virtualization_update_request.go
  • sdk/standard/model_site.go
  • sdk/standard/api_instance_type.go
  • sdk/standard/model_tenant_account.go
  • sdk/standard/model_sku_storage.go
  • sdk/standard/model_expected_power_shelf_create_request.go
  • sdk/standard/model_site_create_request.go
  • sdk/standard/model_machine_dmi_data.go
  • sdk/standard/model_component_diff.go
  • sdk/standard/model_vpc_count_by_status.go
  • sdk/standard/api_audit.go
  • sdk/standard/model_infini_band_interface_create_request.go
  • sdk/standard/model_network_security_group_propagation_details.go
  • sdk/standard/model_allocation_constraint_update_request.go
  • sdk/standard/model_ssh_key_group.go
  • sdk/standard/model_ip_block_create_request.go
  • sdk/standard/model_machine_instance_type_summary.go
  • sdk/standard/model_vpc_peering.go
  • sdk/standard/model_operating_system_update_request.go
  • sdk/standard/model_vpc_prefix_status.go
  • sdk/standard/model_instance_update_request.go
  • sdk/standard/model_service_account.go
  • sdk/standard/model_expected_switch.go
  • sdk/standard/model_dpu_extension_service_credentials.go
  • sdk/standard/model_infini_band_partition.go
  • sdk/standard/model_vpc_prefix.go
  • sdk/standard/model_infini_band_interface.go
  • sdk/standard/api_tray.go
  • sdk/standard/model_expected_machine_update_request.go
  • sdk/standard/model_allocation_status.go
  • sdk/standard/model_expected_switch_update_request.go
  • sdk/standard/model_network_security_group.go
  • sdk/standard/model_expected_switch_create_request.go
  • sdk/standard/api_rack.go
  • sdk/standard/model_machine_count_by_status.go
  • sdk/standard/model_nv_link_interface.go
  • sdk/standard/model_machine_update_request.go
  • sdk/standard/model_infini_band_partition_create_request.go
  • sdk/standard/model_site_machine_stats.go
  • sdk/standard/model_machine_status_breakdown.go
  • sdk/standard/model_nv_link_logical_partition_create_request.go
  • sdk/standard/model_vpc_update_request.go
  • sdk/standard/model_vpc.go
  • sdk/standard/model_expected_machine_create_request.go
  • sdk/standard/model_interface_create_request.go
  • sdk/standard/model_dpu_extension_service_update_request.go
  • sdk/standard/model_vpc_create_request.go

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 4, 2026

🔍 Container Scan Summary

Service Total Critical High Medium Low Other
nico-nsm 66 4 20 33 9 0
nico-psm 58 6 29 13 2 8
nico-rest-api 60 6 31 13 2 8
nico-rest-cert-manager 54 4 28 13 1 8
nico-rest-db 58 6 29 13 2 8
nico-rest-site-agent 55 5 28 13 1 8
nico-rest-site-manager 54 4 28 13 1 8
nico-rest-workflow 59 6 30 13 2 8
nico-rla 57 6 28 13 2 8
TOTAL 521 47 251 137 22 64

Per-CVE detail lives in the per-service grype-* artifacts (JSON + SARIF). Severity counts only — no CVE IDs published here.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (3)
openapi/spec.yaml (1)

2914-2920: ⚡ Quick win

Consolidate includeUsageStats into a reusable OpenAPI parameter component.

The same parameter is repeated in four operations. Defining it once under components/parameters and referencing it avoids drift and keeps descriptions synchronized.

Proposed refactor
+# components:
+#   parameters:
+#     IncludeUsageStats:
+#       schema:
+#         type: boolean
+#       in: query
+#       name: includeUsageStats
+#       description: >-
+#         When true, includes IPAM usage statistics (`usageStats`).

-        - schema:
-            type: boolean
-          in: query
-          name: includeUsageStats
-          description: >-
-            ...
+        - $ref: '#/components/parameters/IncludeUsageStats'

Also applies to: 3019-3025, 3161-3167, 3330-3336

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@openapi/spec.yaml` around lines 2914 - 2920, Extract the repeated query
parameter "includeUsageStats" into a single reusable OpenAPI parameter component
under components.parameters (e.g., components.parameters.includeUsageStats) with
the current schema/type, name, in, and description, then replace each inline
parameter occurrence (the ones using name: includeUsageStats and type: boolean
in query across the operations) with a $ref to that new component; ensure all
four occurrences (and any others at lines noted) now reference
components.parameters.includeUsageStats so the description stays synchronized.
api/pkg/api/handler/subnet_test.go (1)

1247-1265: ⚡ Quick win

Extend coverage to GetAll includeUsageStats paths as well.

Great addition for Get. Please mirror this for TestSubnetHandler_GetAll (invalid boolean -> 400, includeUsageStats=true -> 200 with non-nil usageStats) since the list handler now has equivalent logic.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@api/pkg/api/handler/subnet_test.go` around lines 1247 - 1265, Add equivalent
test cases to TestSubnetHandler_GetAll to cover the includeUsageStats query
paths: insert a case where queryIncludeUsageStats is set to
cdb.GetStrPtr("not-a-bool") expecting expectedErr true and expectedStatus
http.StatusBadRequest, and a case where queryIncludeUsageStats is
cdb.GetStrPtr("true") expecting expectedErr false, expectedStatus http.StatusOK
and expectUsageStatsNonNil true; ensure these cases follow the same test
structure and assertions used in TestSubnetHandler_Get (look for the
queryIncludeUsageStats and expectUsageStatsNonNil fields) so the list handler's
includeUsageStats parsing and returned usageStats are validated.
api/pkg/api/model/subnet_test.go (1)

257-257: ⚡ Quick win

Add a positive-path model test for UsageStats mapping.

The signature update is covered, but the new non-nil dbpu behavior is not directly asserted. Please add a case that passes a populated usage and verifies all mapped fields on APISubnet.UsageStats.

🧪 Suggested test shape
+ t.Run("maps usage stats when provided", func(t *testing.T) {
+   usage := &ipam.Usage{
+     AvailableIPs: 10, AcquiredIPs: 2,
+     AvailablePrefixes: 3, AcquiredPrefixes: 1,
+     AvailableSmallestPrefixes: 8,
+   }
+   got := NewAPISubnet(dbObj, dbsds, usage)
+   require.NotNil(t, got.UsageStats)
+   assert.Equal(t, usage.AvailableIPs, got.UsageStats.AvailableIPs)
+   assert.Equal(t, usage.AcquiredIPs, got.UsageStats.AcquiredIPs)
+   assert.Equal(t, usage.AvailablePrefixes, got.UsageStats.AvailablePrefixes)
+   assert.Equal(t, usage.AcquiredPrefixes, got.UsageStats.AcquiredPrefixes)
+   assert.Equal(t, usage.AvailableSmallestPrefixes, got.UsageStats.AvailableSmallestPrefixes)
+ })
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@api/pkg/api/model/subnet_test.go` at line 257, Add a positive-path unit test
that calls NewAPISubnet with a non-nil populated usage object (the db-side usage
struct passed as the third argument, often named dbpu) and assert that
APISubnet.UsageStats is non-nil and all fields are mapped correctly;
specifically create a test case in subnet_test.go that constructs a dbObj and
sdObj plus a populated usage (with values for bytes_in, bytes_out, packets_in,
packets_out, last_updated, etc.), call NewAPISubnet(tc.dbObj, tc.sdObj, dbpu)
and then verify each corresponding field on the resulting APISubnet.UsageStats
matches the input usage values to cover the new non-nil dbpu behavior for
NewAPISubnet and ensure APISubnet.UsageStats mapping is fully asserted.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@api/pkg/api/handler/subnet.go`:
- Around line 597-613: When includeUsageStats is true, don't silently skip
subnets on errors; instead fail-fast and return the error so the client doesn't
get misleading partial stats. In the loop that builds puSubnetMap (referencing
puSubnetMap, includeUsageStats, ipam.NewIpamStorage, ipam.GetIpamUsageForSubnet
and logger), replace the current logger.Error() + continue behavior: if
sn.IPv4Block is nil or ipam.GetIpamUsageForSubnet returns an error (serr),
return/propagate a proper handler error response (with serr included) rather
than continuing, matching the failure behavior used in the Get handler.

In `@db/pkg/db/ipam/ipam.go`:
- Around line 94-104: cidrPrefixesEqual currently compares parsed prefixes
directly which can differ when host bits are present (e.g., "192.168.0.1/24" vs
"192.168.0.0/24"); change cidrPrefixesEqual to normalize both parsed prefixes to
their network (mask out host bits) before comparing: parse a and b with
netip.ParsePrefix, compute the canonical network address for each prefix by
applying the prefix length mask to the address (i.e., produce a Prefix whose
address is the masked/network address and the same bit length), then compare
those normalized prefixes (pa_normalized == pb_normalized) and return that
result; keep using the existing function name cidrPrefixesEqual and variables
pa/pb to locate the code.

---

Nitpick comments:
In `@api/pkg/api/handler/subnet_test.go`:
- Around line 1247-1265: Add equivalent test cases to TestSubnetHandler_GetAll
to cover the includeUsageStats query paths: insert a case where
queryIncludeUsageStats is set to cdb.GetStrPtr("not-a-bool") expecting
expectedErr true and expectedStatus http.StatusBadRequest, and a case where
queryIncludeUsageStats is cdb.GetStrPtr("true") expecting expectedErr false,
expectedStatus http.StatusOK and expectUsageStatsNonNil true; ensure these cases
follow the same test structure and assertions used in TestSubnetHandler_Get
(look for the queryIncludeUsageStats and expectUsageStatsNonNil fields) so the
list handler's includeUsageStats parsing and returned usageStats are validated.

In `@api/pkg/api/model/subnet_test.go`:
- Line 257: Add a positive-path unit test that calls NewAPISubnet with a non-nil
populated usage object (the db-side usage struct passed as the third argument,
often named dbpu) and assert that APISubnet.UsageStats is non-nil and all fields
are mapped correctly; specifically create a test case in subnet_test.go that
constructs a dbObj and sdObj plus a populated usage (with values for bytes_in,
bytes_out, packets_in, packets_out, last_updated, etc.), call
NewAPISubnet(tc.dbObj, tc.sdObj, dbpu) and then verify each corresponding field
on the resulting APISubnet.UsageStats matches the input usage values to cover
the new non-nil dbpu behavior for NewAPISubnet and ensure APISubnet.UsageStats
mapping is fully asserted.

In `@openapi/spec.yaml`:
- Around line 2914-2920: Extract the repeated query parameter
"includeUsageStats" into a single reusable OpenAPI parameter component under
components.parameters (e.g., components.parameters.includeUsageStats) with the
current schema/type, name, in, and description, then replace each inline
parameter occurrence (the ones using name: includeUsageStats and type: boolean
in query across the operations) with a $ref to that new component; ensure all
four occurrences (and any others at lines noted) now reference
components.parameters.includeUsageStats so the description stays synchronized.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 40202580-bebf-4639-a67f-f92236edcfaf

📥 Commits

Reviewing files that changed from the base of the PR and between bdadba8 and f8d04ce.

📒 Files selected for processing (7)
  • api/pkg/api/handler/subnet.go
  • api/pkg/api/handler/subnet_test.go
  • api/pkg/api/model/subnet.go
  • api/pkg/api/model/subnet_test.go
  • db/pkg/db/ipam/ipam.go
  • db/pkg/db/ipam/ipam_test.go
  • openapi/spec.yaml
🚧 Files skipped from review as they are similar to previous changes (1)
  • db/pkg/db/ipam/ipam_test.go

Comment thread api/pkg/api/handler/subnet.go
Comment thread db/pkg/db/ipam/ipam.go
@hwadekar-nv hwadekar-nv force-pushed the feat/vpc-prefix-usage branch from b3530ac to 4f52092 Compare May 4, 2026 21:10
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (1)
api/pkg/api/handler/subnet.go (1)

586-599: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Fail request instead of returning silent partial usageStats in GetAll.

When includeUsageStats=true, continuing after usage-resolution failures can return 200 OK with incomplete stats. This is inconsistent with the Get handler’s fail-fast behavior and can mislead clients.

Proposed fix
 	puSubnetMap := map[uuid.UUID]*cip.Usage{}
 	if includeUsageStats {
 		ipamStorage := ipam.NewIpamStorage(gash.dbSession.DB, nil)
 		for i := range subnets {
 			sn := &subnets[i]
 			if sn.IPv4Block == nil {
 				logger.Error().Str("subnetId", sn.ID.String()).Msg("Subnet missing IPv4 Block relation for usage stats")
-				continue
+				return cutil.NewAPIErrorResponse(c, http.StatusInternalServerError, "Failed to retrieve Usage Stats for Subnet", nil)
 			}
 			prefixUsage, serr := ipam.GetIpamUsageForSubnet(ctx, ipamStorage, sn, sn.IPv4Block)
 			if serr != nil {
 				logger.Error().Err(serr).Str("subnetId", sn.ID.String()).Msg("error retrieving ipam usage stats for Subnet")
-				continue
+				return cutil.NewAPIErrorResponse(c, http.StatusInternalServerError, "Failed to retrieve Usage Stats for Subnet", nil)
 			}
 			puSubnetMap[sn.ID] = prefixUsage
 		}
 	}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@api/pkg/api/handler/subnet.go` around lines 586 - 599, The current loop in
subnet.go that builds puSubnetMap when includeUsageStats is true (using
ipam.NewIpamStorage and ipam.GetIpamUsageForSubnet) silently logs errors and
continues, producing partial usageStats; change this to fail-fast: when
ipam.GetIpamUsageForSubnet returns an error (serr) or sn.IPv4Block is nil, stop
processing and return an HTTP error response (propagate/translate serr into the
handler's error return path) instead of continuing, ensuring the GetAll handler
returns a non-200 error consistently like the Get handler does.
🧹 Nitpick comments (3)
openapi/spec.yaml (2)

13351-13356: ⚡ Quick win

Document omission semantics for usageStats when not requested.

The description states presence when includeUsageStats=true; please also state that the field is omitted when false/absent to avoid null-vs-missing ambiguity in generated SDK clients.

As per coding guidelines: "Review the OpenAPI specification, check for consistency and correctness, check for misspellings and grammatical errors."

Also applies to: 13527-13532

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@openapi/spec.yaml` around lines 13351 - 13356, Update the OpenAPI description
for the usageStats property (schema reference IpBlockUsageStats) to explicitly
state that the field is only present when the query parameter
includeUsageStats=true and is omitted (not returned as null) when
includeUsageStats is false or absent; apply the same clarification to the other
occurrence of usageStats in the spec so generated SDKs won’t confuse missing vs
null values.

2914-2920: ⚡ Quick win

Centralize includeUsageStats as a reusable OpenAPI parameter.

The same parameter block is duplicated in four operations. Moving it to components/parameters and referencing it via $ref will reduce drift risk and keep docs consistent as behavior evolves.

As per coding guidelines: "Review the OpenAPI specification, check for consistency and correctness, check for misspellings and grammatical errors."

Also applies to: 3019-3025, 3161-3167, 3330-3336

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@openapi/spec.yaml` around lines 2914 - 2920, Create a single reusable OpenAPI
parameter named includeUsageStats under components.parameters with the same
schema/in, name and description as the duplicated blocks, then replace each
duplicated inline parameter in the four operations (the blocks currently
declaring includeUsageStats) with a $ref to that component (e.g., $ref:
'#/components/parameters/includeUsageStats'); ensure the component uses type:
boolean and retains the exact description text and update all occurrences that
match the duplicates noted so they all reference the single component.
db/pkg/db/ipam/ipam_test.go (1)

900-903: ⚡ Quick win

Add explicit nil-parent (ipBlock) error-path coverage in both new tests.

Both helper functions guard ipBlock == nil, but these new tests do not assert ErrNilIPBlock. Adding that case will close the boundary-condition coverage for the feature path.

Suggested patch
@@
 	uNil, err := GetIpamUsageForVpcPrefix(ctx, ipamDB, nil, parent)
 	assert.Nil(t, uNil)
 	assert.ErrorIs(t, err, ErrNilVpcPrefix)
+
+	uNilParent, err := GetIpamUsageForVpcPrefix(ctx, ipamDB, vpFullCidr, nil)
+	assert.Nil(t, uNilParent)
+	assert.ErrorIs(t, err, ErrNilIPBlock)
@@
 	uNil, err := GetIpamUsageForSubnet(ctx, ipamDB, nil, parent)
 	assert.Nil(t, uNil)
 	assert.ErrorIs(t, err, ErrNilSubnet)
+
+	uNilParent, err := GetIpamUsageForSubnet(ctx, ipamDB, subFullCidr, nil)
+	assert.Nil(t, uNilParent)
+	assert.ErrorIs(t, err, ErrNilIPBlock)

Also applies to: 990-993

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@db/pkg/db/ipam/ipam_test.go` around lines 900 - 903, The test currently calls
GetIpamUsageForVpcPrefix and only checks for ErrNilVpcPrefix; add explicit
assertions for the nil ipBlock error path by invoking the same helper with a nil
ipBlock (ipBlock == nil) and asserting the returned error is ErrNilIPBlock and
the result is nil; update both test cases covering lines around the
GetIpamUsageForVpcPrefix calls (and the analogous calls around lines 990-993) to
include assert.Nil(t, result) and assert.ErrorIs(t, err, ErrNilIPBlock) so the
nil-parent (ipBlock) branch in GetIpamUsageForVpcPrefix is covered.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@db/pkg/db/ipam/ipam_test.go`:
- Around line 909-912: The test currently compares only AcquiredIPs between
usages for full CIDR and bare-network inputs (u1 and u2 from
GetIpamUsageForVpcPrefix); add assertions to also compare AcquiredPrefixes (and
optionally AvailableSmallestPrefixes) to ensure prefix-level parity: after the
existing assert.Equal(t, u1.AcquiredIPs, u2.AcquiredIPs) add assertions like
assert.Equal(t, u1.AcquiredPrefixes, u2.AcquiredPrefixes) and assert.Equal(t,
u1.AvailableSmallestPrefixes, u2.AvailableSmallestPrefixes) for the same u1/u2
pairs (repeat the same additions for the second occurrence around lines
1003–1005).

---

Duplicate comments:
In `@api/pkg/api/handler/subnet.go`:
- Around line 586-599: The current loop in subnet.go that builds puSubnetMap
when includeUsageStats is true (using ipam.NewIpamStorage and
ipam.GetIpamUsageForSubnet) silently logs errors and continues, producing
partial usageStats; change this to fail-fast: when ipam.GetIpamUsageForSubnet
returns an error (serr) or sn.IPv4Block is nil, stop processing and return an
HTTP error response (propagate/translate serr into the handler's error return
path) instead of continuing, ensuring the GetAll handler returns a non-200 error
consistently like the Get handler does.

---

Nitpick comments:
In `@db/pkg/db/ipam/ipam_test.go`:
- Around line 900-903: The test currently calls GetIpamUsageForVpcPrefix and
only checks for ErrNilVpcPrefix; add explicit assertions for the nil ipBlock
error path by invoking the same helper with a nil ipBlock (ipBlock == nil) and
asserting the returned error is ErrNilIPBlock and the result is nil; update both
test cases covering lines around the GetIpamUsageForVpcPrefix calls (and the
analogous calls around lines 990-993) to include assert.Nil(t, result) and
assert.ErrorIs(t, err, ErrNilIPBlock) so the nil-parent (ipBlock) branch in
GetIpamUsageForVpcPrefix is covered.

In `@openapi/spec.yaml`:
- Around line 13351-13356: Update the OpenAPI description for the usageStats
property (schema reference IpBlockUsageStats) to explicitly state that the field
is only present when the query parameter includeUsageStats=true and is omitted
(not returned as null) when includeUsageStats is false or absent; apply the same
clarification to the other occurrence of usageStats in the spec so generated
SDKs won’t confuse missing vs null values.
- Around line 2914-2920: Create a single reusable OpenAPI parameter named
includeUsageStats under components.parameters with the same schema/in, name and
description as the duplicated blocks, then replace each duplicated inline
parameter in the four operations (the blocks currently declaring
includeUsageStats) with a $ref to that component (e.g., $ref:
'#/components/parameters/includeUsageStats'); ensure the component uses type:
boolean and retains the exact description text and update all occurrences that
match the duplicates noted so they all reference the single component.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 39392bea-728e-4da3-a957-8c3e6f390838

📥 Commits

Reviewing files that changed from the base of the PR and between f8d04ce and 4f52092.

📒 Files selected for processing (241)
  • api/pkg/api/handler/subnet.go
  • api/pkg/api/handler/subnet_test.go
  • api/pkg/api/handler/util/common/common.go
  • api/pkg/api/handler/vpcprefix.go
  • api/pkg/api/handler/vpcprefix_test.go
  • api/pkg/api/model/subnet.go
  • api/pkg/api/model/subnet_test.go
  • api/pkg/api/model/vpcprefix.go
  • api/pkg/api/model/vpcprefix_test.go
  • db/pkg/db/ipam/ipam.go
  • db/pkg/db/ipam/ipam_test.go
  • openapi/spec.yaml
  • sdk/standard/api_allocation.go
  • sdk/standard/api_audit.go
  • sdk/standard/api_dpu_extension_service.go
  • sdk/standard/api_expected_machine.go
  • sdk/standard/api_expected_power_shelf.go
  • sdk/standard/api_expected_switch.go
  • sdk/standard/api_infini_band_partition.go
  • sdk/standard/api_infrastructure_provider.go
  • sdk/standard/api_instance.go
  • sdk/standard/api_instance_type.go
  • sdk/standard/api_ip_block.go
  • sdk/standard/api_machine.go
  • sdk/standard/api_metadata.go
  • sdk/standard/api_network_security_group.go
  • sdk/standard/api_nv_link_logical_partition.go
  • sdk/standard/api_operating_system.go
  • sdk/standard/api_rack.go
  • sdk/standard/api_service_account.go
  • sdk/standard/api_site.go
  • sdk/standard/api_sku.go
  • sdk/standard/api_ssh_key.go
  • sdk/standard/api_ssh_key_group.go
  • sdk/standard/api_subnet.go
  • sdk/standard/api_tenant.go
  • sdk/standard/api_tenant_account.go
  • sdk/standard/api_tray.go
  • sdk/standard/api_user.go
  • sdk/standard/api_vpc.go
  • sdk/standard/api_vpc_peering.go
  • sdk/standard/api_vpc_prefix.go
  • sdk/standard/client.go
  • sdk/standard/configuration.go
  • sdk/standard/model_allocation.go
  • sdk/standard/model_allocation_constraint.go
  • sdk/standard/model_allocation_constraint_create_request.go
  • sdk/standard/model_allocation_constraint_update_request.go
  • sdk/standard/model_allocation_create_request.go
  • sdk/standard/model_allocation_stats.go
  • sdk/standard/model_allocation_status.go
  • sdk/standard/model_allocation_update_request.go
  • sdk/standard/model_audit_entry.go
  • sdk/standard/model_batch_bring_up_rack_request.go
  • sdk/standard/model_batch_instance_create_request.go
  • sdk/standard/model_batch_rack_firmware_update_request.go
  • sdk/standard/model_batch_tray_firmware_update_request.go
  • sdk/standard/model_batch_update_rack_power_state_request.go
  • sdk/standard/model_batch_update_tray_power_state_request.go
  • sdk/standard/model_bmc_info.go
  • sdk/standard/model_bring_up_rack_request.go
  • sdk/standard/model_bring_up_rack_response.go
  • sdk/standard/model_carbide_api_error.go
  • sdk/standard/model_component_diff.go
  • sdk/standard/model_deprecation.go
  • sdk/standard/model_dpu_extension_service.go
  • sdk/standard/model_dpu_extension_service_create_request.go
  • sdk/standard/model_dpu_extension_service_credentials.go
  • sdk/standard/model_dpu_extension_service_deployment.go
  • sdk/standard/model_dpu_extension_service_deployment_request.go
  • sdk/standard/model_dpu_extension_service_deployment_status.go
  • sdk/standard/model_dpu_extension_service_observability.go
  • sdk/standard/model_dpu_extension_service_observability_config.go
  • sdk/standard/model_dpu_extension_service_observability_logging.go
  • sdk/standard/model_dpu_extension_service_observability_prometheus.go
  • sdk/standard/model_dpu_extension_service_status.go
  • sdk/standard/model_dpu_extension_service_summary.go
  • sdk/standard/model_dpu_extension_service_update_request.go
  • sdk/standard/model_dpu_extension_service_version_info.go
  • sdk/standard/model_expected_machine.go
  • sdk/standard/model_expected_machine_create_request.go
  • sdk/standard/model_expected_machine_update_request.go
  • sdk/standard/model_expected_power_shelf.go
  • sdk/standard/model_expected_power_shelf_create_request.go
  • sdk/standard/model_expected_power_shelf_update_request.go
  • sdk/standard/model_expected_switch.go
  • sdk/standard/model_expected_switch_create_request.go
  • sdk/standard/model_expected_switch_update_request.go
  • sdk/standard/model_field_diff.go
  • sdk/standard/model_firmware_update_request.go
  • sdk/standard/model_firmware_update_response.go
  • sdk/standard/model_infini_band_interface.go
  • sdk/standard/model_infini_band_interface_create_request.go
  • sdk/standard/model_infini_band_interface_status.go
  • sdk/standard/model_infini_band_partition.go
  • sdk/standard/model_infini_band_partition_create_request.go
  • sdk/standard/model_infini_band_partition_status.go
  • sdk/standard/model_infini_band_partition_update_request.go
  • sdk/standard/model_infrastructure_provider.go
  • sdk/standard/model_infrastructure_provider_stats.go
  • sdk/standard/model_instance.go
  • sdk/standard/model_instance_count_by_status.go
  • sdk/standard/model_instance_create_request.go
  • sdk/standard/model_instance_delete_request.go
  • sdk/standard/model_instance_status.go
  • sdk/standard/model_instance_type.go
  • sdk/standard/model_instance_type_allocation_stats.go
  • sdk/standard/model_instance_type_capability_create_request.go
  • sdk/standard/model_instance_type_create_request.go
  • sdk/standard/model_instance_type_stats.go
  • sdk/standard/model_instance_type_status.go
  • sdk/standard/model_instance_type_summary.go
  • sdk/standard/model_instance_type_update_request.go
  • sdk/standard/model_instance_update_request.go
  • sdk/standard/model_interface.go
  • sdk/standard/model_interface_create_request.go
  • sdk/standard/model_interface_status.go
  • sdk/standard/model_ip_block.go
  • sdk/standard/model_ip_block_count_by_status.go
  • sdk/standard/model_ip_block_create_request.go
  • sdk/standard/model_ip_block_status.go
  • sdk/standard/model_ip_block_summary.go
  • sdk/standard/model_ip_block_update_request.go
  • sdk/standard/model_ip_block_usage_stats.go
  • sdk/standard/model_machine.go
  • sdk/standard/model_machine_bmc_info.go
  • sdk/standard/model_machine_capability.go
  • sdk/standard/model_machine_count_by_status.go
  • sdk/standard/model_machine_dmi_data.go
  • sdk/standard/model_machine_gpu_info.go
  • sdk/standard/model_machine_gpu_stats.go
  • sdk/standard/model_machine_health.go
  • sdk/standard/model_machine_health_issue.go
  • sdk/standard/model_machine_health_probe_alert.go
  • sdk/standard/model_machine_health_probe_success.go
  • sdk/standard/model_machine_infini_band_interface.go
  • sdk/standard/model_machine_instance_type.go
  • sdk/standard/model_machine_instance_type_create_request.go
  • sdk/standard/model_machine_instance_type_stats.go
  • sdk/standard/model_machine_instance_type_summary.go
  • sdk/standard/model_machine_interface.go
  • sdk/standard/model_machine_metadata.go
  • sdk/standard/model_machine_network_interface.go
  • sdk/standard/model_machine_status.go
  • sdk/standard/model_machine_status_breakdown.go
  • sdk/standard/model_machine_summary.go
  • sdk/standard/model_machine_update_request.go
  • sdk/standard/model_metadata.go
  • sdk/standard/model_network_security_group.go
  • sdk/standard/model_network_security_group_create_request.go
  • sdk/standard/model_network_security_group_propagation_details.go
  • sdk/standard/model_network_security_group_propagation_status.go
  • sdk/standard/model_network_security_group_rule.go
  • sdk/standard/model_network_security_group_status.go
  • sdk/standard/model_network_security_group_update_request.go
  • sdk/standard/model_nv_link_interface.go
  • sdk/standard/model_nv_link_interface_create_request.go
  • sdk/standard/model_nv_link_interface_status.go
  • sdk/standard/model_nv_link_logical_partition.go
  • sdk/standard/model_nv_link_logical_partition_create_request.go
  • sdk/standard/model_nv_link_logical_partition_status.go
  • sdk/standard/model_nv_link_logical_partition_update_request.go
  • sdk/standard/model_operating_system.go
  • sdk/standard/model_operating_system_create_request.go
  • sdk/standard/model_operating_system_site_association.go
  • sdk/standard/model_operating_system_status.go
  • sdk/standard/model_operating_system_update_request.go
  • sdk/standard/model_rack.go
  • sdk/standard/model_rack_component.go
  • sdk/standard/model_rack_filter.go
  • sdk/standard/model_rack_location.go
  • sdk/standard/model_rack_task.go
  • sdk/standard/model_rack_validation_result.go
  • sdk/standard/model_service_account.go
  • sdk/standard/model_site.go
  • sdk/standard/model_site_capabilities.go
  • sdk/standard/model_site_contact.go
  • sdk/standard/model_site_create_request.go
  • sdk/standard/model_site_location.go
  • sdk/standard/model_site_machine_stats.go
  • sdk/standard/model_site_machine_stats_by_allocation.go
  • sdk/standard/model_site_machine_stats_by_health.go
  • sdk/standard/model_site_machine_stats_by_status.go
  • sdk/standard/model_site_machine_stats_by_status_and_health.go
  • sdk/standard/model_site_status.go
  • sdk/standard/model_site_summary.go
  • sdk/standard/model_site_update_request.go
  • sdk/standard/model_sku.go
  • sdk/standard/model_sku_chassis.go
  • sdk/standard/model_sku_components.go
  • sdk/standard/model_sku_cpu.go
  • sdk/standard/model_sku_ethernet_device.go
  • sdk/standard/model_sku_gpu.go
  • sdk/standard/model_sku_infiniband_device.go
  • sdk/standard/model_sku_memory.go
  • sdk/standard/model_sku_storage.go
  • sdk/standard/model_sku_tpm.go
  • sdk/standard/model_ssh_key.go
  • sdk/standard/model_ssh_key_create_request.go
  • sdk/standard/model_ssh_key_group.go
  • sdk/standard/model_ssh_key_group_create_request.go
  • sdk/standard/model_ssh_key_group_site_association.go
  • sdk/standard/model_ssh_key_group_site_association_status.go
  • sdk/standard/model_ssh_key_group_status.go
  • sdk/standard/model_ssh_key_group_update_request.go
  • sdk/standard/model_ssh_key_update_request.go
  • sdk/standard/model_status_detail.go
  • sdk/standard/model_subnet.go
  • sdk/standard/model_subnet_count_by_status.go
  • sdk/standard/model_subnet_create_request.go
  • sdk/standard/model_subnet_status.go
  • sdk/standard/model_subnet_update_request.go
  • sdk/standard/model_tenant.go
  • sdk/standard/model_tenant_account.go
  • sdk/standard/model_tenant_account_count_by_status.go
  • sdk/standard/model_tenant_account_create_request.go
  • sdk/standard/model_tenant_account_status.go
  • sdk/standard/model_tenant_capabilities.go
  • sdk/standard/model_tenant_instance_type_stats.go
  • sdk/standard/model_tenant_stats.go
  • sdk/standard/model_tray.go
  • sdk/standard/model_tray_filter.go
  • sdk/standard/model_tray_position.go
  • sdk/standard/model_update_power_state_request.go
  • sdk/standard/model_update_power_state_response.go
  • sdk/standard/model_user.go
  • sdk/standard/model_vpc.go
  • sdk/standard/model_vpc_count_by_status.go
  • sdk/standard/model_vpc_create_request.go
  • sdk/standard/model_vpc_peering.go
  • sdk/standard/model_vpc_peering_create_request.go
  • sdk/standard/model_vpc_peering_status.go
  • sdk/standard/model_vpc_prefix.go
  • sdk/standard/model_vpc_prefix_create_request.go
  • sdk/standard/model_vpc_prefix_status.go
  • sdk/standard/model_vpc_prefix_update_request.go
  • sdk/standard/model_vpc_status.go
  • sdk/standard/model_vpc_update_request.go
  • sdk/standard/model_vpc_virtualization_update_request.go
  • sdk/standard/response.go
  • sdk/standard/utils.go
✅ Files skipped from review due to trivial changes (223)
  • sdk/standard/model_dpu_extension_service_create_request.go
  • sdk/standard/model_machine_capability.go
  • sdk/standard/model_allocation_stats.go
  • sdk/standard/model_interface_status.go
  • sdk/standard/model_ip_block_count_by_status.go
  • sdk/standard/model_infrastructure_provider_stats.go
  • sdk/standard/model_operating_system_site_association.go
  • sdk/standard/model_allocation.go
  • sdk/standard/configuration.go
  • sdk/standard/model_ssh_key_group.go
  • sdk/standard/model_sku.go
  • sdk/standard/model_site_machine_stats_by_status.go
  • sdk/standard/model_dpu_extension_service_deployment_status.go
  • sdk/standard/model_allocation_constraint_update_request.go
  • sdk/standard/model_sku_storage.go
  • sdk/standard/model_machine_bmc_info.go
  • sdk/standard/model_batch_rack_firmware_update_request.go
  • sdk/standard/model_site_contact.go
  • sdk/standard/api_metadata.go
  • sdk/standard/api_expected_switch.go
  • sdk/standard/model_network_security_group_propagation_status.go
  • sdk/standard/model_firmware_update_response.go
  • sdk/standard/model_nv_link_logical_partition_create_request.go
  • sdk/standard/model_audit_entry.go
  • sdk/standard/model_ssh_key_group_create_request.go
  • sdk/standard/model_ssh_key_group_site_association_status.go
  • sdk/standard/model_infini_band_partition_status.go
  • sdk/standard/model_vpc_count_by_status.go
  • sdk/standard/model_vpc_prefix_update_request.go
  • sdk/standard/model_machine_instance_type.go
  • sdk/standard/model_ssh_key_group_status.go
  • sdk/standard/model_tenant_account_status.go
  • sdk/standard/model_tenant_capabilities.go
  • sdk/standard/model_vpc_peering_create_request.go
  • sdk/standard/model_vpc_prefix_status.go
  • sdk/standard/model_machine_count_by_status.go
  • sdk/standard/model_user.go
  • sdk/standard/model_machine_dmi_data.go
  • sdk/standard/model_nv_link_interface.go
  • sdk/standard/model_allocation_status.go
  • sdk/standard/model_dpu_extension_service_update_request.go
  • sdk/standard/model_dpu_extension_service_credentials.go
  • sdk/standard/api_nv_link_logical_partition.go
  • sdk/standard/model_instance_type_stats.go
  • sdk/standard/model_allocation_constraint.go
  • sdk/standard/model_allocation_constraint_create_request.go
  • sdk/standard/model_ip_block_summary.go
  • sdk/standard/model_tray.go
  • sdk/standard/model_sku_components.go
  • sdk/standard/model_sku_ethernet_device.go
  • sdk/standard/model_nv_link_interface_create_request.go
  • sdk/standard/model_machine_status_breakdown.go
  • sdk/standard/model_dpu_extension_service.go
  • sdk/standard/model_dpu_extension_service_observability.go
  • sdk/standard/model_dpu_extension_service_deployment_request.go
  • sdk/standard/model_infrastructure_provider.go
  • sdk/standard/model_ip_block.go
  • sdk/standard/model_machine_instance_type_create_request.go
  • sdk/standard/model_dpu_extension_service_observability_config.go
  • sdk/standard/model_vpc_virtualization_update_request.go
  • sdk/standard/model_machine_metadata.go
  • sdk/standard/model_infini_band_interface.go
  • sdk/standard/model_tray_position.go
  • sdk/standard/model_instance_type_status.go
  • sdk/standard/model_batch_update_tray_power_state_request.go
  • sdk/standard/model_sku_cpu.go
  • sdk/standard/api_ssh_key.go
  • sdk/standard/model_expected_machine_create_request.go
  • sdk/standard/model_field_diff.go
  • sdk/standard/model_dpu_extension_service_version_info.go
  • sdk/standard/model_instance_count_by_status.go
  • sdk/standard/model_site_summary.go
  • sdk/standard/model_ssh_key_group_update_request.go
  • sdk/standard/model_sku_memory.go
  • sdk/standard/model_ssh_key_update_request.go
  • sdk/standard/model_instance_type_allocation_stats.go
  • sdk/standard/model_machine_network_interface.go
  • sdk/standard/model_sku_infiniband_device.go
  • sdk/standard/model_update_power_state_request.go
  • sdk/standard/model_nv_link_logical_partition_update_request.go
  • sdk/standard/model_vpc_peering.go
  • sdk/standard/model_subnet_status.go
  • sdk/standard/model_nv_link_interface_status.go
  • sdk/standard/model_rack_validation_result.go
  • sdk/standard/model_rack_location.go
  • sdk/standard/model_rack.go
  • sdk/standard/model_site_machine_stats_by_allocation.go
  • sdk/standard/model_instance.go
  • sdk/standard/model_status_detail.go
  • sdk/standard/model_instance_status.go
  • sdk/standard/model_sku_chassis.go
  • sdk/standard/model_tenant_account.go
  • sdk/standard/model_subnet_update_request.go
  • sdk/standard/model_tray_filter.go
  • sdk/standard/model_machine_health_issue.go
  • sdk/standard/model_site_location.go
  • sdk/standard/model_batch_update_rack_power_state_request.go
  • sdk/standard/api_vpc_peering.go
  • sdk/standard/model_ip_block_update_request.go
  • sdk/standard/model_batch_tray_firmware_update_request.go
  • sdk/standard/api_allocation.go
  • sdk/standard/model_machine_gpu_stats.go
  • sdk/standard/model_dpu_extension_service_status.go
  • sdk/standard/model_machine_status.go
  • sdk/standard/utils.go
  • sdk/standard/model_tenant_account_create_request.go
  • sdk/standard/model_ssh_key_create_request.go
  • sdk/standard/api_instance.go
  • sdk/standard/model_service_account.go
  • sdk/standard/model_instance_delete_request.go
  • sdk/standard/model_machine_gpu_info.go
  • sdk/standard/model_bring_up_rack_response.go
  • sdk/standard/model_rack_component.go
  • sdk/standard/model_expected_machine.go
  • sdk/standard/model_carbide_api_error.go
  • sdk/standard/model_instance_type.go
  • sdk/standard/model_metadata.go
  • sdk/standard/model_batch_instance_create_request.go
  • sdk/standard/model_dpu_extension_service_summary.go
  • sdk/standard/model_tenant_stats.go
  • sdk/standard/model_expected_power_shelf_create_request.go
  • sdk/standard/model_site_create_request.go
  • sdk/standard/model_allocation_create_request.go
  • sdk/standard/model_network_security_group_propagation_details.go
  • sdk/standard/api_ip_block.go
  • sdk/standard/api_network_security_group.go
  • sdk/standard/model_subnet_count_by_status.go
  • sdk/standard/model_machine_health_probe_alert.go
  • sdk/standard/model_vpc_peering_status.go
  • sdk/standard/model_machine_infini_band_interface.go
  • sdk/standard/model_tenant_account_count_by_status.go
  • sdk/standard/api_infrastructure_provider.go
  • sdk/standard/model_dpu_extension_service_observability_logging.go
  • sdk/standard/api_tenant_account.go
  • sdk/standard/model_dpu_extension_service_observability_prometheus.go
  • sdk/standard/model_sku_tpm.go
  • sdk/standard/model_bring_up_rack_request.go
  • sdk/standard/model_site_update_request.go
  • sdk/standard/model_network_security_group_status.go
  • sdk/standard/model_tenant.go
  • sdk/standard/model_network_security_group_update_request.go
  • sdk/standard/model_ip_block_create_request.go
  • sdk/standard/model_machine.go
  • sdk/standard/model_rack_filter.go
  • sdk/standard/model_instance_type_create_request.go
  • sdk/standard/model_ip_block_status.go
  • sdk/standard/model_machine_instance_type_stats.go
  • sdk/standard/model_subnet.go
  • sdk/standard/api_vpc.go
  • sdk/standard/model_allocation_update_request.go
  • sdk/standard/model_machine_health.go
  • sdk/standard/model_rack_task.go
  • sdk/standard/model_machine_update_request.go
  • sdk/standard/model_instance_type_summary.go
  • sdk/standard/model_tenant_instance_type_stats.go
  • sdk/standard/model_nv_link_logical_partition.go
  • sdk/standard/model_instance_type_capability_create_request.go
  • sdk/standard/model_interface_create_request.go
  • sdk/standard/model_subnet_create_request.go
  • sdk/standard/model_machine_interface.go
  • sdk/standard/model_operating_system_status.go
  • sdk/standard/api_operating_system.go
  • sdk/standard/api_infini_band_partition.go
  • sdk/standard/api_rack.go
  • sdk/standard/model_nv_link_logical_partition_status.go
  • sdk/standard/model_ssh_key.go
  • sdk/standard/model_batch_bring_up_rack_request.go
  • sdk/standard/api_service_account.go
  • sdk/standard/api_instance_type.go
  • sdk/standard/model_bmc_info.go
  • sdk/standard/model_infini_band_interface_create_request.go
  • sdk/standard/model_component_diff.go
  • sdk/standard/model_vpc_prefix_create_request.go
  • sdk/standard/model_vpc_status.go
  • sdk/standard/model_deprecation.go
  • sdk/standard/api_expected_machine.go
  • sdk/standard/model_site_machine_stats_by_status_and_health.go
  • sdk/standard/model_ssh_key_group_site_association.go
  • sdk/standard/model_expected_switch_update_request.go
  • sdk/standard/model_machine_summary.go
  • sdk/standard/model_infini_band_partition_update_request.go
  • sdk/standard/model_site_capabilities.go
  • sdk/standard/model_site_machine_stats_by_health.go
  • sdk/standard/model_expected_switch_create_request.go
  • sdk/standard/model_vpc_create_request.go
  • sdk/standard/api_tenant.go
  • sdk/standard/model_sku_gpu.go
  • sdk/standard/api_site.go
  • sdk/standard/api_dpu_extension_service.go
  • sdk/standard/model_firmware_update_request.go
  • sdk/standard/api_subnet.go
  • sdk/standard/model_instance_update_request.go
  • sdk/standard/model_site_status.go
  • sdk/standard/model_expected_switch.go
  • sdk/standard/model_operating_system.go
  • sdk/standard/model_infini_band_partition_create_request.go
  • sdk/standard/model_infini_band_partition.go
  • sdk/standard/model_operating_system_update_request.go
  • sdk/standard/model_site_machine_stats.go
  • sdk/standard/model_network_security_group_create_request.go
  • sdk/standard/api_expected_power_shelf.go
  • sdk/standard/api_ssh_key_group.go
  • sdk/standard/model_instance_create_request.go
  • sdk/standard/model_ip_block_usage_stats.go
  • sdk/standard/api_user.go
  • sdk/standard/model_operating_system_create_request.go
  • sdk/standard/model_machine_instance_type_summary.go
  • sdk/standard/api_tray.go
  • sdk/standard/model_network_security_group.go
  • sdk/standard/model_expected_power_shelf_update_request.go
  • sdk/standard/model_vpc_update_request.go
  • sdk/standard/model_update_power_state_response.go
  • sdk/standard/api_sku.go
  • sdk/standard/model_dpu_extension_service_deployment.go
  • sdk/standard/model_machine_health_probe_success.go
  • sdk/standard/model_network_security_group_rule.go
  • sdk/standard/api_machine.go
  • sdk/standard/api_vpc_prefix.go
  • db/pkg/db/ipam/ipam.go
  • sdk/standard/model_interface.go
  • sdk/standard/model_vpc.go
  • sdk/standard/model_site.go
  • sdk/standard/model_instance_type_update_request.go
🚧 Files skipped from review as they are similar to previous changes (10)
  • api/pkg/api/model/subnet_test.go
  • sdk/standard/model_infini_band_interface_status.go
  • sdk/standard/response.go
  • api/pkg/api/model/subnet.go
  • sdk/standard/api_audit.go
  • sdk/standard/client.go
  • sdk/standard/model_expected_power_shelf.go
  • sdk/standard/model_expected_machine_update_request.go
  • api/pkg/api/handler/vpcprefix.go
  • api/pkg/api/handler/subnet_test.go

Comment thread db/pkg/db/ipam/ipam_test.go
@hwadekar-nv hwadekar-nv changed the title feat: Support IP Usage stats in VpcPrefix feat: Support IP Usage stats in VpcPrefix and Subnet May 4, 2026
@hwadekar-nv hwadekar-nv force-pushed the feat/vpc-prefix-usage branch from 426678f to 8493694 Compare May 4, 2026 22:26
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@api/pkg/api/handler/vpcprefix.go`:
- Around line 518-534: When includeUsageStats is true, do not log-and-skip IPAM
failures for individual prefixes; instead surface an error for the whole list
request. In the loop that iterates vpcPrefixes (variables: vpcPrefixes, vp,
puVpMap) where you call ipam.GetIpamUsageForVpcPrefix using ipamStorage, change
the error handling so that any non-nil error (or missing vp.IPBlock) returns a
proper HTTP error from the handler rather than continuing — mirror the
single-GET behavior used elsewhere (the code path that fails the request on ipam
errors) so callers get a 4xx/5xx response instead of a 200 with partial/missing
usageStats. Ensure you still log the error with logger.Error().Err(...) before
returning.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: d7650058-9eda-40c3-8ba3-35070c5583fa

📥 Commits

Reviewing files that changed from the base of the PR and between 4f52092 and 8493694.

📒 Files selected for processing (241)
  • api/pkg/api/handler/subnet.go
  • api/pkg/api/handler/subnet_test.go
  • api/pkg/api/handler/util/common/common.go
  • api/pkg/api/handler/vpcprefix.go
  • api/pkg/api/handler/vpcprefix_test.go
  • api/pkg/api/model/subnet.go
  • api/pkg/api/model/subnet_test.go
  • api/pkg/api/model/vpcprefix.go
  • api/pkg/api/model/vpcprefix_test.go
  • db/pkg/db/ipam/ipam.go
  • db/pkg/db/ipam/ipam_test.go
  • openapi/spec.yaml
  • sdk/standard/api_allocation.go
  • sdk/standard/api_audit.go
  • sdk/standard/api_dpu_extension_service.go
  • sdk/standard/api_expected_machine.go
  • sdk/standard/api_expected_power_shelf.go
  • sdk/standard/api_expected_switch.go
  • sdk/standard/api_infini_band_partition.go
  • sdk/standard/api_infrastructure_provider.go
  • sdk/standard/api_instance.go
  • sdk/standard/api_instance_type.go
  • sdk/standard/api_ip_block.go
  • sdk/standard/api_machine.go
  • sdk/standard/api_metadata.go
  • sdk/standard/api_network_security_group.go
  • sdk/standard/api_nv_link_logical_partition.go
  • sdk/standard/api_operating_system.go
  • sdk/standard/api_rack.go
  • sdk/standard/api_service_account.go
  • sdk/standard/api_site.go
  • sdk/standard/api_sku.go
  • sdk/standard/api_ssh_key.go
  • sdk/standard/api_ssh_key_group.go
  • sdk/standard/api_subnet.go
  • sdk/standard/api_tenant.go
  • sdk/standard/api_tenant_account.go
  • sdk/standard/api_tray.go
  • sdk/standard/api_user.go
  • sdk/standard/api_vpc.go
  • sdk/standard/api_vpc_peering.go
  • sdk/standard/api_vpc_prefix.go
  • sdk/standard/client.go
  • sdk/standard/configuration.go
  • sdk/standard/model_allocation.go
  • sdk/standard/model_allocation_constraint.go
  • sdk/standard/model_allocation_constraint_create_request.go
  • sdk/standard/model_allocation_constraint_update_request.go
  • sdk/standard/model_allocation_create_request.go
  • sdk/standard/model_allocation_stats.go
  • sdk/standard/model_allocation_status.go
  • sdk/standard/model_allocation_update_request.go
  • sdk/standard/model_audit_entry.go
  • sdk/standard/model_batch_bring_up_rack_request.go
  • sdk/standard/model_batch_instance_create_request.go
  • sdk/standard/model_batch_rack_firmware_update_request.go
  • sdk/standard/model_batch_tray_firmware_update_request.go
  • sdk/standard/model_batch_update_rack_power_state_request.go
  • sdk/standard/model_batch_update_tray_power_state_request.go
  • sdk/standard/model_bmc_info.go
  • sdk/standard/model_bring_up_rack_request.go
  • sdk/standard/model_bring_up_rack_response.go
  • sdk/standard/model_carbide_api_error.go
  • sdk/standard/model_component_diff.go
  • sdk/standard/model_deprecation.go
  • sdk/standard/model_dpu_extension_service.go
  • sdk/standard/model_dpu_extension_service_create_request.go
  • sdk/standard/model_dpu_extension_service_credentials.go
  • sdk/standard/model_dpu_extension_service_deployment.go
  • sdk/standard/model_dpu_extension_service_deployment_request.go
  • sdk/standard/model_dpu_extension_service_deployment_status.go
  • sdk/standard/model_dpu_extension_service_observability.go
  • sdk/standard/model_dpu_extension_service_observability_config.go
  • sdk/standard/model_dpu_extension_service_observability_logging.go
  • sdk/standard/model_dpu_extension_service_observability_prometheus.go
  • sdk/standard/model_dpu_extension_service_status.go
  • sdk/standard/model_dpu_extension_service_summary.go
  • sdk/standard/model_dpu_extension_service_update_request.go
  • sdk/standard/model_dpu_extension_service_version_info.go
  • sdk/standard/model_expected_machine.go
  • sdk/standard/model_expected_machine_create_request.go
  • sdk/standard/model_expected_machine_update_request.go
  • sdk/standard/model_expected_power_shelf.go
  • sdk/standard/model_expected_power_shelf_create_request.go
  • sdk/standard/model_expected_power_shelf_update_request.go
  • sdk/standard/model_expected_switch.go
  • sdk/standard/model_expected_switch_create_request.go
  • sdk/standard/model_expected_switch_update_request.go
  • sdk/standard/model_field_diff.go
  • sdk/standard/model_firmware_update_request.go
  • sdk/standard/model_firmware_update_response.go
  • sdk/standard/model_infini_band_interface.go
  • sdk/standard/model_infini_band_interface_create_request.go
  • sdk/standard/model_infini_band_interface_status.go
  • sdk/standard/model_infini_band_partition.go
  • sdk/standard/model_infini_band_partition_create_request.go
  • sdk/standard/model_infini_band_partition_status.go
  • sdk/standard/model_infini_band_partition_update_request.go
  • sdk/standard/model_infrastructure_provider.go
  • sdk/standard/model_infrastructure_provider_stats.go
  • sdk/standard/model_instance.go
  • sdk/standard/model_instance_count_by_status.go
  • sdk/standard/model_instance_create_request.go
  • sdk/standard/model_instance_delete_request.go
  • sdk/standard/model_instance_status.go
  • sdk/standard/model_instance_type.go
  • sdk/standard/model_instance_type_allocation_stats.go
  • sdk/standard/model_instance_type_capability_create_request.go
  • sdk/standard/model_instance_type_create_request.go
  • sdk/standard/model_instance_type_stats.go
  • sdk/standard/model_instance_type_status.go
  • sdk/standard/model_instance_type_summary.go
  • sdk/standard/model_instance_type_update_request.go
  • sdk/standard/model_instance_update_request.go
  • sdk/standard/model_interface.go
  • sdk/standard/model_interface_create_request.go
  • sdk/standard/model_interface_status.go
  • sdk/standard/model_ip_block.go
  • sdk/standard/model_ip_block_count_by_status.go
  • sdk/standard/model_ip_block_create_request.go
  • sdk/standard/model_ip_block_status.go
  • sdk/standard/model_ip_block_summary.go
  • sdk/standard/model_ip_block_update_request.go
  • sdk/standard/model_ip_block_usage_stats.go
  • sdk/standard/model_machine.go
  • sdk/standard/model_machine_bmc_info.go
  • sdk/standard/model_machine_capability.go
  • sdk/standard/model_machine_count_by_status.go
  • sdk/standard/model_machine_dmi_data.go
  • sdk/standard/model_machine_gpu_info.go
  • sdk/standard/model_machine_gpu_stats.go
  • sdk/standard/model_machine_health.go
  • sdk/standard/model_machine_health_issue.go
  • sdk/standard/model_machine_health_probe_alert.go
  • sdk/standard/model_machine_health_probe_success.go
  • sdk/standard/model_machine_infini_band_interface.go
  • sdk/standard/model_machine_instance_type.go
  • sdk/standard/model_machine_instance_type_create_request.go
  • sdk/standard/model_machine_instance_type_stats.go
  • sdk/standard/model_machine_instance_type_summary.go
  • sdk/standard/model_machine_interface.go
  • sdk/standard/model_machine_metadata.go
  • sdk/standard/model_machine_network_interface.go
  • sdk/standard/model_machine_status.go
  • sdk/standard/model_machine_status_breakdown.go
  • sdk/standard/model_machine_summary.go
  • sdk/standard/model_machine_update_request.go
  • sdk/standard/model_metadata.go
  • sdk/standard/model_network_security_group.go
  • sdk/standard/model_network_security_group_create_request.go
  • sdk/standard/model_network_security_group_propagation_details.go
  • sdk/standard/model_network_security_group_propagation_status.go
  • sdk/standard/model_network_security_group_rule.go
  • sdk/standard/model_network_security_group_status.go
  • sdk/standard/model_network_security_group_update_request.go
  • sdk/standard/model_nv_link_interface.go
  • sdk/standard/model_nv_link_interface_create_request.go
  • sdk/standard/model_nv_link_interface_status.go
  • sdk/standard/model_nv_link_logical_partition.go
  • sdk/standard/model_nv_link_logical_partition_create_request.go
  • sdk/standard/model_nv_link_logical_partition_status.go
  • sdk/standard/model_nv_link_logical_partition_update_request.go
  • sdk/standard/model_operating_system.go
  • sdk/standard/model_operating_system_create_request.go
  • sdk/standard/model_operating_system_site_association.go
  • sdk/standard/model_operating_system_status.go
  • sdk/standard/model_operating_system_update_request.go
  • sdk/standard/model_rack.go
  • sdk/standard/model_rack_component.go
  • sdk/standard/model_rack_filter.go
  • sdk/standard/model_rack_location.go
  • sdk/standard/model_rack_task.go
  • sdk/standard/model_rack_validation_result.go
  • sdk/standard/model_service_account.go
  • sdk/standard/model_site.go
  • sdk/standard/model_site_capabilities.go
  • sdk/standard/model_site_contact.go
  • sdk/standard/model_site_create_request.go
  • sdk/standard/model_site_location.go
  • sdk/standard/model_site_machine_stats.go
  • sdk/standard/model_site_machine_stats_by_allocation.go
  • sdk/standard/model_site_machine_stats_by_health.go
  • sdk/standard/model_site_machine_stats_by_status.go
  • sdk/standard/model_site_machine_stats_by_status_and_health.go
  • sdk/standard/model_site_status.go
  • sdk/standard/model_site_summary.go
  • sdk/standard/model_site_update_request.go
  • sdk/standard/model_sku.go
  • sdk/standard/model_sku_chassis.go
  • sdk/standard/model_sku_components.go
  • sdk/standard/model_sku_cpu.go
  • sdk/standard/model_sku_ethernet_device.go
  • sdk/standard/model_sku_gpu.go
  • sdk/standard/model_sku_infiniband_device.go
  • sdk/standard/model_sku_memory.go
  • sdk/standard/model_sku_storage.go
  • sdk/standard/model_sku_tpm.go
  • sdk/standard/model_ssh_key.go
  • sdk/standard/model_ssh_key_create_request.go
  • sdk/standard/model_ssh_key_group.go
  • sdk/standard/model_ssh_key_group_create_request.go
  • sdk/standard/model_ssh_key_group_site_association.go
  • sdk/standard/model_ssh_key_group_site_association_status.go
  • sdk/standard/model_ssh_key_group_status.go
  • sdk/standard/model_ssh_key_group_update_request.go
  • sdk/standard/model_ssh_key_update_request.go
  • sdk/standard/model_status_detail.go
  • sdk/standard/model_subnet.go
  • sdk/standard/model_subnet_count_by_status.go
  • sdk/standard/model_subnet_create_request.go
  • sdk/standard/model_subnet_status.go
  • sdk/standard/model_subnet_update_request.go
  • sdk/standard/model_tenant.go
  • sdk/standard/model_tenant_account.go
  • sdk/standard/model_tenant_account_count_by_status.go
  • sdk/standard/model_tenant_account_create_request.go
  • sdk/standard/model_tenant_account_status.go
  • sdk/standard/model_tenant_capabilities.go
  • sdk/standard/model_tenant_instance_type_stats.go
  • sdk/standard/model_tenant_stats.go
  • sdk/standard/model_tray.go
  • sdk/standard/model_tray_filter.go
  • sdk/standard/model_tray_position.go
  • sdk/standard/model_update_power_state_request.go
  • sdk/standard/model_update_power_state_response.go
  • sdk/standard/model_user.go
  • sdk/standard/model_vpc.go
  • sdk/standard/model_vpc_count_by_status.go
  • sdk/standard/model_vpc_create_request.go
  • sdk/standard/model_vpc_peering.go
  • sdk/standard/model_vpc_peering_create_request.go
  • sdk/standard/model_vpc_peering_status.go
  • sdk/standard/model_vpc_prefix.go
  • sdk/standard/model_vpc_prefix_create_request.go
  • sdk/standard/model_vpc_prefix_status.go
  • sdk/standard/model_vpc_prefix_update_request.go
  • sdk/standard/model_vpc_status.go
  • sdk/standard/model_vpc_update_request.go
  • sdk/standard/model_vpc_virtualization_update_request.go
  • sdk/standard/response.go
  • sdk/standard/utils.go
✅ Files skipped from review due to trivial changes (221)
  • sdk/standard/model_allocation_stats.go
  • sdk/standard/model_ip_block_count_by_status.go
  • sdk/standard/model_instance_type_summary.go
  • sdk/standard/model_component_diff.go
  • sdk/standard/model_allocation_constraint_update_request.go
  • sdk/standard/api_vpc_peering.go
  • sdk/standard/model_operating_system_status.go
  • sdk/standard/model_dpu_extension_service_summary.go
  • sdk/standard/api_service_account.go
  • sdk/standard/model_interface_status.go
  • sdk/standard/model_update_power_state_request.go
  • sdk/standard/model_dpu_extension_service_deployment_status.go
  • sdk/standard/model_tenant_instance_type_stats.go
  • sdk/standard/model_batch_update_rack_power_state_request.go
  • sdk/standard/model_infrastructure_provider.go
  • sdk/standard/model_rack.go
  • sdk/standard/model_firmware_update_response.go
  • sdk/standard/model_ssh_key_group_site_association_status.go
  • sdk/standard/model_subnet_status.go
  • sdk/standard/model_bring_up_rack_response.go
  • sdk/standard/model_infini_band_partition_status.go
  • sdk/standard/model_instance_type_stats.go
  • sdk/standard/api_sku.go
  • sdk/standard/model_dpu_extension_service_status.go
  • sdk/standard/model_instance_type_capability_create_request.go
  • sdk/standard/model_dpu_extension_service_observability_config.go
  • sdk/standard/model_instance_status.go
  • sdk/standard/model_dpu_extension_service_update_request.go
  • sdk/standard/model_sku_infiniband_device.go
  • sdk/standard/model_sku_chassis.go
  • sdk/standard/model_vpc_prefix_status.go
  • sdk/standard/model_nv_link_logical_partition_update_request.go
  • sdk/standard/model_vpc_prefix_update_request.go
  • sdk/standard/model_site_machine_stats.go
  • sdk/standard/model_bring_up_rack_request.go
  • sdk/standard/model_sku_cpu.go
  • sdk/standard/model_service_account.go
  • sdk/standard/model_rack_filter.go
  • sdk/standard/model_machine_network_interface.go
  • sdk/standard/api_infrastructure_provider.go
  • sdk/standard/model_machine_gpu_stats.go
  • sdk/standard/model_bmc_info.go
  • sdk/standard/model_tenant_account_create_request.go
  • sdk/standard/model_firmware_update_request.go
  • sdk/standard/model_infini_band_partition_update_request.go
  • sdk/standard/model_site_capabilities.go
  • sdk/standard/model_instance_create_request.go
  • sdk/standard/api_network_security_group.go
  • sdk/standard/model_machine_health_issue.go
  • sdk/standard/model_ssh_key_update_request.go
  • sdk/standard/model_site_status.go
  • sdk/standard/model_machine_instance_type.go
  • sdk/standard/model_instance_type.go
  • sdk/standard/api_ip_block.go
  • sdk/standard/model_allocation_update_request.go
  • sdk/standard/model_allocation.go
  • sdk/standard/api_ssh_key_group.go
  • sdk/standard/api_ssh_key.go
  • api/pkg/api/model/subnet_test.go
  • sdk/standard/model_instance.go
  • sdk/standard/model_dpu_extension_service_observability_prometheus.go
  • sdk/standard/api_rack.go
  • sdk/standard/model_ip_block_update_request.go
  • sdk/standard/api_nv_link_logical_partition.go
  • sdk/standard/model_ssh_key.go
  • sdk/standard/model_dpu_extension_service_deployment.go
  • sdk/standard/model_nv_link_interface.go
  • sdk/standard/model_operating_system_create_request.go
  • sdk/standard/model_instance_type_create_request.go
  • sdk/standard/model_batch_bring_up_rack_request.go
  • sdk/standard/model_network_security_group_update_request.go
  • sdk/standard/model_network_security_group_status.go
  • sdk/standard/model_sku_tpm.go
  • sdk/standard/model_network_security_group_rule.go
  • sdk/standard/model_infini_band_interface_create_request.go
  • sdk/standard/api_tray.go
  • sdk/standard/model_dpu_extension_service_deployment_request.go
  • sdk/standard/model_tenant.go
  • sdk/standard/model_dpu_extension_service_version_info.go
  • sdk/standard/model_site_machine_stats_by_status_and_health.go
  • sdk/standard/model_interface.go
  • sdk/standard/model_site_create_request.go
  • sdk/standard/model_ip_block.go
  • sdk/standard/model_rack_task.go
  • sdk/standard/model_metadata.go
  • sdk/standard/api_user.go
  • sdk/standard/model_site_machine_stats_by_status.go
  • sdk/standard/api_subnet.go
  • sdk/standard/model_ssh_key_group_create_request.go
  • sdk/standard/model_sku_ethernet_device.go
  • sdk/standard/model_machine_instance_type_create_request.go
  • sdk/standard/model_machine_health_probe_alert.go
  • sdk/standard/model_carbide_api_error.go
  • sdk/standard/model_subnet_update_request.go
  • sdk/standard/model_tenant_capabilities.go
  • sdk/standard/model_machine_health.go
  • sdk/standard/model_ssh_key_group_status.go
  • sdk/standard/model_ssh_key_group.go
  • sdk/standard/model_tenant_stats.go
  • sdk/standard/model_infini_band_interface.go
  • sdk/standard/model_site_machine_stats_by_allocation.go
  • sdk/standard/model_machine_dmi_data.go
  • sdk/standard/model_machine_summary.go
  • sdk/standard/model_network_security_group_propagation_status.go
  • sdk/standard/model_deprecation.go
  • sdk/standard/model_site_contact.go
  • sdk/standard/model_ssh_key_group_site_association.go
  • sdk/standard/model_allocation_constraint_create_request.go
  • sdk/standard/model_ssh_key_create_request.go
  • sdk/standard/utils.go
  • sdk/standard/api_machine.go
  • sdk/standard/model_sku_components.go
  • sdk/standard/api_operating_system.go
  • sdk/standard/model_sku_memory.go
  • sdk/standard/model_ip_block_summary.go
  • sdk/standard/model_vpc_prefix_create_request.go
  • sdk/standard/api_expected_power_shelf.go
  • sdk/standard/model_update_power_state_response.go
  • sdk/standard/model_machine_status_breakdown.go
  • sdk/standard/model_machine_gpu_info.go
  • sdk/standard/model_machine_capability.go
  • sdk/standard/model_machine_instance_type_stats.go
  • sdk/standard/model_machine_health_probe_success.go
  • sdk/standard/model_subnet_create_request.go
  • sdk/standard/model_vpc.go
  • sdk/standard/model_machine_instance_type_summary.go
  • sdk/standard/model_vpc_count_by_status.go
  • sdk/standard/api_vpc.go
  • sdk/standard/model_infini_band_interface_status.go
  • sdk/standard/model_dpu_extension_service_credentials.go
  • sdk/standard/model_batch_rack_firmware_update_request.go
  • sdk/standard/model_machine_infini_band_interface.go
  • sdk/standard/model_nv_link_logical_partition.go
  • sdk/standard/model_allocation_create_request.go
  • sdk/standard/model_operating_system_site_association.go
  • sdk/standard/model_vpc_peering_status.go
  • sdk/standard/model_network_security_group_create_request.go
  • sdk/standard/model_rack_validation_result.go
  • sdk/standard/model_tray_position.go
  • sdk/standard/model_machine_count_by_status.go
  • sdk/standard/model_expected_machine_update_request.go
  • sdk/standard/model_rack_location.go
  • sdk/standard/model_ip_block_status.go
  • sdk/standard/model_dpu_extension_service_observability_logging.go
  • sdk/standard/model_instance_type_status.go
  • sdk/standard/api_metadata.go
  • sdk/standard/model_vpc_status.go
  • sdk/standard/model_sku_gpu.go
  • sdk/standard/api_dpu_extension_service.go
  • sdk/standard/model_instance_type_update_request.go
  • sdk/standard/model_instance_type_allocation_stats.go
  • sdk/standard/model_expected_machine_create_request.go
  • sdk/standard/model_instance_count_by_status.go
  • sdk/standard/model_site.go
  • sdk/standard/model_machine_bmc_info.go
  • sdk/standard/model_nv_link_logical_partition_create_request.go
  • sdk/standard/model_field_diff.go
  • sdk/standard/model_dpu_extension_service_create_request.go
  • sdk/standard/model_tenant_account_status.go
  • sdk/standard/api_expected_machine.go
  • sdk/standard/model_sku.go
  • sdk/standard/model_tray_filter.go
  • sdk/standard/model_machine_interface.go
  • sdk/standard/model_allocation_constraint.go
  • sdk/standard/model_interface_create_request.go
  • sdk/standard/configuration.go
  • sdk/standard/model_site_machine_stats_by_health.go
  • sdk/standard/model_audit_entry.go
  • sdk/standard/model_vpc_peering.go
  • sdk/standard/model_machine.go
  • sdk/standard/model_subnet_count_by_status.go
  • sdk/standard/model_tray.go
  • sdk/standard/api_instance.go
  • sdk/standard/model_machine_metadata.go
  • sdk/standard/model_sku_storage.go
  • sdk/standard/api_audit.go
  • sdk/standard/model_expected_machine.go
  • sdk/standard/model_ip_block_create_request.go
  • sdk/standard/model_ip_block_usage_stats.go
  • sdk/standard/model_expected_power_shelf_create_request.go
  • sdk/standard/model_tenant_account.go
  • sdk/standard/api_instance_type.go
  • sdk/standard/model_site_summary.go
  • sdk/standard/model_rack_component.go
  • sdk/standard/api_tenant_account.go
  • sdk/standard/model_dpu_extension_service.go
  • sdk/standard/model_machine_status.go
  • sdk/standard/model_infini_band_partition_create_request.go
  • sdk/standard/model_operating_system_update_request.go
  • sdk/standard/api_expected_switch.go
  • sdk/standard/model_dpu_extension_service_observability.go
  • sdk/standard/model_site_location.go
  • sdk/standard/model_expected_power_shelf.go
  • sdk/standard/model_instance_update_request.go
  • sdk/standard/model_ssh_key_group_update_request.go
  • sdk/standard/model_subnet.go
  • sdk/standard/model_tenant_account_count_by_status.go
  • sdk/standard/model_batch_tray_firmware_update_request.go
  • sdk/standard/model_network_security_group_propagation_details.go
  • sdk/standard/model_vpc_prefix.go
  • sdk/standard/client.go
  • sdk/standard/model_infrastructure_provider_stats.go
  • sdk/standard/model_expected_power_shelf_update_request.go
  • sdk/standard/api_site.go
  • sdk/standard/model_machine_update_request.go
  • sdk/standard/model_vpc_create_request.go
  • sdk/standard/model_expected_switch.go
  • sdk/standard/model_batch_update_tray_power_state_request.go
  • sdk/standard/model_expected_switch_create_request.go
  • sdk/standard/model_batch_instance_create_request.go
  • sdk/standard/model_nv_link_interface_create_request.go
  • sdk/standard/model_vpc_peering_create_request.go
  • sdk/standard/api_infini_band_partition.go
  • sdk/standard/model_expected_switch_update_request.go
  • sdk/standard/model_vpc_update_request.go
  • sdk/standard/api_allocation.go
  • sdk/standard/api_tenant.go
  • sdk/standard/model_allocation_status.go
  • sdk/standard/model_status_detail.go
  • openapi/spec.yaml
  • api/pkg/api/handler/subnet_test.go
🚧 Files skipped from review as they are similar to previous changes (15)
  • sdk/standard/model_nv_link_logical_partition_status.go
  • sdk/standard/model_nv_link_interface_status.go
  • sdk/standard/response.go
  • sdk/standard/model_infini_band_partition.go
  • sdk/standard/model_instance_delete_request.go
  • sdk/standard/model_operating_system.go
  • sdk/standard/model_user.go
  • sdk/standard/model_network_security_group.go
  • api/pkg/api/model/subnet.go
  • api/pkg/api/model/vpcprefix_test.go
  • db/pkg/db/ipam/ipam.go
  • sdk/standard/model_site_update_request.go
  • api/pkg/api/handler/vpcprefix_test.go
  • api/pkg/api/handler/subnet.go
  • db/pkg/db/ipam/ipam_test.go

Comment thread api/pkg/api/handler/vpcprefix.go
@hwadekar-nv hwadekar-nv force-pushed the feat/vpc-prefix-usage branch from 8493694 to fece8da Compare May 4, 2026 23:20
@thossain-nv
Copy link
Copy Markdown
Contributor

@hwadekar-nv I don't think we can use IPAM to get usage stats for Subnets or VPC Prefixes. This is because they get used only when Instances are created and we don't record Instance IP usage in IPAM, that's decided by Core. The IPAM usage stats will not give back any meaningful information.

We have to look into Instance count and Interface count to understand how many IPs have been used and how much IP space is left. We can work with @bcavnvidia to find how much IP space each Interface uses for Subnets and for VPC Prefixes.

@thossain-nv thossain-nv changed the title feat: Support IP Usage stats in VpcPrefix and Subnet feat: Support IP Usage stats in VPC Prefix and Subnet May 5, 2026
Comment thread openapi/spec.yaml
Copy link
Copy Markdown
Contributor

@nvlitagaki nvlitagaki May 5, 2026

Choose a reason for hiding this comment

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

Please include an example of a VPC Prefix that includes usageStats, but be mindful to not accidentally imply that this value can also be included in the return value from a create or update call

@hwadekar-nv
Copy link
Copy Markdown
Contributor Author

Got it, also IPAM is now configurable too so not always be available, Thanks @thossain-nv, will sync with @bcavnvidia for this.

@hwadekar-nv hwadekar-nv force-pushed the feat/vpc-prefix-usage branch from cd8b819 to 2619daf Compare May 5, 2026 16:28

// ParseIncludeUsageStats reads includeUsageStats from the request; when true, clones relations and appends relationForStats
// if absent (Subnet: IPv4Block; VPC prefix: IPBlock).
func ParseIncludeUsageStats(c echo.Context, relations []string, relationForStats string) (includeUsageStats bool, augmented []string, err error) {
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.

Usage stats and IncludeRelation are not related. Grouping them in a function does not seem intuitive. Let's leave these in the respective handlers.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants