right_agent 0.6.2 → 0.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -22,10 +22,11 @@
22
22
 
23
23
  module RightScale
24
24
 
25
- # Run commands exposed by an agent
26
- # External processes can send commands through a socket with the specified port
25
+ # Run commands exposed by an agent.
26
+ # External processes can send commands through a socket with the specified port.
27
+ # Command runner accepts connections and deserializes commands using YAML.
28
+ # Each command is expected to be a hash containing the :name and :options keys.
27
29
  class CommandRunner
28
-
29
30
  class << self
30
31
  # (Integer) Port command runner is listening on
31
32
  attr_reader :listen_port
@@ -34,8 +35,7 @@ module RightScale
34
35
  attr_reader :cookie
35
36
  end
36
37
 
37
- # Command runner listens to commands and deserializes them using YAML
38
- # Each command is expected to be a hash containing the :name and :options keys
38
+ # Start a command runner listening on a local TCP port.
39
39
  #
40
40
  # === Parameters
41
41
  # socket_port(Integer):: Base socket port on which to listen for connection,
@@ -43,6 +43,11 @@ module RightScale
43
43
  # identity(String):: Agent identity
44
44
  # commands(Hash):: Commands exposed by agent
45
45
  #
46
+ # === Block
47
+ # If a block is provided, this method will yield after all setup has been completed,
48
+ # passing its PidFile to the block. This provides a customization hook, e.g. for
49
+ # changing the pid file's access mode or ownership.
50
+ #
46
51
  # === Return
47
52
  # cmd_options[:cookie](String):: Command protocol cookie
48
53
  # cmd_options[:listen_port](Integer):: Command server listen port
@@ -52,6 +57,7 @@ module RightScale
52
57
  def self.start(socket_port, identity, commands)
53
58
  cmd_options = nil
54
59
  @listen_port = socket_port
60
+
55
61
  begin
56
62
  CommandIO.instance.listen(socket_port) do |c, conn|
57
63
  begin
@@ -77,6 +83,7 @@ module RightScale
77
83
  pid_file = PidFile.new(identity)
78
84
  if pid_file.exists?
79
85
  pid_file.set_command_options(cmd_options)
86
+ yield(pid_file) if block_given?
80
87
  else
81
88
  Log.warning("Failed to update listen port in PID file - no pid file found for agent with identity #{identity}")
82
89
  end
@@ -29,18 +29,18 @@ module RightScale
29
29
  include Serializable
30
30
 
31
31
  attr_accessor :uuid, :username, :public_key, :public_keys, :common_name,
32
- :superuser, :expires_at, :home_archive_url
32
+ :superuser, :expires_at, :profile_data
33
33
 
34
34
  # Initialize fields from given arguments
35
35
  def initialize(*args)
36
- @uuid = args[0]
37
- @username = args[1]
38
- @public_key = args[2]
39
- @common_name = args[3] || ''
40
- @superuser = args[4] || false
41
- @expires_at = Time.at(args[5]) if args[5] && (args[5] != 0) # nil -> 0 because of expires_at.to_i below
42
- @public_keys = args[6]
43
- @home_archive_url = args[7]
36
+ @uuid = args[0]
37
+ @username = args[1]
38
+ @public_key = args[2]
39
+ @common_name = args[3] || ''
40
+ @superuser = args[4] || false
41
+ @expires_at = Time.at(args[5]) if args[5] && (args[5] != 0) # nil -> 0 because of expires_at.to_i below
42
+ @public_keys = args[6]
43
+ @profile_data = args[7]
44
44
 
45
45
  # we now expect an array of public_keys to be passed while supporting the
46
46
  # singular public_key as a legacy member. when serialized back from a
@@ -57,7 +57,7 @@ module RightScale
57
57
 
58
58
  # Array of serialized fields given to constructor
59
59
  def serialized_members
60
- [ @uuid, @username, @public_key, @common_name, @superuser, @expires_at.to_i, @public_keys, @home_archive_url ]
60
+ [ @uuid, @username, @public_key, @common_name, @superuser, @expires_at.to_i, @public_keys, @profile_data ]
61
61
  end
62
62
 
63
63
  end
@@ -33,7 +33,7 @@ module RightScale
33
33
 
34
34
  class AlreadyRunning < Exception; end
35
35
 
36
- attr_reader :identity
36
+ attr_reader :identity, :pid_file, :cookie_file
37
37
 
38
38
  # Initialize pid file location from agent identity and pid directory
39
39
  def initialize(identity, pid_dir = nil)
data/right_agent.gemspec CHANGED
@@ -24,7 +24,7 @@ require 'rubygems'
24
24
 
25
25
  Gem::Specification.new do |spec|
26
26
  spec.name = 'right_agent'
27
- spec.version = '0.6.2'
27
+ spec.version = '0.6.3'
28
28
  spec.authors = ['Lee Kirchhoff', 'Raphael Simon', 'Tony Spataro']
29
29
  spec.email = 'lee@rightscale.com'
30
30
  spec.homepage = 'https://github.com/rightscale/right_agent'
@@ -48,6 +48,30 @@ describe RightScale::CommandRunner do
48
48
  @socket_port = TEST_SOCKET_PORT
49
49
  end
50
50
 
