nerve 0.6.0 → 0.7.0

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 09be8c301fe459dcab4e5aa469f863ebb27c9f51
4
+ data.tar.gz: f458f7c7d2cbbd3e82f029d3a3488bcd5eff9088
5
+ SHA512:
6
+ metadata.gz: bf15ca3c591c8bac19750d9c3e1ba96ef7af6096492dbd69f76c971563a22fb7948fa1322d11664b819e185f6d51b1e279ba54b08bba062433c6fb06b7b3be5b
7
+ data.tar.gz: b4b4b89e7eb356611b11aea64f9df687af5c1dc657864d791d799f7b80b2c7e63c16b7fccdc4e502593e03b7f42b6f6f425f2c67dddacaaa99bb0b4778ffd7cf
data/CONTRIBUTING.md CHANGED
@@ -1,8 +1,22 @@
1
1
  # Contributing Guidelines #
2
2
 
3
3
  Thanks for contributing to SmartStack!
4
- If you're opening a new PR, please ask for a merge into our `pull_requests` branch -- *not* `master`.
5
- This will allow us avoid a back-and-forth by quickly accepting your PR and then making minor changes or doing testing before merging into `master`.
4
+
5
+ If you are opening a new PR, please ask for a merge into the `master` branch.
6
+
7
+ ## Writing Reporters ##
8
+ Nerve supports *pluggable* reporters, which means that you can easily add
9
+ a reporter by making your own gem that contains your reporter available for
10
+ require at ``nerve/reporter/#{name.downcase}``. If you do this please do
11
+ submit a PR with a link to your gem/repo and we can reference it from the
12
+ README.
13
+
14
+ In general it is preferred to keep reporters that require specific dependencies
15
+ out of nerve because that way you can select the version of dependencies that
16
+ you need (for example if you have a particular version of the docker api or
17
+ etcd). That being said, if your reporter has no external dependencies
18
+ (e.g. files) or is extremely common (e.g. zookeeper, etcd), we may choose to
19
+ support it in the repo itself.
6
20
 
7
21
  ## Writing Checks ##
8
22
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- nerve (0.6.0)
4
+ nerve (0.7.0)
5
5
  bunny (= 1.1.0)
6
6
  etcd (~> 0.2.3)
7
7
  json
data/README.md CHANGED
@@ -19,17 +19,27 @@ The information it reports can be used to take action from a centralized automat
19
19
 
20
20
  ## Installation ##
21
21
 
22
- Add this line to your application's Gemfile:
22
+ To download and run the nerve binary, first install a version of ruby. Then,
23
+ install nerve with:
23
24
 
24
- gem 'nerve'
25
+ ```bash
26
+ $ mkdir -p /opt/smartstack/nerve
25
27
 
26
- And then execute:
28
+ # If you want to install specific versions of dependencies such as an older
29
+ # version of the aws-sdk, the docker-api, etc, gem install that here *before*
30
+ # gem installing nerve. This is also where you would gem install
31
+ # custom reporters.
27
32
 
28
- $ bundle
33
+ # If you are on Ruby 2.X use --no-document instead of --no-ri --no-rdoc
34
+ $ gem install nerve --install-dir /opt/smartstack/nerve --no-ri --no-rdoc
35
+ ```
29
36
 
30
- Or install it yourself as:
31
-
32
- $ gem install nerve
37
+ This will download nerve and its dependencies into /opt/smartstack/nerve. You
38
+ might wish to omit the `--install-dir` flag to use your system's default gem
39
+ path, however this will require you to run `gem install nerve` with root
40
+ permissions. You can also install via bundler, but keep in mind you'll pick up
41
+ Nerve's version of library dependencies and possibly not the ones you need
42
+ for your infra/apps.
33
43
 
34
44
  ## Configuration ##
35
45
 
@@ -54,7 +64,9 @@ The configuration contains the following options:
54
64
  * `reporter_type`: the mechanism used to report up/down information; depending on the reporter you choose, additional parameters may be required. Defaults to `zookeeper`
