Skip to content

Commit efb7b85

Browse files
authored
Merge pull request #830 from agrare/add_specs_non_rails_event_catcher
Fix non-rails event_parser not linking up VMs
2 parents 34e252d + 96c09db commit efb7b85

File tree

7 files changed

+289
-21
lines changed

7 files changed

+289
-21
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
--- !ruby/object:RbVmomi::VIM::EventEx
2+
props:
3+
:key: 13784001
4+
:chainId: 13784001
5+
:createdTime: 2022-10-20 19:16:43.173941000 Z
6+
:userName: ''
7+
:datacenter: !ruby/object:RbVmomi::VIM::DatacenterEventArgument
8+
props:
9+
:name: DC1
10+
:datacenter: !ruby/object:RbVmomi::VIM::Datacenter
11+
connection: nil
12+
ref: datacenter-6548
13+
:computeResource: !ruby/object:RbVmomi::VIM::ComputeResourceEventArgument
14+
props:
15+
:name: Cluster1
16+
:computeResource: !ruby/object:RbVmomi::VIM::ClusterComputeResource
17+
connection: nil
18+
soap: nil
19+
ref: domain-c6564
20+
:host: !ruby/object:RbVmomi::VIM::HostEventArgument
21+
props:
22+
:name: esx1
23+
:host: !ruby/object:RbVmomi::VIM::HostSystem
24+
connection: nil
25+
soap: nil
26+
ref: host-6528
27+
:fullFormattedMessage: ''
28+
:changeTag: ''
29+
:eventTypeId: ''
30+
:arguments: []
31+
:objectId: ha-eventmgr
32+
:objectType: HostSystem
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
--- !ruby/object:RbVmomi::VIM::UserLoginSessionEvent
2+
props:
3+
:key: 13782694
4+
:chainId: 13782694
5+
:createdTime: 2022-10-20 19:05:38.988613000 Z
6+
:userName: root
7+
:fullFormattedMessage: User root logged in as
8+
HTTPClient/1.0 (2.8.3, ruby 2.7.6 (2022-04-12))
9+
:changeTag: ''
10+
:ipAddress: 127.0.0.1
11+
:userAgent: HTTPClient/1.0 (2.8.3, ruby 2.7.6 (2022-04-12))
12+
:locale: en
13+
:sessionId: 52cbdd94-bf4a-ed81-2a2f-698e5bd83fe6
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
--- !ruby/object:RbVmomi::VIM::EventEx
2+
props:
3+
:key: 13784001
4+
:chainId: 13784001
5+
:createdTime: 2022-10-20 19:16:43.173941000 Z
6+
:userName: ''
7+
:datacenter: !ruby/object:RbVmomi::VIM::DatacenterEventArgument
8+
props:
9+
:name: DC1
10+
:datacenter: !ruby/object:RbVmomi::VIM::Datacenter
11+
connection: nil
12+
ref: datacenter-6548
13+
:computeResource: !ruby/object:RbVmomi::VIM::ComputeResourceEventArgument
14+
props:
15+
:name: Cluster1
16+
:computeResource: !ruby/object:RbVmomi::VIM::ClusterComputeResource
17+
connection: nil
18+
soap: nil
19+
ref: domain-c6564
20+
:host: !ruby/object:RbVmomi::VIM::HostEventArgument
21+
props:
22+
:name: esx1
23+
:host: !ruby/object:RbVmomi::VIM::HostSystem
24+
connection: nil
25+
soap: nil
26+
ref: host-6528
27+
:vm: !ruby/object:RbVmomi::VIM::VmEventArgument
28+
props:
29+
:name: event_test
30+
:vm: !ruby/object:RbVmomi::VIM::VirtualMachine
31+
connection: nil
32+
soap: nil
33+
ref: vm-67544
34+
:fullFormattedMessage: Virtual machine event_test in cluster Cluster1 in DC1
35+
is not vSphere HA Protected.
36+
:changeTag: ''
37+
:eventTypeId: com.vmware.vc.HA.VmUnprotectedEvent
38+
:arguments: []
39+
:objectId: vm-67544
40+
:objectType: VirtualMachine
41+
:objectName: event_test
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
--- !ruby/object:RbVmomi::VIM::TaskEvent
2+
props:
3+
:key: 13783975
4+
:chainId: 13783975
5+
:createdTime: 2022-10-20 19:16:30.085025000 Z
6+
:userName: root
7+
:datacenter: !ruby/object:RbVmomi::VIM::DatacenterEventArgument
8+
props:
9+
:name: DC1
10+
:datacenter: !ruby/object:RbVmomi::VIM::Datacenter
11+
connection: nil
12+
soap: nil
13+
ref: datacenter-6548
14+
:computeResource: !ruby/object:RbVmomi::VIM::ComputeResourceEventArgument
15+
props:
16+
:name: Cluster1
17+
:computeResource: !ruby/object:RbVmomi::VIM::ClusterComputeResource
18+
connection: nil
19+
soap: nil
20+
ref: domain-c6564
21+
:host: !ruby/object:RbVmomi::VIM::HostEventArgument
22+
props:
23+
:name: esx1
24+
:host: !ruby/object:RbVmomi::VIM::HostSystem
25+
connection: nil
26+
soap: nil
27+
ref: host-6528
28+
:vm: !ruby/object:RbVmomi::VIM::VmEventArgument
29+
props:
30+
:name: event_test
31+
:vm: !ruby/object:RbVmomi::VIM::VirtualMachine
32+
connection: nil
33+
soap: nil
34+
ref: vm-67544
35+
:fullFormattedMessage: 'Task: Power Off virtual machine'
36+
:changeTag: ''
37+
:info: !ruby/object:RbVmomi::VIM::TaskInfo
38+
props:
39+
:key: task-783502
40+
:task: !ruby/object:RbVmomi::VIM::Task
41+
connection: nil
42+
soap: nil
43+
ref: task-783502
44+
:name: PowerOffVM_Task
45+
:descriptionId: VirtualMachine.powerOff
46+
:entity: !ruby/object:RbVmomi::VIM::VirtualMachine
47+
connection: nil
48+
soap: nil
49+
ref: vm-67544
50+
:entityName: event_test
51+
:locked: []
52+
:state: queued
53+
:cancelled: false
54+
:cancelable: true
55+
:reason: !ruby/object:RbVmomi::VIM::TaskReasonUser
56+
props:
57+
:userName: root
58+
:queueTime: 2022-10-20 19:16:30.084901000 Z
59+
:eventChainId: 0
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
--- !ruby/object:RbVmomi::VIM::TaskEvent
2+
props:
3+
:key: 13784890
4+
:chainId: 13784890
5+
:createdTime: 2022-10-20 19:25:25.308626000 Z
6+
:userName: root
7+
:datacenter: !ruby/object:RbVmomi::VIM::DatacenterEventArgument
8+
props:
9+
:name: DC1
10+
:datacenter: !ruby/object:RbVmomi::VIM::Datacenter
11+
connection: nil
12+
soap: nil
13+
ref: datacenter-6548
14+
:fullFormattedMessage: 'Task: Initialize powering On'
15+
:changeTag: ''
16+
:info: !ruby/object:RbVmomi::VIM::TaskInfo
17+
props:
18+
:key: task-783503
19+
:task: !ruby/object:RbVmomi::VIM::Task
20+
connection: nil
21+
soap: nil
22+
ref: task-783503
23+
:name: PowerOnMultiVM_Task
24+
:descriptionId: Datacenter.powerOnVm
25+
:entity: !ruby/object:RbVmomi::VIM::Datacenter
26+
connection: nil
27+
soap: nil
28+
ref: datacenter-6548
29+
:entityName: DC1
30+
:locked: []
31+
:state: queued
32+
:cancelled: false
33+
:cancelable: true
34+
:reason: !ruby/object:RbVmomi::VIM::TaskReasonUser
35+
props:
36+
:userName: root
37+
:queueTime: 2022-10-20 19:25:25.308277000 Z
38+
:eventChainId: 0
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
require ManageIQ::Providers::Vmware::Engine.root.join("workers/event_catcher/event_parser.rb").to_s
2+
3+
RSpec.describe EventParser do
4+
require "rbvmomi"
5+
6+
context "with a general user event" do
7+
let(:event) { load_event("user_login_session_event") }
8+
9+
it "parses the event" do
10+
expect(described_class.parse_event(event)).to include(
11+
:chain_id => 13_782_694,
12+
:event_type => "UserLoginSessionEvent",
13+
:source => "VC",
14+
:is_task => false,
15+
:message => a_string_including("User root logged in"),
16+
:username => "root",
17+
:full_data => hash_including(
18+
:chainId => 13_782_694,
19+
:changeTag => "",
20+
:key => 13_782_694,
21+
:locale => "en",
22+
:sessionId => "52cbdd94-bf4a-ed81-2a2f-698e5bd83fe6",
23+
:userAgent => "HTTPClient/1.0 (2.8.3, ruby 2.7.6 (2022-04-12))",
24+
:userName => "root"
25+
)
26+
)
27+
end
28+
end
29+
30+
context "with a VM event" do
31+
let(:event) { load_event("virtual_machine_power_off_task_event") }
32+
33+
it "sets vm_ems_ref, vm_name, host_ems_ref, and host_name" do
34+
expect(described_class.parse_event(event)).to include(
35+
:event_type => "PowerOffVM_Task",
36+
:vm_ems_ref => "vm-67544",
37+
:vm_name => "event_test",
38+
:host_ems_ref => "host-6528",
39+
:host_name => "esx1"
40+
)
41+
end
42+
end
43+
44+
context "with an EventEx event" do
45+
context "with an eventTypeId" do
46+
let(:event) { load_event("virtual_machine_event_ex") }
47+
48+
it "sets the event_type to the EventTypeId" do
49+
expect(described_class.parse_event(event)).to include(
50+
:event_type => "com.vmware.vc.HA.VmUnprotectedEvent",
51+
:message => "Virtual machine event_test in cluster Cluster1 in DC1 is not vSphere HA Protected."
52+
)
53+
end
54+
end
55+
56+
context "without an eventTypeId" do
57+
let(:event) { load_event("event_ex") }
58+
59+
it "sets the event_type to EventEx" do
60+
expect(described_class.parse_event(event)).to include(
61+
:event_type => "EventEx",
62+
:message => ""
63+
)
64+
end
65+
end
66+
end
67+
68+
context "with a TaskEvent" do
69+
let(:event) { load_event("virtual_machine_power_on_task_event") }
70+
71+
it "set is_task to true" do
72+
expect(described_class.parse_event(event)).to include(
73+
:is_task => true
74+
)
75+
end
76+
end
77+
78+
# TODO: add events with sourceVm, srcTemplate, destName, destHost
79+
80+
private
81+
82+
def load_event(event_name)
83+
YAML.load_file(event_data_dir.join("#{event_name}.yml"))
84+
end
85+
86+
def event_data_dir
87+
@event_data_dir ||= Pathname.new(__dir__).join("data")
88+
end
89+
end

