lib/klogger.rb in klogger-1.7.0 vs lib/klogger.rb in klogger-2.0.0
- old
+ new
@@ -1,6 +1,7 @@
require 'logger'
+require 'pathname'
require 'psych'
require 'killbill'
require 'klogger/base'
@@ -18,71 +19,114 @@
module Klogger
class KloggerPlugin < Killbill::Plugin::Notification
def initialize(*args)
super(*args)
- @enabled_modules = []
+
+ @config_key_name = "PLUGIN_CONFIG_killbill-logger".to_sym
+ @enabled_modules = {}
end
def start_plugin
- configure_modules
- @enabled_modules.each do |m|
- begin
- m.start_plugin
- rescue => e
- @logger.warn "Unable to start module #{m.class}: #{e.message}"
- end
- end
-
super
+ @global_config = global_configuration
@logger.info "Klogger::KloggerPlugin started"
end
def on_event(event)
- @enabled_modules.each do |m|
- begin
- m.on_event(event)
- rescue => e
- @logger.warn "Unable to send event to module #{m.class}: #{e.message}"
- end
+ tenant_id = tenant(event)
+
+ if (event.event_type == :TENANT_CONFIG_CHANGE || event.event_type == :TENANT_CONFIG_DELETION) &&
+ event.meta_data.to_sym == @config_key_name
+ @enabled_modules[tenant_id] = nil
end
+ configure_modules(tenant_id) if @enabled_modules[tenant_id].nil?
+
+ dispatch_event(event, tenant_id)
end
def stop_plugin
super
- @enabled_modules.each do |m|
- begin
- m.stop_plugin
- rescue => e
- @logger.warn "Unable to stop module #{m.class}: #{e.message}"
- end
- end
-
+ @enabled_modules.keys.each { |kb_tenant_id| stop_modules(kb_tenant_id) }
@logger.info "Klogger::KloggerPlugin stopped"
end
private
- def configure_modules
- # Parse the config file
- begin
- @config = Psych.load_file("#{@conf_dir}/klogger.yml")
- rescue Errno::ENOENT
- @logger.warn "Unable to find the config file #{@conf_dir}/klogger.yml"
- return
- end
+ def configure_modules(kb_tenant_id)
+ @enabled_modules[kb_tenant_id] ||= []
+ stop_modules(kb_tenant_id)
+
+ tenant_config = @global_config.merge(tenant_configuration(kb_tenant_id))
+
# Instantiate each module
- @config.each do |kmodule, config|
+ tenant_config.each do |kmodule, config|
next unless config[:enabled]
module_klass = MODULES[kmodule.to_sym]
next unless module_klass
- @logger.info "Module #{module_klass} enabled"
- @enabled_modules << module_klass.send('new', config, @logger)
+ @logger.info "Module #{module_klass} enabled for tenant #{kb_tenant_id}"
+ @enabled_modules[kb_tenant_id] << module_klass.send('new', config, @logger)
end
+
+ start_modules(kb_tenant_id)
+ end
+
+ def tenant_configuration(kb_tenant_id)
+ return {} if kb_tenant_id.nil? || kb_tenant_id == :monotenant
+ context = @kb_apis.create_context(kb_tenant_id)
+ values = @kb_apis.tenant_user_api.get_tenant_values_for_key(@config_key_name, context)
+ values && values[0] ? Psych.load(values[0]) : {}
+ end
+
+ def global_configuration
+ config_file = "#{@conf_dir}/klogger.yml"
+ return {} unless Pathname.new(config_file).file?
+
+ begin
+ Psych.load_file(config_file)
+ rescue
+ @logger.warn "Unable to parse the config file #{config_file}"
+ {}
+ end
+ end
+
+ def dispatch_event(event, kb_tenant_id)
+ @enabled_modules[kb_tenant_id].each do |m|
+ begin
+ m.on_event(event)
+ rescue => e
+ @logger.warn "Unable to send event to module #{m.class}: #{e.message}"
+ end
+ end
+ end
+
+ def start_modules(kb_tenant_id)
+ @enabled_modules[kb_tenant_id].each do |m|
+ begin
+ m.start_plugin
+ rescue => e
+ @logger.warn "Unable to start module #{m.class}: #{e.message}"
+ end
+ end
+ end
+
+ def stop_modules(kb_tenant_id)
+ @enabled_modules[kb_tenant_id].each do |m|
+ begin
+ m.stop_plugin
+ rescue => e
+ @logger.warn "Unable to stop module #{m.class}: #{e.message}"
+ end
+ end
+ @enabled_modules[kb_tenant_id] = []
+ end
+
+ def tenant(event)
+ event.tenant_id.nil? ? :monotenant : event.tenant_id
end
end
end