Skip to content

Commit

Permalink
Merge pull request #15073 from agrare/euwe_new_folder_targeted_refresh
Browse files Browse the repository at this point in the history
[EUWE] New folder targeted refresh
  • Loading branch information
simaishi authored May 23, 2017
2 parents 500a574 + a76a1cb commit 2b92a6f
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 17 deletions.
2 changes: 1 addition & 1 deletion app/models/ems_refresh.rb
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ def self.refresh(target, id = nil)
def self.refresh_new_target(target_hash, ems_id)
ems = ExtManagementSystem.find(ems_id)

target = save_new_target(target_hash)
target = save_new_target(ems, target_hash)
if target.nil?
_log.warn "Unknown target for event data: #{target_hash}."
return
Expand Down
7 changes: 4 additions & 3 deletions app/models/ems_refresh/save_inventory.rb
Original file line number Diff line number Diff line change
Expand Up @@ -313,15 +313,14 @@ def save_event_logs_inventory(os, hashes)
save_inventory_multi(os.event_logs, hashes, :use_association, [:uid])
end

def save_new_target(target_hash)
unless target_hash[:vm].nil?
def save_new_target(ems, target_hash)
if target_hash[:vm]
vm_hash = target_hash[:vm]
existing_vm = VmOrTemplate.find_by(:ems_ref => vm_hash[:ems_ref], :ems_id => target_hash[:ems_id])
unless existing_vm.nil?
return existing_vm
end

ems = ExtManagementSystem.find_by_id(target_hash[:ems_id])
old_cluster = get_cluster(ems, target_hash[:cluster], target_hash[:resource_pools], target_hash[:folders])

vm_hash[:ems_cluster_id] = old_cluster[:id]
Expand All @@ -338,6 +337,8 @@ def save_new_target(target_hash)
resource_pool.save!

new_vm
elsif target_hash[:folder]
ems.ems_folders.create!(target_hash[:folder])
end
end
end
2 changes: 1 addition & 1 deletion app/models/ems_refresh/save_inventory_infra.rb
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ def save_ems_infra_inventory(ems, hashes, target = nil)
log_header = "EMS: [#{ems.name}], id: [#{ems.id}]"

# Check if the data coming in reflects a complete removal from the ems
if hashes.blank? || (hashes[:hosts].blank? && hashes[:vms].blank? && hashes[:storages].blank?)
if hashes.blank? || (hashes[:hosts].blank? && hashes[:vms].blank? && hashes[:storages].blank? && hashes[:folders].blank?)
target.disconnect_inv
return
end
Expand Down
35 changes: 23 additions & 12 deletions app/models/miq_vim_broker_worker/runner.rb
Original file line number Diff line number Diff line change
Expand Up @@ -149,20 +149,30 @@ def drain_event
event = @queue.deq
return if event.nil?

ems_id = ems_ids_for_notify(event[:server], event[:username])
return if ems_id.nil?

method = "on_#{event[:op].to_s.underscore}_event"
send(method, event) if self.respond_to?(method)
send(method, ems_id, event) if respond_to?(method)
end

def on_notify_event(event)
ems_id = ems_ids_for_notify(event[:server], event[:username])
return if ems_id.nil?
_log.info("Queueing update for EMS id: [#{ems_id}] on event [#{event[:objType]}-#{event[:op]}]#{" for properties: #{event[:changedProps].inspect}" if event.key?(:changedProps)}")
EmsRefresh.queue_vc_update(ems_id, event)
def on_create_event(ems_id, event)
target_hash = ManageIQ::Providers::Vmware::InfraManager::EventParser.obj_update_to_hash(event)
if target_hash.nil?
_log.debug("Ignoring refresh for EMS id: [#{ems_id}] on event [#{event[:objType]}-create]")
else
ems = ExtManagementSystem.find(ems_id)
EmsRefresh.queue_refresh_new_target(target_hash, ems)
end
end

def on_delete_event(ems_id, event)
# TODO: Implement
_log.debug("Ignoring refresh for EMS id: [#{ems_id}] on event [#{event[:objType]}-delete]")
nil
end
alias_method :on_create_event, :on_notify_event
alias_method :on_delete_event, :on_notify_event

def on_update_event(event)
def on_update_event(ems_id, event)
obj_type, changed_props, change_set = event.values_at(:objType, :changedProps, :changeSet)

type, = EmsRefresh::VcUpdates::OBJ_TYPE_TO_TYPE_AND_CLASS[obj_type]
Expand All @@ -178,15 +188,16 @@ def on_update_event(event)

return if changed_props.empty?

on_notify_event(event)
_log.info("Queueing update for EMS id: [#{ems_id}] on event [#{event[:objType]}-#{event[:op]}]#{" for properties: #{event[:changedProps].inspect}" if event.key?(:changedProps)}")
EmsRefresh.queue_vc_update(ems_id, event)
end

def on_miq_vim_removed_event(event)
def on_miq_vim_removed_event(ems_id, event)
return unless event[:op] == 'MiqVimRemoved'

_log.info("#{log_prefix} Attempting to reconnect broker for EMS with address: [#{event[:server]}] due to error: #{event[:error]}")

ems = ManageIQ::Providers::Vmware::InfraManager.with_hostname(event[:server]).first
ems = ManageIQ::Providers::Vmware::InfraManager.find(ems_id)
if ems.nil?
_log.error "#{log_prefix} Unable to find EMS with address: [#{event[:server]}]"
return
Expand Down
28 changes: 28 additions & 0 deletions spec/models/miq_vim_broker_worker/runner_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,34 @@
expect(q.args).to eq([@ems.id, event])
end

it "will handle create events properly" do
event = {
:server => @ems.address,
:username => @ems.authentication_userid,
:objType => "Folder",
:op => "create",
:mor => "group-v123"
}

expected_folder_hash = {
:folder => {
:type => "EmsFolder",
:ems_ref => "group-v123",
:ems_ref_obj => "group-v123",
:uid_ems => "group-v123"
}
}

@vim_broker_worker.instance_variable_get(:@queue).enq(event.dup)

@vim_broker_worker.drain_event
expect(MiqQueue.count).to eq(1)
q = MiqQueue.first
expect(q.class_name).to eq("EmsRefresh")
expect(q.method_name).to eq("refresh_new_target")
expect(q.args).to eq([expected_folder_hash, @ems.id])
end

it "will ignore updates to unknown properties" do
vm = FactoryGirl.create(:vm_with_ref, :ext_management_system => @ems)
@vim_broker_worker.instance_variable_get(:@queue).enq(:server => @ems.address,
Expand Down

0 comments on commit 2b92a6f

Please sign in to comment.