Skip to content

Feat: Enhance NetworkManager EventTargetParser targets#930

Open
niccoloalfredo wants to merge 1 commit into
ManageIQ:masterfrom
sourcesense:feat/enhance-network-event-targets
Open

Feat: Enhance NetworkManager EventTargetParser targets#930
niccoloalfredo wants to merge 1 commit into
ManageIQ:masterfrom
sourcesense:feat/enhance-network-event-targets

Conversation

@niccoloalfredo
Copy link
Copy Markdown

Fix NetworkManager EventTargetParser for Neutron event payload structure

Summary

Fixes the EventTargetParser in NetworkManager to correctly extract resource IDs from Neutron events. The current implementation assumes a flat payload structure with a direct resource_id field, but Neutron uses nested payloads where resources are contained in type-specific objects.

Problem

Current behavior:

resource_id = event_payload['resource_id']  # Always returns nil for Neutron events

Actual Neutron payload structure:

{
  "payload": {
    "network": {
      "id": "b39598c6-e36e-4d8c-82c9-d295addcf82c",
      "tenant_id": "fd2f0bf534504696a8fb62ca84f4e191",
      ...
    }
  }
}

Solution

Key Changes

1. Added resource_type helper:

def resource_type
  @resource_type ||= ems_event.event_type.split(".").first
end

Extracts "network" from "network.create.end" automatically.

2. Added intelligent resource_id extraction:

def resource_id
  @resource_id ||= event_payload.dig(resource_type, "id") || event_payload["resource_id"]
end
  • First tries nested structure: payload.dig("network", "id")
  • Falls back to direct field for backwards compatibility

3. Replaced if/elsif chain with case statement:

target_type = case resource_type
              when "floatingip" then :floating_ips
              when "router" then :network_routers
              when "network" then :cloud_networks
              ...

4. Enhanced tenant ID extraction:

tenant_id = event_payload['tenant_id'] || 
            event_payload['project_id'] || 
            event_payload.dig(resource_type, 'tenant_id') ||
            event_payload.dig(resource_type, 'project_id') ||
            event_payload.dig('initiator', 'project_id')

Searches multiple locations for tenant/project ID in nested structures.

Testing

Manual testing with real Neutron events via AMQP:

  • ✅ Networks, Subnets, Routers, Floating IPs, Security Groups, Ports
  • ✅ Resource IDs correctly extracted from nested payloads
  • ✅ Tenant IDs correctly extracted from nested structures
  • ✅ Targeted refresh working as intended
  • ✅ Security group rules (without IDs) correctly trigger full refresh

Updated spec tests:

  • Payloads now reflect real Neutron structure (nested objects)
  • Added tests for security group rules, fallback scenarios, and tenant extraction

@miq-bot
Copy link
Copy Markdown
Member

miq-bot commented Dec 30, 2025

Checked commit sourcesense@8c8a595 with ruby 3.1.7, rubocop 1.56.3, haml-lint 0.64.0, and yamllint
2 files checked, 7 offenses detected

app/models/manageiq/providers/openstack/network_manager/event_target_parser.rb

spec/models/manageiq/providers/openstack/network_manager/event_target_parser_spec.rb

@miq-bot miq-bot added the stale label Apr 6, 2026
@miq-bot
Copy link
Copy Markdown
Member

miq-bot commented Apr 6, 2026

This pull request has been automatically marked as stale because it has not been updated for at least 3 months.

If these changes are still valid, please remove the stale label, make any changes requested by reviewers (if any), and ensure that this issue is being looked at by the assigned/reviewer(s).

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants