right_agent 0.9.5 → 0.9.6

Sign up to get free protection for your applications and to get access to all the features.
data/lib/right_agent.rb CHANGED
@@ -43,7 +43,7 @@ require File.normalize_path(File.join(RIGHT_AGENT_BASE_DIR, 'security'))
43
43
  require File.normalize_path(File.join(RIGHT_AGENT_BASE_DIR, 'operation_result'))
44
44
  require File.normalize_path(File.join(RIGHT_AGENT_BASE_DIR, 'subprocess'))
45
45
  require File.normalize_path(File.join(RIGHT_AGENT_BASE_DIR, 'agent_identity'))
46
- require File.normalize_path(File.join(RIGHT_AGENT_BASE_DIR, 'agent_tags_manager'))
46
+ require File.normalize_path(File.join(RIGHT_AGENT_BASE_DIR, 'agent_tag_manager'))
47
47
  require File.normalize_path(File.join(RIGHT_AGENT_BASE_DIR, 'actor'))
48
48
  require File.normalize_path(File.join(RIGHT_AGENT_BASE_DIR, 'actor_registry'))
49
49
  require File.normalize_path(File.join(RIGHT_AGENT_BASE_DIR, 'dispatcher'))
@@ -98,6 +98,28 @@ module RightScale
98
98
  def self.valid_thread_name
99
99
  VALID_THREAD_NAME
100
100
  end
101
+
102
+ # Default policy name when no policy is specified for an executable bundle.
103
+ DEFAULT_POLICY_NAME = nil
104
+
105
+ # Default policy name when no policy is specified for an executable bundle.
106
+ #
107
+ # === Return
108
+ # (String):: default policy name...
109
+ def self.default_policy_name
110
+ DEFAULT_POLICY_NAME
111
+ end
112
+
113
+ # Default period for policies
114
+ DEFAULT_POLICY_PERIOD = 60 * 60 * 24
115
+
116
+ # Default audit period when a runlist policy does not specify a period.
117
+ #
118
+ # === Return
119
+ # (String):: default policy name...
120
+ def self.default_audit_period
121
+ DEFAULT_POLICY_PERIOD
122
+ end
101
123
 
102
124
  # Initialize path to root directory of agent
103
125
  #
@@ -25,7 +25,7 @@ require 'singleton'
25
25
  module RightScale
26
26
 
27
27
  # Agent tags management
28
- class AgentTagsManager
28
+ class AgentTagManager
29
29
  include Singleton
30
30
 
31
31
  # (Agent) Agent being managed
@@ -33,14 +33,19 @@ module RightScale
33
33
 
34
34
  # Retrieve current agent tags and give result to block
35
35
  #
36
+ # === Parameters
37
+ # options(Hash):: Request options
38
+ # :raw(Boolean):: true to yield raw tag response instead of deserialized tags
39
+ # :timeout(Integer):: timeout in seconds before giving up and yielding an error message
40
+ #
36
41
  # === Block
37
42
  # Given block should take one argument which will be set with an array
38
43
  # initialized with the tags of this instance
39
44
  #
40
45
  # === Return
41
46
  # true:: Always return true
42
- def tags
43
- do_query(nil, @agent.identity) do |result|
47
+ def tags(options={})
48
+ do_query(nil, @agent.identity, options) do |result|
44
49
  if result.kind_of?(Hash)
45
50
  yield(result.size == 1 ? result.values.first['tags'] : [])
46
51
  else
@@ -54,6 +59,9 @@ module RightScale
54
59
  #
55
60
  # === Parameters
56
61
  # tags(Array):: tags to query or empty
62
+ # options(Hash):: Request options
63
+ # :raw(Boolean):: true to yield raw tag response instead of deserialized tags
64
+ # :timeout(Integer):: timeout in seconds before giving up and yielding an error message
57
65
  #
58
66
  # === Block