workers/event_catcher/event_parser.rb

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -42,46 +42,42 @@ def self.parse_event(event)
4242
result[:username] = event.userName if event.userName.present?
4343

4444
# Get the vm information
45-
vm_key = "vm" if event.props.key?("vm")
46-
vm_key = "sourceVm" if event.props.key?("sourceVm")
47-
vm_key = "srcTemplate" if event.props.key?("srcTemplate")
45+
vm_key = :vm if event.props.key?(:vm)
46+
vm_key = :sourceVm if event.props.key?(:sourceVm)
47+
vm_key = :srcTemplate if event.props.key?(:srcTemplate)
4848
if vm_key
49-
vm_data = event.send(vm_key)
50-
51-
result[:vm_ems_ref] = vm_data&.vm if vm_data&.vm
52-
result[:vm_name] = CGI.unescape(vm_data&.name) if vm_data&.name
53-
result[:vm_location] = vm_data&.path if vm_data&.path
54-
result[:vm_uid_ems] = vm_data&.uuid if vm_data&.uuid
55-
56-
result
49+
vm = event.send(vm_key)
50+
if vm
51+
result[:vm_ems_ref] = vm.vm._ref if vm.vm
52+
result[:vm_name] = CGI.unescape(vm.name) if vm.name
53+
end
5754
end
5855

