right_infrastructure_agent 1.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +10 -0
- data/README.rdoc +65 -0
- data/Rakefile +86 -0
- data/lib/right_infrastructure_agent.rb +26 -0
- data/lib/right_infrastructure_agent/command_constants.rb +34 -0
- data/lib/right_infrastructure_agent/global_object_replicator_sink.rb +337 -0
- data/lib/right_infrastructure_agent/global_object_replicator_source.rb +117 -0
- data/lib/right_infrastructure_agent/infrastructure_auth_client.rb +88 -0
- data/lib/right_infrastructure_agent/infrastructure_helpers.rb +85 -0
- data/lib/right_infrastructure_agent/login_policy_factory.rb +137 -0
- data/lib/right_infrastructure_agent/models_helper.rb +483 -0
- data/lib/right_infrastructure_agent/rainbows_agent_controller.rb +192 -0
- data/lib/right_infrastructure_agent/scripts/infrastructure_agent_deployer.rb +278 -0
- data/right_infrastructure_agent.gemspec +54 -0
- data/spec/global_object_replicator_sink_spec.rb +305 -0
- data/spec/global_object_replicator_source_spec.rb +113 -0
- data/spec/infrastructure_auth_client_spec.rb +140 -0
- data/spec/infrastructure_helpers_spec.rb +80 -0
- data/spec/login_policy_factory_spec.rb +279 -0
- data/spec/models_helper_spec.rb +546 -0
- data/spec/spec.opts +2 -0
- data/spec/spec_helper.rb +85 -0
- metadata +116 -0
@@ -0,0 +1,192 @@
|
|
1
|
+
# Copyright (c) 2009-2014 RightScale, Inc, All Rights Reserved Worldwide.
|
2
|
+
#
|
3
|
+
# THIS PROGRAM IS CONFIDENTIAL AND PROPRIETARY TO RIGHTSCALE
|
4
|
+
# AND CONSTITUTES A VALUABLE TRADE SECRET. Any unauthorized use,
|
5
|
+
# reproduction, modification, or disclosure of this program is
|
6
|
+
# strictly prohibited. Any use of this program by an authorized
|
7
|
+
# licensee is strictly subject to the terms and conditions,
|
8
|
+
# including confidentiality obligations, set forth in the applicable
|
9
|
+
# License Agreement between RightScale.com, Inc. and the licensee.
|
10
|
+
|
11
|
+
require 'monitor'
|
12
|
+
|
13
|
+
module RightScale
|
14
|
+
|
15
|
+
# Controller for running an agent in a Rainbows Rails environment
|
16
|
+
# Dependent upon existing base configuration file for agents of the given type
|
17
|
+
module RainbowsAgentController
|
18
|
+
|
19
|
+
class NoConfigurationData < StandardError; end
|
20
|
+
|
21
|
+
FORCED_OPTIONS = {
|
22
|
+
:format => :secure,
|
23
|
+
:daemonize => false
|
24
|
+
}
|
25
|
+
|
26
|
+
@worker_index = nil
|
27
|
+
|
28
|
+
# Rainbows worker index
|
29
|
+
#
|
30
|
+
# @return [Integer] 0-based worker index
|
31
|
+
def self.worker_index
|
32
|
+
@worker_index
|
33
|
+
end
|
34
|
+
|
35
|
+
# Start agent and create error tracker for its use
|
36
|
+
# Choose agent type from candidate types based on contents of configuration directory
|
37
|
+
# Assign agent name by using worker index to suffix agent type
|
38
|
+
#
|
39
|
+
# @param [Array] agent_types for candidate agents
|
40
|
+
# @param [Integer] worker_index for this rainbows worker process; 0-based
|
41
|
+
# @param [Object] logger to use
|
42
|
+
#
|
43
|
+
# @option options [String] :cfg_dir containing configuration for all agents
|
44
|
+
# @option options [String] :prefix to build agent identity
|
45
|
+
# @option options [String, Integer] :base_id to build agent identity, defaults to worker_index + 1
|
46
|
+
#
|
47
|
+
# @yield [] Invoked immediately prior to storing configuration receiving one parameter containing
|
48
|
+
# the configuration hash and returning the updated configuration hash, optional
|
49
|
+
#
|
50
|
+
# @return [TrueClass] always true
|
51
|
+
def self.start(agent_types, worker_index, logger, options = {}, &block)
|
52
|
+
RightSupport::Log::Mixin.default_logger = logger
|
53
|
+
Log.force_logger(logger) if logger
|
54
|
+
@worker_index = worker_index
|
55
|
+
agent_name = nil
|
56
|
+
|
57
|
+
# Need next_tick here to wait for rainbows worker to start EventMachine
|
58
|
+
EM.next_tick do
|
59
|
+
begin
|
60
|
+
AgentConfig.cfg_dir = options[:cfg_dir]
|
61
|
+
agent_type = pick_agent_type(agent_types)
|
62
|
+
raise NoConfigurationData, "Deployment is missing configuration file for any agents of type " +
|
63
|
+
"#{agent_types.inspect} in #{AgentConfig.cfg_dir}; need to run rad!" unless agent_type
|
64
|
+
|
65
|
+
# Configure agent
|
66
|
+
agent_name = form_agent_name(agent_type, worker_index)
|
67
|
+
cfg = configure_agent(agent_type, agent_name, worker_index, options, &block)
|
68
|
+
cfg.merge!(options.merge(FORCED_OPTIONS))
|
69
|
+
cfg[:agent_name] = agent_name
|
70
|
+
|
71
|
+
require File.expand_path(File.join(AgentConfig.lib_dir, 'router_agent')) if agent_type == "router"
|
72
|
+
|
73
|
+
# Initialize error tracking
|
74
|
+
agent_class = (agent_type == "router") ? RouterAgent : InfrastructureAgent
|
75
|
+
trace_level = defined?(agent_class::TRACE_LEVEL) ? agent_class::TRACE_LEVEL : {}
|
76
|
+
filter_params = defined?(agent_class::FILTER_PARAMS) ? agent_class::FILTER_PARAMS : {}
|
77
|
+
tracker_options = {:shard_id => cfg[:shard_id], :trace_level => trace_level, :filter_params => filter_params}
|
78
|
+
if (endpoint = cfg[:airbrake_endpoint]) && (api_key = cfg[:airbrake_api_key])
|
79
|
+
tracker_options[:airbrake_endpoint] = endpoint
|
80
|
+
tracker_options[:airbrake_api_key] = api_key
|
81
|
+
elsif defined?(Skeletor) && Skeletor::Deployer.config["error_handling"].respond_to?(:[]) &&
|
82
|
+
(endpoint = Skeletor::Deployer.config["error_handling"]["airbrake_endpoint"]) &&
|
83
|
+
(api_key = Skeletor::Deployer.config["error_handling"]["airbrake_api_key"])
|
84
|
+
tracker_options[:airbrake_endpoint] = endpoint
|
85
|
+
tracker_options[:airbrake_api_key] = api_key
|
86
|
+
end
|
87
|
+
ErrorTracker.init(self, agent_name, tracker_options)
|
88
|
+
|
89
|
+
# Start the agent
|
90
|
+
Log.info("Starting #{agent_name} agent with the following options:")
|
91
|
+
cfg.inject([]) do |t, (k, v)|
|
92
|
+
t << "- #{k}: #{k.to_s =~ /pass|auth/ ? "<hidden>" : (v.respond_to?(:each) ? v.inspect : v)}"
|
93
|
+
end.sort.each { |l| Log.info(l) }
|
94
|
+
@agent = agent_class.start(cfg)
|
95
|
+
|
96
|
+
rescue PidFile::AlreadyRunning
|
97
|
+
Log.error("#{agent_name} already running") rescue nil
|
98
|
+
EM.stop
|
99
|
+
rescue NoConfigurationData => e
|
100
|
+
Log.error(e.message) rescue nil
|
101
|
+
ErrorTracker.notify(e, nil, self, self)
|
102
|
+
EM.stop
|
103
|
+
rescue Exception => e
|
104
|
+
Log.error("Failed to start #{agent_name} agent", e, :trace) rescue nil
|
105
|
+
ErrorTracker.notify(e, nil, self, self)
|
106
|
+
EM.stop
|
107
|
+
end
|
108
|
+
end
|
109
|
+
true
|
110
|
+
end
|
111
|
+
|
112
|
+
# Stop agent by telling it to terminate
|
113
|
+
# Do not allow the agent termination to call EM.stop;
|
114
|
+
# instead defer that to rainbows to do after all connections are closed
|
115
|
+
#
|
116
|
+
# @return [TrueClass] always true
|
117
|
+
def self.stop
|
118
|
+
@agent.terminate {} if @agent
|
119
|
+
true
|
120
|
+
end
|
121
|
+
|
122
|
+
protected
|
123
|
+
|
124
|
+
# Pick agent type from first in list that has a configuration file
|
125
|
+
#
|
126
|
+
# @param [Array] agent_types for candidate agents
|
127
|
+
#
|
128
|
+
# @return [String, NilClass] agent type, or nil if none configured
|
129
|
+
def self.pick_agent_type(types)
|
130
|
+
(types & AgentConfig.cfg_agents).first
|
131
|
+
end
|
132
|
+
|
133
|
+
# Form agent name form type and index
|
134
|
+
#
|
135
|
+
# @param [String] type of agent
|
136
|
+
# @param [Integer] index for worker
|
137
|
+
#
|
138
|
+
# @return [String] agent name
|
139
|
+
def self.form_agent_name(type, index)
|
140
|
+
"#{type}_#{index + 1}"
|
141
|
+
end
|
142
|
+
|
143
|
+
# Determine configuration settings for this agent and persist them
|
144
|
+
# Reuse existing agent identities when possible
|
145
|
+
#
|
146
|
+
# @param [String] agent_type
|
147
|
+
# @param [String] agent_name
|
148
|
+
# @param [Integer] worker_index for this rainbows worker process; 0-based
|
149
|
+
#
|
150
|
+
# @option options [String] :prefix to build agent identity
|
151
|
+
# @option options [String, Integer] :base_id to build agent identity, defaults to worker_index + 1
|
152
|
+
#
|
153
|
+
# @yield [configuration] optionally prior to storing configuration
|
154
|
+
# @yieldparam [Hash] configuration for agent
|
155
|
+
# @yieldreturn [Hash] updated configuration
|
156
|
+
#
|
157
|
+
# @return [Hash] persisted configuration options
|
158
|
+
#
|
159
|
+
# @raise [NoConfigurationData] no configuration data found for the agent
|
160
|
+
def self.configure_agent(agent_type, agent_name, worker_index, options)
|
161
|
+
cfg = AgentConfig.agent_options(agent_type)
|
162
|
+
raise NoConfigurationData, "No configuration data found for agents of type #{agent_type} " +
|
163
|
+
"in #{AgentConfig.cfg_file(agent_type)}" if cfg.empty?
|
164
|
+
base_id = (options[:base_id] || (worker_index + 1)).to_i
|
165
|
+
unless (identity = AgentConfig.agent_options(agent_name)[:identity]) &&
|
166
|
+
AgentIdentity.parse(identity).base_id == base_id
|
167
|
+
identity = AgentIdentity.new(options[:prefix] || "rs", agent_type, base_id).to_s
|
168
|
+
end
|
169
|
+
cfg.merge!(:identity => identity)
|
170
|
+
if cfg[:host]
|
171
|
+
# Randomize broker order
|
172
|
+
host = []
|
173
|
+
port = []
|
174
|
+
addresses = RightAMQP::HABrokerClient.addresses(cfg[:host], cfg[:port])
|
175
|
+
indices = (0..addresses.size - 1).to_a
|
176
|
+
indices.shuffle.each do |i|
|
177
|
+
a = addresses[i]
|
178
|
+
host << "#{a[:host]}:#{a[:index]}"
|
179
|
+
port << "#{a[:port]}:#{a[:index]}"
|
180
|
+
end
|
181
|
+
cfg[:host] = host.join(",")
|
182
|
+
cfg[:port] = port.join(",") if cfg[:port]
|
183
|
+
end
|
184
|
+
cfg = yield(cfg) if block_given?
|
185
|
+
cfg_file = AgentConfig.store_cfg(agent_name, cfg)
|
186
|
+
Log.info("Generated configuration file for #{agent_name} agent: #{cfg_file}")
|
187
|
+
cfg
|
188
|
+
end
|
189
|
+
|
190
|
+
end # RainbowsAgentController
|
191
|
+
|
192
|
+
end # RightScale
|
@@ -0,0 +1,278 @@
|
|
1
|
+
# === Synopsis:
|
2
|
+
# RightScale Infrastructure Agent Deployer (rad) - (c) 2009-2013 RightScale Inc
|
3
|
+
#
|
4
|
+
# rad is a command line tool for building the configuration file for a RightInfrastructureAgent
|
5
|
+
#
|
6
|
+
# The configuration file is generated in:
|
7
|
+
# <agent name>/config.yml
|
8
|
+
# in platform-specific RightAgent configuration directory
|
9
|
+
#
|
10
|
+
# Note that a router is also a RightInfrastructureAgent but its configuration options are
|
11
|
+
# slightly different, .e.g., broker configuration is governed by home-island option instead
|
12
|
+
# of host and port
|
13
|
+
#
|
14
|
+
# === Examples:
|
15
|
+
# Build configuration for agent named AGENT with default options:
|
16
|
+
# rad AGENT
|
17
|
+
#
|
18
|
+
# Build configuration for agent named AGENT so it uses given AMQP settings:
|
19
|
+
# rad AGENT --user USER --pass PASSWORD --vhost VHOST --port PORT --host HOST
|
20
|
+
# rad AGENT -u USER -p PASSWORD -v VHOST -P PORT -h HOST
|
21
|
+
#
|
22
|
+
# Build configuration for island router named ROUTER:
|
23
|
+
# rad ROUTER --user USER --pass PASSWORD --vhost VHOST --home-island 1 --rnds-urls URL1,URL2
|
24
|
+
# --tags-urls URL1,URL2 --tags-auth-key KEY
|
25
|
+
#
|
26
|
+
# Build configuration for two core agents that are sharing a request queue named 'core'
|
27
|
+
# rad core --shared-queue core
|
28
|
+
# rad core_2 --shared-queue core
|
29
|
+
#
|
30
|
+
# === Usage:
|
31
|
+
# rad AGENT [options]
|
32
|
+
#
|
33
|
+
# --root-dir, -r DIR Set agent root directory (containing init, actors, and certs subdirectories)
|
34
|
+
# --cfg-dir, -c DIR Set directory where generated configuration files for all agents are stored
|
35
|
+
# --pid-dir, -z DIR Set directory containing process id file
|
36
|
+
# --identity, -i ID Use base id ID to build agent's identity
|
37
|
+
# --token, -t TOKEN Use token TOKEN to build agent's identity
|
38
|
+
# --prefix, -x PREFIX Use prefix PREFIX to build agent's identity
|
39
|
+
# --type TYPE Use agent type TYPE to build agent's' identity,
|
40
|
+
# defaults to AGENT with any trailing '_[0-9]+' removed
|
41
|
+
# --url Set agent AMQP connection URL (host, port, user, pass, vhost)
|
42
|
+
# --user, -u USER Set agent AMQP username
|
43
|
+
# --password, -p PASS Set agent AMQP password
|
44
|
+
# --vhost, -v VHOST Set agent AMQP virtual host
|
45
|
+
# --host, -h HOST Set AMQP server host for agent
|
46
|
+
# --port, -P PORT Set AMQP server port for agent
|
47
|
+
# --heartbeat, -b SEC Set number of seconds between AMQP broker connection heartbeats, 0 means disable
|
48
|
+
# --prefetch COUNT Set maximum requests AMQP broker is to prefetch before current is ack'd
|
49
|
+
# --time-to-live SEC Set maximum age in seconds before a request expires and is ignored
|
50
|
+
# --adjust-for-skew When routing requests adjust expiration time for clock skew of target
|
51
|
+
# --retry-timeout SEC Set maximum number of seconds to retry request before give up
|
52
|
+
# --retry-interval SEC Set number of seconds before initial request retry, increases exponentially
|
53
|
+
# --check-interval SEC Set number of seconds between failed connection checks, increases exponentially
|
54
|
+
# --ping-interval SEC Set minimum number of seconds since last message receipt for the agent
|
55
|
+
# to ping the router to check connectivity, 0 means disable ping
|
56
|
+
# --reconnect-interval SEC Set number of seconds between HTTP or AMQP reconnect attempts
|
57
|
+
# --advertise-interval SEC Set number of seconds between agent advertising its services
|
58
|
+
# --grace-timeout SEC Set number of seconds before graceful termination times out
|
59
|
+
# --[no-]dup-check Set whether to check for and reject duplicate requests, .e.g., due to retries
|
60
|
+
# --instance-queue-ttl Set time-to-live in seconds for messages published to instance queues
|
61
|
+
# --notify, -n EMAIL Set email address EMAIL for exception notifications
|
62
|
+
# --defer-notify [LIMIT] Defer event notifications associated with audits and optionally limit workers
|
63
|
+
# assigned to service them
|
64
|
+
# --shard, -s ID Set identifier for shard in which this agent is operating
|
65
|
+
# --fiber-pool-size N Set size of fiber pool to be used for asynchronous message processing,
|
66
|
+
# 0 means do not use fibers and instead execute synchronously
|
67
|
+
# --airbrake-endpoint URL Set URL for Airbrake endpoint for reporting exceptions to Errbit
|
68
|
+
# --airbrake-api-key KEY Set Airbrake API key for use in reporting exceptions to Errbit
|
69
|
+
# --shared-queue, -q Q Use Q as input for agent in addition to identity queue
|
70
|
+
# --proxied-queues QS Set comma-separated list of queues to be proxied by router, each in the form
|
71
|
+
# <name>@<url> with <name> being the name of the queue and <url> being the HTTP URL
|
72
|
+
# of the server ready to process messages from the given queue
|
73
|
+
# --rnds-urls URLS Set comma-separated list of URLs for accessing RightNetDataService
|
74
|
+
# --tags-urls URLS Set comma-separated list of URLs for accessing TagService
|
75
|
+
# --tags-auth-token TOKEN Set authentication token for accessing TagService
|
76
|
+
# --max-cache-size Set maximum number of entries in LRU cache for storing instance agents
|
77
|
+
# --cache-reload-age Set age in seconds of cached instance before automatically reload
|
78
|
+
# --home-island ID Set comma-separated list of identifiers of RightNet islands which router is servicing
|
79
|
+
# --auto-restart N Set number of requests before auto-terminate followed by monit auto-restart
|
80
|
+
# --options, -o KEY=VAL Pass-through options
|
81
|
+
# --monit, -m Generate monit configuration file
|
82
|
+
# --test Build test deployment using default test settings
|
83
|
+
# --quiet, -Q Do not produce output
|
84
|
+
# --help Display help
|
85
|
+
#
|
86
|
+
# Note that the applicability of these various options varies depending on the type of infrastructure agent
|
87
|
+
|
88
|
+
require 'rubygems'
|
89
|
+
require 'right_agent/scripts/agent_deployer'
|
90
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'right_infrastructure_agent'))
|
91
|
+
|
92
|
+
module RightScale
|
93
|
+
|
94
|
+
class InfrastructureAgentDeployer < AgentDeployer
|
95
|
+
|
96
|
+
# Create and run deployer
|
97
|
+
#
|
98
|
+
# === Return
|
99
|
+
# true:: Always return true
|
100
|
+
def self.run
|
101
|
+
d = InfrastructureAgentDeployer.new
|
102
|
+
d.deploy(d.parse_args)
|
103
|
+
end
|
104
|
+
|
105
|
+
protected
|
106
|
+
|
107
|
+
# Parse other arguments used only by infrastructure agents
|
108
|
+
#
|
109
|
+
# === Parameters
|
110
|
+
# opts(OptionParser):: Options parser with options to be parsed
|
111
|
+
# options(Hash):: Storage for options that are parsed
|
112
|
+
#
|
113
|
+
# === Return
|
114
|
+
# true:: Always return true
|
115
|
+
def parse_other_args(opts, options)
|
116
|
+
opts.on('-q', '--shared-queue Q') do |q|
|
117
|
+
options[:shared_queue] = q
|
118
|
+
end
|
119
|
+
|
120
|
+
opts.on('-q', '--proxied-queues QS') do |qs|
|
121
|
+
options[:proxied_queues] = qs
|
122
|
+
end
|
123
|
+
|
124
|
+
opts.on('-n', '--notify EMAIL') do |email|
|
125
|
+
options[:notify] = email
|
126
|
+
end
|
127
|
+
|
128
|
+
opts.on('--rnds-urls URLS') do |urls|
|
129
|
+
options[:rnds_urls] = urls
|
130
|
+
end
|
131
|
+
|
132
|
+
opts.on('--tags-urls URLS') do |urls|
|
133
|
+
options[:tags_urls] = urls
|
134
|
+
end
|
135
|
+
|
136
|
+
opts.on('--tags-auth-token TOKEN') do |token|
|
137
|
+
options[:tags_auth_token] = token
|
138
|
+
end
|
139
|
+
|
140
|
+
opts.on('--max-cache-size SIZE') do |size|
|
141
|
+
options[:max_cache_size] = size.to_i
|
142
|
+
end
|
143
|
+
|
144
|
+
opts.on('--cache-reload-age SEC') do |sec|
|
145
|
+
options[:cache_reload_age] = sec.to_i
|
146
|
+
end
|
147
|
+
|
148
|
+
opts.on('--home-island ID') do |id|
|
149
|
+
ids = id.split(/,\s*/).map { |id| id.to_i }
|
150
|
+
options[:home_island] = ids.size > 1 ? ids : ids[0]
|
151
|
+
end
|
152
|
+
|
153
|
+
opts.on('--auto-restart N') do |n|
|
154
|
+
options[:auto_restart] = n.to_i
|
155
|
+
end
|
156
|
+
|
157
|
+
opts.on('--fiber-pool-size N') do |n|
|
158
|
+
options[:fiber_pool_size] = n.to_i
|
159
|
+
end
|
160
|
+
|
161
|
+
opts.on('--instance-queue-ttl SEC') do |sec|
|
162
|
+
options[:instance_queue_ttl] = sec.to_i
|
163
|
+
end
|
164
|
+
|
165
|
+
opts.on('--advertise-interval SEC') do |sec|
|
166
|
+
options[:advertise_interval] = sec.to_i
|
167
|
+
end
|
168
|
+
|
169
|
+
opts.on('--defer-notify [LIMIT]') do |limit|
|
170
|
+
options[:defer_notify] = limit ? limit.to_i : true
|
171
|
+
end
|
172
|
+
|
173
|
+
opts.on('--adjust-for-skew') do
|
174
|
+
options[:adjust_for_skew] = true
|
175
|
+
end
|
176
|
+
|
177
|
+
opts.on('--help') do
|
178
|
+
puts Usage.scan(__FILE__)
|
179
|
+
exit
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
# Determine configuration settings to be persisted
|
184
|
+
#
|
185
|
+
# === Parameters
|
186
|
+
# options(Hash):: Command line options
|
187
|
+
# cfg(Hash):: Initial configuration settings
|
188
|
+
#
|
189
|
+
# === Return
|
190
|
+
# cfg(Hash):: Configuration settings
|
191
|
+
def configure(options, cfg)
|
192
|
+
if options[:agent_type] != 'instance'
|
193
|
+
options[:retry_interval] ||= 4
|
194
|
+
options[:retry_timeout] ||= 25
|
195
|
+
end
|
196
|
+
cfg = super(options, cfg)
|
197
|
+
if options[:agent_type] != 'instance'
|
198
|
+
cfg[:reconnect_interval] ||= 5
|
199
|
+
cfg[:grace_timeout] ||= 75
|
200
|
+
cfg[:dup_check] = !!options[:dup_check]
|
201
|
+
cfg[:advertise_interval] = options[:advertise_interval] || 60 * 60
|
202
|
+
cfg[:instance_queue_ttl] = options[:instance_queue_ttl] || 24 * 60 * 60
|
203
|
+
cfg[:secure] = options[:options][:secure] = false
|
204
|
+
cfg[:notify] = options[:notify] if options[:notify]
|
205
|
+
cfg[:defer_notify] = options[:defer_notify] if options[:defer_notify]
|
206
|
+
cfg[:fiber_pool_size] = options[:fiber_pool_size] if options[:fiber_pool_size]
|
207
|
+
cfg[:shared_queue] = options[:shared_queue] if options[:shared_queue]
|
208
|
+
cfg[:proxied_queues] = options[:proxied_queues] if options[:proxied_queues]
|
209
|
+
if options[:test]
|
210
|
+
cfg[:rnds_urls] = '127.0.0.1:9010'
|
211
|
+
cfg[:tags_urls] = '127.0.0.1:9030'
|
212
|
+
cfg[:log_to_file_only] = true
|
213
|
+
end
|
214
|
+
cfg[:rnds_urls] = options[:rnds_urls] if options[:rnds_urls]
|
215
|
+
cfg[:tags_urls] = options[:tags_urls] if options[:tags_urls]
|
216
|
+
cfg[:tags_auth_token] = options[:tags_auth_token] if options[:tags_auth_token]
|
217
|
+
cfg[:max_cache_size] = options[:max_cache_size] || 1000
|
218
|
+
cfg[:cache_reload_age] = options[:cache_reload_age] || 30
|
219
|
+
cfg[:home_island] = options[:home_island] if options[:home_island]
|
220
|
+
cfg[:auto_restart] = options[:auto_restart] if options[:auto_restart]
|
221
|
+
cfg[:adjust_for_skew] = options[:adjust_for_skew] if options[:adjust_for_skew]
|
222
|
+
if options[:host]
|
223
|
+
# Randomize broker order
|
224
|
+
host = []
|
225
|
+
port = []
|
226
|
+
addresses = RightAMQP::HABrokerClient.addresses(options[:host], options[:port])
|
227
|
+
indices = (0..addresses.size - 1).to_a
|
228
|
+
indices.shuffle.each do |i|
|
229
|
+
a = addresses[i]
|
230
|
+
host << "#{a[:host]}:#{a[:index]}"
|
231
|
+
port << "#{a[:port]}:#{a[:index]}"
|
232
|
+
end
|
233
|
+
cfg[:host] = host.join(",")
|
234
|
+
cfg[:port] = port.join(",") if options[:port]
|
235
|
+
end
|
236
|
+
end
|
237
|
+
cfg
|
238
|
+
end
|
239
|
+
|
240
|
+
# Setup agent monitoring
|
241
|
+
#
|
242
|
+
# === Parameters
|
243
|
+
# options(Hash):: Command line options
|
244
|
+
#
|
245
|
+
# === Return
|
246
|
+
# true:: Always return true
|
247
|
+
def monitor(options)
|
248
|
+
agent_name = options[:agent_name]
|
249
|
+
identity = options[:identity]
|
250
|
+
pid_file = PidFile.new(identity)
|
251
|
+
cfg = <<-EOF
|
252
|
+
check process #{agent_name}
|
253
|
+
with pidfile \"#{pid_file}\"
|
254
|
+
start program \"/etc/init.d/#{agent_name} start\"
|
255
|
+
stop program \"/etc/init.d/#{agent_name} stop\"
|
256
|
+
mode manual
|
257
|
+
EOF
|
258
|
+
cfg_file = File.join(AgentConfig.cfg_dir, agent_name, "#{identity}.conf")
|
259
|
+
File.open(cfg_file, 'w') { |f| f.puts(cfg) }
|
260
|
+
File.chmod(0600, cfg_file) # monit requires strict perms on this file
|
261
|
+
puts " - agent monit config: #{cfg_file}" unless options[:quiet]
|
262
|
+
true
|
263
|
+
end
|
264
|
+
|
265
|
+
end # InfrastructureAgentDeployer
|
266
|
+
|
267
|
+
end # RightScale
|
268
|
+
|
269
|
+
# Copyright (c) 2009-2013 RightScale, Inc, All Rights Reserved Worldwide.
|
270
|
+
#
|
271
|
+
# THIS PROGRAM IS CONFIDENTIAL AND PROPRIETARY TO RIGHTSCALE
|
272
|
+
# AND CONSTITUTES A VALUABLE TRADE SECRET. Any unauthorized use,
|
273
|
+
# reproduction, modification, or disclosure of this program is
|
274
|
+
# strictly prohibited. Any use of this program by an authorized
|
275
|
+
# licensee is strictly subject to the terms and conditions,
|
276
|
+
# including confidentiality obligations, set forth in the applicable
|
277
|
+
# License Agreement between RightScale.com, Inc. and
|
278
|
+
# the licensee.
|