Skip to content

Commit

Permalink
Connect events to targeted refresh
Browse files Browse the repository at this point in the history
With this commit we teach our NetworkManager how to
map obtained events to appropriate target. At the moment
only events concerning the three supported targets actually
trigger something:

```
- network_groups
- cloud_subnets
- security_groups
```

while all other events are simply skipped.

Signed-off-by: Miha Pleško <[email protected]>
  • Loading branch information
miha-plesko committed Oct 26, 2017
1 parent 932edad commit 8f42f32
Show file tree
Hide file tree
Showing 7 changed files with 342 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
class ManageIQ::Providers::Nuage::NetworkManager::EventTargetParser
attr_reader :ems_event

# @param ems_event [EmsEvent] EmsEvent object
def initialize(ems_event)
@ems_event = ems_event
end

# Parses all targets that are present in the EmsEvent given in the initializer
#
# @return [Array] Array of ManagerRefresh::Target objects
def parse
parse_ems_event_targets(ems_event)
end

private

# Parses list of ManagerRefresh::Target out of the given EmsEvent
#
# @param event [EmsEvent] EmsEvent object
# @return [Array] Array of ManagerRefresh::Target objects
def parse_ems_event_targets(event)
target_collection = ManagerRefresh::TargetCollection.new(:manager => event.ext_management_system, :event => event)

case event.full_data["entityType"]
when 'enterprise'
add_targets(target_collection, :network_groups, event.full_data['entities'])
when 'subnet'
add_targets(target_collection, :cloud_subnets, event.full_data['entities'])
when 'policygroup'
add_targets(target_collection, :security_groups, event.full_data['entities'])
when 'domain'
add_targets(target_collection, :network_groups, event.full_data['entities'], :key => 'enterpriseID')
end

target_collection.targets
end

