esp_sdk 2.0.0 → 2.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 (148) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/CHANGELOG.md +6 -1
  4. data/Gemfile.lock +11 -1
  5. data/README.md +287 -28
  6. data/bin/esp +15 -0
  7. data/esp_sdk.gemspec +2 -0
  8. data/lib/esp/aws_clients.rb +60 -0
  9. data/lib/esp/commands/add_external_account.rb +57 -0
  10. data/lib/esp/commands/commands_tasks.rb +106 -0
  11. data/lib/esp/commands/console.rb +68 -0
  12. data/lib/esp/extensions/active_resource/formats/json_api_format.rb +12 -4
  13. data/lib/esp/extensions/active_resource/paginated_collection.rb +5 -5
  14. data/lib/esp/extensions/active_resource/validations.rb +1 -1
  15. data/lib/esp/external_account_creator.rb +77 -0
  16. data/lib/esp/resources/alert.rb +30 -34
  17. data/lib/esp/resources/cloud_trail_event.rb +5 -0
  18. data/lib/esp/resources/contact_request.rb +6 -5
  19. data/lib/esp/resources/custom_signature.rb +32 -56
  20. data/lib/esp/resources/dashboard.rb +8 -1
  21. data/lib/esp/resources/external_account.rb +27 -19
  22. data/lib/esp/resources/organization.rb +27 -3
  23. data/lib/esp/resources/region.rb +15 -3
  24. data/lib/esp/resources/report.rb +28 -24
  25. data/lib/esp/resources/resource.rb +26 -10
  26. data/lib/esp/resources/service.rb +5 -0
  27. data/lib/esp/resources/signature.rb +28 -12
  28. data/lib/esp/resources/stat.rb +21 -2
  29. data/lib/esp/resources/stat_custom_signature.rb +30 -4
  30. data/lib/esp/resources/stat_region.rb +29 -3
  31. data/lib/esp/resources/stat_service.rb +29 -3
  32. data/lib/esp/resources/stat_signature.rb +29 -3
  33. data/lib/esp/resources/sub_organization.rb +27 -3
  34. data/lib/esp/resources/suppression/region.rb +14 -32
  35. data/lib/esp/resources/suppression/signature.rb +14 -40
  36. data/lib/esp/resources/suppression/unique_identifier.rb +8 -6
  37. data/lib/esp/resources/suppression.rb +43 -5
  38. data/lib/esp/resources/tag.rb +5 -0
  39. data/lib/esp/resources/team.rb +33 -9
  40. data/lib/esp/resources/user.rb +29 -3
  41. data/lib/esp/version.rb +1 -1
  42. data/lib/esp.rb +25 -5
  43. data/test/esp/aws_clients_test.rb +101 -0
  44. data/test/esp/extensions/active_resource/formats/json_api_format_test.rb +26 -12
  45. data/test/esp/extensions/active_resource/paginated_collection_test.rb +93 -72
  46. data/test/esp/extensions/active_resource/validations_test.rb +2 -12
  47. data/test/esp/external_account_creator_test.rb +153 -0
  48. data/test/esp/resources/alert_test.rb +71 -33
  49. data/test/esp/resources/cloud_trail_event_test.rb +9 -1
  50. data/test/esp/resources/contact_request_test.rb +8 -0
  51. data/test/esp/resources/custom_signature_test.rb +8 -0
  52. data/test/esp/resources/dashboard_test.rb +8 -0
  53. data/test/esp/resources/external_account_test.rb +8 -0
  54. data/test/esp/resources/metadata_test.rb +1 -1
  55. data/test/esp/resources/organization_test.rb +8 -0
  56. data/test/esp/resources/region_test.rb +12 -4
  57. data/test/esp/resources/report_test.rb +13 -4
  58. data/test/esp/resources/resource_test.rb +208 -64
  59. data/test/esp/resources/service_test.rb +8 -0
  60. data/test/esp/resources/signature_test.rb +15 -9
  61. data/test/esp/resources/stat_custom_signature_test.rb +9 -1
  62. data/test/esp/resources/stat_region_test.rb +23 -1
  63. data/test/esp/resources/stat_service_test.rb +23 -1
  64. data/test/esp/resources/stat_signature_test.rb +23 -1
  65. data/test/esp/resources/stat_test.rb +52 -8
  66. data/test/esp/resources/sub_organization_test.rb +8 -0
  67. data/test/esp/resources/suppression/region_test.rb +10 -2
  68. data/test/esp/resources/suppression/signature_test.rb +10 -2
  69. data/test/esp/resources/suppression/unique_identifier_test.rb +10 -2
  70. data/test/esp/resources/suppression_test.rb +74 -14
  71. data/test/esp/resources/tag_test.rb +9 -1
  72. data/test/esp/resources/team_test.rb +8 -0
  73. data/test/esp/resources/user_test.rb +49 -19
  74. data/test/esp_test.rb +19 -1
  75. data/test/factories/alerts.rb +70 -0
  76. data/test/factories/organizations.rb +2 -2
  77. data/test/factories/regions.rb +1 -1
  78. data/test/factories/sub_organizations.rb +1 -1
  79. data/test/factories/suppressions.rb +109 -3
  80. data/test/factories/users.rb +65 -2
  81. data/test/test_helper.rb +9 -8
  82. metadata +41 -69
  83. data/bin/esp_console +0 -67
  84. data/rdoc/ActiveResource/Formats.html +0 -178
  85. data/rdoc/ActiveResource/PaginatedCollection.html +0 -912
  86. data/rdoc/ActiveResource.html +0 -182
  87. data/rdoc/ESP/Alert.html +0 -808
  88. data/rdoc/ESP/CloudTrailEvent.html +0 -377
  89. data/rdoc/ESP/ContactRequest.html +0 -368
  90. data/rdoc/ESP/CustomSignature.html +0 -748
  91. data/rdoc/ESP/Dashboard.html +0 -357
  92. data/rdoc/ESP/ExternalAccount.html +0 -567
  93. data/rdoc/ESP/Metadata.html +0 -411
  94. data/rdoc/ESP/Organization.html +0 -592
  95. data/rdoc/ESP/Region.html +0 -401
  96. data/rdoc/ESP/Report.html +0 -624
  97. data/rdoc/ESP/Service.html +0 -382
  98. data/rdoc/ESP/Signature.html +0 -557
  99. data/rdoc/ESP/Stat.html +0 -1780
  100. data/rdoc/ESP/StatCustomSignature.html +0 -1601
  101. data/rdoc/ESP/StatRegion.html +0 -1600
  102. data/rdoc/ESP/StatService.html +0 -1600
  103. data/rdoc/ESP/StatSignature.html +0 -1600
  104. data/rdoc/ESP/SubOrganization.html +0 -542
  105. data/rdoc/ESP/Suppression/Region.html +0 -456
  106. data/rdoc/ESP/Suppression/Signature.html +0 -472
  107. data/rdoc/ESP/Suppression/UniqueIdentifier.html +0 -419
  108. data/rdoc/ESP/Suppression.html +0 -651
  109. data/rdoc/ESP/Tag.html +0 -373
  110. data/rdoc/ESP/Team.html +0 -586
  111. data/rdoc/ESP/User.html +0 -485
  112. data/rdoc/ESP.html +0 -549
  113. data/rdoc/README_md.html +0 -503
  114. data/rdoc/created.rid +0 -31
  115. data/rdoc/images/add.png +0 -0
  116. data/rdoc/images/arrow_up.png +0 -0
  117. data/rdoc/images/brick.png +0 -0
  118. data/rdoc/images/brick_link.png +0 -0
  119. data/rdoc/images/bug.png +0 -0
  120. data/rdoc/images/bullet_black.png +0 -0
  121. data/rdoc/images/bullet_toggle_minus.png +0 -0
  122. data/rdoc/images/bullet_toggle_plus.png +0 -0
  123. data/rdoc/images/date.png +0 -0
  124. data/rdoc/images/delete.png +0 -0
  125. data/rdoc/images/find.png +0 -0
  126. data/rdoc/images/loadingAnimation.gif +0 -0
  127. data/rdoc/images/macFFBgHack.png +0 -0
  128. data/rdoc/images/package.png +0 -0
  129. data/rdoc/images/page_green.png +0 -0
  130. data/rdoc/images/page_white_text.png +0 -0
  131. data/rdoc/images/page_white_width.png +0 -0
  132. data/rdoc/images/plugin.png +0 -0
  133. data/rdoc/images/ruby.png +0 -0
  134. data/rdoc/images/tag_blue.png +0 -0
  135. data/rdoc/images/tag_green.png +0 -0
  136. data/rdoc/images/transparent.png +0 -0
  137. data/rdoc/images/wrench.png +0 -0
  138. data/rdoc/images/wrench_orange.png +0 -0
  139. data/rdoc/images/zoom.png +0 -0
  140. data/rdoc/index.html +0 -136
  141. data/rdoc/js/darkfish.js +0 -155
  142. data/rdoc/js/jquery.js +0 -4
  143. data/rdoc/js/navigation.js +0 -142
  144. data/rdoc/js/search.js +0 -94
  145. data/rdoc/js/search_index.js +0 -1
  146. data/rdoc/js/searcher.js +0 -228
  147. data/rdoc/rdoc.css +0 -595
  148. data/rdoc/table_of_contents.html +0 -942
