wavefront-sdk 3.7.0 → 5.1.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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +43 -2
  3. data/.travis.yml +0 -1
  4. data/HISTORY.md +32 -0
  5. data/README.md +4 -3
  6. data/lib/wavefront-sdk/account.rb +104 -3
  7. data/lib/wavefront-sdk/api_mixins/user.rb +10 -0
  8. data/lib/wavefront-sdk/cloudintegration.rb +27 -0
  9. data/lib/wavefront-sdk/core/api_caller.rb +50 -7
  10. data/lib/wavefront-sdk/core/exception.rb +5 -0
  11. data/lib/wavefront-sdk/defs/version.rb +1 -3
  12. data/lib/wavefront-sdk/paginator/base.rb +21 -15
  13. data/lib/wavefront-sdk/query.rb +0 -1
  14. data/lib/wavefront-sdk/role.rb +128 -0
  15. data/lib/wavefront-sdk/spy.rb +126 -0
  16. data/lib/wavefront-sdk/stdlib/array.rb +1 -1
  17. data/lib/wavefront-sdk/stdlib/time.rb +13 -0
  18. data/lib/wavefront-sdk/unstable/README.md +4 -0
  19. data/lib/wavefront-sdk/unstable/chart.rb +90 -0
  20. data/lib/wavefront-sdk/unstable/unstable.rb +9 -0
  21. data/lib/wavefront-sdk/user.rb +31 -0
  22. data/lib/wavefront-sdk/usergroup.rb +17 -16
  23. data/lib/wavefront-sdk/validators.rb +52 -7
  24. data/lib/wavefront-sdk/write.rb +13 -3
  25. data/spec/.rubocop.yml +41 -0
  26. data/spec/spec_helper.rb +4 -0
  27. data/spec/support/minitest_assertions.rb +4 -4
  28. data/spec/wavefront-sdk/account_spec.rb +107 -1
  29. data/spec/wavefront-sdk/cloudintegration_spec.rb +38 -0
  30. data/spec/wavefront-sdk/core/api_caller_spec.rb +43 -0
  31. data/spec/wavefront-sdk/metric_helper_spec.rb +1 -1
  32. data/spec/wavefront-sdk/role_spec.rb +96 -0
  33. data/spec/wavefront-sdk/spy_spec.rb +113 -0
  34. data/spec/wavefront-sdk/unstable/chart_spec.rb +39 -0
  35. data/spec/wavefront-sdk/user_spec.rb +8 -0
  36. data/spec/wavefront-sdk/usergroup_spec.rb +21 -11
  37. data/spec/wavefront-sdk/validators_spec.rb +31 -0
  38. data/wavefront-sdk.gemspec +4 -4
  39. metadata +24 -13
@@ -37,6 +37,49 @@ class WavefrontApiCallerTest < MiniTest::Test
37
37
  assert_requested(:get, uri, headers: headers)
38
38
  end
39
39
 
40
+ def test_get_flat_params
41
+ query = { rkey: %w[val1 val2 val3], ukey: 36 }
42
+ uri = "#{uri_base}/path?rkey=val1&rkey=val2&rkey=val3&ukey=36"
43
+ stub_request(:get, uri).to_return(body: DUMMY_RESPONSE, status: 200)
44
+ wf.get_flat_params('/path', query)
45
+ assert_requested(:get, uri, headers: headers)
46
+ end
47
+
48
+ def test_get_stream
49
+ uri = "#{uri_base}/path?key1=val1"
50
+ stub_request(:get, uri).to_return(body: DUMMY_RESPONSE, status: 200)
51
+ out, err = capture_io { wf.get_stream('/path', key1: 'val1') }
52
+ assert_requested(:get, uri, headers: headers)
53
+ assert_equal(out.strip, DUMMY_RESPONSE)
54
+ assert_empty(err)
55
+ end
56
+
57
+ def test_get_stream_array_params
58
+ uri = "#{uri_base}/path?key=val1&key=val2"
59
+ stub_request(:get, uri).to_return(body: DUMMY_RESPONSE, status: 200)
60
+ out, err = capture_io { wf.get_stream('/path', key: %w[val1 val2]) }
61
+ assert_requested(:get, uri, headers: headers)
62
+ assert_equal(out.strip, DUMMY_RESPONSE)
63
+ assert_empty(err)
64
+ end
65
+
66
+ def test_get_stream_timestamp
67
+ uri = "#{uri_base}/path?key1=val1"
68
+ stub_request(:get, uri).to_return(body: DUMMY_RESPONSE, status: 200)
69
+
70
+ out, err = capture_io do
71
+ wf.get_stream('/path',
72
+ { key1: 'val1' },
73
+ timestamp_chunks: true)
74
+ end
75
+
76
+ assert_requested(:get, uri, headers: headers)
77
+ out_lines = out.split("\n")
78
+ assert_match(/^\d{4}-\d\d-\d\d \d\d:\d\d:\d\d \+\d{4}$/, out_lines[0])
79
+ assert_equal(out_lines[1], DUMMY_RESPONSE)
80
+ assert_empty(err)
81
+ end
82
+
40
83
  def test_post