59
67
  # Given block should take one argument which will be set with an array
@@ -62,7 +70,14 @@ module RightScale
62
70
  # === Return
63
71
  # true:: Always return true
64
72
  def query_tags(*tags)
65
- do_query(tags) { |result| yield result }
73
+ if tags.last.respond_to?(:keys)
74
+ tags = tags[0..-2]
75
+ options = tags.last
76
+ else
77
+ options = {}
78
+ end
79
+
80
+ do_query(tags, nil, options) { |result| yield result }
66
81
  end
67
82
 
68
83
  # Queries a list of servers in the current deployment which have one or more
@@ -71,14 +86,17 @@ module RightScale
71
86
  # === Parameters
72
87
  # tags(Array):: tags to query or empty
73
88
  # agent_ids(Array):: agent IDs to query or empty or nil
89
+ # options(Hash):: Request options
90
+ # :timeout(Integer):: timeout in seconds before giving up and yielding an error message
74
91
  #
75
92
  # === Block
76
93
  # Given block should take one argument which will be set with the raw response
77
94
  #
78
95
  # === Return
79
96
  # true:: Always return true
80
- def query_tags_raw(tags, agent_ids = nil)
81
- do_query(tags, agent_ids, true) { |raw_response| yield raw_response }
97
+ def query_tags_raw(tags, agent_ids = nil, options={})
98
+ options = options.merge(:raw=>true)
99
+ do_query(tags, agent_ids, options) { |raw_response| yield raw_response }
82
100
  end
83
101
 
84
102
  # Add given tags to agent
@@ -168,7 +186,9 @@ module RightScale
168
186
  # === Parameters
169
187
  # tags(Array):: tags to query or empty or nil
170
188
  # agent_ids(Array):: agent IDs to query or empty or nil
171
- # raw(Boolean):: true to yield raw tag response instead of deserialized tags
189
+ # options(Hash):: Request options
190
+ # :raw(Boolean):: true to yield raw tag response instead of deserialized tags
191
+ # :timeout(Integer):: timeout in seconds before giving up and yielding an error message
172
192
  #
173
193
  # === Block
174
194
  # Given block should take one argument which will be set with an array
@@ -176,12 +196,20 @@ module RightScale
176
196
  #
177
197
  # === Return
178
198
  # true:: Always return true
179
- def do_query(tags = nil, agent_ids = nil, raw = false)
199
+ def do_query(tags = nil, agent_ids = nil, options={})
200
+ raw = options[:raw] || false
201
+ timeout = options[:timeout]
202
+
203
+ request_options = {}
204
+ request_options[:timeout] = timeout if timeout
205
+
180
206
  agent_check
181
207
  payload = {:agent_identity => @agent.identity}
182
208
  payload[:tags] = ensure_flat_array_value(tags) unless tags.nil? || tags.empty?
183
209
  payload[:agent_ids] = ensure_flat_array_value(agent_ids) unless agent_ids.nil? || agent_ids.empty?
184
- request = RightScale::IdempotentRequest.new("/mapper/query_tags", payload)
210
+ request = RightScale::IdempotentRequest.new("/mapper/query_tags",
211
+ payload,
212
+ request_options)
185
213
  request.callback { |result| yield raw ? request.raw_response : result }
186
214
  request.errback do |message|
187
215
  Log.error("Failed to query tags: #{message}")
@@ -208,6 +236,10 @@ module RightScale
208
236
  value
209
237
  end
210
238
 
211
- end # AgentTagsManager
239
+ end # AgentTagManager
212
240
 
241
+ # This class has been renamed as of RightAgent 0.9.6; provide an alias
242
+ # to the old typename
243
+ # TODO remove this alias for RightAgent 1.0
244
+ AgentTagsManager = AgentTagManager
213
245
  end # RightScale
