Module: Wavefront::Validators
- Included in:
- CoreApi, Write, Writer::Core
- Defined in:
- lib/wavefront-sdk/validators.rb
Overview
A module of mixins to validate input. The Wavefront documentation lays down restrictions on types and sizes of various inputs, which we will check on the user’s behalf. Most of the information used in this file comes from community.wavefront.com/docs/DOC-1031 Some comes from the Swagger API documentation, some has come directly from Wavefront engineers.
rubocop:disable Metrics/ModuleLength
Instance Method Summary collapse
-
#uuid?(str) ⇒ Bool
Is the given string a UUID? These are used for various item IDs.
-
#wf_account_id?(id) ⇒ Boolean
Ensure the given argument is a valid User or SystemAccount ID.
-
#wf_alert_id?(id) ⇒ Boolean
Ensure the given argument is a valid Wavefront alert ID.
-
#wf_alert_severity?(severity) ⇒ Boolean
Ensure the given argument is a valid alert severity.
-
#wf_apitoken_id?(id) ⇒ Boolean
Ensure the given argument is a valid API token ID.
-
#wf_cloudintegration_id?(id) ⇒ Boolean
Ensure the given argument is a valid Wavefront cloud integration ID.
-
#wf_dashboard_id?(id) ⇒ Boolean
There doesn’t seem to be a public statement on what’s allowed in a dashboard name.
-
#wf_derivedmetric_id?(id) ⇒ Boolean
Ensure the given argument is a valid derived metric ID.
-
#wf_distribution?(dist) ⇒ Boolean
Validate a distribution description.
-
#wf_distribution_count?(count) ⇒ Boolean
Ensure the given argument is a valid distribution count.
-
#wf_distribution_interval?(interval) ⇒ Boolean
Ensure the given argument is a valid distribution interval.
-
#wf_distribution_values?(vals) ⇒ Boolean
Validate an array of distribution values.
-
#wf_epoch?(timestamp) ⇒ Boolean
Ensure the given argument is a valid epoch timestamp.
-
#wf_event_id?(id) ⇒ Boolean
Ensure the given argument is a valid event ID.
-
#wf_granularity?(granularity) ⇒ Boolean
Ensure the given argument is a valid query granularity.
-
#wf_ingestionpolicy_id?(id) ⇒ Boolean
Ensure the given argument is a valid ingestion policy ID.
-
#wf_integration_id?(id) ⇒ Boolean
Ensure the given argument is a valid Wavefront integration ID.
-
#wf_link_id?(id) ⇒ Boolean
Ensure the given argument is a valid external Link ID.
-
#wf_link_template?(template) ⇒ Boolean
Ensure the given argument is a valid external link template.
-
#wf_maintenance_window_id?(id) ⇒ Boolean
Ensure the given argument is a valid maintenance window ID.
-
#wf_message_id?(id) ⇒ Boolean
Ensure the given argument is a valid message ID.
-
#wf_metric_name?(metric) ⇒ Boolean
Ensure the given argument is a valid Wavefront metric name, or path.
-
#wf_monitoredcluster_id?(id) ⇒ Boolean
Ensure the given argument is a valid monitored cluster ID.
-
#wf_ms_ts?(timestamp) ⇒ Boolean
Ensure the given argument is a valid millisecond epoch timestamp.
-
#wf_name?(name) ⇒ Boolean
Ensure the given argument is a valid name, for instance for an event.
-
#wf_notificant_id?(id) ⇒ Boolean
Ensure the given argument is a valid Wavefront notificant ID.
-
#wf_permission?(id) ⇒ Boolean
Ensure the given argument is a Wavefront permission.
-
#wf_point?(point) ⇒ Boolean
Validate a point so it conforms to the standard described in community.wavefront.com/docs/DOC-1031.
-
#wf_point_tag?(key, val) ⇒ Boolean
Validate a single point tag, probably on behalf of #wf_point_tags?.
-
#wf_point_tags?(tags) ⇒ Boolean
Ensure a hash of key:value point tags are value.
-
#wf_proxy_id?(id) ⇒ Boolean
Ensure the given argument is a valid Wavefront proxy ID.
-
#wf_role_id?(id) ⇒ Boolean
Ensure the given argument is a valid Wavefront role ID.
-
#wf_sampling_value?(value) ⇒ Boolean
Ensure the given value is a valid sampling rate.
-
#wf_savedsearch_entity?(id) ⇒ Boolean
Ensure the given argument is a valid saved search entity type.
-
#wf_savedsearch_id?(id) ⇒ Boolean
Ensure the given argument is a valid saved search ID.
-
#wf_serviceaccount_id?(id) ⇒ Boolean
Ensure the given argument is a valid service account ID.
-
#wf_source_id?(source) ⇒ Boolean
Ensure the given argument is a valid Wavefront source name.
-
#wf_string?(str) ⇒ Boolean
Ensure the given argument is a valid string, for a tag name.
-
#wf_tag?(*tags) ⇒ Boolean
Ensure one, or an array, of tags are valid.
-
#wf_ts?(timestamp) ⇒ Boolean
Ensure the given argument is a valid timestamp.
-
#wf_user_id?(user) ⇒ Boolean
Ensure the given argument is a valid user.
-
#wf_usergroup_id?(gid) ⇒ Boolean
Ensure the given argument is a valid user group.
-
#wf_value?(value) ⇒ Boolean
Ensure the given argument is a valid Wavefront value.
-
#wf_version?(version) ⇒ Boolean
Ensure the given argument is a valid version number.
-
#wf_webhook_id?(id) ⇒ Boolean
Ensure the given argument is a valid webhook ID.
Instance Method Details
#uuid?(str) ⇒ Bool
Is the given string a UUID? These are used for various item IDs.
23 24 25 |
# File 'lib/wavefront-sdk/validators.rb', line 23 def uuid?(str) str.is_a?(String) && str =~ /([a-f\d]{8}(-[a-f\d]{4}){3}-[a-f\d]{12})/ end |
#wf_account_id?(id) ⇒ Boolean
Ensure the given argument is a valid User or SystemAccount ID.
588 589 590 591 592 593 594 595 596 |
# File 'lib/wavefront-sdk/validators.rb', line 588 def wf_account_id?(id) return true if wf_user_id?(id) rescue Wavefront::Exception::InvalidUserId begin return true if wf_serviceaccount_id?(id) rescue Wavefront::Exception::InvalidServiceAccountId raise Wavefront::Exception::InvalidAccountId, id end end |
#wf_alert_id?(id) ⇒ Boolean
Ensure the given argument is a valid Wavefront alert ID. Alerts are identified by the epoch-nanosecond at which they were created.
228 229 230 231 232 233 |
# File 'lib/wavefront-sdk/validators.rb', line 228 def wf_alert_id?(id) id = id.to_s if id.is_a?(Numeric) return true if id.is_a?(String) && id.match(/^\d{13}$/) raise Wavefront::Exception::InvalidAlertId, id end |
#wf_alert_severity?(severity) ⇒ Boolean
Ensure the given argument is a valid alert severity
328 329 330 331 332 |
# File 'lib/wavefront-sdk/validators.rb', line 328 def wf_alert_severity?(severity) return true if %w[INFO SMOKE WARN SEVERE].include?(severity) raise Wavefront::Exception::InvalidAlertSeverity, severity end |
#wf_apitoken_id?(id) ⇒ Boolean
Ensure the given argument is a valid API token ID
538 539 540 541 542 |
# File 'lib/wavefront-sdk/validators.rb', line 538 def wf_apitoken_id?(id) return true if uuid?(id) raise Wavefront::Exception::InvalidApiTokenId, id end |
#wf_cloudintegration_id?(id) ⇒ Boolean
Ensure the given argument is a valid Wavefront cloud integration ID
243 244 245 246 247 |
# File 'lib/wavefront-sdk/validators.rb', line 243 def wf_cloudintegration_id?(id) return true if uuid?(id) raise Wavefront::Exception::InvalidCloudIntegrationId, id end |
#wf_dashboard_id?(id) ⇒ Boolean
There doesn’t seem to be a public statement on what’s allowed in a dashboard name. For now I’m going to assume up to 255 word characters.
258 259 260 261 262 |
# File 'lib/wavefront-sdk/validators.rb', line 258 def wf_dashboard_id?(id) return true if id.is_a?(String) && id.size < 256 && id.match(/^[\w\-]+$/) raise Wavefront::Exception::InvalidDashboardId, id end |
#wf_derivedmetric_id?(id) ⇒ Boolean
Ensure the given argument is a valid derived metric ID. IDs are the millisecond epoch timestamp at which the derived metric was created.
272 273 274 275 276 277 |
# File 'lib/wavefront-sdk/validators.rb', line 272 def wf_derivedmetric_id?(id) id = id.to_s if id.is_a?(Numeric) return true if id.is_a?(String) && id =~ /^\d{13}$/ raise Wavefront::Exception::InvalidDerivedMetricId, id end |
#wf_distribution?(dist) ⇒ Boolean
Validate a distribution description
461 462 463 464 465 466 467 468 |
# File 'lib/wavefront-sdk/validators.rb', line 461 def wf_distribution?(dist) wf_metric_name?(dist[:path]) wf_distribution_values?(dist[:value]) wf_epoch?(dist[:ts]) if dist[:ts] wf_source_id?(dist[:source]) if dist[:source] (dist[:tags]) if dist[:tags] true end |
#wf_distribution_count?(count) ⇒ Boolean
Ensure the given argument is a valid distribution count.
527 528 529 530 531 |
# File 'lib/wavefront-sdk/validators.rb', line 527 def wf_distribution_count?(count) return true if count.is_a?(Integer) && count.positive? raise Wavefront::Exception::InvalidDistributionCount, count end |
#wf_distribution_interval?(interval) ⇒ Boolean
Ensure the given argument is a valid distribution interval.
516 517 518 519 520 |
# File 'lib/wavefront-sdk/validators.rb', line 516 def wf_distribution_interval?(interval) return true if %i[m h d].include?(interval) raise Wavefront::Exception::InvalidDistributionInterval, interval end |
#wf_distribution_values?(vals) ⇒ Boolean
Validate an array of distribution values
476 477 478 479 480 481 482 |
# File 'lib/wavefront-sdk/validators.rb', line 476 def wf_distribution_values?(vals) vals.each do |times, val| wf_distribution_count?(times) wf_value?(val) end true end |
#wf_epoch?(timestamp) ⇒ Boolean
Ensure the given argument is a valid epoch timestamp. Again, no range checking.
125 126 127 128 129 |
# File 'lib/wavefront-sdk/validators.rb', line 125 def wf_epoch?() return true if .is_a?(Numeric) raise Wavefront::Exception::InvalidTimestamp, end |
#wf_event_id?(id) ⇒ Boolean
Ensure the given argument is a valid event ID. Event IDs are an epoch-millisecond timestamp followed by a : followed by the name of the event.
288 289 290 291 292 |
# File 'lib/wavefront-sdk/validators.rb', line 288 def wf_event_id?(id) return true if id.is_a?(String) && id =~ /^\d{13}:.+/ raise Wavefront::Exception::InvalidEventId, id end |
#wf_granularity?(granularity) ⇒ Boolean
Ensure the given argument is a valid query granularity
353 354 355 356 357 |
# File 'lib/wavefront-sdk/validators.rb', line 353 def wf_granularity?(granularity) return true if %w[d h m s].include?(granularity.to_s) raise Wavefront::Exception::InvalidGranularity, granularity end |
#wf_ingestionpolicy_id?(id) ⇒ Boolean
Ensure the given argument is a valid ingestion policy ID
577 578 579 580 581 |
# File 'lib/wavefront-sdk/validators.rb', line 577 def wf_ingestionpolicy_id?(id) return true if id.is_a?(String) && id =~ /^[a-z0-9\-_]+-\d{13}$/ raise Wavefront::Exception::InvalidIngestionPolicyId, id end |
#wf_integration_id?(id) ⇒ Boolean
Ensure the given argument is a valid Wavefront integration ID. These appear to be lower-case strings.
505 506 507 508 509 |
# File 'lib/wavefront-sdk/validators.rb', line 505 def wf_integration_id?(id) return true if id.is_a?(String) && id =~ /^[a-z0-9]+$/ raise Wavefront::Exception::InvalidIntegrationId, id end |
#wf_link_id?(id) ⇒ Boolean
Ensure the given argument is a valid external Link ID
301 302 303 304 305 |
# File 'lib/wavefront-sdk/validators.rb', line 301 def wf_link_id?(id) return true if id.is_a?(String) && id =~ /^\w{16}$/ raise Wavefront::Exception::InvalidExternalLinkId, id end |
#wf_link_template?(template) ⇒ Boolean
Ensure the given argument is a valid external link template
32 33 34 35 36 37 38 39 |
# File 'lib/wavefront-sdk/validators.rb', line 32 def wf_link_template?(template) if template.is_a?(String) && template.start_with?('http://', 'https://') return true end raise Wavefront::Exception::InvalidLinkTemplate, template end |
#wf_maintenance_window_id?(id) ⇒ Boolean
Ensure the given argument is a valid maintenance window ID. IDs are the millisecond epoch timestamp at which the window was created.
315 316 317 318 319 320 |
# File 'lib/wavefront-sdk/validators.rb', line 315 def wf_maintenance_window_id?(id) id = id.to_s if id.is_a?(Numeric) return true if id.is_a?(String) && id =~ /^\d{13}$/ raise Wavefront::Exception::InvalidMaintenanceWindowId, id end |
#wf_message_id?(id) ⇒ Boolean
Ensure the given argument is a valid message ID
340 341 342 343 344 |
# File 'lib/wavefront-sdk/validators.rb', line 340 def (id) return true if id.is_a?(String) && id =~ /^\w+::\w+$/ raise Wavefront::Exception::InvalidMessageId, id end |
#wf_metric_name?(metric) ⇒ Boolean
Ensure the given argument is a valid Wavefront metric name, or path.
is not valid.
49 50 51 52 53 54 55 56 57 |
# File 'lib/wavefront-sdk/validators.rb', line 49 def wf_metric_name?(metric) if metric.is_a?(String) && metric.size < 1024 && (metric.match(/^#{DELTA}?[\w\-.]+$/) || metric.match(%r{^"#{DELTA}?[\w\-./,]+"$})) return true end raise Wavefront::Exception::InvalidMetricName, metric end |
#wf_monitoredcluster_id?(id) ⇒ Boolean
Ensure the given argument is a valid monitored cluster ID
603 604 605 606 607 |
# File 'lib/wavefront-sdk/validators.rb', line 603 def wf_monitoredcluster_id?(id) return true if id.is_a?(String) && id.size < 256 && id =~ /^[a-z0-9\-_]+$/ raise Wavefront::Exception::InvalidMonitoredClusterId, id end |
#wf_ms_ts?(timestamp) ⇒ Boolean
Ensure the given argument is a valid millisecond epoch timestamp. We do no checking of the value, because who am I to say that the user doesn’t want to send a point relating to 1ms after the epoch, or a thousand years in the future?
112 113 114 115 116 |
# File 'lib/wavefront-sdk/validators.rb', line 112 def wf_ms_ts?() return true if .is_a?(Numeric) raise Wavefront::Exception::InvalidTimestamp, end |
#wf_name?(name) ⇒ Boolean
Ensure the given argument is a valid name, for instance for an event. Names can contain, AFAIK, word characters.
raise Wavefront::Exception::InvalidName if name is not valid
66 67 68 69 70 |
# File 'lib/wavefront-sdk/validators.rb', line 66 def wf_name?(name) return true if name.is_a?(String) && name.size < 1024 && name =~ /^\w+$/ raise Wavefront::Exception::InvalidName, name end |
#wf_notificant_id?(id) ⇒ Boolean
Ensure the given argument is a valid Wavefront notificant ID.
491 492 493 494 495 |
# File 'lib/wavefront-sdk/validators.rb', line 491 def wf_notificant_id?(id) return true if id.is_a?(String) && id =~ /^\w{16}$/ raise Wavefront::Exception::InvalidNotificantId, id end |
#wf_permission?(id) ⇒ Boolean
Ensure the given argument is a Wavefront permission
560 561 562 563 564 565 566 567 568 569 570 |
# File 'lib/wavefront-sdk/validators.rb', line 560 def (id) if %w[alerts_management batch_query_priority embedded_charts dashboard_management derived_metrics_management ingestion events_management external_links_management application_management metrics_management agent_management host_tag_management user_management].include?(id) return true end raise Wavefront::Exception::InvalidPermission, id end |
#wf_point?(point) ⇒ Boolean
Validate a point so it conforms to the standard described in community.wavefront.com/docs/DOC-1031
446 447 448 449 450 451 452 453 |
# File 'lib/wavefront-sdk/validators.rb', line 446 def wf_point?(point) wf_metric_name?(point[:path]) wf_value?(point[:value]) wf_epoch?(point[:ts]) if point[:ts] wf_source_id?(point[:source]) if point[:source] (point[:tags]) if point[:tags] true end |
#wf_point_tag?(key, val) ⇒ Boolean
Validate a single point tag, probably on behalf of #wf_point_tags?
197 198 199 200 201 202 203 204 |
# File 'lib/wavefront-sdk/validators.rb', line 197 def wf_point_tag?(key, val) if key && val && (key.size + val.size < 254) && key =~ /^[\w\-.:]+$/ && val !~ /\\$/ return end raise Wavefront::Exception::InvalidTag, "#{key}=#{val}" end |
#wf_point_tags?(tags) ⇒ Boolean
Ensure a hash of key:value point tags are value. Not to be confused with source tags.
185 186 187 188 189 |
# File 'lib/wavefront-sdk/validators.rb', line 185 def () raise Wavefront::Exception::InvalidTag unless .is_a?(Hash) .each { |k, v| wf_point_tag?(k, v) } end |
#wf_proxy_id?(id) ⇒ Boolean
Ensure the given argument is a valid Wavefront proxy ID
213 214 215 216 217 |
# File 'lib/wavefront-sdk/validators.rb', line 213 def wf_proxy_id?(id) return true if uuid?(id) raise Wavefront::Exception::InvalidProxyId, id end |
#wf_role_id?(id) ⇒ Boolean
Ensure the given argument is a valid Wavefront role ID
624 625 626 627 628 |
# File 'lib/wavefront-sdk/validators.rb', line 624 def wf_role_id?(id) return true if uuid?(id) raise Wavefront::Exception::InvalidRoleId, id end |
#wf_sampling_value?(value) ⇒ Boolean
Ensure the given value is a valid sampling rate.
613 614 615 616 617 |
# File 'lib/wavefront-sdk/validators.rb', line 613 def wf_sampling_value?(value) return true if value.is_a?(Numeric) && value.between?(0, 0.05) raise Wavefront::Exception::InvalidSamplingValue, value end |
#wf_savedsearch_entity?(id) ⇒ Boolean
Ensure the given argument is a valid saved search entity type.
378 379 380 381 382 383 384 |
# File 'lib/wavefront-sdk/validators.rb', line 378 def wf_savedsearch_entity?(id) return true if %w[DASHBOARD ALERT MAINTENANCE_WINDOW NOTIFICANT EVENT SOURCE EXTERNAL_LINK AGENT CLOUD_INTEGRATION].include?(id) raise Wavefront::Exception::InvalidSavedSearchEntity, id end |
#wf_savedsearch_id?(id) ⇒ Boolean
Ensure the given argument is a valid saved search ID.
365 366 367 368 369 |
# File 'lib/wavefront-sdk/validators.rb', line 365 def wf_savedsearch_id?(id) return true if id.is_a?(String) && id =~ /^\w{8}$/ raise Wavefront::Exception::InvalidSavedSearchId, id end |
#wf_serviceaccount_id?(id) ⇒ Boolean
Ensure the given argument is a valid service account ID
549 550 551 552 553 |
# File 'lib/wavefront-sdk/validators.rb', line 549 def wf_serviceaccount_id?(id) return true if id.is_a?(String) && id.start_with?('sa::') raise Wavefront::Exception::InvalidServiceAccountId, id end |
#wf_source_id?(source) ⇒ Boolean
Ensure the given argument is a valid Wavefront source name
393 394 395 396 397 398 399 400 |
# File 'lib/wavefront-sdk/validators.rb', line 393 def wf_source_id?(source) if source.is_a?(String) && source.match(/^[\w.\-]+$/) && source.size < 1024 return true end raise Wavefront::Exception::InvalidSourceId, source end |
#wf_string?(str) ⇒ Boolean
Ensure the given argument is a valid string, for a tag name.
78 79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/wavefront-sdk/validators.rb', line 78 def wf_string?(str) # # Only allows PCRE "word" characters, spaces, full-stops and # commas in tags and descriptions. This might be too restrictive, # but if it is, this is the only place we need to change it. # if str.is_a?(String) && str.size < 1024 && str =~ /^[\-\w .,]*$/ return true end raise Wavefront::Exception::InvalidString, str end |
#wf_tag?(*tags) ⇒ Boolean
Ensure one, or an array, of tags are valid. These tags are used as source tags, or tags for maintenance windows etc. They can contain letters, numbers, -, _ and :, and must be less than 256 characters long
140 141 142 143 144 145 146 147 148 |
# File 'lib/wavefront-sdk/validators.rb', line 140 def wf_tag?(*) Array(*).each do |tag| unless tag.is_a?(String) && tag.size < 255 && tag =~ /^[\w:\-.]+$/ raise Wavefront::Exception::InvalidTag, tag end end true end |
#wf_ts?(timestamp) ⇒ Boolean
Ensure the given argument is a valid timestamp
97 98 99 100 101 |
# File 'lib/wavefront-sdk/validators.rb', line 97 def wf_ts?() return true if .is_a?(Time) || .is_a?(Date) raise Wavefront::Exception::InvalidTimestamp, end |
#wf_user_id?(user) ⇒ Boolean
Ensure the given argument is a valid user.
408 409 410 411 412 |
# File 'lib/wavefront-sdk/validators.rb', line 408 def wf_user_id?(user) return true if user.is_a?(String) && user.length < 256 && !user.empty? raise Wavefront::Exception::InvalidUserId, user end |
#wf_usergroup_id?(gid) ⇒ Boolean
Ensure the given argument is a valid user group.
420 421 422 423 424 |
# File 'lib/wavefront-sdk/validators.rb', line 420 def wf_usergroup_id?(gid) return true if uuid?(gid) raise Wavefront::Exception::InvalidUserGroupId, gid end |
#wf_value?(value) ⇒ Boolean
Ensure the given argument is a valid Wavefront value. Can be any form of Numeric, including standard notation.
157 158 159 160 161 |
# File 'lib/wavefront-sdk/validators.rb', line 157 def wf_value?(value) return true if value.is_a?(Numeric) raise Wavefront::Exception::InvalidMetricValue, value end |
#wf_version?(version) ⇒ Boolean
Ensure the given argument is a valid version number
170 171 172 173 174 175 |
# File 'lib/wavefront-sdk/validators.rb', line 170 def wf_version?(version) version = version.to_i if version.is_a?(String) && version =~ /^\d+$/ return true if version.is_a?(Integer) && version.positive? raise Wavefront::Exception::InvalidVersion, version end |
#wf_webhook_id?(id) ⇒ Boolean
Ensure the given argument is a valid webhook ID.
432 433 434 435 436 |
# File 'lib/wavefront-sdk/validators.rb', line 432 def wf_webhook_id?(id) return true if id.is_a?(String) && id =~ /^[a-zA-Z0-9]{16}$/ raise Wavefront::Exception::InvalidWebhookId, id end |