55
65
  * `check_interval`: the frequency with which service checks will be initiated; defaults to `500ms`
56
66
  * `checks`: a list of checks that nerve will perform; if all of the pass, the service will be registered; otherwise, it will be un-registered
57
- * `weight`: a positive integer weight value which can be used to affect the haproxy backend weighting in synapse.
67
+ * `weight` (optional): a positive integer weight value which can be used to affect the haproxy backend weighting in synapse.
68
+ * `haproxy_server_options` (optional): a string containing any special haproxy server options for this service instance. For example if you wanted to set a service instance as a backup.
69
+ * `labels` (optional): an object containing user-defined key-value pairs that describe this service instance. For example, you could label service instances with datacenter information.
58
70
 
59
71
  #### Zookeeper Reporter ####
60
72
 
@@ -26,14 +26,27 @@ class Nerve::Reporter
26
26
  %w{instance_id host port}.each do |required|
27
27
  raise ArgumentError, "missing required argument #{required} for new service watcher" unless service[required]
28
28
  end
29
- d = {'host' => service['host'], 'port' => service['port'], 'name' => service['instance_id']}
30
- return d unless service.has_key?('weight')
29
+ d = {
30
+ 'host' => service['host'],
31
+ 'port' => service['port'],
32
+ 'name' => service['instance_id']
33
+ }
31
34
 
32
35
  # Weight is optional, but it should be well formed if supplied
33
- if service['weight'].to_i >= 0 and "#{service['weight']}".match /^\d+$/
34
- d['weight'] = service['weight'].to_i
35
- else
36
- raise ArgumentError, "invalid 'weight' argument in service data: #{service.inspect}"
36
+ if service.has_key?('weight')
37
+ if service['weight'].to_i >= 0 and "#{service['weight']}".match /^\d+$/
38
+ d['weight'] = service['weight'].to_i
39
+ else
40
+ raise ArgumentError, "invalid 'weight' argument in service data: #{service.inspect}"
41
+ end
42
+ end
43
+
44
+ if service.has_key?('haproxy_server_options')
45
+ d['haproxy_server_options'] = service['haproxy_server_options']
46
+ end
47
+
48
+ if service.has_key?('labels')
49
+ d['labels'] = service['labels']
37
50
  end
38
51
  d
39
52
  end
@@ -36,7 +36,9 @@ module Nerve
36
36
  code = response.code.to_i
37
37
  body = response.body
38
38
 
39
- if code >= 200 and code < 300 and (@expect == nil || body.include?(@expect))
39
+ # Any 2xx or 3xx code should be considered healthy. This is standard
40
+ # practice in HAProxy, nginx, etc ...
41
+ if code >= 200 and code < 400 and (@expect == nil || body.include?(@expect))
40
42
  log.debug "nerve: check #{@name} got response code #{code} with body \"#{body}\""
41
43
  return true
42
44
  else
data/lib/nerve/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Nerve
2
- VERSION = "0.6.0"
2
+ VERSION = "0.7.0"
3
3
  end
@@ -23,6 +23,11 @@ describe "example services are valid" do
23
23
  it 'saves the weight data' do
24
24
  expect(JSON.parse(Nerve::Reporter.new_from_service(service_data).data)['weight']).to eql(2)
25
25
  end
26
+ it 'saves the labels data' do
27
+ labels = {'az' => 'us-west-1'}
28
+ service_data['labels'] = labels
29
+ expect(JSON.parse(Nerve::Reporter.new_from_service(service_data).data)['labels']).to eq(labels)
30
+ end
26
31
  end
27
32
 
28
33
  context "when #{item} can be initialized as a valid service watcher" do
@@ -67,6 +67,20 @@ describe Nerve::Reporter::Test do
67
67
  it 'works if the weight is a string' do
68
68
  expect(subject.get_service_data({'host' => '127.0.0.1', 'port' => 6666, 'instance_id' => 'foobar', 'weight' => '3'})['weight']).to eql(3)