@@ -0,0 +1,68 @@
1
+ # https://www.fedux.org/articles/2015/08/26/creating-an-irb-based-repl-console-for-your-project.html
2
+ require 'optparse'
3
+ require 'irb'
4
+
5
+ ARGV.clone.options do |opts|
6
+ opts.banner = "Usage: esp console"
7
+
8
+ opts.separator ""
9
+
10
+ opts.on("-h", "--help",
11
+ "Show this help message.") do
12
+ puts opts # rubocop:disable Rails/Output
13
+ exit
14
+ end
15
+
16
+ opts.separator ""
17
+ opts.separator "An IRB console you can use if not using it in a Rails app"
18
+ opts.separator ""
19
+
20
+ opts.parse!
21
+ end
22
+
23
+ module ESP
24
+ class Console
25
+ def start # rubocop:disable Metrics/MethodLength
26
+ ARGV.clear
27
+ IRB.setup nil
28
+
29
+ IRB.conf[:PROMPT] = {}
30
+ IRB.conf[:IRB_NAME] = 'espsdk'
31
+ IRB.conf[:PROMPT][:ESPSDK] = {
32
+ PROMPT_I: '%N:%03n:%i> ',
33
+ PROMPT_N: '%N:%03n:%i> ',
34
+ PROMPT_S: '%N:%03n:%i%l ',
35
+ PROMPT_C: '%N:%03n:%i* ',
36
+ RETURN: "# => %s\n"
37
+ }
38
+ IRB.conf[:PROMPT_MODE] = :ESPSDK
39
+
40
+ IRB.conf[:RC] = false
41
+
42
+ require 'irb/completion'
43
+ require 'irb/ext/save-history'
44
+ IRB.conf[:READLINE] = true
45
+ IRB.conf[:SAVE_HISTORY] = 1000
46
+ IRB.conf[:HISTORY_FILE] = '~/.esp_sdk_history'
47
+
48
+ context = Class.new do
49
+ include ESP
50
+ end
51
+
52
+ irb = IRB::Irb.new(IRB::WorkSpace.new(context.new))
53
+ IRB.conf[:MAIN_CONTEXT] = irb.context
54
+
55
+ trap("SIGINT") do
56
+ irb.signal_handle
57
+ end
58
+
59
+ begin
60
+ catch(:IRB_EXIT) do
61
+ irb.eval_input
62
+ end
63
+ ensure
64
+ IRB.irb_at_exit
65
+ end
66
+ end
67
+ end
68
+ end
@@ -1,6 +1,6 @@
1
1
  require 'active_support/json'