@@ -38,6 +38,7 @@ require File.normalize_path(File.join(CORE_PAYLOAD_TYPES_BASE_DIR, 'right_script
38
38
  require File.normalize_path(File.join(CORE_PAYLOAD_TYPES_BASE_DIR, 'right_script_instantiation'))
39
39
  require File.normalize_path(File.join(CORE_PAYLOAD_TYPES_BASE_DIR, 'login_policy'))
40
40
  require File.normalize_path(File.join(CORE_PAYLOAD_TYPES_BASE_DIR, 'login_user'))
41
+ require File.normalize_path(File.join(CORE_PAYLOAD_TYPES_BASE_DIR, 'runlist_policy'))
41
42
  require File.normalize_path(File.join(CORE_PAYLOAD_TYPES_BASE_DIR, 'secure_document'))
42
43
  require File.normalize_path(File.join(CORE_PAYLOAD_TYPES_BASE_DIR, 'secure_document_location'))
43
44
  require File.normalize_path(File.join(CORE_PAYLOAD_TYPES_BASE_DIR, 'planned_volume'))
@@ -54,9 +54,6 @@ module RightScale
54
54
  # (String) Repose server to use
55
55
  attr_accessor :repose_servers
56
56
 
57
- # (String) The name of the RIghtLink thread to run this bundle on
58
- attr_accessor :thread_name
59
-
60
57
  # (Hash):: collection of repos to be checked out on the instance
61
58
  # :key (String):: the hash id (SHA) of the repository
62
59
  # :value (Hash):: repo and cookbook detail
@@ -89,6 +86,9 @@ module RightScale
89
86
  # }
90
87
  # :positions (Array):: List of CookbookPositions to be developed. Represents the subset of cookbooks identified as the "dev cookbooks"
91
88
  attr_accessor :dev_cookbooks
89
+
90
+ # (RunlistPolicy) The RightLink policy this bundle belongs to
91
+ attr_accessor :runlist_policy
92
92
 
93
93
  def initialize(*args)
94
94
  @executables = args[0]
@@ -98,7 +98,7 @@ module RightScale
98
98
  @cookbooks = args[4] if args.size > 4
99
99
  @repose_servers = args[5] if args.size > 5
100
100
  @dev_cookbooks = args[6] if args.size > 6
101
- @thread_name = args[7] if args.size > 7
101
+ @runlist_policy = args[7] if args.size > 7
102
102
  end
103
103
 
104
104
  # Array of serialized fields given to constructor
@@ -110,7 +110,7 @@ module RightScale
110
110
  @cookbooks,
111
111
  @repose_servers,
112
112
  @dev_cookbooks,
113
- @thread_name ]
113
+ @runlist_policy ]
114
114
  end
115
115
 
116
116
  # Human readable representation
@@ -0,0 +1,44 @@
1
+ #
2
+ # Copyright (c) 2009-2012 RightScale Inc
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #
23
+
24
+ module RightScale
25
+
26
+ class RunlistPolicy
27
+ include Serializable
28
+
29
+ attr_accessor :policy_name, :thread_name, :audit_period
30
+
31
+ # Initialize fields from given arguments
32
+ def initialize(*args)
33
+ @policy_name = args[0]
34
+ @thread_name = args[1]
35
+ @audit_period = args[2]
36
+ end
37
+
38
+ # Array of serialized fields given to constructor
39
+ def serialized_members
40
+ [ @policy_name, @thread_name, @audit_period ]
41
+ end
42
+
43
+ end
44
+ end
@@ -80,7 +80,7 @@ module RightScale
80
80
  # increasing delay exponentially and decreasing this count exponentially, defaults to
81
81
  # DEFAULT_RETRY_DELAY_COUNT
82
82
  # :max_retry_delay(Fixnum):: Maximum number of seconds of retry delay, defaults to DEFAULT_MAX_RETRY_DELAY