69
69
  end
70
+
71
+ it 'correctly passes haproxy_server_options' do
72
+ expect(subject.get_service_data({
73
+ 'host' => '127.0.0.1', 'port' => 6666, 'instance_id' => 'foobar',
74
+ 'haproxy_server_options' => 'backup'
75
+ })['haproxy_server_options']).to eql('backup')
76
+ end
77
+ it 'correctly passes labels' do
78
+ labels = {'az' => 'us-west-1', 'custom_key' => 'custom_value'}
79
+ expect(subject.get_service_data({
80
+ 'host' => '127.0.0.1', 'port' => 6666, 'instance_id' => 'foobar',
81
+ 'labels' => labels
82
+ })['labels']).to eql(labels)
83
+ end
70
84
  end
71
85
  end
72
86
 
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nerve
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
5
- prerelease:
4
+ version: 0.7.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Martin Rhoads
@@ -11,44 +10,39 @@ authors:
11
10
  autorequire:
12
11
  bindir: bin
13
12
  cert_chain: []
14
- date: 2015-08-04 00:00:00.000000000 Z
13
+ date: 2016-02-17 00:00:00.000000000 Z
15
14
  dependencies:
16
15
  - !ruby/object:Gem::Dependency
17
16
  name: json
18
17
  requirement: !ruby/object:Gem::Requirement
19
- none: false
20
18
  requirements:
21
- - - ! '>='
19
+ - - ">="
22
20
  - !ruby/object:Gem::Version
23
21
  version: '0'
24
22
  type: :runtime
25
23
  prerelease: false
26
24
  version_requirements: !ruby/object:Gem::Requirement
27
- none: false
28
25
  requirements:
29
- - - ! '>='
26
+ - - ">="
30
27
  - !ruby/object:Gem::Version
31
28
  version: '0'
32
29
  - !ruby/object:Gem::Dependency
33
30
  name: zk
34
31
  requirement: !ruby/object:Gem::Requirement
35
- none: false
36
32
  requirements:
37
- - - ~>
33
+ - - "~>"
38
34
  - !ruby/object:Gem::Version
39
35
  version: 1.9.2
40
36
  type: :runtime
41
37
  prerelease: false
42
38
  version_requirements: !ruby/object:Gem::Requirement
43
- none: false
44
39
  requirements:
45
- - - ~>
40
+ - - "~>"
46
41
  - !ruby/object:Gem::Version
47
42
  version: 1.9.2
48
43
  - !ruby/object:Gem::Dependency
49
44
  name: bunny
50
45
  requirement: !ruby/object:Gem::Requirement
51
- none: false
52
46
  requirements:
53
47
  - - '='
54
48
  - !ruby/object:Gem::Version
@@ -56,7 +50,6 @@ dependencies:
56
50
  type: :runtime
57
51
  prerelease: false
58
52
  version_requirements: !ruby/object:Gem::Requirement
59
- none: false
60
53
  requirements:
61
54
  - - '='
62
55
  - !ruby/object:Gem::Version
@@ -64,81 +57,71 @@ dependencies:
64
57
  - !ruby/object:Gem::Dependency
65
58
  name: etcd
66
59
  requirement: !ruby/object:Gem::Requirement
67
- none: false
68
60
  requirements:
69
- - - ~>
61
+ - - "~>"
70
62
  - !ruby/object:Gem::Version
71
63
  version: 0.2.3
72
64
  type: :runtime
73
65
  prerelease: false
74
66
  version_requirements: !ruby/object:Gem::Requirement
75
- none: false
76
67
  requirements:
77
- - - ~>
68
+ - - "~>"
78
69
  - !ruby/object:Gem::Version
79
70
  version: 0.2.3
80
71
  - !ruby/object:Gem::Dependency
81
72
  name: rake
82
73
  requirement: !ruby/object:Gem::Requirement
83
- none: false
84
74
  requirements:
85
- - - ! '>='
75
+ - - ">="
86
76
  - !ruby/object:Gem::Version
