From 3936017df18bff9020eea52c0b39191c7c3fdde6 Mon Sep 17 00:00:00 2001
From: felipedf <felipe.diogenes13@gmail.com>
Date: Tue, 3 Jul 2018 11:41:55 -0300
Subject: [PATCH] Parsing physical_swtich_id and physical_chassis_id into
 events

---
 .../physical_infra_manager/event_parser.rb    | 93 ++++++++++++-------
 .../event_parser_spec.rb                      | 69 +++++++++++---
 2 files changed, 115 insertions(+), 47 deletions(-)

diff --git a/app/models/manageiq/providers/lenovo/physical_infra_manager/event_parser.rb b/app/models/manageiq/providers/lenovo/physical_infra_manager/event_parser.rb
index b3258aaf1e..24ee21da6e 100755
--- a/app/models/manageiq/providers/lenovo/physical_infra_manager/event_parser.rb
+++ b/app/models/manageiq/providers/lenovo/physical_infra_manager/event_parser.rb
@@ -1,38 +1,65 @@
 module ManageIQ::Providers::Lenovo::PhysicalInfraManager::EventParser
-  def self.event_to_hash(data, ems_id)
-    event = filter_data(data)
-    event_hash = {
-      :event_type         => event[:event_type],
-      :ems_ref            => event[:ems_ref],
-      :source             => event[:source],
-      :physical_server_id => get_physical_server_id(event[:component_id]),
-      :message            => event[:message],
-      :timestamp          => event[:timestamp],
-      :full_data          => event,
-      :ems_id             => ems_id
-    }
-    event_hash
-  end
+  CHASSIS = 'Chassis'.freeze
+  SERVER  = %w(Node Power Processor System).freeze
+  SWITCH  = 'Switch'.freeze
 
-  def self.filter_data(data)
-    {
-      :component_id   => data.componentID,
-      :component_type => data.typeText,
-      :event_type     => data.msgID,
-      :ems_ref        => data.cn,
-      :message        => data.msg,
-      :parent_uuid    => data.senderUUID,
-      :parent_name    => data.systemName,
-      :parent_model   => data.systemTypeModelText,
-      :parent_type    => data.systemTypeText,
-      :severity_id    => data.severity,
-      :severity       => data.severityText,
-      :source         => 'LenovoXclarity',
-      :timestamp      => data.timeStamp,
-    }
-  end
+  class << self
+    def event_to_hash(data, ems_id)
+      event = filter_data(data)
+      event_hash = {
+        :event_type => event[:event_type],
+        :ems_ref    => event[:ems_ref],
+        :source     => event[:source],
+        :message    => event[:message],
+        :timestamp  => event[:timestamp],
+        :full_data  => event,
+        :ems_id     => ems_id
+      }
+
+      event_hash.merge!(event_resources(event))
+    end
+
+    def filter_data(data)
+      {
+        :component_id   => data.componentID,
+        :component_type => data.typeText,
+        :event_type     => data.msgID,
+        :ems_ref        => data.cn,
+        :message        => data.msg,
+        :parent_uuid    => data.sourceID,
+        :parent_name    => data.systemName,
+        :parent_model   => data.systemTypeModelText,
+        :parent_type    => data.systemTypeText,
+        :severity_id    => data.severity,
+        :severity       => data.severityText,
+        :source         => 'LenovoXclarity',
+        :timestamp      => data.timeStamp,
+      }
+    end
+
+
+    private
+
+    def event_resources(event)
+      event_resources = {}
+
+      if event[:parent_type] == CHASSIS
+        event_resources[:physical_chassis_id] = get_resource_id(PhysicalChassis, event[:parent_uuid])
+      end
+
+      if event[:component_type] == SWITCH
+        event_resources[:physical_switch_id] = get_resource_id(PhysicalSwitch, event[:component_id])
+      elsif SERVER.include?(event[:component_type])
+        event_resources[:physical_server_id] = get_resource_id(PhysicalServer, event[:component_id])
+      else
+        $log.error("The event of type #{event[:component_type]} is not supported")
+      end
+
+      event_resources
+    end
 
-  def self.get_physical_server_id(ems_ref)
-    PhysicalServer.find_by(:ems_ref => ems_ref).try(:id)
+    def get_resource_id(resource, uid_ems)
+      resource.find_by(:uid_ems => uid_ems).try(:id)
+    end
   end
 end