83
- # :timeout(Fixnum):: Number of seconds with no response before error callback gets called with
83
+ # :timeout(Fixnum):: Number of seconds with no response before error callback gets called, with
84
84
  # -1 meaning never, defaults to DEFAULT_TIMEOUT
85
85
  #
86
86
  # === Raises
@@ -131,6 +131,21 @@ module RightScale
131
131
  @logger.__send__(m, *args)
132
132
  end
133
133
 
134
+ # Determine whether this object, or its method_missing proxy, responds
135
+ # to the given method name. This follows the best practice of always
136
+ # overriding #respond_to? whenever one implements dynamic dispatch
137
+ # via #method_missing.
138
+ #
139
+ # === Parameters
140
+ # m(Symbol):: Forwarded method name
141
+ #
142
+ # === Return
143
+ # (true|false):: True if this object or its proxy responds to the names method, false otherwise
144
+ def respond_to?(m)
145
+ init unless @initialized
146
+ super(m) || @logger.respond_to?(m)
147
+ end
148
+
134
149
  # Log warning and optionally append exception information
135
150
  #
136
151
  # === Parameters
@@ -296,6 +311,22 @@ module RightScale
296
311
  @program_name = prog_name
297
312
  end
298
313
 
314
+ # Sets the syslog facility that will be used when emitting syslog messages.
315
+ # Can only be successfully called before logging is initialized
316
+ #
317
+ # === Parameters
318
+ # facility(String):: A syslog facility name, e.g. 'user' or 'local0'
319
+ #
320
+ # === Return
321
+ # program_name(String):: The input string
322
+ #
323
+ # === Raise
324
+ # RuntimeError:: If logger is already initialized
325
+ def facility=(facility)
326
+ raise 'Logger already initialized' if @initialized
327
+ @facility = facility
328
+ end
329
+
299
330
  # Sets the level for the Logger by symbol or by Logger constant
300
331
  #
301
332
  # === Parameters
@@ -403,7 +434,9 @@ module RightScale
403
434
  logger.formatter.datetime_format = "%b %d %H:%M:%S"
404
435
  else
405
436
  $stderr.puts "Logging to syslog" if opts[:print]
406
- logger = RightSupport::Log::SystemLogger.new(@program_name || identity || 'RightAgent')
437
+ program_name = @program_name || identity || 'RightAgent'
438
+ facility = @facility || 'local0'
439
+ logger = RightSupport::Log::SystemLogger.new(program_name, :facility=>facility)
407
440
  end
408
441
 
409
442
  @logger = Multiplexer.new(logger)
@@ -87,5 +87,16 @@ module RightScale
87
87
  res[0]
88
88
  end
89
89
 
90
+ # Determine whether this object, or ALL of its targets, responds to
91
+ # the named method.
92
+ #
93
+ # === Parameters
94
+ # m(Symbol):: Forwarded method name
95
+ #
96
+ # === Return
97
+ # (true|false):: True if this object, or ALL targets, respond to the names method; false otherwise
98
+ def respond_to?(m)
99
+ super(m) || @targets.all? { |t| t.respond_to?(m) }
100
+ end
90
101
  end
91
102
  end
@@ -118,10 +118,6 @@ module RightScale
118
118
  '/var/run'
119
119
  end
120
120
 
121
- def right_link_dir
122
- '/opt/rightscale/right_link'
123
- end
124
-
125
121
  # Path to right link configuration and internal usage scripts
126
122
  def private_bin_dir
127
123
  '/opt/rightscale/bin'
@@ -169,10 +169,6 @@ module RightScale
169
169
  '/var/run'
170
170
  end
171
171
 
172
- def right_link_dir
173
- '/opt/rightscale/right_link'
174
- end
175
-
176
172
  # Path to right link configuration and internal usage scripts
177
173
  def private_bin_dir
178
174
  '/opt/rightscale/bin'
@@ -212,13 +212,9 @@ module RightScale
212
212
  @right_link_home_dir
213
213
  end
214
214
 