def add_targets(target_collection, association, entities, key: 'ID')
return unless entities.respond_to?(:each)
entities.each do |obj|
next if obj[key].to_s.empty?
target_collection.add_target(:association => association, :manager_ref => {:ems_ref => obj[key]})
end
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"userName":null,
"enterpriseName":null,
"type":"CREATE",
"entityType":"alarm",
"eventReceivedTime":1481063680946,
"entities":[
{
"children":null,
"parentType":"nsgateway",
"entityScope":"ENTERPRISE",
"lastUpdatedBy":"43f8868f-4bc1-472c-9d19-533dcfcb1ee0",
"lastUpdatedDate":1481063680000,
"creationDate":1481063680000,
"name":"NSG-Ottawa 213.50.60.102 Gateway with system-id [213.50.60.102] is disconnected",
"reason":"Gateway with system-id [213.50.60.102] is disconnected",
"description":"Gateway [213.50.60.102:NSG-Ottawa] was disconnected from the controller.",
"alarmTimeStamp":1481063680945,
"acknowledged":false,
"alarmId":"NSG-Ottawa-213.50.60.102-gwstate-916ea220-c381-4701-ba33-da1e423c992d",
"numberOfOccurances":1,
"alarmedObjectType":"nsgateway",
"alarmedObjectId":"05117fac-eac2-4ed7-b421-e70fcb42daee",
"severity":"MAJOR",
"errorCondition":4707,
"incrementNumberOfOccurances":false,
"enterpriseId":"40d29496-c5ef-41c6-aa6b-ef1cd8655457",
"owner":"43f8868f-4bc1-472c-9d19-533dcfcb1ee0",
"ID":"1336a16b-6d2e-46c2-bbfa-e8bf4343534c",
"parentID":"05117fac-eac2-4ed7-b421-e70fcb42daee",
"externalID":null
}
],
"diffMap":null,
"ignoreDiffInMediationEvents":false,
"updateMechanism":"DEFAULT",
"writeToDb":true
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
{
"userName":"tester",
"enterpriseName":"csp",
"type":"CREATE",
"entityType":"domain",
"entityVersion":null,
"assoicatedEvent":false,
"eventReceivedTime":1508854852753,
"entities":[
{
"children":null,
"parentType":"enterprise",
"entityScope":"ENTERPRISE",
"lastUpdatedBy":"d2dc3ac6-01a4-4755-8686-e0be7f36f088",
"lastUpdatedDate":1508854852000,
"creationDate":1508854852000,
"routeDistinguisher":"65534:61003",
"routeTarget":"65534:26701",
"name":"Finance-App",
"description":"Created by Ansible",
"maintenanceMode":"DISABLED",
"dhcpServerAddresses":null,
"underlayEnabled":"DISABLED",
"policyChangeStatus":null,
"backHaulRouteDistinguisher":"65534:2255",
"backHaulRouteTarget":"65534:58729",
"backHaulVNID":9473174,
"advertiseCriteria":null,
"importRouteTarget":"65534:26701",
"exportRouteTarget":"65534:26701",
"encryption":"DISABLED",
"localAS":null,
"owner":"d2dc3ac6-01a4-4755-8686-e0be7f36f088",
"ID":"c3869ddf-4c4b-433b-a23f-fc3800337578",
"parentID":"fda58efc-7f7c-4a51-b6b4-24b32d755785",
"externalID":null,
"serviceID":307942814,
"customerID":236537,
"DHCPBehavior":"CONSUME",
"DHCPServerAddress":null,
"secondaryDHCPServerAddress":null,
"labelID":27767,
"multicast":"DISABLED",
"PATEnabled":"INHERITED",
"associatedPATMapperID":null,
"associatedMulticastChannelMapID":null,
"stretched":false,
"tunnelType":"VXLAN",
"ECMPCount":1,
"templateID":"2402a4b4-d309-4d03-8c65-82aa02bdfd7d",
"enterpriseID":"fda58efc-7f7c-4a51-b6b4-24b32d755785",
"uplinkPreference":"PRIMARY_SECONDARY",
"globalRoutingEnabled":false,
"leakingEnabled":false,
"DPI":"DISABLED",
"permittedAction":null,
"associatedBGPProfileID":null,
"BGPEnabled":false,
"domainID":472114,
"domainVLANID":0
}
],
"diffMap":null,
"ignoreDiffInMediationEvents":false,
"updateMechanism":"DEFAULT",
"requestID":"c9591176-42c2-4347-a182-9a6f0bd8b63c"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
{
"userName":"tester",
"enterpriseName":"csp",
"type":"CREATE",
"entityType":"enterprise",
"entityVersion":null,
"assoicatedEvent":false,
"eventReceivedTime":1508854841922,
"entities":[
{
"children":null,
"parentType":null,
"entityScope":"ENTERPRISE",
"lastUpdatedBy":"d2dc3ac6-01a4-4755-8686-e0be7f36f088",
"lastUpdatedDate":1508854841000,
"creationDate":1508854841000,
"name":"Ansible-Test",
"description":"Created by Ansible",
"avatarType":null,
"avatarData":null,
"floatingIPsQuota":16,
"floatingIPsUsed":0,
"allowTrustedForwardingClass":false,
"allowAdvancedQOSConfiguration":false,
"allowedForwardingClasses":[
"H"
],
"allowGatewayManagement":false,
"enableApplicationPerformanceManagement":false,
"encryptionManagementMode":"DISABLED",
"localAS":null,
"dictionaryVersion":2,
"allowedForwardingMode":null,
"owner":"d2dc3ac6-01a4-4755-8686-e0be7f36f088",
"ID":"fda58efc-7f7c-4a51-b6b4-24b32d755785",
"parentID":null,
"externalID":null,
"customerID":236537,
"DHCPLeaseInterval":24,
"enterpriseProfileID":"f1e5eb19-c67a-4651-90c1-3f84e23e1d36",
"receiveMultiCastListID":"081169f6-cb2f-4c6e-8e94-b701224a5141",
"sendMultiCastListID":"738446cc-026f-488f-9718-b13f4390857b",
"associatedGroupKeyEncryptionProfileID":"de15a596-d99d-47a9-8e55-2147a1fd7b47",
"associatedEnterpriseSecurityID":"a7a66d41-7cc3-4678-9289-b2faf0259144",
"associatedKeyServerMonitorID":"48383e55-4171-4fe0-9c70-a74efb171d44",
"LDAPEnabled":false,
"LDAPAuthorizationEnabled":false,
"BGPEnabled":false
}
],
"diffMap":null,
"ignoreDiffInMediationEvents":false,
"updateMechanism":"DEFAULT",
"requestID":"dd3b1d85-b021-48f3-9c23-50b8aeaa86f5"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"entityType":"policygroup",
"type":"CREATE",
"eventReceivedTime":1508854841922,
"entities":[
{
"ID":"fadd09c4-9fea-46ec-8342-73f1b6a4df74"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
{
"userName":"tester",
"enterpriseName":"csp",
"type":"CREATE",
"entityType":"subnet",
"entityVersion":null,
"assoicatedEvent":false,
"eventReceivedTime":1508854855195,
"entities":[
{
"children":null,
"parentType":"zone",
"entityScope":"ENTERPRISE",
"lastUpdatedBy":"d2dc3ac6-01a4-4755-8686-e0be7f36f088",
"lastUpdatedDate":1508854855000,
"creationDate":1508854855000,
"address":"10.88.88.0",
"netmask":"255.255.255.0",
"name":"Audit-Subnet",
"dynamicIpv6Address":true,
"gateway":"10.88.88.1",
"description":"Created by Ansible",
"maintenanceMode":"DISABLED",
"routeDistinguisher":"65534:63222",
"routeTarget":"65534:1739",
"vnId":7540380,
"underlayEnabled":"INHERITED",
"underlay":false,
"entityState":null,
"splitSubnet":false,
"encryption":"INHERITED",
"owner":"d2dc3ac6-01a4-4755-8686-e0be7f36f088",
"ID":"4e08bf9c-b679-4c82-a6f7-b298a3901d25",
"parentID":"a1669738-b807-4af2-bd12-2e77f3e6a970",
"externalID":null,
"IPv6Address":null,
"IPType":"IPV4",
"IPv6Gateway":null,
"serviceID":1569936378,
"gatewayMACAddress":"68:54:ED:00:A3:78",
"PATEnabled":"INHERITED",
"policyGroupID":1055128306,
"public":false,
"templateID":null,
"associatedSharedNetworkResourceID":null,
"DHCPRelayStatus":"DISABLED",
"proxyARP":false,
"multicast":"INHERITED",
"associatedMulticastChannelMapID":null,
"DPI":"INHERITED",
"useGlobalMAC":"DISABLED"
}
],
"diffMap":null,
"ignoreDiffInMediationEvents":false,
"updateMechanism":"DEFAULT",
"requestID":"56e69f6e-a1fd-457f-b4c5-844cfd790153"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
describe ManageIQ::Providers::Nuage::NetworkManager::EventTargetParser do
before :each do
_guid, _server, zone = EvmSpecHelper.create_guid_miq_server_zone
@ems = FactoryGirl.create(:ems_nuage_network, :zone => zone)

allow_any_instance_of(EmsEvent).to receive(:handle_event)
allow(EmsEvent).to receive(:create_completed_event)
end

context "Events trigger targeted refresh" do
it "entityType: enterprise" do
assert_event_triggers_target(
'enterprise_create.json',
[[:network_groups, {:ems_ref => 'fda58efc-7f7c-4a51-b6b4-24b32d755785'}]]
)
end

it "entityType: subnet" do
assert_event_triggers_target(
'subnet_create.json',
[[:cloud_subnets, {:ems_ref => '4e08bf9c-b679-4c82-a6f7-b298a3901d25'}]]
)
end

it "entityType: policygroup" do
assert_event_triggers_target(
'policygroup_create.json',
[[:security_groups, {:ems_ref => 'fadd09c4-9fea-46ec-8342-73f1b6a4df74'}]]
)
end

it "entityType: domain" do
assert_event_triggers_target(
'domain_create.json',
[[:network_groups, {:ems_ref => 'fda58efc-7f7c-4a51-b6b4-24b32d755785'}]]
)
end
end

context "Alarms don't trigger targeted refresh" do
it "alarm" do
assert_event_triggers_target('alarm_create.json', [])
end
end

def assert_event_triggers_target(event_data, expected_targets)
ems_event = create_ems_event(event_data)
parsed_targets = described_class.new(ems_event).parse

expect(parsed_targets.size).to eq(expected_targets.count)
expect(target_references(parsed_targets)).to(
match_array(expected_targets)
)
end

def target_references(parsed_targets)
parsed_targets.map { |x| [x.association, x.manager_ref] }.uniq
end

def response(path)
JSON.parse(File.read(File.join(File.dirname(__FILE__), "/event_catcher/#{path}")))
end

def create_ems_event(path)
event_hash = ManageIQ::Providers::Nuage::NetworkManager::EventParser.event_to_hash(response(path), @ems.id)
EmsEvent.add(@ems.id, event_hash)
end
end

0 comments on commit 8f42f32

Please sign in to comment.