diff --git a/spec/models/manageiq/providers/lenovo/physical_infra_manager/event_parser_spec.rb b/spec/models/manageiq/providers/lenovo/physical_infra_manager/event_parser_spec.rb
index d3aad188d1..fe646dd310 100644
--- a/spec/models/manageiq/providers/lenovo/physical_infra_manager/event_parser_spec.rb
+++ b/spec/models/manageiq/providers/lenovo/physical_infra_manager/event_parser_spec.rb
@@ -3,24 +3,65 @@
 describe ManageIQ::Providers::Lenovo::PhysicalInfraManager::EventParser do
   let(:event_attrs1) do
     {
-      :msgID              => 1,
-      :source             => "LenovoXclarity",
-      :msg                => "This is a test event.",
-      :timeStamp          => "2017-04-26T13:55:49.749552",
-      :physical_server_id => "",
-      :to_hash            => "",
-      :ems_id             => 3
+      :msgID       => 1,
+      :source      => 'LenovoXclarity',
+      :msg         => 'This is a test event.',
+      :timeStamp   => '2017-04-26T13:55:49.749552',
+      :typeText    => 'Switch',
+      :componentID => 'FFFFFFFFFFFFFFFFFFFFFFFF',
+      :to_hash     => '',
+      :ems_id      => 3,
     }
   end
 
+  let(:event_attrs2) do
+    {
+      :msgID          => 1,
+      :source         => 'LenovoXclarity',
+      :sourceID       => 'AAAAAAAAAAAAAAAAAAAAAAA',
+      :msg            => 'This is also a test event.',
+      :timeStamp      => '2018-07-11T13:55:49.749552',
+      :typeText       => 'Power',
+      :systemTypeText => 'Chassis',
+      :componentID    => '00FF00FF00FF00FF00FF00FF',
+      :to_hash        => '',
+      :ems_id         => 3,
+    }
+  end
+
+  let(:physical_chassis) { FactoryGirl.create(:physical_chassis, :uid_ems => 'AAAAAAAAAAAAAAAAAAAAAAA') }
+
   let(:event1) { XClarityClient::Event.new(event_attrs1) }
+  let(:physical_switch) { FactoryGirl.create(:physical_switch, :uid_ems => 'FFFFFFFFFFFFFFFFFFFFFFFF') }
+
+  let(:event2) { XClarityClient::Event.new(event_attrs2) }
+  let(:physical_server) { FactoryGirl.create(:physical_server, :uid_ems => '00FF00FF00FF00FF00FF00FF') }
+
+  context 'events are parsed' do
+    it 'should belong to a switch' do
+      physical_switch
+      event_hash = described_class.event_to_hash(event1, 3)
+      expect(event_hash[:event_type]).to eq(1)
+      expect(event_hash[:source]).to eq('LenovoXclarity')
+      expect(event_hash[:message]).to eq('This is a test event.')
+      expect(event_hash[:timestamp]).to eq('2017-04-26T13:55:49.749552')
+      expect(event_hash[:physical_server_id]).to be_nil
+      expect(event_hash[:physical_switch_id]).to eq(physical_switch.id)
+      expect(event_hash[:ems_id]).to eq(3)
+    end
 
-  it 'will parse events' do
-    event_hash = described_class.event_to_hash(event1, 3)
-    expect(event_hash[:event_type]).to eq(1)
-    expect(event_hash[:source]).to eq("LenovoXclarity")
-    expect(event_hash[:message]).to eq("This is a test event.")
-    expect(event_hash[:timestamp]).to eq("2017-04-26T13:55:49.749552")
-    expect(event_hash[:ems_id]).to eq(3)
+    it 'should belong to a server' do
+      physical_server
+      physical_chassis
+      event_hash = described_class.event_to_hash(event2, 3)
+      expect(event_hash[:event_type]).to eq(1)
+      expect(event_hash[:source]).to eq('LenovoXclarity')
+      expect(event_hash[:message]).to eq('This is also a test event.')
+      expect(event_hash[:timestamp]).to eq('2018-07-11T13:55:49.749552')
+      expect(event_hash[:physical_chassis_id]).to eq(physical_chassis.id)
+      expect(event_hash[:physical_server_id]).to eq(physical_server.id)
+      expect(event_hash[:physical_switch_id]).to be_nil
+      expect(event_hash[:ems_id]).to eq(3)
+    end
   end
 end