41
84
  uri = "#{uri_base}/path"
42
85
  obj = { key: 'value' }
@@ -118,7 +118,7 @@ class WavefrontMetricHelperTest < MiniTest::Test
118
118
  assert_equal(1, out.select do |o|
119
119
  o[:value] == [[2, 10.0], [1, 11.0],
120
120
  [1, 12.0]]
121
- end .size)
121
+ end.size)
122
122
  assert_equal(1, out.select { |o| o[:tags] == WH_TAGS }.size)
123
123
  assert_equal(3, out.select { |o| o[:path] == 'test.dist1' }.size)
124
124
  end
@@ -0,0 +1,96 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require_relative '../spec_helper'
5
+ require_relative '../test_mixins/general'
6
+
7
+ # Unit tests for Wavefront::Role
8
+ #
9
+ class WavefrontRoleTest < WavefrontTestBase
10
+ include WavefrontTest::Create
11
+ include WavefrontTest::Delete
12
+ include WavefrontTest::Describe
13
+ include WavefrontTest::List
14
+ include WavefrontTest::Update
15
+
16
+ def test_add_assignees
17
+ assert_posts("/api/v2/role/#{id}/addAssignees", assignees.to_json) do
18
+ wf.add_assignees(id, assignees)
19
+ end
20
+
21
+ assert_raises(Wavefront::Exception::InvalidRoleId) do
22
+ wf.add_assignees(invalid_id, assignees)
23
+ end
24
+ end
25
+
26
+ def test_remove_assignees
27
+ assert_posts("/api/v2/role/#{id}/removeAssignees", assignees.to_json) do
28
+ wf.remove_assignees(id, assignees)
29
+ end
30
+
31
+ assert_raises(Wavefront::Exception::InvalidRoleId) do
32
+ wf.remove_assignees(invalid_id, assignees)
33
+ end
34
+ end
35
+
36
+ def test_grant
37
+ assert_posts("/api/v2/role/grant/#{permission}", roles.to_json) do
38
+ wf.grant(permission, roles)
39
+ end
40
+
41
+ assert_raises(Wavefront::Exception::InvalidRoleId) do
42
+ wf.grant(permission, [invalid_id])
43
+ end
44
+
45
+ assert_raises(Wavefront::Exception::InvalidPermission) do
46
+ wf.grant('made_up_permission', roles)
47
+ end
48
+ end
49
+
50
+ def test_revoke
51
+ assert_posts("/api/v2/role/revoke/#{permission}", roles.to_json) do
52
+ wf.revoke(permission, roles)
53
+ end
54
+
55
+ assert_raises(Wavefront::Exception::InvalidRoleId) do
56
+ wf.revoke(permission, [invalid_id])
57
+ end
58
+
59
+ assert_raises(Wavefront::Exception::InvalidPermission) do
60
+ wf.revoke('made_up_permission', roles)
61
+ end
62
+ end
63
+
64
+ private
65
+
66
+ def api_class
67
+ :role
68
+ end
69
+
70
+ def id
71
+ 'f8dc0c14-91a0-4ca9-8a2a-7d47f4db4672'
72
+ end
73
+
74
+ def roles
75
+ %w[f8dc0c14-91a0-4ca9-8a2a-7d47f4db4672
76
+ 2659191e-aad4-4302-a94e-9667e1517127]
77
+ end
78
+
79
+ def assignees
80
+ roles.push('sa::test')
81
+ end
82
+
83
+ def invalid_id
84
+ '__BAD_ID__'
85
+ end
86
+
87
+ def payload
88
+ { name: 'test role',
89
+ permissions: %w[alerts_management events_management],
90
+ description: 'dummy role for unit tests' }
91
+ end
92
+
93
+ def permission
94
+ 'alerts_management'
95
+ end
96
+ end
@@ -0,0 +1,113 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require_relative '../spec_helper'
5
+ require_relative '../../lib/wavefront-sdk/spy'
6
+
7
+ # Unit tests for Spy class
8
+ #
9
+ class WavefrontSpyTest < MiniTest::Test
10
+ attr_reader :wf
11
+
12
+ def setup
13
+ @wf = Wavefront::Spy.new(CREDS)
14
+ end
15
+
16
+ def test_points
17
+ capture_io do
18
+ assert_gets('/api/spy/points?sampling=0.01') { wf.points }
19
+ assert_gets('/api/spy/points?sampling=0.05') { wf.points(0.05) }
20
+
21
+ assert_gets('/api/spy/points?sampling=0.05&metric=my_prefix') do
22
+ wf.points(0.05, prefix: 'my_prefix')
23
+ end
24
+
25
+ assert_gets('/api/spy/points?sampling=0.05&metric=my_prefix&host=h1') do
26
+ wf.points(0.05, prefix: 'my_prefix', host: 'h1')
27
+ end
28
+
29
+ assert_gets('/api/spy/points?sampling=0.02&metric=my_prefix&' \
30
+ 'pointTagKey=mytag') do
31
+ wf.points(0.02, prefix: 'my_prefix', tag_key: 'mytag')
32
+ end
33
+
34
+ assert_gets('/api/spy/points?sampling=0.02&metric=my_prefix&' \
35
+ 'pointTagKey=tag1&pointTagKey=tag2') do
36
+ wf.points(0.02, prefix: 'my_prefix', tag_key: %w[tag1 tag2])
37
+ end
38
+ end
39
+ end
40
+
41
+ def test_histograms
42
+ capture_io do
43
+ assert_gets('/api/spy/histograms?sampling=0.01') { wf.histograms }
44
+ assert_gets('/api/spy/histograms?sampling=0.05') { wf.histograms(0.05) }
45
+
46
+ assert_gets('/api/spy/histograms?sampling=0.05&histogram=my_prefix') do
47
+ wf.histograms(0.05, prefix: 'my_prefix')
48
+ end
49
+
50
+ assert_gets(
51
+ '/api/spy/histograms?sampling=0.05&histogram=my_prefix&host=h1'
52
+ ) do
53
+ wf.histograms(0.05, prefix: 'my_prefix', host: 'h1')
54
+ end
55
+
56
+ assert_gets('/api/spy/histograms?sampling=0.02&histogram=my_prefix&' \
57
+ 'histogramTagKey=the_tag') do
58
+ wf.histograms(0.02, prefix: 'my_prefix', tag_key: 'the_tag')
59
+ end
60
+
61
+ assert_gets('/api/spy/histograms?sampling=0.02&histogram=my_prefix&' \
62
+ 'histogramTagKey=tag1&histogramTagKey=tag2') do
63
+ wf.histograms(0.02, prefix: 'my_prefix', tag_key: %w[tag1 tag2])
64
+ end
65
+ end
66
+ end
67
+
68
+ def test_spans
69
+ capture_io do
70
+ assert_gets('/api/spy/spans?sampling=0.01') { wf.spans }
71
+ assert_gets('/api/spy/spans?sampling=0.05') { wf.spans(0.05) }
72
+
73
+ assert_gets('/api/spy/spans?sampling=0.05&name=my_prefix') do
74
+ wf.spans(0.05, prefix: 'my_prefix')
75
+ end
76
+
77
+ assert_gets(
78
+ '/api/spy/spans?sampling=0.05&name=my_prefix&host=h1'
79
+ ) do
80
+ wf.spans(0.05, prefix: 'my_prefix', host: 'h1')
81
+ end
82
+
83
+ assert_gets('/api/spy/spans?sampling=0.02&name=my_prefix&' \
84
+ 'spanTagKey=the_tag') do
85
+ wf.spans(0.02, prefix: 'my_prefix', tag_key: 'the_tag')
86
+ end
87
+
88
+ assert_gets('/api/spy/spans?sampling=0.02&name=my_prefix&' \
89
+ 'spanTagKey=tag1&spanTagKey=tag2') do
90
+ wf.spans(0.02, prefix: 'my_prefix', tag_key: %w[tag1 tag2])
91
+ end
92
+ end
93
+ end
94
+
95
+ def test_ids
96
+ capture_io do
97
+ assert_gets('/api/spy/ids?sampling=0.01') { wf.ids }
98
+ assert_gets('/api/spy/ids?sampling=0.05') { wf.ids(0.05) }
99
+
100
+ assert_gets('/api/spy/ids?sampling=0.05&type=METRIC') do
101
+ wf.ids(0.05, type: 'METRIC')
102
+ end
103
+
104
+ assert_gets('/api/spy/ids?sampling=0.05&type=SPAN&name=my_prefix') do
105
+ wf.ids(0.05, type: 'SPAN', prefix: 'my_prefix')
106
+ end
107
+ end
108
+ end
109
+
110
+ def dummy_response
111
+ DUMMY_RESPONSE
112
+ end
113
+ end
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require_relative '../../spec_helper'
5
+ require_relative '../../../lib/wavefront-sdk/unstable/chart'
6
+
7
+ # Unit tests for Chart class
8
+ #
9
+ class WavefrontChartTest < MiniTest::Test
10
+ attr_reader :wf
11
+
12
+ def setup
13
+ @wf = Wavefront::Unstable::Chart.new(CREDS)
14
+ end
15
+
16
+ def test_all_metrics
17
+ assert_gets('/chart/metrics/all?l=100&q=&trie=true') do
18
+ wf.metrics_under('')
19
+ end
20
+ end
21
+
22
+ def test_metrics_under
23
+ assert_gets('/chart/metrics/all?l=100&q=test.path&trie=true') do
24
+ wf.metrics_under('test.path')
25
+ end
26
+
27
+ assert_gets('/chart/metrics/all?l=10&q=test.path&trie=true') do
28
+ wf.metrics_under('test.path', nil, 10)
29
+ end
30
+
31
+ assert_gets('/chart/metrics/all?l=100&p=last.one&q=test.path&trie=true') do
32
+ wf.metrics_under('test.path', 'last.one')
33
+ end
34
+ end
35
+
36
+ def dummy_response
37
+ { metrics: ['test data'] }.to_json
38
+ end
39
+ end
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
+ require 'logger'
4
5
  require_relative '../spec_helper'