2
2
 
3
- module ActiveResource
3
+ module ActiveResource # :nodoc: all
4
4
  class ConnectionError
5
5
  def initialize(response)
6
6
  @response = if response.respond_to?(:response)
@@ -20,7 +20,7 @@ module ActiveResource
20
20
  end
21
21
  end
22
22
 
23
- module Formats
23
+ module Formats # :nodoc: all
24
24
  module JsonAPIFormat
25
25
  module_function
26
26
 
@@ -114,11 +114,19 @@ module ActiveResource
114
114
  return if included.blank?
115
115
  object[assoc] = case data
116
116
  when Array
117
- included.select { |i| data.include?(parse_object!(i).slice('type', 'id')) }
117
+ merge_nested_included_objects(object, data, included)
118
118
  when Hash
119
- included.detect { |i| data == parse_object!(i).slice('type', 'id') }
119
+ merge_nested_included_objects(object, [data], included).first
120
120
  end
121
121
  end
122
+
123
+ def self.merge_nested_included_objects(object, data, included)
124
+ assocs = included.select { |i| data.include?((i.slice('type', 'id'))) }
125
+ # Remove the object from the included array to prevent an infinite loop if one of it's associations relates back to itself.
126
+ assoc_included = included.dup
127
+ assoc_included.delete(object)
128
+ assocs.map { |i| parse_object!(i, assoc_included) }
129
+ end
122
130
  end
123
131
  end
124
132
  end
@@ -26,7 +26,7 @@ module ActiveResource
26
26
  # alerts.current_page_number # => 5
27
27
  # first_page.current_page_number # => 1
28
28
  def first_page
29
- previous_page? ? resource_class.all(from: from, params: { page: { number: 1 } }) : self
29
+ previous_page? ? resource_class.where(original_params.merge(from: from, page: { number: 1 })) : self
30
30
  end
31
31
 
32
32
  # Updates the existing PaginatedCollection object with the first page of data when not on the first page.
@@ -49,7 +49,7 @@ module ActiveResource
49
49
  # alerts.current_page_number # => 5
50
50
  # previous_page.current_page_number # => 4
51
51
  def previous_page
52
- previous_page? ? resource_class.all(from: from, params: previous_page_params) : self
52
+ previous_page? ? resource_class.where(original_params.merge(previous_page_params.merge(from: from))) : self
53
53
  end
54
54
 
55
55
  # Updates the existing PaginatedCollection object with the previous page of data when not on the first page.
@@ -72,7 +72,7 @@ module ActiveResource
72
72
  # alerts.current_page_number # => 5
73
73
  # next_page.current_page_number # => 6
74
74
  def next_page
75
- next_page? ? resource_class.all(from: from, params: next_page_params) : self
75
+ next_page? ? resource_class.where(original_params.merge(next_page_params.merge(from: from))) : self
76
76
  end
77
77
 
78
78
  # Updates the existing PaginatedCollection object with the last page of data when not on the last page.
@@ -95,7 +95,7 @@ module ActiveResource
95
95
  # alerts.current_page_number # => 5