215
- def right_link_dir
216
- return pretty_path(File.join(right_link_home_dir, 'right_link'))
217
- end
218
-
219
215
  # Path to right link configuration and internal usage scripts
220
216
  def private_bin_dir
221
- return pretty_path(File.join(right_link_dir, 'scripts', 'windows'))
217
+ return pretty_path(File.join(right_link_home_dir, 'right_link', 'scripts', 'windows'))
222
218
  end
223
219
 
224
220
  def sandbox_dir
data/right_agent.gemspec CHANGED
@@ -24,8 +24,8 @@ require 'rubygems'
24
24
 
25
25
  Gem::Specification.new do |spec|
26
26
  spec.name = 'right_agent'
27
- spec.version = '0.9.5'
28
- spec.date = '2012-03-17'
27
+ spec.version = '0.9.6'
28
+ spec.date = '2012-03-23'
29
29
  spec.authors = ['Lee Kirchhoff', 'Raphael Simon', 'Tony Spataro']
30
30
  spec.email = 'lee@rightscale.com'
31
31
  spec.homepage = 'https://github.com/rightscale/right_agent'
@@ -27,7 +27,7 @@ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'lib', 'r
27
27
  module RightScale
28
28
  describe ExecutableBundle do
29
29
  context 'serialized_members' do
30
- it 'contains 8 elements' do
30
+ it 'contains 9 elements' do
31
31
  ExecutableBundle.new.serialized_members.count.should == 8
32
32
  end
33
33
  end
@@ -54,6 +54,14 @@ module RightScale
54
54
  bundle.serialized_members[6].should be_nil
55
55
  end
56
56
  end
57
+
58
+ context 'runlist policy' do
59
+ let(:bundle) { ExecutableBundle.new(nil, nil, nil, nil, nil, nil, nil, RunlistPolicy.new) }
60
+
61
+ it 'should serialize into a runlist policy object' do
62
+ bundle.serialized_members[7].should be_an_instance_of(RunlistPolicy)
63
+ end
64
+ end
57
65
  end
58
66
  end
59
67
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: right_agent
3
3
  version: !ruby/object:Gem::Version
4
- hash: 49
4
+ hash: 55
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 9
9
- - 5
10
- version: 0.9.5
9
+ - 6
10
+ version: 0.9.6
11
11
  platform: ruby
12
12
  authors:
13
13
  - Lee Kirchhoff
@@ -17,7 +17,7 @@ autorequire:
17
17
  bindir: bin
18
18
  cert_chain: []
19
19
 
20
- date: 2012-03-17 00:00:00 -07:00
20
+ date: 2012-03-23 00:00:00 -07:00
21
21
  default_executable:
22
22
  dependencies:
23
23
  - !ruby/object:Gem::Dependency
@@ -155,7 +155,7 @@ files:
155
155
  - lib/right_agent/agent.rb
156
156
  - lib/right_agent/agent_config.rb
157
157
  - lib/right_agent/agent_identity.rb
158
- - lib/right_agent/agent_tags_manager.rb
158
+ - lib/right_agent/agent_tag_manager.rb
159
159
  - lib/right_agent/audit_formatter.rb
160
160
  - lib/right_agent/command.rb
161
161
  - lib/right_agent/command/agent_manager_commands.rb
@@ -182,6 +182,7 @@ files:
182
182
  - lib/right_agent/core_payload_types/repositories_bundle.rb
183
183
  - lib/right_agent/core_payload_types/right_script_attachment.rb
184
184
  - lib/right_agent/core_payload_types/right_script_instantiation.rb
185
+ - lib/right_agent/core_payload_types/runlist_policy.rb
185
186
  - lib/right_agent/core_payload_types/secure_document.rb
186
187
  - lib/right_agent/core_payload_types/secure_document_location.rb
187
188
  - lib/right_agent/core_payload_types/software_repository_instantiation.rb