5
6
  require_relative '../test_mixins/general'
6
7
 
@@ -13,6 +14,13 @@ class WavefrontUserTest < WavefrontTestBase
13
14
  include WavefrontTest::Describe
14
15
  include WavefrontTest::Update
15
16
 
17
+ # Override the parent constructor so we can suppress all the 'deprecated'
18
+ # log messages
19
+ #
20
+ def setup
21
+ @wf = Wavefront::User.new(CREDS, logger: Logger.new('/dev/null'))
22
+ end
23
+
16
24
  def test_list
17
25
  assert_gets('/api/v2/user') { wf.list }
18
26
  end
@@ -7,7 +7,8 @@ require_relative '../test_mixins/general'
7
7
  # Unit tests for WavefrontUserGroup
8
8
  #
9
9
  class WavefrontUserGroupTest < WavefrontTestBase
10
- attr_reader :users, :groups, :permission, :invalid_groups, :invalid_users
10
+ attr_reader :users, :groups, :permission, :invalid_groups, :invalid_users,
11
+ :roles, :invalid_roles
11
12
 
12
13
  include WavefrontTest::Create
13
14
  include WavefrontTest::Delete
@@ -39,22 +40,28 @@ class WavefrontUserGroupTest < WavefrontTestBase
39
40
  assert_invalid_id { wf.remove_users_from_group(invalid_id, users) }