5956
# Get the dest vm information
6057
has_dest = false
6158
if %w[sourceVm srcTemplate].include?(vm_key)
62-
vm_data = event.vm
63-
if vm_data
64-
result[:dest_vm_ems_ref] = vm_data&.vm if vm_data&.vm
65-
result[:dest_vm_name] = CGI.unescape(vm_data&.name) if vm_data&.name
66-
result[:dest_vm_location] = vm_data&.path if vm_data&.path
59+
vm = event.vm
60+
if vm
61+
result[:dest_vm_ems_ref] = vm.vm._ref if vm.vm
62+
result[:dest_vm_name] = CGI.unescape(vm.name) if vm.name
6763
end
6864

6965
has_dest = true
70-
elsif event.props.key?("destName")
66+
elsif event.props.key?(:destName)
7167
result[:dest_vm_name] = event.destName
7268
has_dest = true
7369
end
7470

7571
if event.props.key?(:host)
7672
result[:host_name] = event.host.name
77-
result[:host_ems_ref] = event.host.host
73+
result[:host_ems_ref] = event.host.host._ref
7874
end
7975

8076
if has_dest
81-
host_data = event.props["destHost"] || event.props["host"]
77+
host_data = event.props[:destHost] || event.props[:host]
8278
if host_data
83-
result[:dest_host_ems_ref] = host_data["host"]
84-
result[:dest_host_name] = host_data["name"]
79+
result[:dest_host_ems_ref] = host_data[:host]
80+
result[:dest_host_name] = host_data[:name]
8581
end
8682
end
8783

0 commit comments

Comments
 (0)