96
96
  # last_page.current_page_number # => 25
97
97
  def last_page
98
- !last_page? ? resource_class.all(from: from, params: last_page_params) : self
98
+ !last_page? ? resource_class.where(original_params.merge(last_page_params.merge(from: from))) : self
99
99
  end
100
100
 
101
101
  # Updates the existing PaginatedCollection object with the last page of data when not on the last page.
@@ -125,7 +125,7 @@ module ActiveResource
125
125
  fail ArgumentError, "You must supply a page number." unless page_number.present?
126
126
  fail ArgumentError, "Page number cannot be less than 1." if page_number.to_i < 1
127
127
  fail ArgumentError, "Page number cannot be greater than the last page number." if page_number.to_i > last_page_number.to_i
128
- page_number.to_i != current_page_number.to_i ? resource_class.all(from: from, params: { page: { number: page_number, size: (next_page_params || previous_page_params)['page']['size'] } }) : self
128
+ page_number.to_i != current_page_number.to_i ? resource_class.where(original_params.merge(from: from, page: { number: page_number, size: (next_page_params || previous_page_params)['page']['size'] })) : self
129
129
  end
130
130
 
131
131
  # Returns a new PaginatedCollection with the +page_number+ page of data when not already on page +page_number+.
@@ -1,4 +1,4 @@
1
- module ActiveResource
1
+ module ActiveResource # :nodoc: all
2
2
  module Validations
3
3
  # Loads the set of remote errors into the object's Errors based on the
4
4
  # content-type of the error-block received.
