class Tengine::Resource::Watcher
Attributes
config[R]
pid[R]
Public Class Methods
new(argv = [])
click to toggle source
# File lib/tengine/resource/watcher.rb, line 16 def initialize(argv = []) @config = Tengine::Resource::Config::Resource.parse(argv) @pid = sprintf("process:%s/%d", ENV["MM_SERVER_NAME"], Process.pid) @mq_config = config[:event_queue].to_hash @mq_config[:sender] = { :keep_connection => true } @daemonize_options = { :app_name => 'tengine_resource_watchd', :ARGV => [config[:action]], :ontop => !config[:process][:daemon], # :monitor => true, :multiple => true, :dir_mode => :normal, :dir => File.expand_path(config[:process][:pid_dir]), } # 必要なディレクトリの生成 FileUtils.mkdir_p(File.expand_path(config[:process][:pid_dir])) Tengine::Core::MethodTraceable.disabled = !config[:verbose] rescue Exception puts "[#{$!.class.name}] #{$!.message}\n " << $!.backtrace.join("\n ") raise end
Public Instance Methods
find_providers()
click to toggle source
# File lib/tengine/resource/watcher.rb, line 123 def find_providers providers = Tengine::Resource::Provider.all begin result = providers.to_a raise ConfigurationError, "no provider found" if result.empty? return result rescue NameError => e raise e unless e.message =~ /uninitialized constant/ documents = Mongoid.default_session.collections. detect{|c| c.name.to_s == Tengine::Resource::Provider.collection_name.to_s}.find types = documents.map{|d| d['_type']} undefined_type_names = types.select do |t| begin t.constantize false rescue Exception true end end raise ConfigurationError, "provider class not found: " << undefined_type_names.join(", ") end end
mq_suite()
click to toggle source
# File lib/tengine/resource/watcher.rb, line 40 def mq_suite @mq_suite ||= Tengine::Mq::Suite.new(@mq_config) Tengine::Event.mq_suite = @mq_suite end
run(__file__)
click to toggle source
# File lib/tengine/resource/watcher.rb, line 50 def run(__file__) case config[:action].to_sym when :start start_daemon(__file__) when :stop stop_daemon(__file__) when :restart stop_daemon(__file__) start_daemon(__file__) end end
sender()
click to toggle source
# File lib/tengine/resource/watcher.rb, line 45 def sender @sender ||= Tengine::Event::Sender.new(mq_suite) Tengine::Event.default_sender = @sender end
shutdown()
click to toggle source
# File lib/tengine/resource/watcher.rb, line 116 def shutdown EM.run do EM.cancel_timer @periodic if @periodic sender.stop end end
start()
click to toggle source
# File lib/tengine/resource/watcher.rb, line 75 def start @config.setup_loggers # observerの登録 Mongoid.observers = Tengine::Resource::Observer Mongoid.instantiate_observers Mongoid.configure do |c| c.send :load_configuration, @config[:db] end EM.run do sender.wait_for_connection do providers = find_providers providers.each do |provider| provider.retry_on_error = true if provider.respond_to?(:retry_on_error=) # polling_intervalが 0 以下の場合は、問い合わせを行わない if (polling_interval = provider.polling_interval) > 0 # 仮想サーバタイプの監視 provider.synchronize_virtual_server_types name = "#{provider.name}@#{self.class}" # Tengine::Core::Mutexをnameに対して固有のObjectIdを設定します。 Tengine::Core::Mutex::Mutex.add_static_bson_objectid(name, provider.id) mutex = Tengine::Core::Mutex.new(name, provider.polling_interval) @periodic = EM.add_periodic_timer(provider.polling_interval) do mutex.synchronize do # 物理サーバの監視 provider.synchronize_physical_servers mutex.heartbeat # 仮想サーバの監視 provider.synchronize_virtual_servers mutex.heartbeat # 仮想サーバイメージの監視 provider.synchronize_virtual_server_images end end end end end end end
start_daemon(__file__)
click to toggle source
# File lib/tengine/resource/watcher.rb, line 62 def start_daemon(__file__) fname = File.basename __file__ cwd = Dir.getwd Daemons.run_proc(fname, @daemonize_options) do Dir.chdir(cwd) { self.start } end end
stop_daemon(__file__)
click to toggle source
# File lib/tengine/resource/watcher.rb, line 70 def stop_daemon(__file__) fname = File.basename __file__ Daemons.run_proc(fname, @daemonize_options) end