@@ -115,18 +115,92 @@ def wait_for_updates(vim, &block)
115115
116116 def parse_event ( event )
117117 event_type = event . class . wsdl_name
118+ is_task = event_type == "TaskEvent"
119+
120+ if is_task
121+ sub_event_type = event . info &.name
122+
123+ # Handle special cases
124+ case sub_event_type
125+ when nil
126+ # Handle cases wehre event name is missing
127+ sub_event_type = "PowerOnVM_Task" if event . fullFormattedMessage . to_s . downcase == "task: power on virtual machine"
128+ sub_event_type ||= "DrsMigrateVM_Task" if event . info &.descriptionId == "Drm.ExecuteVMotionLRO"
129+ if sub_event_type . nil?
130+ puts "Event Type cannot be determined for TaskEvent. Using generic eventType [TaskEvent] instead"
131+ sub_event_type = "TaskEvent"
132+ end
133+ when "Rename_Task" , "Destroy_Task"
134+ # Handle case where event name is overloaded
135+ sub_event_name = event . info . descriptionId . split ( "." ) . first
136+ sub_event_name = "VM" if sub_event_name == "VirtualMachine"
137+ sub_event_name = "Cluster" if sub_event_name == "ClusterComputeResource"
138+ sub_event_type . gsub! ( /_/ , "#{ sub_event_name } _" )
139+ end
140+
141+ event_type = sub_event_type
142+ elsif event_type == "EventEx"
143+ sub_event_type = event . eventTypeId
144+ event_type = sub_event_type if sub_event_type . present?
145+ end
118146
119147 result = {
120148 :ems_id => ems_id ,
121149 :event_type => event_type ,
122150 :chain_id => event . chainId ,
123- :is_task => event_type == "TaskEvent" ,
151+ :is_task => is_task ,
124152 :source => "VC" ,
125153 :message => event . fullFormattedMessage ,
126154 :timestamp => event . createdTime ,
127155 :full_data => event . props
128156 }
129157
158+ result [ :username ] = event . userName if event . userName . present?
159+
160+ # Get the vm information
161+ vm_key = "vm" if event . props . key? ( "vm" )
162+ vm_key = "sourceVm" if event . props . key? ( "sourceVm" )
163+ vm_key = "srcTemplate" if event . props . key? ( "srcTemplate" )
164+ if vm_key
165+ vm_data = event . send ( vm_key )
166+
167+ result [ :vm_ems_ref ] = vm_data &.vm if vm_data &.vm
168+ result [ :vm_name ] = CGI . unescape ( vm_data &.name ) if vm_data &.name
169+ result [ :vm_location ] = vm_data &.path if vm_data &.path
170+ result [ :vm_uid_ems ] = vm_data &.uuid if vm_data &.uuid
171+
172+ result
173+ end
174+
175+ # Get the dest vm information
176+ has_dest = false
177+ if %w[ sourceVm srcTemplate ] . include? ( vm_key )
178+ vm_data = event . vm
179+ if vm_data
180+ result [ :dest_vm_ems_ref ] = vm_data &.vm if vm_data &.vm
181+ result [ :dest_vm_name ] = CGI . unescape ( vm_data &.name ) if vm_data &.name
182+ result [ :dest_vm_location ] = vm_data &.path if vm_data &.path
183+ end
184+
185+ has_dest = true
186+ elsif event . props . key? ( "destName" )
187+ result [ :dest_vm_name ] = event . destName
188+ has_dest = true
189+ end
190+
191+ if event . props . key? ( :host )
192+ result [ :host_name ] = event . host . name
193+ result [ :host_ems_ref ] = event . host . host
194+ end
195+
196+ if has_dest
197+ host_data = event . props [ "destHost" ] || event . props [ "host" ]
198+ if host_data
199+ result [ :dest_host_ems_ref ] = host_data [ "host" ]
200+ result [ :dest_host_name ] = host_data [ "name" ]
201+ end
202+ end
203+
130204 result
131205 end
132206
@@ -142,15 +216,13 @@ def publish_events(events)
142216 end
143217
144218 def messaging_client
145- @messaging_client ||= begin
146- ManageIQ ::Messaging ::Client . open (
147- :host => messaging_host ,
148- :port => messaging_port ,
149- :protocol => :Kafka ,
150- :encoding => "json" ,
151- :client_ref => "vmware-event-catcher-#{ ems_id } "
152- )
153- end
219+ @messaging_client ||= ManageIQ ::Messaging ::Client . open (
220+ :host => messaging_host ,
221+ :port => messaging_port ,
222+ :protocol => :Kafka ,
223+ :encoding => "json" ,
224+ :client_ref => "vmware-event-catcher-#{ ems_id } "
225+ )
154226 end
155227
156228 def notify_started
0 commit comments