@@ -0,0 +1,77 @@
1
+ module ESP # :nodoc: all
2
+ class AddExternalAccountError < StandardError
3
+ EXIT_CODES = {
4
+ '12 characters' => 98,
5
+ 'not a number' => 97,
6
+ 'organization not found' => 96,
7
+ 'sub organization' => 95,
8
+ 'team' => 94,
9
+ 'external account' => 93
10
+ }.freeze
11
+
12
+ def initialize(message = nil)
13
+ super
14
+ end
15
+
16
+ def exit_code
17
+ EXIT_CODES.detect { |key, _code| message =~ /#{key}/i }.last
18
+ rescue StandardError
19
+ 1
20
+ end
21
+ end
22
+
23
+ class ExternalAccountCreator
24
+ attr_reader :aws
25
+
26
+ def initialize
27
+ @aws = AWSClients.new
28
+ end
29
+
30
+ def create
31
+ fail ESP::AddExternalAccountError, aws.errors.full_messages.join(', ') unless aws.valid?
32
+
33
+ puts "adding AWS account #{aws.owner_id} to ESP as #{team_name}" # rubocop:disable Rails/Output
34
+ aws_role_object = aws.create_and_attach_role!(external_account_id)
35
+ sleep 10
36
+
37
+ puts "aws_role_arn = #{aws_role_object.role.arn}, external_id = #{external_account_id}, nickname = #{team_name}, esp_suborg_id = #{sub_organization.id}, esp_team_id = #{team.id}" # rubocop:disable Rails/Output
38
+ external_account = ESP::ExternalAccount.create(arn: aws_role_object.role.arn, external_id: external_account_id, name: team_name, sub_organization_id: sub_organization.id, team_id: team.id)
39
+ fail ESP::AddExternalAccountError, "On External Account: #{external_account.errors.full_messages.join(', ')}" unless external_account.errors.blank?
40
+ external_account
41
+ end
42
+
43
+ private
44
+
45
+ def external_account_id
46
+ @external_id ||= ESP::ExternalAccount.new.generate_external_id
47
+ end
48
+
49
+ def organization
50
+ @organization ||= ESP::Organization.last
51
+ fail ESP::AddExternalAccountError, "Organization not found" if @organization.blank?
52
+ @organization
53
+ end
54
+
55
+ def sub_organization
56
+ @sub_org ||= begin
57
+ sub_org = ESP::SubOrganization.where(name_eq: 'AutoCreate').first
58
+ sub_org || ESP::SubOrganization.create(name: "AutoCreate", organization_id: organization.id)
59
+ end
60
+ fail ESP::AddExternalAccountError, "On Sub Organization: #{@sub_org.errors.full_messages.first}" unless @sub_org.errors.blank?
61
+ @sub_org
62
+ end
63
+
64
+ def team_name
65
+ "#{sub_organization.name} #{aws.owner_id}"
66
+ end
67
+
68
+ def team
69
+ @team ||= begin
70
+ team = ESP::Team.where(name: team_name, sub_organization_id: sub_organization.id).first
71
+ team || ESP::Team.create(name: team_name, sub_organization_id: sub_organization.id)
72
+ end
73
+ fail ESP::AddExternalAccountError, "On Team: #{@team.errors.full_messages.first}" unless @team.errors.blank?
74
+ @team
75
+ end
76
+ end
77
+ end
@@ -45,61 +45,57 @@ module ESP
45
45
  end
46
46
 
47
47
  # Returns a paginated collection of alerts for the given report_id
48
- # Convenience method to use instead of ::find since a report_id is required to return alerts.
49
48
  #
50
49
  # ==== Parameters
51
50
  #
52
- # +report_id+ | Required | The ID of the report to retrieve alerts for
51
+ # +clauses+ | Required | Hash of attributes with appended predicates to search, sort and include.
53
52
  #
54
- # +arguments+ | Not Required | An optional hash of search criteria to filter the returned collection
53
+ # ===== Valid Clauses
55
54
  #
56
- # ===== Valid Arguments
55
+ # See {API documentation}[http://api-docs.evident.io?ruby#searching-alerts] for valid arguments
57
56
  #
58
- # +region_id+ | Not Required | Return only alerts for this region.
59
- #
60
- # +status+ | Not Required | Return only alerts for the give status(es). Valid values are fail, warn, error, pass, info
61
- #
62
- # +first_seen+ | Not Required | Return only alerts that have started within a number of hours of the report. For example, first_seen of 3 will return alerts that started showing up within the last 3 hours of the report.
63
- #
64
- # +suppressed+ | Not Required | Return only suppressed alerts
57
+ # ==== Example
58
+ # alerts = ESP::Alert.where(report_id: 54, status_eq: 'fail', signature_risk_level_in: ['High'], include: 'signature')
59
+ def self.where(clauses = {})
60
+ clauses = clauses.with_indifferent_access
61
+ return super(clauses) if clauses[:from].present?
62
+ from = for_report(clauses.delete(:report_id))
63
+ super clauses.merge(from: from)
64
+ end
65
+
66
+ # Find an Alert by id
65
67
  #
66
- # +team_id+ | Not Required | Return only alerts for the given team.
68
+ # ==== Parameter
67
69
  #
68
- # +external_account_id+ | Not Required | Return only alerts for the given external id.
70
+ # +id+ | Required | The ID of the alert to retrieve
69
71
  #
70
- # +service_id+ | Not Required | Return only alerts on signatures with the given service.
72
+ # +options+ | Optional | A hash of options
71
73
  #
72
- # +signature_severity+ | Not Required | Return only alerts for signatures with the given risk_level. Valid values are Low, Medium, High
74
+ # ===== Valid Options
73
75
  #
74
- # +signature_name+ | Not Required | Return only alerts for signatures with the given name.
76
+ # +include+ | The list of associated objects to return on the initial request.
75
77
  #
76
- # +resource+ | Not Required | Return only alerts for the given resource or tag.
78
+ # ===== Valid Includable Associations
77
79
  #
78
- # +signature_identifier+ | Not Required | Return only alerts for signatures with the given identifier.
80
+ # See {API documentation}[http://api-docs.evident.io?ruby#searching-alerts] for valid arguments
79
81
  #
80
82
  # ==== Example
81
- # alerts = ESP::Alert.for_report(54, status: 'fail', signature_severity: 'High')
82
- def self.for_report(report_id = nil, arguments = {})
83
- fail ArgumentError, "You must supply a report id." unless report_id.present?
84
- from = "#{prefix}reports/#{report_id}/alerts.json"
85
- all(from: from, params: arguments)
86
- end
87
-
88
- # Find an Alert by id
89
- #
90
- # ==== Parameter
91
- #
92
- # +id+ | Required | The ID of the alert to retrieve
83
+ # alert = ESP::Alert.find(1, include: 'tags,external_account.team')
93
84
  #
94
85
  # :call-seq:
95
- # find(id)
86
+ # find(id, options = {})
96
87
  def self.find(*arguments)
97
88
  scope = arguments.slice!(0)
98
89
  options = (arguments.slice!(0) || {}).with_indifferent_access
99
90
  return super(scope, options) if scope.is_a?(Numeric) || options[:from].present?
100
- params = options.fetch(:params, {}).with_indifferent_access
101
- report_id = params.delete(:report_id)
102
- for_report(report_id, params)
91
+ params = options.fetch(:params, {})
92
+ from = for_report(params.delete(:report_id))
93
+ all(from: "#{from}.json", params: params)
94
+ end
95
+
96
+ def self.for_report(report_id) # :nodoc:
97
+ fail ArgumentError, "You must supply a report id." unless report_id.present?
98
+ "#{prefix}reports/#{report_id}/alerts"
103
99
  end
104
100
 
105
101
  # Suppress the signature associated with this alert.
@@ -1,5 +1,10 @@
1
1
  module ESP
2
2
  class CloudTrailEvent < ESP::Resource
3
+ # Not Implemented. You cannot search for a CloudTrailEvent.
4
+ def self.where(*)
5
+ fail ESP::NotImplementedError
6
+ end
7
+
3
8
  # Not Implemented. You cannot create or update a CloudTrailEvent.
4
9
  def save
5
10
  fail ESP::NotImplementedError
@@ -6,6 +6,11 @@ module ESP
6
6
  fail ESP::NotImplementedError
7
7
  end
8
8
 
9
+ # Not Implemented. You cannot search for ContactRequest.
10
+ def self.where(*)
11
+ fail ESP::NotImplementedError
12
+ end
13
+
9
14
  # Not Implemented. You cannot update a ContactRequest.
10
15
  def update
11
16
  fail ESP::NotImplementedError
@@ -25,11 +30,7 @@ module ESP
25
30
  #
26
31
  # ===== Valid Attributes
27
32
  #
28
- # +title+ | Required | Subject of your message
29
- #
30
- # +description+ | Required | Body of your message
31
- #
32
- # +request_type+ | Required | Type of contact request. Supported values are `support` for support requests and `feature` for a feature request
33
+ # See {API documentation}[http://api-docs.evident.io?ruby#contact-request-create] for valid arguments
33
34
  #
34
35
  #
35
36
  # :call-seq:
@@ -14,13 +14,7 @@ module ESP
14
14
  #
15
15
  # ===== Valid Arguments
16
16
  #
17
- # +external_account_id+ | Required | The ID of the external account to run this custom signature against
18
- #
19
- # +signature+ | Required | The code for this custom signature
20
- #
21
- # +language+ | Required | The language of the custom signature. Possible values are `ruby` or `javascript`
22
- #
23
- # +regions+ | Required | Array of region names to run this custom signature against
17
+ # See {API documentation}[http://api-docs.evident.io?ruby#custom-signature-run-new] for valid arguments
24
18
  #
25
19
  # ==== Example
26
20
  # signature = "# Demo Ruby Signature\r\nconfigure do |c|\r\n # Set regions to run in. Remove this line to run in all regions.\r\n c.valid_regions = [:us_east_1]\r\n # Override region to display as global. Useful when checking resources\r\n # like IAM that do not have a specific region.\r\n c.display_as = :global\r\n # deep_inspection works with set_data to automically collect\r\n # data fields for each alert. Not required.\r\n c.deep_inspection = [:users]\r\nend\r\n\r\n# Required perform method\r\ndef perform(aws)\r\n list_users = aws.iam.list_users\r\n count = list_users[:users].count\r\n\r\n # Set data for deep_inspection to use\r\n set_data(list_users)\r\n\r\n if count == 0\r\n fail(user_count: count, condition: 'count == 0')\r\n else\r\n pass(user_count: count, condition: 'count >= 1')\r\n end\r\nend\r\n"
@@ -42,13 +36,7 @@ module ESP
42
36
  #
43
37
  # ===== Valid Arguments
44
38
  #
45
- # +external_account_id+ | Required | The ID of the external account to run this custom signature against
46
- #
47
- # +signature+ | Required | The code for this custom signature
48
- #
49
- # +language+ | Required | The language of the custom signature. Possible values are `ruby` or `javascript`
50
- #
51
- # +regions+ | Required | Array of region names to run this custom signature against
39
+ # See {API documentation}[http://api-docs.evident.io?ruby#custom-signature-run-new] for valid arguments
52
40
  #
53
41
  # ==== Example
54
42
  # signature = "# Demo Ruby Signature\r\nconfigure do |c|\r\n # Set regions to run in. Remove this line to run in all regions.\r\n c.valid_regions = [:us_east_1]\r\n # Override region to display as global. Useful when checking resources\r\n # like IAM that do not have a specific region.\r\n c.display_as = :global\r\n # deep_inspection works with set_data to automically collect\r\n # data fields for each alert. Not required.\r\n c.deep_inspection = [:users]\r\nend\r\n\r\n# Required perform method\r\ndef perform(aws)\r\n list_users = aws.iam.list_users\r\n count = list_users[:users].count\r\n\r\n # Set data for deep_inspection to use\r\n set_data(list_users)\r\n\r\n if count == 0\r\n fail(user_count: count, condition: 'count == 0')\r\n else\r\n pass(user_count: count, condition: 'count >= 1')\r\n end\r\nend\r\n"
@@ -69,9 +57,7 @@ module ESP
69
57
  #
70
58
  # ===== Valid Arguments
71
59
  #
72
- # +external_account_id+ | Required | The ID of the external account to run this custom signature against
73
- #
74
- # +regions+ | Required | Array of region names to run this custom signature against
60
+ # See {API documentation}[http://api-docs.evident.io?ruby#custom-signature-run-existing] for valid arguments
75
61
  #
76
62
  # ==== Example
77
63
  # custom_signature = ESP::CustomSignature.find(365)
@@ -93,9 +79,7 @@ module ESP
93
79
  #
94
80
  # ===== Valid Arguments
95
81
  #
96
- # +external_account_id+ | Required | The ID of the external account to run this custom signature against
97
- #
98
- # +regions+ | Required | Array of region names to run this custom signature against
82
+ # See {API documentation}[http://api-docs.evident.io?ruby#custom-signature-run-existing] for valid arguments
99
83
  #
100
84
  # ==== Example
101
85
  # custom_signature = ESP::CustomSignature.find(365)
@@ -122,11 +106,7 @@ module ESP
122
106
  #
123
107
  # ===== Valid Arguments
124
108
  #
125
- # +regions+ | Required | An array of region names to suppress.
126
- #
127
- # +external_account_ids+ | Required | An Array of the external accounts identified by +external_account_id+ to suppress the signature or custom signature on.
128
- #
129
- # +reason+ | Required | The reason for creating the suppression.
109
+ # See {API documentation}[http://api-docs.evident.io?ruby#suppression-create] for valid arguments
130
110
  #
131
111
  # ==== Example
132
112
  # suppress(regions: ['us_east_1'], external_account_ids: [5], reason: 'My very good reason for creating this suppression')
@@ -135,6 +115,20 @@ module ESP
135
115
  ESP::Suppression::Signature.create(custom_signature_ids: [id], regions: Array(arguments[:regions]), external_account_ids: Array(arguments[:external_account_ids]), reason: arguments[:reason])
136
116
  end
137
117
 
118
+ # :singleton-method: where
119
+ # Return a paginated CustomSignature list filtered by search parameters
120
+ #
121
+ # ==== Parameters
122
+ #
123
+ # +clauses+ | Hash of attributes with appended predicates to search, sort and include.
124
+ #
125
+ # ===== Valid Clauses
126
+ #
127
+ # See {API documentation}[http://api-docs.evident.io?ruby#custom-signature-attributes] for valid arguments
128
+ #
129
+ # :call-seq:
130
+ # where(clauses = {})
131
+
138
132
  ##
139
133
  # :singleton-method: find
140
134
  # Find a CustomSignature by id
@@ -143,8 +137,18 @@ module ESP
143
137
  #
144
138
  # +id+ | Required | The ID of the custom signature to retrieve
145
139
  #
140
+ # +options+ | Optional | A hash of options
141
+ #
142
+ # ===== Valid Options
143
+ #
144
+ # +include+ | The list of associated objects to return on the initial request.
145
+ #
146
+ # ===== Valid Includable Associations
147
+ #
148
+ # See {API documentation}[http://api-docs.evident.io?ruby#custom-signature-attributes] for valid arguments
149
+ #
146
150
  # :call-seq:
147
- # find(id)
151
+ # find(id, options = {})
148
152
 
149
153
  # :singleton-method: all
150
154
  # Return a paginated CustomSignature list
@@ -160,21 +164,7 @@ module ESP
160
164
  #
161
165
  # ===== Valid Attributes
162
166
  #
163
- # +active+ | Not Required | Flag that determines if this custom signature should run on reports
164
- #
165
- # +description+ | Not Required | The description of the custom signature that is displayed on alerts
166
- #
167
- # +identifier+ | Required | The identifier to use for the custom signature. Common format is AWS:<Service>-<Number> such as AWS:IAM-001
168
- #
169
- # +language+ | Required | The language of the custom signature. Possible values are `ruby` or `javascript`
170
- #
171
- # +name+ | Required | The name of the custom signature
172
- #
173
- # +resolution+ | Not Required | Details for how to resolve this custom signature that is displayed on alerts
174
- #
175
- # +risk_level+ | Required | The risk-level of the problem identified by the custom signature
176
- #
177
- # +signature+ | Required | The code for this custom signature
167
+ # See {API documentation}[http://api-docs.evident.io?ruby#custom-signature-create] for valid arguments
178
168
  #
179
169
  # ==== Example
180
170
  #
@@ -186,21 +176,7 @@ module ESP
186
176
  #
187
177
  # ===== Valid Attributes
188
178
  #
189
- # +active+ | Not Required | Flag that determines if this custom signature should run on reports
190
- #
191
- # +description+ | Not Required | The description of the custom signature that is displayed on alerts
192
- #
193
- # +identifier+ | Required | The identifier to use for the custom signature. Common format is AWS:<Service>-<Number> such as AWS:IAM-001
194
- #
195
- # +language+ | Required | The language of the custom signature. Possible values are `ruby` or `javascript`
196
- #
197
- # +name+ | Required | The name of the custom signature
198
- #
199
- # +resolution+ | Not Required | Details for how to resolve this custom signature that is displayed on alerts
200
- #
201
- # +risk_level+ | Required | The risk-level of the problem identified by the custom signature
202
- #
203
- # +signature+ | Required | The code for this custom signature
179
+ # See {API documentation}[http://api-docs.evident.io?ruby#custom-signature-create] for valid arguments
204
180
  #
205
181
  # ==== Example
206
182
  #
@@ -4,7 +4,14 @@ module ESP
4
4
  #
5
5
  # Regular ARELlike methods are disabled.
6
6
  def self.find(*)
7
- fail ESP::NotImplementedError, 'Regular ARELlike methods are disabled. Use either the .recent method.'
7
+ fail ESP::NotImplementedError, 'Regular ARELlike methods are disabled. Use the .recent method.'
8
+ end
9
+
10
+ # Not Implemented. You cannot search for Suppression::Region.
11
+ #
12
+ # Regular ARELlike methods are disabled.
13
+ def self.where(*)
14
+ fail ESP::NotImplementedError, 'Regular ARELlike methods are disabled. Use the .recent method.'
8
15
  end
9
16
 
10
17
  # Not Implemented. You cannot create or update a Dashboard.
@@ -24,6 +24,20 @@ module ESP
24
24
  super
25
25
  end
26
26
 
27
+ # :singleton-method: where
28
+ # Return a paginated ExternalAccount list filtered by search parameters
29
+ #
30
+ # ==== Parameters
31
+ #
32
+ # +clauses+ | Hash of attributes with appended predicates to search, sort and include.
33
+ #
34
+ # ===== Valid Clauses
35
+ #
36
+ # See {API documentation}[http://api-docs.evident.io?ruby#external-account-attributes] for valid arguments
37
+ #
38
+ # :call-seq:
39
+ # where(clauses = {})
40
+
27
41
  ##
28
42
  # :singleton-method: find
29
43
  # Find an ExternalAccount by id
@@ -32,8 +46,18 @@ module ESP
32
46
  #
33
47
  # +id+ | Required | The ID of the external account to retrieve
34
48
  #
49
+ # +options+ | Optional | A hash of options
50
+ #
51
+ # ===== Valid Options
52
+ #
53
+ # +include+ | The list of associated objects to return on the initial request.
54
+ #
55
+ # ===== Valid Includable Associations
56
+ #
57
+ # See {API documentation}[http://api-docs.evident.io?ruby#external-account-attributes] for valid arguments
58
+ #
35
59
  # :call-seq:
36
- # find(id)
60
+ # find(id, options = {})
37
61
 
38
62
  # :singleton-method: all
39
63
  # Return a paginated CustomSignature list
@@ -49,15 +73,7 @@ module ESP
49
73
  #
50
74
  # ===== Valid Attributes
51
75
  #
52
- # +arn+ | Required | Amazon Resource Name for the IAM role
53
- #
54
- # +external_id+ | Required | External identifier set on the role. This will be set by calling #generate_external_id if not already set.
55
- #
56
- # +name+ | Not Required | The name for this external account
57
- #
58
- # +sub_organization_id+ | Required | The ID of the sub organization the external account will belong to
59
- #
60
- # +team_id+ | Required | The ID of the team the external account will belong to
76
+ # See {API documentation}[http://api-docs.evident.io?ruby#external-account-create] for valid arguments
61
77
  #
62
78
  # ==== Example
63
79
  #
@@ -68,15 +84,7 @@ module ESP
68
84
  #
69
85
  # ===== Valid Attributes
70
86
  #
71
- # +arn+ | Required | Amazon Resource Name for the IAM role
72
- #
73
- # +external_id+ | Required | External identifier set on the role. This will be set by calling #generate_external_id if not already set.
74
- #
75
- # +name+ | Not Required | The name for this external account
76
- #
77
- # +sub_organization_id+ | Required | The ID of the sub organization the external account will belong to
78
- #
79
- # +team_id+ | Required | The ID of the team the external account will belong to
87
+ # See {API documentation}[http://api-docs.evident.io?ruby#external-account-create] for valid arguments
80
88
  #
81
89
  # ==== Example
82
90
  #
@@ -34,6 +34,20 @@ module ESP
34
34
  fail ESP::NotImplementedError
35
35
  end
36
36
 
37
+ # :singleton-method: where
38
+ # Return a paginated Organization list filtered by search parameters
39
+ #
40
+ # ==== Parameters
41
+ #
42
+ # +clauses+ | Hash of attributes with appended predicates to search, sort and include.
43
+ #
44
+ # ===== Valid Clauses
45
+ #
46
+ # See {API documentation}[http://api-docs.evident.io?ruby#organization-attributes] for valid arguments
47
+ #
48
+ # :call-seq:
49
+ # where(clauses = {})
50
+
37
51
  ##
38
52
  # :singleton-method: find
39
53
  # Find a Organization by id
@@ -42,8 +56,18 @@ module ESP
42
56
  #
43
57
  # +id+ | Required | The ID of the organization to retrieve
44
58
  #
59
+ # +options+ | Optional | A hash of options
60
+ #
61
+ # ===== Valid Options
62
+ #
63
+ # +include+ | The list of associated objects to return on the initial request.
64
+ #
65
+ # ===== Valid Includable Associations
66
+ #
67
+ # See {API documentation}[http://api-docs.evident.io?ruby#organization-attributes] for valid arguments
68
+ #
45
69
  # :call-seq:
46
- # find(id)
70
+ # find(id, options = {})
47
71
 
48
72
  # :singleton-method: all
49
73
  # Return a paginated Organization list
@@ -54,8 +78,8 @@ module ESP
54
78
  # :method: save
55
79
  # Update an Organization.
56
80
  #
57
- # ==== Valid Attributes
81
+ # ===== Valid Attributes
58
82
  #
59
- # +name+ | Not Required | The new name of the organization
83
+ # See {API documentation}[http://api-docs.evident.io?ruby#organization-update] for valid arguments
60
84
  end
61
85
  end