smplkit 2.0.14 → 2.0.15

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 (53) hide show
  1. checksums.yaml +4 -4
  2. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/api/actions_api.rb +2 -69
  3. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/api/events_api.rb +17 -17
  4. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/api/forwarders_api.rb +36 -36
  5. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/api/functions_api.rb +2 -2
  6. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/api/resource_types_api.rb +2 -72
  7. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/api/usage_api.rb +4 -4
  8. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/event.rb +12 -2
  9. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/event_list_response.rb +1 -1
  10. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/event_request.rb +165 -0
  11. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/event_resource.rb +2 -18
  12. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/event_response.rb +1 -1
  13. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/forwarder.rb +17 -17
  14. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/forwarder_delivery.rb +11 -1
  15. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/forwarder_delivery_list_response.rb +1 -0
  16. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/forwarder_delivery_resource.rb +1 -0
  17. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/forwarder_delivery_response.rb +1 -0
  18. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/forwarder_http.rb +40 -1
  19. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/forwarder_list_response.rb +1 -0
  20. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/forwarder_request.rb +165 -0
  21. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/forwarder_resource.rb +2 -17
  22. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/forwarder_response.rb +1 -0
  23. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/http_header.rb +3 -1
  24. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/retry_failed_deliveries_summary.rb +4 -0
  25. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/test_forwarder_request.rb +41 -1
  26. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/test_forwarder_response.rb +7 -1
  27. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/usage_attributes.rb +4 -1
  28. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/wipe_response.rb +3 -0
  29. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client/models/wipe_tables_summary.rb +7 -0
  30. data/lib/smplkit/_generated/audit/lib/smplkit_audit_client.rb +2 -0
  31. data/lib/smplkit/_generated/audit/spec/api/actions_api_spec.rb +1 -14
  32. data/lib/smplkit/_generated/audit/spec/api/events_api_spec.rb +5 -5
  33. data/lib/smplkit/_generated/audit/spec/api/forwarders_api_spec.rb +11 -11
  34. data/lib/smplkit/_generated/audit/spec/api/functions_api_spec.rb +1 -1
  35. data/lib/smplkit/_generated/audit/spec/api/resource_types_api_spec.rb +1 -15
  36. data/lib/smplkit/_generated/audit/spec/api/usage_api_spec.rb +2 -2
  37. data/lib/smplkit/_generated/audit/spec/models/event_request_spec.rb +36 -0
  38. data/lib/smplkit/_generated/audit/spec/models/forwarder_http_spec.rb +4 -0
  39. data/lib/smplkit/_generated/audit/spec/models/forwarder_request_spec.rb +36 -0
  40. data/lib/smplkit/_generated/audit/spec/models/forwarder_spec.rb +0 -6
  41. data/lib/smplkit/_generated/audit/spec/models/test_forwarder_request_spec.rb +4 -0
  42. data/lib/smplkit/audit/actions.rb +35 -0
  43. data/lib/smplkit/audit/client.rb +11 -9
  44. data/lib/smplkit/audit/events.rb +8 -45
  45. data/lib/smplkit/audit/models.rb +197 -0
  46. data/lib/smplkit/audit/resource_types.rb +30 -0
  47. data/lib/smplkit/errors.rb +5 -0
  48. data/lib/smplkit/management/audit.rb +111 -0
  49. data/lib/smplkit/management/client.rb +4 -1
  50. data/lib/smplkit.rb +7 -5
  51. metadata +9 -3
  52. data/lib/smplkit/audit/forwarders.rb +0 -282
  53. data/lib/smplkit/audit/functions.rb +0 -58