87
77
  version: '0'
88
78
  type: :development
89
79
  prerelease: false
90
80
  version_requirements: !ruby/object:Gem::Requirement
91
- none: false
92
81
  requirements:
93
- - - ! '>='
82
+ - - ">="
94
83
  - !ruby/object:Gem::Version
95
84
  version: '0'
96
85
  - !ruby/object:Gem::Dependency
97
86
  name: rspec
98
87
  requirement: !ruby/object:Gem::Requirement
99
- none: false
100
88
  requirements:
101
- - - ~>
89
+ - - "~>"
102
90
  - !ruby/object:Gem::Version
103
91
  version: 3.1.0
104
92
  type: :development
105
93
  prerelease: false
106
94
  version_requirements: !ruby/object:Gem::Requirement
107
- none: false
108
95
  requirements:
109
- - - ~>
96
+ - - "~>"
110
97
  - !ruby/object:Gem::Version
111
98
  version: 3.1.0
112
99
  - !ruby/object:Gem::Dependency
113
100
  name: factory_girl
114
101
  requirement: !ruby/object:Gem::Requirement
115
- none: false
116
102
  requirements:
117
- - - ! '>='
103
+ - - ">="
118
104
  - !ruby/object:Gem::Version
119
105
  version: '0'
120
106
  type: :development
121
107
  prerelease: false
122
108
  version_requirements: !ruby/object:Gem::Requirement
123
- none: false
124
109
  requirements:
125
- - - ! '>='
110
+ - - ">="
126
111
  - !ruby/object:Gem::Version
127
112
  version: '0'
128
113
  - !ruby/object:Gem::Dependency
129
114
  name: pry
130
115
  requirement: !ruby/object:Gem::Requirement
131
- none: false
132
116
  requirements:
133
- - - ! '>='
117
+ - - ">="
134
118
  - !ruby/object:Gem::Version
135
119
  version: '0'
136
120
  type: :development
137
121
  prerelease: false
138
122
  version_requirements: !ruby/object:Gem::Requirement
139
- none: false
140
123
  requirements:
141
- - - ! '>='
124
+ - - ">="
142
125
  - !ruby/object:Gem::Version
143
126
  version: '0'
144
127
  description: Nerve is a service registration daemon. It performs health checks on
@@ -153,10 +136,10 @@ executables:
153
136
  extensions: []
154
137
  extra_rdoc_files: []
155
138
  files:
156
- - .gitignore
157
- - .mailmap
158
- - .nerve.rc
159
- - .travis.yml
139
+ - ".gitignore"
140
+ - ".mailmap"
141
+ - ".nerve.rc"
142
+ - ".travis.yml"
160
143
  - CONTRIBUTING.md
161
144
  - Gemfile
162
145
  - Gemfile.lock
@@ -194,27 +177,26 @@ files:
194
177
  - spec/spec_helper.rb
195
178
  homepage: https://github.com/airbnb/nerve
196
179
  licenses: []
180
+ metadata: {}
197
181
  post_install_message:
198
182
  rdoc_options: []
199
183
  require_paths:
200
184
  - lib
201
185
  required_ruby_version: !ruby/object:Gem::Requirement
202
- none: false
203
186
  requirements:
204
- - - ! '>='
187
+ - - ">="
205
188
  - !ruby/object:Gem::Version
206
189
  version: '0'
207
190
  required_rubygems_version: !ruby/object:Gem::Requirement
208
- none: false
209
191
  requirements:
210
- - - ! '>='
192
+ - - ">="
211
193
  - !ruby/object:Gem::Version
212
194
  version: '0'
213
195
  requirements: []
214
196
  rubyforge_project:
215
- rubygems_version: 1.8.23.2
197
+ rubygems_version: 2.4.5
216
198
  signing_key:
217
- specification_version: 3
199
+ specification_version: 4
218
200
  summary: A service registration daemon
219
201
  test_files:
220
202
  - spec/.gitkeep