40
41
  end
41
42
 
42
- def test_grant
43
- assert_posts("/api/v2/usergroup/grant/#{permission}",
44
- groups.to_json) do
45
- wf.grant(permission, groups)
43
+ def test_add_roles_to_group
44
+ assert_posts("/api/v2/usergroup/#{id}/addRoles", roles.to_json) do
45
+ wf.add_roles_to_group(id, roles)
46
46
  end
47
47
 
48
- assert_invalid_id { wf.grant(permission, invalid_groups) }
48
+ assert_raises(Wavefront::Exception::InvalidRoleId) do
49
+ wf.add_roles_to_group(id, invalid_roles)
50
+ end
51
+
52
+ assert_invalid_id { wf.add_roles_to_group(invalid_id, roles) }
49
53
  end
50
54
 
51
- def test_revoke
52
- assert_posts("/api/v2/usergroup/revoke/#{permission}",
53
- groups.to_json) do
54
- wf.revoke(permission, groups)
55
+ def test_remove_roles_from_group
56
+ assert_posts("/api/v2/usergroup/#{id}/removeRoles", roles.to_json) do
57
+ wf.remove_roles_from_group(id, roles)
58
+ end
59
+
60
+ assert_raises(Wavefront::Exception::InvalidRoleId) do
61
+ wf.remove_roles_from_group(id, invalid_roles)
55
62
  end