@@ -1,282 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Smplkit
4
- module Audit
5
- # Public-facing enum for SIEM streaming destination types.
6
- #
7
- # Mirrors the +ForwarderType+ enum the audit OpenAPI spec emits
8
- # (ADR-047 §2.12). Customers pass these constants — or any string
9
- # in {VALUES} — to {Forwarders#create} / {Forwarders#update} /
10
- # {Forwarders#list}. The wrapper validates membership before
11
- # round-tripping to the wire.
12
- module ForwarderType
13
- HTTP = "HTTP"
14
- DATADOG = "DATADOG"
15
- SPLUNK_HEC = "SPLUNK_HEC"
16
- SUMO_LOGIC = "SUMO_LOGIC"
17
- NEW_RELIC = "NEW_RELIC"
18
- HONEYCOMB = "HONEYCOMB"
19
- ELASTIC = "ELASTIC"
20
-
21
- # Every supported value, in spec order. Useful for membership
22
- # checks, dropdown population, or test parametrization.
23
- VALUES = [HTTP, DATADOG, SPLUNK_HEC, SUMO_LOGIC, NEW_RELIC, HONEYCOMB, ELASTIC].freeze
24
-
25
- # Coerce +value+ to a known wire-format slug, or raise ArgumentError.
26
- # Strings round-trip transparently; nil passes through.
27
- def self.coerce(value)
28
- return nil if value.nil?
29
-
30
- s = value.to_s
31
- return s if VALUES.include?(s)
32
-
33
- raise ArgumentError,
34
- "Unknown ForwarderType #{value.inspect}; expected one of #{VALUES.inspect}"
35
- end
36
- end
37
-
38
- # SIEM streaming forwarders for the authenticated account.
39
- #
40
- # Pro tier only — every method here raises a wrapped 402
41
- # +SmplkitGeneratedClient::Audit::ApiError+ on lower tiers.
42
- class Forwarders
43
- attr_reader :deliveries, :actions
44
-
45
- def initialize(api)
46
- @api = api
47
- @deliveries = ForwarderDeliveries.new(api)
48
- @actions = ForwarderActions.new(api)
49
- end
50
-
51
- def create(name:, forwarder_type:, http:, enabled: true,
52
- filter: nil, transform: nil, data: nil)
53
- body = wrap_forwarder(nil, name, ForwarderType.coerce(forwarder_type),
54
- http, enabled, filter, transform, data)
55
- resp = @api.create_forwarder(body)
56
- Forwarder.from_resource(resp.data)
57
- end
58
-
59
- def list(forwarder_type: nil, enabled: nil, page_size: nil, page_after: nil)
60
- opts = {}
61
- opts[:filter_forwarder_type] = ForwarderType.coerce(forwarder_type) if forwarder_type
62
- opts[:filter_enabled] = enabled unless enabled.nil?
63
- opts[:page_size] = page_size if page_size
64
- opts[:page_after] = page_after if page_after
65
- resp = @api.list_forwarders(opts)
66
- forwarders = (resp.data || []).map { |r| Forwarder.from_resource(r) }
67
- ListForwardersPage.new(forwarders, Forwarders.next_cursor(resp.links&._next))
68
- end
69
-
70
- def get(forwarder_id)
71
- resp = @api.get_forwarder(forwarder_id)
72
- Forwarder.from_resource(resp.data)
73
- end
74
-
75
- def update(forwarder_id, name:, forwarder_type:, http:, enabled: true,
76
- filter: nil, transform: nil, data: nil)
77
- body = wrap_forwarder(forwarder_id, name, ForwarderType.coerce(forwarder_type),
78
- http, enabled, filter, transform, data)
79
- resp = @api.update_forwarder(forwarder_id, body)
80
- Forwarder.from_resource(resp.data)
81
- end
82
-
83
- def delete(forwarder_id)
84
- @api.delete_forwarder(forwarder_id)
85
- nil
86
- end
87
-
88
- def self.next_cursor(link)
89
- return nil unless link.is_a?(String)
90
-
91
- idx = link.index("page[after]=")
92
- return nil if idx.nil?
93
-
94
- token = link[(idx + "page[after]=".length)..]
95
- amp = token.index("&")
96
- amp ? token[0...amp] : token
97
- end
98
-
99
- private
100
-
101
- def wrap_forwarder(id, name, forwarder_type, http, enabled, filter, transform, data)
102
- attrs = SmplkitGeneratedClient::Audit::Forwarder.new(
103
- name: name,
104
- forwarder_type: forwarder_type,
105
- enabled: enabled,
106
- # Server-side validation rejects ``data: null`` (the field is
107
- # required-non-null in the OpenAPI schema). Default to an empty
108
- # hash mirroring the AuditEvents.record fix.
109
- data: data || {},
110
- http: ForwarderHttp.to_wire(http),
111
- filter: filter,
112
- transform: transform
113
- )
114
- resource = SmplkitGeneratedClient::Audit::ForwarderResource.new(
115
- id: id ? id.to_s : "",
116
- type: "forwarder",
117
- attributes: attrs
118
- )
119
- SmplkitGeneratedClient::Audit::ForwarderResponse.new(data: resource)
120
- end
121
- end
122
-
123
- # Sub-namespace for the per-forwarder delivery log + per-delivery retry.
124
- class ForwarderDeliveries
125
- attr_reader :actions
126
-
127
- def initialize(api)
128
- @api = api
129
- @actions = DeliveryActions.new(api)
130
- end
131
-
132
- def list(forwarder_id, status: nil, created_at_range: nil, event_id: nil, page_size: nil, page_after: nil)
133
- opts = {}
134
- opts[:filter_status] = status if status
135
- opts[:filter_created_at] = created_at_range if created_at_range
136
- opts[:filter_event_id] = event_id if event_id
137
- opts[:page_size] = page_size if page_size
138
- opts[:page_after] = page_after if page_after
139
- resp = @api.list_forwarder_deliveries(forwarder_id, opts)
140
- deliveries = (resp.data || []).map { |r| ForwarderDelivery.from_resource(r) }
141
- ListDeliveriesPage.new(deliveries, Forwarders.next_cursor(resp.links&._next))
142
- end
143
- end
144
-
145
- # +client.audit.forwarders.deliveries.actions.retry(forwarder_id, delivery_id)+
146
- class DeliveryActions
147
- def initialize(api)
148
- @api = api
149
- end
150
-
151
- def retry(forwarder_id, delivery_id)
152
- resp = @api.retry_forwarder_delivery(forwarder_id, delivery_id)
153
- ForwarderDelivery.from_resource(resp.data)
154
- end
155
- end
156
-
157
- # +client.audit.forwarders.actions.retry_failed_deliveries(forwarder_id)+
158
- class ForwarderActions
159
- def initialize(api)
160
- @api = api
161
- end
162
-
163
- def retry_failed_deliveries(forwarder_id)
164
- resp = @api.retry_failed_forwarder_deliveries(forwarder_id)
165
- RetryFailedDeliveriesSummary.new(
166
- attempted: resp.attempted,
167
- succeeded: resp.succeeded,
168
- failed: resp.failed
169
- )
170
- end
171
- end
172
-
173
- # ----------------------------------------------------------------------
174
- # Public-facing model structs
175
- # ----------------------------------------------------------------------
176
-
177
- HttpHeader = Struct.new(:name, :value, keyword_init: true)
178
-
179
- # rubocop:disable Lint/StructNewOverride -- ``:method`` matches the
180
- # API attribute and shadowing Struct#method is the expected ergonomics.
181
- ForwarderHttp = Struct.new(:method, :url, :headers, :body, :success_status, keyword_init: true) do
182
- def initialize(method: "POST", url: "", headers: nil, body: nil, success_status: "2xx")
183
- super(method: method, url: url, headers: headers || [], body: body, success_status: success_status)
184
- end
185
-
186
- def self.to_wire(src)
187
- h = src.is_a?(Hash) ? new(**src) : src
188
- SmplkitGeneratedClient::Audit::ForwarderHttp.new(
189
- method: h.method,
190
- url: h.url,
191
- headers: (h.headers || []).map do |hdr|
192
- name, value = if hdr.is_a?(Hash)
193
- [hdr[:name] || hdr["name"],
194
- hdr[:value] || hdr["value"]]
195
- else
196
- [hdr.name, hdr.value]
197
- end
198
- SmplkitGeneratedClient::Audit::HttpHeader.new(name: name, value: value)
199
- end,
200
- body: h.body,
201
- success_status: h.success_status
202
- )
203
- end
204
-
205
- def self.from_wire(src)
206
- return new if src.nil?
207
-
208
- new(
209
- method: src.method || "POST",
210
- url: src.url || "",
211
- headers: (src.headers || []).map { |h| HttpHeader.new(name: h.name, value: h.value) },
212
- body: src.body,
213
- success_status: src.success_status || "2xx"
214
- )
215
- end
216
- end
217
- # rubocop:enable Lint/StructNewOverride
218
-
219
- # rubocop:disable Lint/StructNewOverride -- ``:filter`` matches the
220
- # API attribute and shadowing Struct#filter is the expected ergonomics.
221
- Forwarder = Struct.new(
222
- :id, :name, :slug, :forwarder_type, :enabled,
223
- :filter, :transform, :http, :data,
224
- :created_at, :updated_at, :deleted_at, :version,
225
- keyword_init: true
226
- ) do
227
- def self.from_resource(resource)
228
- a = resource.attributes
229
- new(
230
- id: resource.id,
231
- name: a.name,
232
- slug: a.slug,
233
- forwarder_type: a.forwarder_type,
234
- enabled: a.enabled.nil? || a.enabled,
235
- filter: Smplkit::Helpers.deep_stringify_keys(a.filter || {}),
236
- transform: a.transform,
237
- http: ForwarderHttp.from_wire(a.http),
238
- data: Smplkit::Helpers.deep_stringify_keys(a.data || {}),
239
- created_at: a.created_at,
240
- updated_at: a.updated_at,
241
- deleted_at: a.deleted_at,
242
- version: a.version
243
- )
244
- end
245
- end
246
- # rubocop:enable Lint/StructNewOverride
247
-
248
- ListForwardersPage = Struct.new(:forwarders, :next_cursor)
249
-
250
- ForwarderDelivery = Struct.new(
251
- :id, :forwarder_id, :event_id, :attempt_number, :status,
252
- :request, :response_status, :response_body, :latency_ms, :error, :created_at,
253
- keyword_init: true
254
- ) do
255
- def self.from_resource(resource)
256
- a = resource.attributes
257
- new(
258
- id: resource.id,
259
- forwarder_id: a.forwarder_id,
260
- event_id: a.event_id,
261
- attempt_number: a.attempt_number,
262
- status: a.status,
263
- request: Smplkit::Helpers.deep_stringify_keys(a.request || {}),
264
- response_status: a.response_status,
265
- response_body: a.response_body,
266
- latency_ms: a.latency_ms,
267
- error: a.error,
268
- created_at: a.created_at
269
- )
270
- end
271
- end
272
-
273
- ListDeliveriesPage = Struct.new(:deliveries, :next_cursor)
274
-
275
- RetryFailedDeliveriesSummary = Struct.new(:attempted, :succeeded, :failed, keyword_init: true)
276
-
277
- TestForwarderResult = Struct.new(
278
- :succeeded, :response_status, :response_headers, :response_body, :latency_ms, :error,
279
- keyword_init: true
280
- )
281
- end
282
- end
@@ -1,58 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Smplkit
4
- module Audit
5
- # +client.audit.functions.test_forwarder.actions.execute(...)+
6
- class Functions
7
- attr_reader :test_forwarder
8
-
9
- def initialize(api)
10
- @test_forwarder = TestForwarderNamespace.new(api)
11
- end
12
- end
13
-
14
- # Sub-namespace for the test_forwarder action.
15
- class TestForwarderNamespace
16
- attr_reader :actions
17
-
18
- def initialize(api)
19
- @actions = TestForwarderActions.new(api)
20
- end
21
- end
22
-
23
- # +execute+ is a server-side proxy that lets the console preview a
24
- # destination without browser CORS getting in the way. The audit
25
- # service applies its SSRF guard before resolving the URL —
26
- # private/loopback/link-local addresses (incl. the EC2 IMDS at
27
- # +169.254.169.254+) and disallowed ports are rejected.
28
- class TestForwarderActions
29
- def initialize(api)
30
- @api = api
31
- end
32
-
33
- def execute(url:, method: "POST", headers: nil, body: nil,
34
- success_status: "2xx", timeout_ms: nil)
35
- req = SmplkitGeneratedClient::Audit::TestForwarderRequest.new(
36
- url: url,
37
- method: method,
38
- headers: (headers || []).map do |h|
39
- name, value = h.is_a?(Hash) ? [h[:name] || h["name"], h[:value] || h["value"]] : [h.name, h.value]
40
- SmplkitGeneratedClient::Audit::HttpHeader.new(name: name, value: value)
41
- end,
42
- body: body,
43
- success_status: success_status,
44
- timeout_ms: timeout_ms
45
- )
46
- resp = @api.execute_test_forwarder(req)
47
- TestForwarderResult.new(
48
- succeeded: resp.succeeded || false,
49
- response_status: resp.response_status,
50
- response_headers: resp.response_headers || {},
51
- response_body: resp.response_body || "",
52
- latency_ms: resp.latency_ms,
53
- error: resp.error
54
- )
55
- end
56
- end
57
- end
58
- end