wavefront-sdk 3.6.1 → 5.0.1
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 +4 -4
- data/.rubocop.yml +43 -2
- data/.travis.yml +0 -1
- data/HISTORY.md +33 -0
- data/README.md +4 -3
- data/lib/wavefront-sdk/account.rb +303 -0
- data/lib/wavefront-sdk/api_mixins/user.rb +20 -0
- data/lib/wavefront-sdk/core/api_caller.rb +50 -7
- data/lib/wavefront-sdk/core/exception.rb +6 -0
- data/lib/wavefront-sdk/core/response.rb +2 -1
- data/lib/wavefront-sdk/defs/version.rb +1 -3
- data/lib/wavefront-sdk/ingestionpolicy.rb +85 -0
- data/lib/wavefront-sdk/paginator/base.rb +21 -15
- data/lib/wavefront-sdk/query.rb +0 -1
- data/lib/wavefront-sdk/role.rb +128 -0
- data/lib/wavefront-sdk/spy.rb +126 -0
- data/lib/wavefront-sdk/stdlib/array.rb +1 -1
- data/lib/wavefront-sdk/stdlib/time.rb +13 -0
- data/lib/wavefront-sdk/unstable/README.md +4 -0
- data/lib/wavefront-sdk/unstable/chart.rb +90 -0
- data/lib/wavefront-sdk/unstable/unstable.rb +9 -0
- data/lib/wavefront-sdk/usage.rb +31 -0
- data/lib/wavefront-sdk/user.rb +41 -0
- data/lib/wavefront-sdk/usergroup.rb +17 -16
- data/lib/wavefront-sdk/validators.rb +65 -7
- data/lib/wavefront-sdk/write.rb +13 -3
- data/spec/.rubocop.yml +42 -1
- data/spec/spec_helper.rb +4 -0
- data/spec/support/minitest_assertions.rb +4 -4
- data/spec/wavefront-sdk/account_spec.rb +238 -0
- data/spec/wavefront-sdk/core/api_caller_spec.rb +43 -0
- data/spec/wavefront-sdk/ingestionpolicy_spec.rb +43 -0
- data/spec/wavefront-sdk/metric_helper_spec.rb +1 -1
- data/spec/wavefront-sdk/role_spec.rb +96 -0
- data/spec/wavefront-sdk/spy_spec.rb +113 -0
- data/spec/wavefront-sdk/unstable/chart_spec.rb +39 -0
- data/spec/wavefront-sdk/usage_spec.rb +33 -0
- data/spec/wavefront-sdk/user_spec.rb +20 -0
- data/spec/wavefront-sdk/usergroup_spec.rb +21 -11
- data/spec/wavefront-sdk/validators_spec.rb +52 -6
- data/wavefront-sdk.gemspec +4 -4
- metadata +30 -9
data/lib/wavefront-sdk/write.rb
CHANGED
@@ -107,12 +107,14 @@ module Wavefront
|
|
107
107
|
end
|
108
108
|
|
109
109
|
# Compound the responses of all chunked writes into one. It will
|
110
|
-
# be 'ok' only if *everything* passed.
|
110
|
+
# be 'ok' only if *everything* passed. Returns 400 as the HTTP code on
|
111
|
+
# error, regardless of what actual errors occurred.
|
111
112
|
# @param responses [Array[Wavefront::Response]]
|
112
113
|
# @return Wavefront::Response
|
113
114
|
#
|
114
115
|
def composite_response(responses)
|
115
|
-
result = responses
|
116
|
+
result, code = response_results(responses)
|
117
|
+
|
116
118
|
summary = { sent: 0, rejected: 0, unsent: 0 }
|
117
119
|
|
118
120
|
%i[sent rejected unsent].each do |k|
|
@@ -120,11 +122,19 @@ module Wavefront
|
|
120
122
|
end
|
121
123
|
|
122
124
|
Wavefront::Response.new(
|
123
|
-
{ status: { result: result, message: nil, code:
|
125
|
+
{ status: { result: result, message: nil, code: code },
|
124
126
|
response: summary.to_h }.to_json, nil
|
125
127
|
)
|
126
128
|
end
|
127
129
|
|
130
|
+
def response_results(responses)
|
131
|
+
if responses.all?(&:ok?)
|
132
|
+
['OK', 200]
|
133
|
+
else
|
134
|
+
['ERROR', 400]
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
128
138
|
def manage_conn
|
129
139
|
opts[:noauto] ? false : true
|
130
140
|
end
|
data/spec/.rubocop.yml
CHANGED
@@ -5,9 +5,50 @@ Metrics/AbcSize:
|
|
5
5
|
# Offense count: 5
|
6
6
|
# Configuration parameters: CountComments.
|
7
7
|
Metrics/ClassLength:
|
8
|
-
Max:
|
8
|
+
Max: 400
|
9
9
|
|
10
10
|
# Offense count: 46
|
11
11
|
# Configuration parameters: CountComments, ExcludedMethods.
|
12
12
|
Metrics/MethodLength:
|
13
13
|
Max: 39
|
14
|
+
|
15
|
+
# New cops
|
16
|
+
#
|
17
|
+
Lint/RaiseException:
|
18
|
+
Enabled: true
|
19
|
+
Lint/StructNewOverride:
|
20
|
+
Enabled: true
|
21
|
+
Style/ExponentialNotation:
|
22
|
+
Enabled: true
|
23
|
+
Style/HashEachMethods:
|
24
|
+
Enabled: true
|
25
|
+
Style/HashTransformKeys:
|
26
|
+
Enabled: true
|
27
|
+
Style/HashTransformValues:
|
28
|
+
Enabled: true
|
29
|
+
Layout/EmptyLinesAroundAttributeAccessor:
|
30
|
+
Enabled: true
|
31
|
+
Layout/SpaceAroundMethodCallOperator:
|
32
|
+
Enabled: true
|
33
|
+
Style/SlicingWithRange:
|
34
|
+
Enabled: true
|
35
|
+
Lint/DeprecatedOpenSSLConstant:
|
36
|
+
Enabled: true
|
37
|
+
Lint/MixedRegexpCaptureTypes:
|
38
|
+
Enabled: true
|
39
|
+
Style/RedundantRegexpCharacterClass:
|
40
|
+
Enabled: true
|
41
|
+
Style/RedundantRegexpEscape:
|
42
|
+
Enabled: true
|
43
|
+
Style/AccessorGrouping:
|
44
|
+
Enabled: true
|
45
|
+
Style/BisectedAttrAccessor:
|
46
|
+
Enabled: true
|
47
|
+
Style/RedundantAssignment:
|
48
|
+
Enabled: true
|
49
|
+
Style/RedundantFetchBlock:
|
50
|
+
Enabled: true
|
51
|
+
|
52
|
+
# Is nothing sacred?
|
53
|
+
Layout/LineLength:
|
54
|
+
Max: 80
|
data/spec/spec_helper.rb
CHANGED
@@ -20,7 +20,7 @@ module Minitest
|
|
20
20
|
headers = DEFAULT_HEADERS
|
21
21
|
stub_request(:get, uri(api_path))
|
22
22
|
.with(headers: headers)
|
23
|
-
.to_return(body:
|
23
|
+
.to_return(body: dummy_response, status: 200)
|
24
24
|
yield block
|
25
25
|
assert_requested(:get, uri(api_path), headers: headers)
|
26
26
|
WebMock.reset!
|
@@ -39,7 +39,7 @@ module Minitest
|
|
39
39
|
payload = 'null' if payload.nil?
|
40
40
|
stub_request(:post, uri(api_path))
|
41
41
|
.with(body: payload, headers: headers)
|
42
|
-
.to_return(body:
|
42
|
+
.to_return(body: dummy_response, status: 200)
|
43
43
|
yield block
|
44
44
|
assert_requested(:post, uri(api_path), headers: headers)
|
45
45
|
WebMock.reset!
|
@@ -58,7 +58,7 @@ module Minitest
|
|
58
58
|
payload = 'null' if payload.nil?
|
59
59
|
stub_request(:put, uri(api_path))
|
60
60
|
.with(body: payload, headers: headers)
|
61
|
-
.to_return(body:
|
61
|
+
.to_return(body: dummy_response, status: 200)
|
62
62
|
yield block
|
63
63
|
assert_requested(:put, uri(api_path), headers: headers)
|
64
64
|
WebMock.reset!
|
@@ -72,7 +72,7 @@ module Minitest
|
|
72
72
|
headers = DEFAULT_HEADERS
|
73
73
|
stub_request(:delete, uri(api_path))
|
74
74
|
.with(headers: headers)
|
75
|
-
.to_return(body:
|
75
|
+
.to_return(body: dummy_response, status: 200)
|
76
76
|
yield block
|
77
77
|
assert_requested(:delete, uri(api_path), headers: headers)
|
78
78
|
WebMock.reset!
|
@@ -0,0 +1,238 @@
|
|
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 Account class
|
8
|
+
#
|
9
|
+
class WavefrontAccountTest < WavefrontTestBase
|
10
|
+
include WavefrontTest::List
|
11
|
+
include WavefrontTest::Delete
|
12
|
+
include WavefrontTest::Describe
|
13
|
+
|
14
|
+
def test_add_roles
|
15
|
+
assert_posts("/api/v2/account/#{id}/addRoles", roles.to_json) do
|
16
|
+
wf.add_roles(id, roles)
|
17
|
+
end
|
18
|
+
|
19
|
+
assert_invalid_id { wf.add_roles(invalid_id, roles) }
|
20
|
+
|
21
|
+
assert_raises(Wavefront::Exception::InvalidRoleId) do
|
22
|
+
wf.add_roles(id, invalid_role)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_add_user_groups
|
27
|
+
assert_posts("/api/v2/account/#{id}/addUserGroups", groups.to_json) do
|
28
|
+
wf.add_user_groups(id, groups)
|
29
|
+
end
|
30
|
+
|
31
|
+
assert_invalid_id { wf.add_user_groups(invalid_id, groups) }
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_business_functions
|
35
|
+
assert_gets("/api/v2/account/#{id}/businessFunctions") do
|
36
|
+
wf.business_functions(id)
|
37
|
+
end
|
38
|
+
|
39
|
+
assert_raises(ArgumentError) { wf.business_functions }
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_grant_to_single_user
|
43
|
+
assert_posts("/api/v2/account/#{id}/grant/#{permission}") do
|
44
|
+
wf.grant(id, permission)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_grant_to_multiple_users
|
49
|
+
assert_posts("/api/v2/account/grant/#{permission}", id_list.to_json) do
|
50
|
+
wf.grant(id_list, permission)
|
51
|
+
end
|
52
|
+
|
53
|
+
assert_raises(Wavefront::Exception::InvalidRoleId) do
|
54
|
+
wf.remove_roles(id, invalid_role)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_remove_roles
|
59
|
+
assert_posts("/api/v2/account/#{id}/removeRoles", roles.to_json) do
|
60
|
+
wf.remove_roles(id, roles)
|
61
|
+
end
|
62
|
+
|
63
|
+
assert_invalid_id { wf.remove_roles(invalid_id, roles) }
|
64
|
+
|
65
|
+
assert_raises(Wavefront::Exception::InvalidRoleId) do
|
66
|
+
wf.remove_roles(id, invalid_role)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_remove_user_groups
|
71
|
+
assert_posts("/api/v2/account/#{id}/removeUserGroups", groups.to_json) do
|
72
|
+
wf.remove_user_groups(id, groups)
|
73
|
+
end
|
74
|
+
|
75
|
+
assert_invalid_id { wf.remove_user_groups(invalid_id, groups) }
|
76
|
+
|
77
|
+
assert_raises(Wavefront::Exception::InvalidUserGroupId) do
|
78
|
+
wf.remove_user_groups(id, invalid_group)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_revoke_from_single_user
|
83
|
+
assert_posts("/api/v2/account/#{id}/revoke/#{permission}") do
|
84
|
+
wf.revoke(id, permission)
|
85
|
+
end
|
86
|
+
|
87
|
+
assert_invalid_id { wf.revoke(invalid_id, permission) }
|
88
|
+
|
89
|
+
assert_raises(Wavefront::Exception::InvalidPermission) do
|
90
|
+
wf.revoke(id, invalid_permission)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_revoke_from_multiple_users
|
95
|
+
assert_posts("/api/v2/account/revoke/#{permission}", id_list.to_json) do
|
96
|
+
wf.revoke(id_list, permission)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_delete_accounts
|
101
|
+
assert_posts('/api/v2/account/deleteAccounts', id_list.to_json) do
|
102
|
+
wf.delete_accounts(id_list)
|
103
|
+
end
|
104
|
+
|
105
|
+
assert_invalid_id { wf.delete_accounts([invalid_id]) }
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_add_ingestion_policy
|
109
|
+
assert_posts('/api/v2/account/addingestionpolicy',
|
110
|
+
{ ingestionPolicyId: policy_id,
|
111
|
+
accounts: id_list }.to_json) do
|
112
|
+
wf.add_ingestion_policy(policy_id, id_list)
|
113
|
+
end
|
114
|
+
|
115
|
+
assert_raises Wavefront::Exception::InvalidIngestionPolicyId do
|
116
|
+
wf.add_ingestion_policy(invalid_policy_id, id_list)
|
117
|
+
end
|
118
|
+
|
119
|
+
assert_invalid_id { wf.add_ingestion_policy(policy_id, [invalid_id]) }
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_remove_ingestion_policy
|
123
|
+
assert_posts('/api/v2/account/removeingestionpolicies',
|
124
|
+
{ ingestionPolicyId: policy_id,
|
125
|
+
accounts: id_list }.to_json) do
|
126
|
+
wf.remove_ingestion_policy(policy_id, id_list)
|
127
|
+
end
|
128
|
+
|
129
|
+
assert_raises Wavefront::Exception::InvalidIngestionPolicyId do
|
130
|
+
wf.add_ingestion_policy(invalid_policy_id, id_list)
|
131
|
+
end
|
132
|
+
|
133
|
+
assert_invalid_id { wf.add_ingestion_policy(policy_id, [invalid_id]) }
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_user_list
|
137
|
+
assert_gets('/api/v2/account/user?offset=0&limit=100') do
|
138
|
+
wf.user_list
|
139
|
+
end
|
140
|
+
|
141
|
+
assert_gets('/api/v2/account/user?offset=10&limit=50') do
|
142
|
+
wf.user_list(10, 50)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_user_describe
|
147
|
+
assert_gets("/api/v2/account/user/#{id}") { wf.user_describe(id) }
|
148
|
+
|
149
|
+
assert_raises(Wavefront::Exception::InvalidUserId) do
|
150
|
+
wf.user_describe(invalid_id)
|
151
|
+
end
|
152
|
+
|
153
|
+
assert_raises(ArgumentError) { wf.user_describe }
|
154
|
+
end
|
155
|
+
|
156
|
+
def test_user_create
|
157
|
+
assert_posts('/api/v2/account/user', payload.to_json) do
|
158
|
+
wf.user_create(payload)
|
159
|
+
end
|
160
|
+
|
161
|
+
assert_raises(ArgumentError) { wf.user_create }
|
162
|
+
assert_raises(ArgumentError) { wf.user_create('test') }
|
163
|
+
end
|
164
|
+
|
165
|
+
def test_user_invite
|
166
|
+
assert_posts('/api/v2/account/user/invite', [payload].to_json) do
|
167
|
+
wf.user_invite([payload])
|
168
|
+
end
|
169
|
+
|
170
|
+
assert_raises(ArgumentError) { wf.user_invite }
|
171
|
+
assert_raises(ArgumentError) { wf.user_invite('test') }
|
172
|
+
end
|
173
|
+
|
174
|
+
def test_validate_accounts
|
175
|
+
assert_posts('/api/v2/account/validateAccounts', id_list.to_json) do
|
176
|
+
wf.validate_accounts(id_list)
|
177
|
+
end
|
178
|
+
|
179
|
+
assert_raises(ArgumentError) { wf.validate_accounts }
|
180
|
+
end
|
181
|
+
|
182
|
+
private
|
183
|
+
|
184
|
+
def api_class
|
185
|
+
'account'
|
186
|
+
end
|
187
|
+
|
188
|
+
def id
|
189
|
+
'sa::tester'
|
190
|
+
end
|
191
|
+
|
192
|
+
def invalid_id
|
193
|
+
'bad_id' * 1000
|
194
|
+
end
|
195
|
+
|
196
|
+
def groups
|
197
|
+
%w[f8dc0c14-91a0-4ca9-8a2a-7d47f4db4672
|
198
|
+
2659191e-aad4-4302-a94e-9667e1517127]
|
199
|
+
end
|
200
|
+
|
201
|
+
def roles
|
202
|
+
%w[f8dc0c14-91a0-4ca9-8a2a-7d47f4db1234
|
203
|
+
2659191e-aad4-4302-a94e-9667e1515678]
|
204
|
+
end
|
205
|
+
|
206
|
+
def invalid_role
|
207
|
+
%w[bad_role]
|
208
|
+
end
|
209
|
+
|
210
|
+
def invalid_group
|
211
|
+
%w[bad_group]
|
212
|
+
end
|
213
|
+
|
214
|
+
def id_list
|
215
|
+
%w[sa:test user@example.com]
|
216
|
+
end
|
217
|
+
|
218
|
+
def invalid_permission
|
219
|
+
'some_nonsense_permission_i_made_up'
|
220
|
+
end
|
221
|
+
|
222
|
+
def permission
|
223
|
+
'agent_management'
|
224
|
+
end
|
225
|
+
|
226
|
+
def policy_id
|
227
|
+
'testpolicy-1579537565010'
|
228
|
+
end
|
229
|
+
|
230
|
+
def invalid_policy_id
|
231
|
+
'badpolicy'
|
232
|
+
end
|
233
|
+
|
234
|
+
def payload
|
235
|
+
{ emailAddress: id,
|
236
|
+
groups: %w[browse] }
|
237
|
+
end
|
238
|
+
end
|
@@ -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' }
|
@@ -0,0 +1,43 @@
|
|
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 IngestionPolicy class
|
8
|
+
#
|
9
|
+
class WavefrontIngestionPolicyTest < WavefrontTestBase
|
10
|
+
include WavefrontTest::List
|
11
|
+
include WavefrontTest::Describe
|
12
|
+
include WavefrontTest::Update
|
13
|
+
include WavefrontTest::Delete
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def payload
|
18
|
+
{ sampledUserAccounts: ['string'],
|
19
|
+
userAccountCount: 0,
|
20
|
+
sampledServiceAccounts: [
|
21
|
+
'string'
|
22
|
+
],
|
23
|
+
serviceAccountCount: 0,
|
24
|
+
name: 'string',
|
25
|
+
id: 'string',
|
26
|
+
description: 'string',
|
27
|
+
customer: 'string',
|
28
|
+
lastUpdatedMs: 0,
|
29
|
+
lastUpdatedAccountId: 'string' }
|
30
|
+
end
|
31
|
+
|
32
|
+
def api_class
|
33
|
+
'usage/ingestionpolicy'
|
34
|
+
end
|
35
|
+
|
36
|
+
def id
|
37
|
+
'test-ingestion-policy-1579538401492'
|
38
|
+
end
|
39
|
+
|
40
|
+
def invalid_id
|
41
|
+
'bad_id'
|
42
|
+
end
|
43
|
+
end
|