56
63
 
57
- assert_invalid_id { wf.revoke(permission, invalid_groups) }
64
+ assert_invalid_id { wf.remove_roles_from_group(invalid_id, roles) }
58
65
  end
59
66
 
60
67
  def setup_fixtures
@@ -63,7 +70,10 @@ class WavefrontUserGroupTest < WavefrontTestBase
63
70
  @groups = %w[f8dc0c14-91a0-4ca9-8a2a-7d47f4db4672
64
71
  2659191e-aad4-4302-a94e-9667e1517127]
65
72
  @users = %w[someone@somewhere.com other@elsewhere.net]
73
+ @roles = %w[abcdef14-91a0-4ca9-8a2a-7d47f4db4672
74
+ fedcba1e-aad4-4302-a94e-9667e1517127]
66
75
  @invalid_users = ['bad' * 500, '']
76
+ @invalid_roles = ['some nonsense']
67
77
  end
68
78
 
69
79
  private
@@ -386,4 +386,35 @@ class WavefrontValidatorsTest < MiniTest::Test
386
386
  bad = ['', [], {}, 'a' * 1000]
387
387
  good_and_bad('wf_account_id?', 'InvalidAccountId', good, bad)
388
388
  end
389
+
390
+ def test_wf_managedcluster_id
391
+ good = %w[test-cluster other-cluster cluster]
392
+ bad = ['', [], {}, 'a' * 1000, '£"^WR"!']
393
+ good_and_bad('wf_monitoredcluster_id?',
394
+ 'InvalidMonitoredClusterId',
395
+ good,
396
+ bad)
397
+ end
398
+
399
+ def test_wf_sampling_value
400
+ good = [0, 0.01, 0.003, 0.05]
401
+ bad = ['a', 0.1, 0.99, 1, -1, 1.1]
402
+ good_and_bad('wf_sampling_value?', 'InvalidSamplingValue', good, bad)
403
+ end
404
+
405
+ def test_wf_role_id
406
+ good = %w[2bfdcac7-1c9c-4c4b-9b56-c41c22c586dc
407
+ 17db4cc1-65f6-40a8-a1fa-6fcae460c4bd
408
+ fca312fb-5ff4-420d-862d-5d6d99ed6bcf
409
+ 3a1957e0-459e-49e5-9209-3888a4e8ac5b]
410
+
411
+ bad = %w[fa312fb-5ff4-420d-862d-5d6d99ed6bcf thing 123]
412
+ good_and_bad('wf_role_id?', 'InvalidRoleId', good, bad)
413
+ end
414
+
415
+ def test_wf_aws_external_id
416
+ good = %w[ah5Z9dkr46jbvLtJ HqOM4mru5svd3uFp c1lBxILCBNxLKdx9]
417
+ bad = %w[h5Z9dkr46jbvLtJ HqOM4mru5svd3uFp3 c!lBx!LC*NxLKdx*]
418
+ good_and_bad('wf_aws_external_id?', 'InvalidAwsExternalId', good, bad)
419
+ end
389
420
  end
@@ -23,17 +23,17 @@ Gem::Specification.new do |gem|
23
23
  gem.bindir = 'bin'
24
24
 
25
25
  gem.add_dependency 'addressable', '~> 2.7'
26
- gem.add_dependency 'faraday', '~> 0.17.0'
26
+ gem.add_dependency 'faraday', '~> 1.0'
27
27
  gem.add_dependency 'inifile', '~> 3.0'
28
28
  gem.add_dependency 'map', '~> 6.6'
29
29
 
30
30
  gem.add_development_dependency 'minitest', '~> 5.11'
31
- gem.add_development_dependency 'rake', '~> 12.3'
32
- gem.add_development_dependency 'rubocop', '~> 0.79'
31
+ gem.add_development_dependency 'rake', '~> 13.0'
32
+ gem.add_development_dependency 'rubocop', '= 0.87.1'
33
33
  gem.add_development_dependency 'simplecov', '~> 0.16'
34
34
  gem.add_development_dependency 'spy', '~> 1.0.0'
35
35
  gem.add_development_dependency 'webmock', '~> 3.7'
36
36
  gem.add_development_dependency 'yard', '~> 0.9'
37
37
 
38
- gem.required_ruby_version = Gem::Requirement.new('>= 2.3.0')
38
+ gem.required_ruby_version = Gem::Requirement.new('>= 2.4.0')
39
39
  end