51
+ context :start do
52
+ before(:each) do
53
+ @pid_file = flexmock(RightScale::PidFile)
54
+ @pid_file.should_receive(:exists?).and_return(true)
55
+ @pid_file.should_receive(:set_command_options).and_return(true)
56
+ flexmock(RightScale::PidFile).should_receive(:new).and_return(@pid_file)
57
+ end
58
+
59
+ context 'when a block is provided' do
60
+ before(:each) do
61
+ @block = Proc.new do |pid_file|
62
+ @callback_pid_file = pid_file
63
+ end
64
+ end
65
+
66
+ it 'should yield its PidFile' do
67
+ commands = { :test => lambda { |opt, _| } }
68
+ flexmock(RightScale::CommandIO).should_receive(:instance).and_return(RightScale::CommandIOMock.instance)
69
+ RightScale::CommandRunner.start(@socket_port, RightScale::AgentIdentity.generate, commands, &@block)
70
+ @callback_pid_file.should == @pid_file
71
+ end
72
+ end
73
+ end
74
+
51
75
  it 'should handle invalid formats' do
52
76
  flexmock(RightScale::CommandIO.instance).should_receive(:listen).and_yield(['invalid yaml'])
53
77
  flexmock(RightScale::Log).should_receive(:info).once
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: 3
4
+ hash: 1
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 6
9
- - 2
10
- version: 0.6.2
9
+ - 3
10
+ version: 0.6.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Lee Kirchhoff
@@ -17,14 +17,11 @@ autorequire:
17
17
  bindir: bin
18
18
  cert_chain: []
19
19
 
20
- date: 2011-11-16 00:00:00 -08:00
20
+ date: 2011-11-21 00:00:00 -08:00
21
21
  default_executable:
22
22
  dependencies:
23
23
  - !ruby/object:Gem::Dependency
24
- prerelease: false
25
- type: :runtime
26
- name: right_support
27
- version_requirements: &id001 !ruby/object:Gem::Requirement
24
+ requirement: &id001 !ruby/object:Gem::Requirement
28
25
  none: false
29
26
  requirements:
30
27
  - - ~>
@@ -34,12 +31,12 @@ dependencies:
34
31
  - 1
35
32
  - 0
36
33
  version: "1.0"
37
- requirement: *id001
38
- - !ruby/object:Gem::Dependency
34
+ name: right_support
39
35
  prerelease: false
40
36
  type: :runtime
41
- name: amqp
42
- version_requirements: &id002 !ruby/object:Gem::Requirement
37
+ version_requirements: *id001
38
+ - !ruby/object:Gem::Dependency
39
+ requirement: &id002 !ruby/object:Gem::Requirement
43
40
  none: false
44
41
  requirements:
45
42
  - - "="
@@ -50,12 +47,12 @@ dependencies:
50
47
  - 7
51
48
  - 5
52
49
  version: 0.7.5
53
- requirement: *id002
54
- - !ruby/object:Gem::Dependency
50
+ name: amqp
55
51
  prerelease: false
56
52
  type: :runtime
57
- name: json
58
- version_requirements: &id003 !ruby/object:Gem::Requirement
53
+ version_requirements: *id002
54
+ - !ruby/object:Gem::Dependency
55
+ requirement: &id003 !ruby/object:Gem::Requirement
59
56
  none: false
60
57
  requirements:
61
58
  - - ~>
@@ -65,12 +62,12 @@ dependencies:
65
62
  - 1
66
63
  - 4
67
64
  version: "1.4"
68
- requirement: *id003
69
- - !ruby/object:Gem::Dependency
65
+ name: json
70
66
  prerelease: false
71
67
  type: :runtime
72
- name: eventmachine
73
- version_requirements: &id004 !ruby/object:Gem::Requirement
68
+ version_requirements: *id003
69
+ - !ruby/object:Gem::Dependency
70
+ requirement: &id004 !ruby/object:Gem::Requirement
74
71
  none: false
75
72
  requirements:
76
73
  - - ~>
@@ -81,12 +78,12 @@ dependencies:
81
78
  - 12
82
79
  - 10
83
80
  version: 0.12.10
84
- requirement: *id004
85
- - !ruby/object:Gem::Dependency
81
+ name: eventmachine
86
82
  prerelease: false
87
83
  type: :runtime
88
- name: right_popen
89
- version_requirements: &id005 !ruby/object:Gem::Requirement
84
+ version_requirements: *id004
85
+ - !ruby/object:Gem::Dependency
86
+ requirement: &id005 !ruby/object:Gem::Requirement
90
87
  none: false
91
88
  requirements:
92
89
  - - ~>
@@ -97,12 +94,12 @@ dependencies:
97
94
  - 0
98
95
  - 11
99
96
  version: 1.0.11
100
- requirement: *id005
101
- - !ruby/object:Gem::Dependency
97
+ name: right_popen
102
98
  prerelease: false
103
99
  type: :runtime
104
- name: msgpack
105
- version_requirements: &id006 !ruby/object:Gem::Requirement
100
+ version_requirements: *id005
101
+ - !ruby/object:Gem::Dependency
102
+ requirement: &id006 !ruby/object:Gem::Requirement
106
103
  none: false
107
104
  requirements:
108
105
  - - "="
@@ -113,7 +110,10 @@ dependencies:
113
110
  - 4
114
111
  - 4
115
112
  version: 0.4.4
116
- requirement: *id006
113
+ name: msgpack
114
+ prerelease: false
115
+ type: :runtime
116
+ version_requirements: *id006
117
117
  description: |
118
118
  RightAgent provides a foundation for running an agent on a server to interface
119
119
  in a secure fashion with other agents in the RightScale system. A RightAgent