dogtrainer 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -0
- data/ChangeLog.md +9 -0
- data/README.md +8 -8
- data/lib/dogtrainer/api.rb +38 -12
- data/lib/dogtrainer/dogapiexception.rb +26 -0
- data/lib/dogtrainer/version.rb +1 -1
- data/spec/unit/api_spec.rb +86 -12
- data/spec/unit/dogapiexception_spec.rb +50 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 61ad47a205486a220109a1e79127f4c7e5d13724
|
4
|
+
data.tar.gz: 054eb39e28f43c41599d64840813da35d78210b3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 81048ff88866c2439e90d0ff18d46ece9480a73c8b8358a4b975f4b59c38bf6415c9018502b82092ad240c8dc2dbd7a12f38afdda251098287b81a68f12fb84a
|
7
|
+
data.tar.gz: 0cd934673286968e9657102fc9f11c156e4ad8817e3d86ec4c2881601a43e0cbdebb135ebee3c7aeed6ec790abd4442e9795805a277583bdd04e5f6a205e0fd4
|
data/.rubocop.yml
CHANGED
data/ChangeLog.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
Version 0.3.0
|
2
|
+
|
3
|
+
- Added ``DogTrainer::DogApiException`` custom exception class, subclass of ``StandardError``.
|
4
|
+
- ``DogTrainer::API`` methods ``mute_monitor_by_id``, ``mute_monitor_by_name``,
|
5
|
+
``mute_monitors_by_regex``, ``unmute_monitor_by_id``, ``unmute_monitor_by_name``,
|
6
|
+
``unmute_monitors_by_regex``, ``upsert_timeboard`` and ``upsert_screenboard``
|
7
|
+
now raise an ``DogTrainer::DogApiException`` if the Datadog API response status
|
8
|
+
code indicates an error.
|
9
|
+
|
1
10
|
Version 0.2.0
|
2
11
|
|
3
12
|
- add support to mute and unmute monitors by id, name or regex
|
data/README.md
CHANGED
@@ -4,9 +4,9 @@ Build of master branch: [![CircleCI](https://circleci.com/gh/manheim/dogtrainer.
|
|
4
4
|
|
5
5
|
Documentation: [http://www.rubydoc.info/gems/dogtrainer/](http://www.rubydoc.info/gems/dogtrainer/)
|
6
6
|
|
7
|
-
Wrapper around
|
7
|
+
Wrapper around Datadog dogapi gem to simplify creation and management of Monitors and Boards.
|
8
8
|
|
9
|
-
This class provides methods to manage (upsert / ensure the existence and configuration of)
|
9
|
+
This class provides methods to manage (upsert / ensure the existence and configuration of) Datadog
|
10
10
|
Monitors and TimeBoards/ScreenBoards.
|
11
11
|
|
12
12
|
## Installation
|
@@ -30,7 +30,7 @@ gem.add_runtime_dependency 'dogtrainer'
|
|
30
30
|
|
31
31
|
## Usage
|
32
32
|
|
33
|
-
To use the
|
33
|
+
To use the Datadog helper, require the module and create an instance of the class,
|
34
34
|
passing it the required configuration information.
|
35
35
|
|
36
36
|
```ruby
|
@@ -47,13 +47,13 @@ require 'dogtrainer'
|
|
47
47
|
dog = DogTrainer::API.new(api_key, app_key, notify_to, 'string describing where to update monitors or boards')
|
48
48
|
```
|
49
49
|
|
50
|
-
* __api_key__ is your
|
50
|
+
* __api_key__ is your Datadog API Key, which you can find at https://app.datadoghq.com/account/settings#api
|
51
51
|
* __app_key__ is an application-specific key, which should be generated separately for every app or
|
52
52
|
service that uses this class. These can be generated and seen at https://app.datadoghq.com/account/settings#api
|
53
|
-
* __notify_to__ is the string specifying
|
53
|
+
* __notify_to__ is the string specifying Datadog monitor recipients in "@" form. If you are only managing Timeboards or
|
54
54
|
Screenboards (not Monitors), this can be ``nil``.
|
55
55
|
* __repo_path__ is a string that will be included in all Monitor notification messages and TimeBoard/ScreenBoard descriptions,
|
56
|
-
telling users where to find the code that created the
|
56
|
+
telling users where to find the code that created the Datadog resource. This is intended to alert users to code-managed
|
57
57
|
items that shouldn't be manually changed. If this parameter is not specified, it will be obtained from the first usable
|
58
58
|
and present value of: the ``GIT_URL`` environment variable, the ``CIRCLE_REPOSITORY_URL`` or the first remote URL found
|
59
59
|
by running ``git config --local -l`` in the directory that contains the code calling this constructor.
|
@@ -243,12 +243,12 @@ graphs = [
|
|
243
243
|
"max:aws.elb.latency{host:#{elb_name}}"
|
244
244
|
]
|
245
245
|
),
|
246
|
-
# Instance CPU Utilization from
|
246
|
+
# Instance CPU Utilization from Datadog/EC2 integration
|
247
247
|
dog.graphdef(
|
248
248
|
"Instance EC2 CPU Utilization",
|
249
249
|
"avg:aws.ec2.cpuutilization{name:#{instance_name}}"
|
250
250
|
),
|
251
|
-
# Instance Free Memory from
|
251
|
+
# Instance Free Memory from Datadog Agent on instance
|
252
252
|
dog.graphdef(
|
253
253
|
"Instance Free Memory",
|
254
254
|
"avg:system.mem.free{name:#{instance_name}}"
|
data/lib/dogtrainer/api.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'dogapi'
|
2
2
|
require 'dogapi/v1'
|
3
3
|
require 'dogtrainer/logging'
|
4
|
+
require 'dogtrainer/dogapiexception'
|
4
5
|
|
5
6
|
module DogTrainer
|
6
7
|
# Helper methods to upsert/ensure existence and configuration of DataDog
|
@@ -36,6 +37,20 @@ module DogTrainer
|
|
36
37
|
end
|
37
38
|
end
|
38
39
|
|
40
|
+
# Check the result of a Dogapi::Client call.
|
41
|
+
#
|
42
|
+
# Dogapi::Client returns responses as arrays, with the first element being
|
43
|
+
# the HTTP response code and the second element being the actual response.
|
44
|
+
#
|
45
|
+
# Check the specified
|
46
|
+
#
|
47
|
+
# @param r [Array] the Dogapi result/response
|
48
|
+
# @param accepted_codes [Array] Array of acceptable (success) HTTP codes
|
49
|
+
# @raise [DogApiException] if the response code indicates an error
|
50
|
+
def check_dog_result(r, accepted_codes = ['200'])
|
51
|
+
raise DogApiException, r unless accepted_codes.include?(r[0])
|
52
|
+
end
|
53
|
+
|
39
54
|
# Return a human-usable string identifying where to make changes to the
|
40
55
|
# resources created by this class. Returns the first of:
|
41
56
|
#
|
@@ -195,8 +210,10 @@ module DogTrainer
|
|
195
210
|
'no_data_timeframe' => 20
|
196
211
|
}
|
197
212
|
}
|
198
|
-
|
199
|
-
options[
|
213
|
+
unless options[:escalation_message].nil?
|
214
|
+
monitor_data['options']['escalation_message'] = \
|
215
|
+
options[:escalation_message]
|
216
|
+
end
|
200
217
|
monitor_data
|
201
218
|
end
|
202
219
|
|
@@ -303,7 +320,7 @@ module DogTrainer
|
|
303
320
|
|
304
321
|
# Create a monitor that doesn't already exist; return its id
|
305
322
|
#
|
306
|
-
# @param
|
323
|
+
# @param _mon_name [String] mane of the monitor to create
|
307
324
|
# @param mon_params [Hash] params to pass to the DataDog API call. Must
|
308
325
|
# include "type" and "query" keys.
|
309
326
|
def create_monitor(_mon_name, mon_params)
|
@@ -356,14 +373,15 @@ module DogTrainer
|
|
356
373
|
# @param [Hash] options
|
357
374
|
# @option options [Integer] :end_timestamp optional timestamp
|
358
375
|
# for when the mute should end; Integer POSIX timestamp.
|
376
|
+
# @raise [DogApiException] if the Datadog API returns an error
|
359
377
|
def mute_monitor_by_id(mon_id, options = { end_timestamp: nil })
|
360
378
|
if options.fetch(:end_timestamp, nil).nil?
|
361
379
|
logger.info "Muting monitor by ID #{mon_id}"
|
362
|
-
@dog.mute_monitor(mon_id)
|
380
|
+
check_dog_result(@dog.mute_monitor(mon_id))
|
363
381
|
else
|
364
382
|
end_ts = options[:end_timestamp]
|
365
383
|
logger.info "Muting monitor by ID #{mon_id} until #{end_ts}"
|
366
|
-
@dog.mute_monitor(mon_id, end: end_ts)
|
384
|
+
check_dog_result(@dog.mute_monitor(mon_id, end: end_ts))
|
367
385
|
end
|
368
386
|
end
|
369
387
|
|
@@ -383,17 +401,18 @@ module DogTrainer
|
|
383
401
|
# @option options [Integer] :end_timestamp optional timestamp
|
384
402
|
# for when the mute should end; Integer POSIX timestamp.
|
385
403
|
# @raise [RuntimeError] raised if the specified monitor name can't be found
|
404
|
+
# @raise [DogApiException] if the Datadog API returns an error
|
386
405
|
def mute_monitor_by_name(mon_name, options = { end_timestamp: nil })
|
387
406
|
mon = get_existing_monitor_by_name(mon_name)
|
388
407
|
raise "ERROR: Could not find monitor with name #{mon_name}" if mon.nil?
|
389
408
|
if options.fetch(:end_timestamp, nil).nil?
|
390
409
|
logger.info "Muting monitor by name #{mon_name} (#{mon['id']})"
|
391
|
-
@dog.mute_monitor(mon['id'])
|
410
|
+
check_dog_result(@dog.mute_monitor(mon['id']))
|
392
411
|
else
|
393
412
|
end_ts = options[:end_timestamp]
|
394
413
|
logger.info "Muting monitor by name #{mon_name} (#{mon['id']}) " \
|
395
414
|
"until #{end_ts}"
|
396
|
-
@dog.mute_monitor(mon['id'], end: end_ts)
|
415
|
+
check_dog_result(@dog.mute_monitor(mon['id'], end: end_ts))
|
397
416
|
end
|
398
417
|
end
|
399
418
|
|
@@ -442,9 +461,10 @@ module DogTrainer
|
|
442
461
|
# Unute the monitor identified by the specified unique ID.
|
443
462
|
#
|
444
463
|
# @param mon_id [Integer] ID of the monitor to mute
|
464
|
+
# @raise [DogApiException] if the Datadog API returns an error
|
445
465
|
def unmute_monitor_by_id(mon_id)
|
446
466
|
logger.info "Unmuting monitor by ID #{mon_id}"
|
447
|
-
@dog.unmute_monitor(mon_id, all_scopes: true)
|
467
|
+
check_dog_result(@dog.unmute_monitor(mon_id, all_scopes: true))
|
448
468
|
end
|
449
469
|
|
450
470
|
# Unmute the monitor identified by the specified name.
|
@@ -522,12 +542,14 @@ module DogTrainer
|
|
522
542
|
#
|
523
543
|
# @param dash_name [String] Account-unique dashboard name
|
524
544
|
# @param graphs [Array] Array of graphdefs to add to dashboard
|
545
|
+
# @raise [DogApiException] if the Datadog API returns an error
|
525
546
|
def upsert_timeboard(dash_name, graphs)
|
526
547
|
logger.info "Upserting timeboard: #{dash_name}"
|
527
548
|
desc = "created by DogTrainer RubyGem via #{@repo_path}"
|
528
549
|
dash = get_existing_timeboard_by_name(dash_name)
|
529
550
|
if dash.nil?
|
530
551
|
d = @dog.create_dashboard(dash_name, desc, graphs)
|
552
|
+
check_dog_result(d)
|
531
553
|
logger.info "Created timeboard #{d[1]['dash']['id']}"
|
532
554
|
return
|
533
555
|
end
|
@@ -548,9 +570,10 @@ module DogTrainer
|
|
548
570
|
|
549
571
|
if needs_update
|
550
572
|
logger.info "\tUpdating timeboard #{dash['dash']['id']}"
|
551
|
-
@dog.update_dashboard(
|
573
|
+
d = @dog.update_dashboard(
|
552
574
|
dash['dash']['id'], dash_name, desc, graphs
|
553
575
|
)
|
576
|
+
check_dog_result(d)
|
554
577
|
logger.info "\tTimeboard updated."
|
555
578
|
else
|
556
579
|
logger.info "\tTimeboard is up-to-date"
|
@@ -566,6 +589,7 @@ module DogTrainer
|
|
566
589
|
# @param widgets [Array] Array of Hash widget definitions to pass to
|
567
590
|
# the DataDog API. For further information, see:
|
568
591
|
# http://docs.datadoghq.com/api/screenboards/
|
592
|
+
# @raise [DogApiException] if the Datadog API returns an error
|
569
593
|
def upsert_screenboard(dash_name, widgets)
|
570
594
|
logger.info "Upserting screenboard: #{dash_name}"
|
571
595
|
desc = "created by DogTrainer RubyGem via #{@repo_path}"
|
@@ -574,6 +598,7 @@ module DogTrainer
|
|
574
598
|
d = @dog.create_screenboard(board_title: dash_name,
|
575
599
|
description: desc,
|
576
600
|
widgets: widgets)
|
601
|
+
check_dog_result(d)
|
577
602
|
logger.info "Created screenboard #{d[1]['id']}"
|
578
603
|
return
|
579
604
|
end
|
@@ -594,9 +619,10 @@ module DogTrainer
|
|
594
619
|
|
595
620
|
if needs_update
|
596
621
|
logger.info "\tUpdating screenboard #{dash['id']}"
|
597
|
-
@dog.update_screenboard(dash['id'], board_title: dash_name,
|
598
|
-
|
599
|
-
|
622
|
+
d = @dog.update_screenboard(dash['id'], board_title: dash_name,
|
623
|
+
description: desc,
|
624
|
+
widgets: widgets)
|
625
|
+
check_dog_result(d)
|
600
626
|
logger.info "\tScreenboard updated."
|
601
627
|
else
|
602
628
|
logger.info "\tScreenboard is up-to-date"
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module DogTrainer
|
2
|
+
# Exception raised for Datadog API errors (non-200 status code)
|
3
|
+
class DogApiException < StandardError
|
4
|
+
attr_reader :statuscode
|
5
|
+
attr_reader :content
|
6
|
+
|
7
|
+
def initialize(response)
|
8
|
+
@statuscode = response[0]
|
9
|
+
@content = if response.length > 1
|
10
|
+
response[1]
|
11
|
+
else
|
12
|
+
{}
|
13
|
+
end
|
14
|
+
msg = "Datadog API call returned status #{@statuscode}"
|
15
|
+
if @content.include?('errors')
|
16
|
+
msg << ":\n"
|
17
|
+
if @content['errors'].is_a?(Array)
|
18
|
+
@content['errors'].each { |e| msg << "#{e}\n" }
|
19
|
+
else
|
20
|
+
msg << "#{content['errors']}\n"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
super(msg)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/dogtrainer/version.rb
CHANGED
data/spec/unit/api_spec.rb
CHANGED
@@ -60,6 +60,39 @@ describe DogTrainer::API do
|
|
60
60
|
expect(x.instance_variable_get('@repo_path')).to eq('foo/bar')
|
61
61
|
end
|
62
62
|
end
|
63
|
+
describe '#check_dog_result' do
|
64
|
+
let(:response) { { 'foo' => 'bar' } }
|
65
|
+
context 'with default accepted_codes' do
|
66
|
+
describe 'when code is in accepted array' do
|
67
|
+
it 'does not raise an exception' do
|
68
|
+
expect { subject.check_dog_result(['200', response]) }
|
69
|
+
.to_not raise_error
|
70
|
+
end
|
71
|
+
end
|
72
|
+
describe 'when code is not in accepted array' do
|
73
|
+
it 'raises an exception' do
|
74
|
+
expect { subject.check_dog_result(['400', response]) }
|
75
|
+
.to raise_error DogTrainer::DogApiException,
|
76
|
+
/Datadog API call returned status 400/
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
context 'with custom accepted_codes' do
|
81
|
+
describe 'when code is in accepted array' do
|
82
|
+
it 'does not raise an exception' do
|
83
|
+
expect { subject.check_dog_result(['404', response], %w(200 404)) }
|
84
|
+
.to_not raise_error
|
85
|
+
end
|
86
|
+
end
|
87
|
+
describe 'when code is not in accepted array' do
|
88
|
+
it 'raises an exception' do
|
89
|
+
expect { subject.check_dog_result(['400', response], %w(200 404)) }
|
90
|
+
.to raise_error DogTrainer::DogApiException,
|
91
|
+
/Datadog API call returned status 400/
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
63
96
|
describe '#get_repo_path' do
|
64
97
|
it 'calls #get_git_url_for_directory if ENV vars are not set' do
|
65
98
|
allow(ENV).to receive(:has_key?).with('GIT_URL').and_return(false)
|
@@ -1000,19 +1033,25 @@ describe DogTrainer::API do
|
|
1000
1033
|
describe '#mute_monitor_by_id' do
|
1001
1034
|
it 'calls dog.mute_monitor with id' do
|
1002
1035
|
dog = double(Dogapi::Client)
|
1003
|
-
|
1036
|
+
resp = double
|
1037
|
+
allow(dog).to receive(:mute_monitor).with(any_args).and_return(resp)
|
1038
|
+
allow(subject).to receive(:check_dog_result)
|
1004
1039
|
subject.instance_variable_set('@dog', dog)
|
1005
1040
|
|
1006
1041
|
expect(dog).to receive(:mute_monitor).once.with(12_345)
|
1042
|
+
expect(subject).to receive(:check_dog_result).once.with(resp)
|
1007
1043
|
subject.mute_monitor_by_id(12_345)
|
1008
1044
|
end
|
1009
1045
|
it 'calls dog.mute_monitor with id and timestamp if specified' do
|
1010
1046
|
dog = double(Dogapi::Client)
|
1011
|
-
|
1047
|
+
resp = double
|
1048
|
+
allow(dog).to receive(:mute_monitor).with(any_args).and_return(resp)
|
1049
|
+
allow(subject).to receive(:check_dog_result)
|
1012
1050
|
subject.instance_variable_set('@dog', dog)
|
1013
1051
|
|
1014
1052
|
expect(dog).to receive(:mute_monitor).once
|
1015
1053
|
.with(12_345, end: 6_789)
|
1054
|
+
expect(subject).to receive(:check_dog_result).once.with(resp)
|
1016
1055
|
subject.mute_monitor_by_id(12_345, end_timestamp: 6_789)
|
1017
1056
|
end
|
1018
1057
|
end
|
@@ -1020,39 +1059,48 @@ describe DogTrainer::API do
|
|
1020
1059
|
it 'calls dog.mute_monitor with id' do
|
1021
1060
|
monitor = { 'id' => 5_678 }
|
1022
1061
|
dog = double(Dogapi::Client)
|
1023
|
-
|
1062
|
+
resp = double
|
1063
|
+
allow(dog).to receive(:mute_monitor).with(any_args).and_return(resp)
|
1024
1064
|
allow(subject).to receive(:get_existing_monitor_by_name)
|
1025
1065
|
.and_return(monitor)
|
1066
|
+
allow(subject).to receive(:check_dog_result)
|
1026
1067
|
subject.instance_variable_set('@dog', dog)
|
1027
1068
|
|
1028
1069
|
expect(subject).to receive(:get_existing_monitor_by_name).once
|
1029
1070
|
.with('mymon')
|
1030
1071
|
expect(dog).to receive(:mute_monitor).once.with(5_678)
|
1072
|
+
expect(subject).to receive(:check_dog_result).once.with(resp)
|
1031
1073
|
subject.mute_monitor_by_name('mymon')
|
1032
1074
|
end
|
1033
1075
|
it 'calls dog.mute_monitor with id and timestamp if specified' do
|
1034
1076
|
monitor = { 'id' => 5_678 }
|
1035
1077
|
dog = double(Dogapi::Client)
|
1036
|
-
|
1078
|
+
resp = double
|
1079
|
+
allow(dog).to receive(:mute_monitor).with(any_args).and_return(resp)
|
1037
1080
|
allow(subject).to receive(:get_existing_monitor_by_name)
|
1038
1081
|
.and_return(monitor)
|
1082
|
+
allow(subject).to receive(:check_dog_result)
|
1039
1083
|
subject.instance_variable_set('@dog', dog)
|
1040
1084
|
|
1041
1085
|
expect(subject).to receive(:get_existing_monitor_by_name).once
|
1042
1086
|
.with('mymon')
|
1043
1087
|
expect(dog).to receive(:mute_monitor).once.with(5_678, end: 1_234)
|
1088
|
+
expect(subject).to receive(:check_dog_result).once.with(resp)
|
1044
1089
|
subject.mute_monitor_by_name('mymon', end_timestamp: 1_234)
|
1045
1090
|
end
|
1046
1091
|
it 'raises error if monitor cannot be found' do
|
1047
1092
|
dog = double(Dogapi::Client)
|
1048
|
-
|
1093
|
+
resp = double
|
1094
|
+
allow(dog).to receive(:mute_monitor).with(any_args).and_return(resp)
|
1049
1095
|
allow(subject).to receive(:get_existing_monitor_by_name)
|
1050
1096
|
.and_return(nil)
|
1097
|
+
allow(subject).to receive(:check_dog_result)
|
1051
1098
|
subject.instance_variable_set('@dog', dog)
|
1052
1099
|
|
1053
1100
|
expect(subject).to receive(:get_existing_monitor_by_name).once
|
1054
1101
|
.with('mymon')
|
1055
1102
|
expect(dog).to_not receive(:mute_monitor)
|
1103
|
+
expect(subject).to_not receive(:check_dog_result)
|
1056
1104
|
expect { subject.mute_monitor_by_name('mymon') }
|
1057
1105
|
.to raise_error(RuntimeError,
|
1058
1106
|
'ERROR: Could not find monitor with name mymon')
|
@@ -1126,11 +1174,14 @@ describe DogTrainer::API do
|
|
1126
1174
|
describe '#unmute_monitor_by_id' do
|
1127
1175
|
it 'calls dog.unmute_monitor with id' do
|
1128
1176
|
dog = double(Dogapi::Client)
|
1129
|
-
|
1177
|
+
resp = double
|
1178
|
+
allow(dog).to receive(:unmute_monitor).with(any_args).and_return(resp)
|
1179
|
+
allow(subject).to receive(:check_dog_result)
|
1130
1180
|
subject.instance_variable_set('@dog', dog)
|
1131
1181
|
|
1132
1182
|
expect(dog).to receive(:unmute_monitor).once
|
1133
1183
|
.with(12_345, all_scopes: true)
|
1184
|
+
expect(subject).to receive(:check_dog_result).once.with(resp)
|
1134
1185
|
subject.unmute_monitor_by_id(12_345)
|
1135
1186
|
end
|
1136
1187
|
end
|
@@ -1326,6 +1377,7 @@ describe DogTrainer::API do
|
|
1326
1377
|
allow(subject).to receive(:get_existing_timeboard_by_name).with(any_args)
|
1327
1378
|
.and_return(nil)
|
1328
1379
|
allow(subject.logger).to receive(:info).with(any_args)
|
1380
|
+
allow(subject).to receive(:check_dog_result)
|
1329
1381
|
|
1330
1382
|
expect(subject).to receive(:get_existing_timeboard_by_name).once
|
1331
1383
|
.with('t')
|
@@ -1337,6 +1389,7 @@ describe DogTrainer::API do
|
|
1337
1389
|
)
|
1338
1390
|
expect(dog).to_not receive(:update_dashboard)
|
1339
1391
|
expect(subject.logger).to receive(:info).with('Created timeboard id1')
|
1392
|
+
expect(subject).to receive(:check_dog_result).once.with(res)
|
1340
1393
|
subject.upsert_timeboard('t', [1, 2])
|
1341
1394
|
end
|
1342
1395
|
it 'does not update if params are current' do
|
@@ -1359,12 +1412,14 @@ describe DogTrainer::API do
|
|
1359
1412
|
allow(subject).to receive(:get_existing_timeboard_by_name).with(any_args)
|
1360
1413
|
.and_return(res[1])
|
1361
1414
|
allow(subject.logger).to receive(:info).with(any_args)
|
1415
|
+
allow(subject).to receive(:check_dog_result)
|
1362
1416
|
|
1363
1417
|
expect(subject).to receive(:get_existing_timeboard_by_name).once
|
1364
1418
|
.with('t')
|
1365
1419
|
expect(dog).to_not receive(:create_dashboard)
|
1366
1420
|
expect(dog).to_not receive(:update_dashboard)
|
1367
1421
|
expect(subject.logger).to receive(:info).with("\tTimeboard is up-to-date")
|
1422
|
+
expect(subject).to_not receive(:check_dog_result)
|
1368
1423
|
subject.upsert_timeboard('t', [1, 2])
|
1369
1424
|
end
|
1370
1425
|
it 'updates if title changed' do
|
@@ -1382,11 +1437,12 @@ describe DogTrainer::API do
|
|
1382
1437
|
]
|
1383
1438
|
dog = double(Dogapi::Client)
|
1384
1439
|
allow(dog).to receive(:create_dashboard).with(any_args)
|
1385
|
-
allow(dog).to receive(:update_dashboard).with(any_args)
|
1440
|
+
allow(dog).to receive(:update_dashboard).with(any_args).and_return(res)
|
1386
1441
|
subject.instance_variable_set('@dog', dog)
|
1387
1442
|
allow(subject).to receive(:get_existing_timeboard_by_name).with(any_args)
|
1388
1443
|
.and_return(res[1])
|
1389
1444
|
allow(subject.logger).to receive(:info).with(any_args)
|
1445
|
+
allow(subject).to receive(:check_dog_result)
|
1390
1446
|
|
1391
1447
|
expect(subject).to receive(:get_existing_timeboard_by_name).once
|
1392
1448
|
.with('t')
|
@@ -1399,6 +1455,7 @@ describe DogTrainer::API do
|
|
1399
1455
|
)
|
1400
1456
|
expect(subject.logger).to receive(:info).with("\tUpdating timeboard id1")
|
1401
1457
|
expect(subject.logger).to receive(:info).with("\tTimeboard updated.")
|
1458
|
+
expect(subject).to receive(:check_dog_result).once.with(res)
|
1402
1459
|
subject.upsert_timeboard('t', [1, 2])
|
1403
1460
|
end
|
1404
1461
|
it 'updates if repo_path changed' do
|
@@ -1416,11 +1473,12 @@ describe DogTrainer::API do
|
|
1416
1473
|
]
|
1417
1474
|
dog = double(Dogapi::Client)
|
1418
1475
|
allow(dog).to receive(:create_dashboard).with(any_args)
|
1419
|
-
allow(dog).to receive(:update_dashboard).with(any_args)
|
1476
|
+
allow(dog).to receive(:update_dashboard).with(any_args).and_return(res)
|
1420
1477
|
subject.instance_variable_set('@dog', dog)
|
1421
1478
|
allow(subject).to receive(:get_existing_timeboard_by_name).with(any_args)
|
1422
1479
|
.and_return(res[1])
|
1423
1480
|
allow(subject.logger).to receive(:info).with(any_args)
|
1481
|
+
allow(subject).to receive(:check_dog_result)
|
1424
1482
|
|
1425
1483
|
expect(subject).to receive(:get_existing_timeboard_by_name).once
|
1426
1484
|
.with('t')
|
@@ -1433,6 +1491,7 @@ describe DogTrainer::API do
|
|
1433
1491
|
)
|
1434
1492
|
expect(subject.logger).to receive(:info).with("\tUpdating timeboard id1")
|
1435
1493
|
expect(subject.logger).to receive(:info).with("\tTimeboard updated.")
|
1494
|
+
expect(subject).to receive(:check_dog_result).once.with(res)
|
1436
1495
|
subject.upsert_timeboard('t', [1, 2])
|
1437
1496
|
end
|
1438
1497
|
it 'updates if graphs changed' do
|
@@ -1450,11 +1509,12 @@ describe DogTrainer::API do
|
|
1450
1509
|
]
|
1451
1510
|
dog = double(Dogapi::Client)
|
1452
1511
|
allow(dog).to receive(:create_dashboard).with(any_args)
|
1453
|
-
allow(dog).to receive(:update_dashboard).with(any_args)
|
1512
|
+
allow(dog).to receive(:update_dashboard).with(any_args).and_return(res)
|
1454
1513
|
subject.instance_variable_set('@dog', dog)
|
1455
1514
|
allow(subject).to receive(:get_existing_timeboard_by_name).with(any_args)
|
1456
1515
|
.and_return(res[1])
|
1457
1516
|
allow(subject.logger).to receive(:info).with(any_args)
|
1517
|
+
allow(subject).to receive(:check_dog_result)
|
1458
1518
|
|
1459
1519
|
expect(subject).to receive(:get_existing_timeboard_by_name).once
|
1460
1520
|
.with('t')
|
@@ -1467,6 +1527,7 @@ describe DogTrainer::API do
|
|
1467
1527
|
)
|
1468
1528
|
expect(subject.logger).to receive(:info).with("\tUpdating timeboard id1")
|
1469
1529
|
expect(subject.logger).to receive(:info).with("\tTimeboard updated.")
|
1530
|
+
expect(subject).to receive(:check_dog_result).once.with(res)
|
1470
1531
|
subject.upsert_timeboard('t', [3, 4])
|
1471
1532
|
end
|
1472
1533
|
end
|
@@ -1487,6 +1548,7 @@ describe DogTrainer::API do
|
|
1487
1548
|
subject.instance_variable_set('@dog', dog)
|
1488
1549
|
allow(subject).to receive(:get_existing_screenboard_by_name)
|
1489
1550
|
.with(any_args).and_return(nil)
|
1551
|
+
allow(subject).to receive(:check_dog_result)
|
1490
1552
|
allow(subject.logger).to receive(:info).with(any_args)
|
1491
1553
|
|
1492
1554
|
expect(subject).to receive(:get_existing_screenboard_by_name).once
|
@@ -1499,6 +1561,7 @@ describe DogTrainer::API do
|
|
1499
1561
|
)
|
1500
1562
|
expect(dog).to_not receive(:update_screenboard)
|
1501
1563
|
expect(subject.logger).to receive(:info).with('Created screenboard id1')
|
1564
|
+
expect(subject).to receive(:check_dog_result).once.with(res)
|
1502
1565
|
subject.upsert_screenboard('t', [1, 2])
|
1503
1566
|
end
|
1504
1567
|
it 'does nothing if it is up to date' do
|
@@ -1517,6 +1580,7 @@ describe DogTrainer::API do
|
|
1517
1580
|
subject.instance_variable_set('@dog', dog)
|
1518
1581
|
allow(subject).to receive(:get_existing_screenboard_by_name)
|
1519
1582
|
.with(any_args).and_return(res[1])
|
1583
|
+
allow(subject).to receive(:check_dog_result)
|
1520
1584
|
allow(subject.logger).to receive(:info).with(any_args)
|
1521
1585
|
|
1522
1586
|
expect(subject).to receive(:get_existing_screenboard_by_name).once
|
@@ -1525,6 +1589,7 @@ describe DogTrainer::API do
|
|
1525
1589
|
expect(dog).to_not receive(:update_screenboard)
|
1526
1590
|
expect(subject.logger).to receive(:info)
|
1527
1591
|
.with("\tScreenboard is up-to-date")
|
1592
|
+
expect(subject).to_not receive(:check_dog_result)
|
1528
1593
|
subject.upsert_screenboard('t', [1, 2])
|
1529
1594
|
end
|
1530
1595
|
it 'updates if repo_path in description is different' do
|
@@ -1539,10 +1604,11 @@ describe DogTrainer::API do
|
|
1539
1604
|
]
|
1540
1605
|
dog = double(Dogapi::Client)
|
1541
1606
|
allow(dog).to receive(:create_screenboard).with(any_args)
|
1542
|
-
allow(dog).to receive(:update_screenboard).with(any_args)
|
1607
|
+
allow(dog).to receive(:update_screenboard).with(any_args).and_return(res)
|
1543
1608
|
subject.instance_variable_set('@dog', dog)
|
1544
1609
|
allow(subject).to receive(:get_existing_screenboard_by_name)
|
1545
1610
|
.with(any_args).and_return(res[1])
|
1611
|
+
allow(subject).to receive(:check_dog_result)
|
1546
1612
|
allow(subject.logger).to receive(:info).with(any_args)
|
1547
1613
|
|
1548
1614
|
expect(subject).to receive(:get_existing_screenboard_by_name).once
|
@@ -1555,6 +1621,8 @@ describe DogTrainer::API do
|
|
1555
1621
|
description: 'created by DogTrainer RubyGem via my_repo_path',
|
1556
1622
|
widgets: [1, 2]
|
1557
1623
|
)
|
1624
|
+
expect(subject.logger).to receive(:info).with("\tScreenboard updated.")
|
1625
|
+
expect(subject).to receive(:check_dog_result).once.with(res)
|
1558
1626
|
subject.upsert_screenboard('t', [1, 2])
|
1559
1627
|
end
|
1560
1628
|
it 'updates if title is different' do
|
@@ -1569,10 +1637,11 @@ describe DogTrainer::API do
|
|
1569
1637
|
]
|
1570
1638
|
dog = double(Dogapi::Client)
|
1571
1639
|
allow(dog).to receive(:create_screenboard).with(any_args)
|
1572
|
-
allow(dog).to receive(:update_screenboard).with(any_args)
|
1640
|
+
allow(dog).to receive(:update_screenboard).with(any_args).and_return(res)
|
1573
1641
|
subject.instance_variable_set('@dog', dog)
|
1574
1642
|
allow(subject).to receive(:get_existing_screenboard_by_name)
|
1575
1643
|
.with(any_args).and_return(res[1])
|
1644
|
+
allow(subject).to receive(:check_dog_result)
|
1576
1645
|
allow(subject.logger).to receive(:info).with(any_args)
|
1577
1646
|
|
1578
1647
|
expect(subject).to receive(:get_existing_screenboard_by_name).once
|
@@ -1585,6 +1654,8 @@ describe DogTrainer::API do
|
|
1585
1654
|
description: 'created by DogTrainer RubyGem via my_repo_path',
|
1586
1655
|
widgets: [1, 2]
|
1587
1656
|
)
|
1657
|
+
expect(subject.logger).to receive(:info).with("\tScreenboard updated.")
|
1658
|
+
expect(subject).to receive(:check_dog_result).once.with(res)
|
1588
1659
|
subject.upsert_screenboard('t', [1, 2])
|
1589
1660
|
end
|
1590
1661
|
it 'updates if widgets are different' do
|
@@ -1599,10 +1670,11 @@ describe DogTrainer::API do
|
|
1599
1670
|
]
|
1600
1671
|
dog = double(Dogapi::Client)
|
1601
1672
|
allow(dog).to receive(:create_screenboard).with(any_args)
|
1602
|
-
allow(dog).to receive(:update_screenboard).with(any_args)
|
1673
|
+
allow(dog).to receive(:update_screenboard).with(any_args).and_return(res)
|
1603
1674
|
subject.instance_variable_set('@dog', dog)
|
1604
1675
|
allow(subject).to receive(:get_existing_screenboard_by_name)
|
1605
1676
|
.with(any_args).and_return(res[1])
|
1677
|
+
allow(subject).to receive(:check_dog_result)
|
1606
1678
|
allow(subject.logger).to receive(:info).with(any_args)
|
1607
1679
|
|
1608
1680
|
expect(subject).to receive(:get_existing_screenboard_by_name).once
|
@@ -1615,6 +1687,8 @@ describe DogTrainer::API do
|
|
1615
1687
|
description: 'created by DogTrainer RubyGem via my_repo_path',
|
1616
1688
|
widgets: [1, 2]
|
1617
1689
|
)
|
1690
|
+
expect(subject.logger).to receive(:info).with("\tScreenboard updated.")
|
1691
|
+
expect(subject).to receive(:check_dog_result).once.with(res)
|
1618
1692
|
subject.upsert_screenboard('t', [1, 2])
|
1619
1693
|
end
|
1620
1694
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'dogtrainer'
|
2
|
+
|
3
|
+
describe DogTrainer::DogApiException do
|
4
|
+
subject { DogTrainer::DogApiException }
|
5
|
+
describe 'attr_readers' do
|
6
|
+
it 'has statuscode attr_reader' do
|
7
|
+
expect(subject.new(['500', { 'errors' => ['foo'] }]).statuscode)
|
8
|
+
.to eq('500')
|
9
|
+
end
|
10
|
+
it 'has content attr_reader' do
|
11
|
+
expect(subject.new(['500', { 'errors' => ['foo'] }]).content)
|
12
|
+
.to eq('errors' => ['foo'])
|
13
|
+
end
|
14
|
+
end
|
15
|
+
describe 'when response is a single-element array' do
|
16
|
+
it 'sets content to an empty hash' do
|
17
|
+
expect(subject.new(['500']).content).to eq({})
|
18
|
+
end
|
19
|
+
end
|
20
|
+
describe 'with errors in content' do
|
21
|
+
context 'when errors is an Array' do
|
22
|
+
it 'includes errors in the message' do
|
23
|
+
# rubocop:disable Style/WordArray
|
24
|
+
x = subject.new(['500', { 'errors' => ['foo', "bar\nbaz"] }])
|
25
|
+
# rubocop:enable Style/WordArray
|
26
|
+
expect(x.to_s)
|
27
|
+
.to eq("Datadog API call returned status 500:\nfoo\nbar\nbaz\n")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
context 'when errors is a String' do
|
31
|
+
it 'includes errors in the message' do
|
32
|
+
x = subject.new(['500', { 'errors' => 'foo' }])
|
33
|
+
expect(x.to_s)
|
34
|
+
.to eq("Datadog API call returned status 500:\nfoo\n")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
describe 'without errors in content' do
|
39
|
+
it 'does not include errors in the message' do
|
40
|
+
x = subject.new(['500', {}])
|
41
|
+
expect(x.to_s).to eq('Datadog API call returned status 500')
|
42
|
+
end
|
43
|
+
end
|
44
|
+
describe 'with a nil content' do
|
45
|
+
it 'produces a correct message' do
|
46
|
+
x = subject.new(['404', {}])
|
47
|
+
expect(x.to_s).to eq('Datadog API call returned status 404')
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dogtrainer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jantman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-02-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dogapi
|
@@ -386,10 +386,12 @@ files:
|
|
386
386
|
- dogtrainer.gemspec
|
387
387
|
- lib/dogtrainer.rb
|
388
388
|
- lib/dogtrainer/api.rb
|
389
|
+
- lib/dogtrainer/dogapiexception.rb
|
389
390
|
- lib/dogtrainer/logging.rb
|
390
391
|
- lib/dogtrainer/version.rb
|
391
392
|
- spec/spec_helper.rb
|
392
393
|
- spec/unit/api_spec.rb
|
394
|
+
- spec/unit/dogapiexception_spec.rb
|
393
395
|
- spec/unit/logging_spec.rb
|
394
396
|
homepage: http://github.com/Manheim/dogtrainer
|
395
397
|
licenses:
|
@@ -420,4 +422,5 @@ summary: Wrapper around DataDog dogapi gem to simplify creation and management o
|
|
420
422
|
test_files:
|
421
423
|
- spec/spec_helper.rb
|
422
424
|
- spec/unit/api_spec.rb
|
425
|
+
- spec/unit/dogapiexception_spec.rb
|
423
426
|
- spec/unit/logging_spec.rb
|