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.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/CHANGELOG.md +6 -1
- data/Gemfile.lock +11 -1
- data/README.md +287 -28
- data/bin/esp +15 -0
- data/esp_sdk.gemspec +2 -0
- data/lib/esp/aws_clients.rb +60 -0
- data/lib/esp/commands/add_external_account.rb +57 -0
- data/lib/esp/commands/commands_tasks.rb +106 -0
- data/lib/esp/commands/console.rb +68 -0
- data/lib/esp/extensions/active_resource/formats/json_api_format.rb +12 -4
- data/lib/esp/extensions/active_resource/paginated_collection.rb +5 -5
- data/lib/esp/extensions/active_resource/validations.rb +1 -1
- data/lib/esp/external_account_creator.rb +77 -0
- data/lib/esp/resources/alert.rb +30 -34
- data/lib/esp/resources/cloud_trail_event.rb +5 -0
- data/lib/esp/resources/contact_request.rb +6 -5
- data/lib/esp/resources/custom_signature.rb +32 -56
- data/lib/esp/resources/dashboard.rb +8 -1
- data/lib/esp/resources/external_account.rb +27 -19
- data/lib/esp/resources/organization.rb +27 -3
- data/lib/esp/resources/region.rb +15 -3
- data/lib/esp/resources/report.rb +28 -24
- data/lib/esp/resources/resource.rb +26 -10
- data/lib/esp/resources/service.rb +5 -0
- data/lib/esp/resources/signature.rb +28 -12
- data/lib/esp/resources/stat.rb +21 -2
- data/lib/esp/resources/stat_custom_signature.rb +30 -4
- data/lib/esp/resources/stat_region.rb +29 -3
- data/lib/esp/resources/stat_service.rb +29 -3
- data/lib/esp/resources/stat_signature.rb +29 -3
- data/lib/esp/resources/sub_organization.rb +27 -3
- data/lib/esp/resources/suppression/region.rb +14 -32
- data/lib/esp/resources/suppression/signature.rb +14 -40
- data/lib/esp/resources/suppression/unique_identifier.rb +8 -6
- data/lib/esp/resources/suppression.rb +43 -5
- data/lib/esp/resources/tag.rb +5 -0
- data/lib/esp/resources/team.rb +33 -9
- data/lib/esp/resources/user.rb +29 -3
- data/lib/esp/version.rb +1 -1
- data/lib/esp.rb +25 -5
- data/test/esp/aws_clients_test.rb +101 -0
- data/test/esp/extensions/active_resource/formats/json_api_format_test.rb +26 -12
- data/test/esp/extensions/active_resource/paginated_collection_test.rb +93 -72
- data/test/esp/extensions/active_resource/validations_test.rb +2 -12
- data/test/esp/external_account_creator_test.rb +153 -0
- data/test/esp/resources/alert_test.rb +71 -33
- data/test/esp/resources/cloud_trail_event_test.rb +9 -1
- data/test/esp/resources/contact_request_test.rb +8 -0
- data/test/esp/resources/custom_signature_test.rb +8 -0
- data/test/esp/resources/dashboard_test.rb +8 -0
- data/test/esp/resources/external_account_test.rb +8 -0
- data/test/esp/resources/metadata_test.rb +1 -1
- data/test/esp/resources/organization_test.rb +8 -0
- data/test/esp/resources/region_test.rb +12 -4
- data/test/esp/resources/report_test.rb +13 -4
- data/test/esp/resources/resource_test.rb +208 -64
- data/test/esp/resources/service_test.rb +8 -0
- data/test/esp/resources/signature_test.rb +15 -9
- data/test/esp/resources/stat_custom_signature_test.rb +9 -1
- data/test/esp/resources/stat_region_test.rb +23 -1
- data/test/esp/resources/stat_service_test.rb +23 -1
- data/test/esp/resources/stat_signature_test.rb +23 -1
- data/test/esp/resources/stat_test.rb +52 -8
- data/test/esp/resources/sub_organization_test.rb +8 -0
- data/test/esp/resources/suppression/region_test.rb +10 -2
- data/test/esp/resources/suppression/signature_test.rb +10 -2
- data/test/esp/resources/suppression/unique_identifier_test.rb +10 -2
- data/test/esp/resources/suppression_test.rb +74 -14
- data/test/esp/resources/tag_test.rb +9 -1
- data/test/esp/resources/team_test.rb +8 -0
- data/test/esp/resources/user_test.rb +49 -19
- data/test/esp_test.rb +19 -1
- data/test/factories/alerts.rb +70 -0
- data/test/factories/organizations.rb +2 -2
- data/test/factories/regions.rb +1 -1
- data/test/factories/sub_organizations.rb +1 -1
- data/test/factories/suppressions.rb +109 -3
- data/test/factories/users.rb +65 -2
- data/test/test_helper.rb +9 -8
- metadata +41 -69
- data/bin/esp_console +0 -67
- data/rdoc/ActiveResource/Formats.html +0 -178
- data/rdoc/ActiveResource/PaginatedCollection.html +0 -912
- data/rdoc/ActiveResource.html +0 -182
- data/rdoc/ESP/Alert.html +0 -808
- data/rdoc/ESP/CloudTrailEvent.html +0 -377
- data/rdoc/ESP/ContactRequest.html +0 -368
- data/rdoc/ESP/CustomSignature.html +0 -748
- data/rdoc/ESP/Dashboard.html +0 -357
- data/rdoc/ESP/ExternalAccount.html +0 -567
- data/rdoc/ESP/Metadata.html +0 -411
- data/rdoc/ESP/Organization.html +0 -592
- data/rdoc/ESP/Region.html +0 -401
- data/rdoc/ESP/Report.html +0 -624
- data/rdoc/ESP/Service.html +0 -382
- data/rdoc/ESP/Signature.html +0 -557
- data/rdoc/ESP/Stat.html +0 -1780
- data/rdoc/ESP/StatCustomSignature.html +0 -1601
- data/rdoc/ESP/StatRegion.html +0 -1600
- data/rdoc/ESP/StatService.html +0 -1600
- data/rdoc/ESP/StatSignature.html +0 -1600
- data/rdoc/ESP/SubOrganization.html +0 -542
- data/rdoc/ESP/Suppression/Region.html +0 -456
- data/rdoc/ESP/Suppression/Signature.html +0 -472
- data/rdoc/ESP/Suppression/UniqueIdentifier.html +0 -419
- data/rdoc/ESP/Suppression.html +0 -651
- data/rdoc/ESP/Tag.html +0 -373
- data/rdoc/ESP/Team.html +0 -586
- data/rdoc/ESP/User.html +0 -485
- data/rdoc/ESP.html +0 -549
- data/rdoc/README_md.html +0 -503
- data/rdoc/created.rid +0 -31
- data/rdoc/images/add.png +0 -0
- data/rdoc/images/arrow_up.png +0 -0
- data/rdoc/images/brick.png +0 -0
- data/rdoc/images/brick_link.png +0 -0
- data/rdoc/images/bug.png +0 -0
- data/rdoc/images/bullet_black.png +0 -0
- data/rdoc/images/bullet_toggle_minus.png +0 -0
- data/rdoc/images/bullet_toggle_plus.png +0 -0
- data/rdoc/images/date.png +0 -0
- data/rdoc/images/delete.png +0 -0
- data/rdoc/images/find.png +0 -0
- data/rdoc/images/loadingAnimation.gif +0 -0
- data/rdoc/images/macFFBgHack.png +0 -0
- data/rdoc/images/package.png +0 -0
- data/rdoc/images/page_green.png +0 -0
- data/rdoc/images/page_white_text.png +0 -0
- data/rdoc/images/page_white_width.png +0 -0
- data/rdoc/images/plugin.png +0 -0
- data/rdoc/images/ruby.png +0 -0
- data/rdoc/images/tag_blue.png +0 -0
- data/rdoc/images/tag_green.png +0 -0
- data/rdoc/images/transparent.png +0 -0
- data/rdoc/images/wrench.png +0 -0
- data/rdoc/images/wrench_orange.png +0 -0
- data/rdoc/images/zoom.png +0 -0
- data/rdoc/index.html +0 -136
- data/rdoc/js/darkfish.js +0 -155
- data/rdoc/js/jquery.js +0 -4
- data/rdoc/js/navigation.js +0 -142
- data/rdoc/js/search.js +0 -94
- data/rdoc/js/search_index.js +0 -1
- data/rdoc/js/searcher.js +0 -228
- data/rdoc/rdoc.css +0 -595
- data/rdoc/table_of_contents.html +0 -942
|
@@ -2,6 +2,12 @@ module ESP
|
|
|
2
2
|
class Suppression
|
|
3
3
|
class Region < ESP::Resource
|
|
4
4
|
self.prefix += "suppressions/"
|
|
5
|
+
# Not Implemented. You cannot search for Suppression::Region.
|
|
6
|
+
#
|
|
7
|
+
# Regular ARELlike methods are disabled. Use the ESP::Suppression object to search suppressions.
|
|
8
|
+
def self.where(*)
|
|
9
|
+
fail ESP::NotImplementedError, 'Regular ARELlike methods are disabled. Use the ESP::Suppression object to search suppressions'
|
|
10
|
+
end
|
|
5
11
|
|
|
6
12
|
# Not Implemented. You cannot search for Suppression::Region.
|
|
7
13
|
#
|
|
@@ -44,26 +50,14 @@ module ESP
|
|
|
44
50
|
#
|
|
45
51
|
# +attributes+ | Required | A hash of region suppression attributes
|
|
46
52
|
#
|
|
47
|
-
# ===== Valid Attributes
|
|
53
|
+
# ===== Valid Attributes
|
|
48
54
|
#
|
|
49
|
-
#
|
|
55
|
+
# See {API documentation}[http://api-docs.evident.io?ruby#suppression-region-create] for valid arguments
|
|
50
56
|
#
|
|
51
|
-
#
|
|
52
|
-
#
|
|
53
|
-
# +resource+ | Not Required | The resource string this suppression will suppress alerts for.
|
|
54
|
-
#
|
|
55
|
-
# +reason+ | Required | The reason for creating the suppression.
|
|
56
|
-
#
|
|
57
|
-
# ==== Example
|
|
57
|
+
# ==== Example When Not Creating for Alert
|
|
58
58
|
# create(regions: ['us_east_1'], external_account_ids: [5], reason: 'My very good reason for creating this suppression')
|
|
59
59
|
#
|
|
60
|
-
#
|
|
61
|
-
#
|
|
62
|
-
# +alert_id+ | Required | The id for the alert you want to create a suppression for.
|
|
63
|
-
#
|
|
64
|
-
# +reason+ | Required | The reason for creating the suppression.
|
|
65
|
-
#
|
|
66
|
-
# ==== Example
|
|
60
|
+
# ==== Example When Creating for Alert
|
|
67
61
|
# create(alert_id: 5, reason: 'My very good reason for creating this suppression')
|
|
68
62
|
|
|
69
63
|
# :method: save
|
|
@@ -71,27 +65,15 @@ module ESP
|
|
|
71
65
|
#
|
|
72
66
|
# If you set an +alert_id+, set the +reason+ and all other params will be ignored, and the suppression will be created based on that alert.
|
|
73
67
|
#
|
|
74
|
-
# ===== Valid Attributes
|
|
75
|
-
#
|
|
76
|
-
# +regions+ | Required | An array of region names to suppress.
|
|
77
|
-
#
|
|
78
|
-
# +external_account_ids+ | Required | An Array of the external accounts identified by +external_account_id+ to suppress the signature or custom signature on.
|
|
68
|
+
# ===== Valid Attributes
|
|
79
69
|
#
|
|
80
|
-
#
|
|
70
|
+
# See {API documentation}[http://api-docs.evident.io?ruby#suppression-region-create] for valid arguments
|
|
81
71
|
#
|
|
82
|
-
#
|
|
83
|
-
#
|
|
84
|
-
# ==== Example
|
|
72
|
+
# ==== Example When Not Creating for Alert
|
|
85
73
|
# suppression = new(regions: ['us_east_1'], external_account_ids: [5], reason: 'My very good reason for creating this suppression')
|
|
86
74
|
# suppression.save
|
|
87
75
|
#
|
|
88
|
-
#
|
|
89
|
-
#
|
|
90
|
-
# +alert_id+ | Required | The id for the alert you want to create a suppression for.
|
|
91
|
-
#
|
|
92
|
-
# +reason+ | Required | The reason for creating the suppression.
|
|
93
|
-
#
|
|
94
|
-
# ==== Example
|
|
76
|
+
# ==== Example When Creating for Alert
|
|
95
77
|
# suppression = new(alert_id: 5, reason: 'My very good reason for creating this suppression')
|
|
96
78
|
# suppression.save
|
|
97
79
|
end
|
|
@@ -2,6 +2,12 @@ module ESP
|
|
|
2
2
|
class Suppression
|
|
3
3
|
class Signature < ESP::Resource
|
|
4
4
|
self.prefix += "suppressions/"
|
|
5
|
+
# Not Implemented. You cannot search for Suppression::Signature.
|
|
6
|
+
#
|
|
7
|
+
# Regular ARELlike methods are disabled. Use the ESP::Suppression object to search suppressions.
|
|
8
|
+
def self.where(*)
|
|
9
|
+
fail ESP::NotImplementedError, 'Regular ARELlike methods are disabled. Use the ESP::Suppression object to search suppressions'
|
|
10
|
+
end
|
|
5
11
|
|
|
6
12
|
# Not Implemented. You cannot search for Suppression::Signature.
|
|
7
13
|
#
|
|
@@ -44,30 +50,14 @@ module ESP
|
|
|
44
50
|
#
|
|
45
51
|
# +attributes+ | Required | A hash of signature suppression attributes
|
|
46
52
|
#
|
|
47
|
-
# ===== Valid Attributes
|
|
48
|
-
#
|
|
49
|
-
# +signature_ids+ | Conditionally Required | An array of signatures identified by +signature_id+ to suppress. Required if +custom_signature_ids+ is blank.
|
|
53
|
+
# ===== Valid Attributes
|
|
50
54
|
#
|
|
51
|
-
#
|
|
55
|
+
# See {API documentation}[http://api-docs.evident.io?ruby#suppression-signature-create] for valid arguments
|
|
52
56
|
#
|
|
53
|
-
#
|
|
54
|
-
#
|
|
55
|
-
# +external_account_ids+ | Required | An Array of the external accounts identified by +external_account_id+ to suppress the signature or custom signature on.
|
|
56
|
-
#
|
|
57
|
-
# +resource+ | Not Required | The resource string this suppression will suppress alerts for.
|
|
58
|
-
#
|
|
59
|
-
# +reason+ | Required | The reason for creating the suppression.
|
|
60
|
-
#
|
|
61
|
-
# ==== Example
|
|
57
|
+
# ==== Example When Not Creating for Alert
|
|
62
58
|
# create(signature_ids: [4, 2], regions: ['us_east_1'], external_account_ids: [5], reason: 'My very good reason for creating this suppression')
|
|
63
59
|
#
|
|
64
|
-
#
|
|
65
|
-
#
|
|
66
|
-
# +alert_id+ | Required | The id for the alert you want to create a suppression for.
|
|
67
|
-
#
|
|
68
|
-
# +reason+ | Required | The reason for creating the suppression.
|
|
69
|
-
#
|
|
70
|
-
# ==== Example
|
|
60
|
+
# ==== Example When Creating for Alert
|
|
71
61
|
# create(alert_id: 5, reason: 'My very good reason for creating this suppression')
|
|
72
62
|
|
|
73
63
|
# :method: save
|
|
@@ -75,31 +65,15 @@ module ESP
|
|
|
75
65
|
#
|
|
76
66
|
# If you set an +alert_id+, set the +reason+ and all other params will be ignored, and the suppression will be created based on that alert.
|
|
77
67
|
#
|
|
78
|
-
# ===== Valid Attributes
|
|
79
|
-
#
|
|
80
|
-
# +signature_ids+ | Conditionally Required | An array of signatures identified by +signature_id+ to suppress. Required if +custom_signature_ids+ is blank.
|
|
81
|
-
#
|
|
82
|
-
# +custom_signature_ids+ | Conditionally Required | An array of custom signatures identified by +custom_signature_id+ to suppress. Required if +signature_ids+ is blank.
|
|
83
|
-
#
|
|
84
|
-
# +regions+ | Required | An array of region names to suppress.
|
|
68
|
+
# ===== Valid Attributes
|
|
85
69
|
#
|
|
86
|
-
#
|
|
70
|
+
# See {API documentation}[http://api-docs.evident.io?ruby#suppression-signature-create] for valid arguments
|
|
87
71
|
#
|
|
88
|
-
#
|
|
89
|
-
#
|
|
90
|
-
# +reason+ | Required | The reason for creating the suppression.
|
|
91
|
-
#
|
|
92
|
-
# ==== Example
|
|
72
|
+
# ==== Example When Not Creating for Alert
|
|
93
73
|
# suppression = new(signature_ids: [4, 2], regions: ['us_east_1'], external_account_ids: [5], reason: 'My very good reason for creating this suppression')
|
|
94
74
|
# suppression.save
|
|
95
75
|
#
|
|
96
|
-
#
|
|
97
|
-
#
|
|
98
|
-
# +alert_id+ | Required | The id for the alert you want to create a suppression for.
|
|
99
|
-
#
|
|
100
|
-
# +reason+ | Required | The reason for creating the suppression.
|
|
101
|
-
#
|
|
102
|
-
# ==== Example
|
|
76
|
+
# ==== Example When Creating for Alert
|
|
103
77
|
# suppression = new(alert_id: 5, reason: 'My very good reason for creating this suppression')
|
|
104
78
|
# suppression.save
|
|
105
79
|
end
|
|
@@ -2,6 +2,12 @@ module ESP
|
|
|
2
2
|
class Suppression
|
|
3
3
|
class UniqueIdentifier < ESP::Resource
|
|
4
4
|
self.prefix += "suppressions/alert/:alert_id/"
|
|
5
|
+
# Not Implemented. You cannot search for Suppression::UniqueIdentifier.
|
|
6
|
+
#
|
|
7
|
+
# Regular ARELlike methods are disabled. Use the ESP::Suppression object to search suppressions.
|
|
8
|
+
def self.where(*)
|
|
9
|
+
fail ESP::NotImplementedError, 'Regular ARELlike methods are disabled. Use the ESP::Suppression object to search suppressions'
|
|
10
|
+
end
|
|
5
11
|
|
|
6
12
|
# Not Implemented. You cannot search for Suppression::UniqueIdentifier.
|
|
7
13
|
#
|
|
@@ -34,9 +40,7 @@ module ESP
|
|
|
34
40
|
#
|
|
35
41
|
# ==== Attributes
|
|
36
42
|
#
|
|
37
|
-
#
|
|
38
|
-
#
|
|
39
|
-
# +reason+ | Required | The reason for creating the suppression.
|
|
43
|
+
# See {API documentation}[http://api-docs.evident.io?ruby#suppression-unique-identifier-create] for valid arguments
|
|
40
44
|
#
|
|
41
45
|
# ==== Example
|
|
42
46
|
# create(alert_id: 5, reason: 'My very good reason for creating this suppression')
|
|
@@ -48,9 +52,7 @@ module ESP
|
|
|
48
52
|
#
|
|
49
53
|
# ==== Attributes
|
|
50
54
|
#
|
|
51
|
-
#
|
|
52
|
-
#
|
|
53
|
-
# +reason+ | Required | The reason for creating the suppression.
|
|
55
|
+
# See {API documentation}[http://api-docs.evident.io?ruby#suppression-unique-identifier-create] for valid arguments
|
|
54
56
|
#
|
|
55
57
|
# ==== Example
|
|
56
58
|
# suppression = new(alert_id: 5, reason: 'My very good reason for creating this suppression')
|
|
@@ -10,24 +10,38 @@ module ESP
|
|
|
10
10
|
|
|
11
11
|
##
|
|
12
12
|
# The regions affected by this suppression.
|
|
13
|
-
|
|
13
|
+
def regions
|
|
14
|
+
# When regions come back in an include, the method still gets called, to return the object from the attributes.
|
|
15
|
+
return attributes['regions'] if attributes['regions'].present?
|
|
16
|
+
return [] unless respond_to? :region_ids
|
|
17
|
+
ESP::Region.where(id_in: region_ids)
|
|
18
|
+
end
|
|
14
19
|
|
|
15
20
|
##
|
|
16
21
|
# The external accounts affected by this suppression.
|
|
17
|
-
|
|
22
|
+
def external_accounts
|
|
23
|
+
# When external_accounts come back in an include, the method still gets called, to return the object from the attributes.
|
|
24
|
+
return attributes['external_accounts'] if attributes['external_accounts'].present?
|
|
25
|
+
return [] unless respond_to? :external_account_ids
|
|
26
|
+
ESP::ExternalAccount.where(id_in: external_account_ids)
|
|
27
|
+
end
|
|
18
28
|
|
|
19
29
|
##
|
|
20
30
|
# The signatures being suppressed.
|
|
21
31
|
def signatures
|
|
32
|
+
# When signatures come back in an include, the method still gets called, to return the object from the attributes.
|
|
33
|
+
return attributes['signatures'] if attributes['signatures'].present?
|
|
22
34
|
return [] unless respond_to? :signature_ids
|
|
23
|
-
ESP::Signature.
|
|
35
|
+
ESP::Signature.where(id_in: signature_ids)
|
|
24
36
|
end
|
|
25
37
|
|
|
26
38
|
##
|
|
27
39
|
# The custom signatures being suppressed.
|
|
28
40
|
def custom_signatures
|
|
41
|
+
# When custom_signatures come back in an include, the method still gets called, to return the object from the attributes.
|
|
42
|
+
return attributes['custom_signatures'] if attributes['custom_signatures'].present?
|
|
29
43
|
return [] unless respond_to? :custom_signature_ids
|
|
30
|
-
ESP::CustomSignature.
|
|
44
|
+
ESP::CustomSignature.where(id_in: custom_signature_ids)
|
|
31
45
|
end
|
|
32
46
|
|
|
33
47
|
# Overriden so the correct param is sent on the has_many relationships. API needs this one to be plural.
|
|
@@ -69,6 +83,20 @@ module ESP
|
|
|
69
83
|
false
|
|
70
84
|
end
|
|
71
85
|
|
|
86
|
+
# :singleton-method: where
|
|
87
|
+
# Return a paginated Suppression list filtered by search parameters
|
|
88
|
+
#
|
|
89
|
+
# ==== Parameters
|
|
90
|
+
#
|
|
91
|
+
# +clauses+ | Hash of attributes with appended predicates to search, sort and include.
|
|
92
|
+
#
|
|
93
|
+
# ===== Valid Clauses
|
|
94
|
+
#
|
|
95
|
+
# See {API documentation}[http://api-docs.evident.io?ruby#suppression-attributes] for valid arguments
|
|
96
|
+
#
|
|
97
|
+
# :call-seq:
|
|
98
|
+
# where(clauses = {})
|
|
99
|
+
|
|
72
100
|
##
|
|
73
101
|
# :singleton-method: find
|
|
74
102
|
# Find a Suppression by id
|
|
@@ -77,8 +105,18 @@ module ESP
|
|
|
77
105
|
#
|
|
78
106
|
# +id+ | Required | The ID of the suppression to retrieve
|
|
79
107
|
#
|
|
108
|
+
# +options+ | Optional | A hash of options
|
|
109
|
+
#
|
|
110
|
+
# ===== Valid Options
|
|
111
|
+
#
|
|
112
|
+
# +include+ | The list of associated objects to return on the initial request.
|
|
113
|
+
#
|
|
114
|
+
# ===== Valid Includable Associations
|
|
115
|
+
#
|
|
116
|
+
# See {API documentation}[http://api-docs.evident.io?ruby#suppression-attributes] for valid arguments
|
|
117
|
+
#
|
|
80
118
|
# :call-seq:
|
|
81
|
-
# find(id)
|
|
119
|
+
# find(id, options = {})
|
|
82
120
|
|
|
83
121
|
# :singleton-method: all
|
|
84
122
|
# Return a paginated Suppression list
|
data/lib/esp/resources/tag.rb
CHANGED
|
@@ -10,6 +10,11 @@ module ESP
|
|
|
10
10
|
fail ESP::NotImplementedError
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
+
# Not Implemented. You cannot search for a Tag.
|
|
14
|
+
def self.where(*)
|
|
15
|
+
fail ESP::NotImplementedError
|
|
16
|
+
end
|
|
17
|
+
|
|
13
18
|
# Returns a paginated collection of tags for the given alert_id
|
|
14
19
|
# Convenience method to use instead of ::find since an alert_id is required to return tags.
|
|
15
20
|
#
|
data/lib/esp/resources/team.rb
CHANGED
|
@@ -26,6 +26,20 @@ module ESP
|
|
|
26
26
|
Report.create_for_team(id)
|
|
27
27
|
end
|
|
28
28
|
|
|
29
|
+
# :singleton-method: where
|
|
30
|
+
# Return a paginated Team list filtered by search parameters
|
|
31
|
+
#
|
|
32
|
+
# ==== Parameters
|
|
33
|
+
#
|
|
34
|
+
# +clauses+ | Hash of attributes with appended predicates to search, sort and include.
|
|
35
|
+
#
|
|
36
|
+
# ===== Valid Clauses
|
|
37
|
+
#
|
|
38
|
+
# See {API documentation}[http://api-docs.evident.io?ruby#team-attributes] for valid arguments
|
|
39
|
+
#
|
|
40
|
+
# :call-seq:
|
|
41
|
+
# where(clauses = {})
|
|
42
|
+
|
|
29
43
|
##
|
|
30
44
|
# :singleton-method: find
|
|
31
45
|
# Find a Team by id
|
|
@@ -34,8 +48,18 @@ module ESP
|
|
|
34
48
|
#
|
|
35
49
|
# +id+ | Required | The ID of the team to retrieve
|
|
36
50
|
#
|
|
51
|
+
# +options+ | Optional | A hash of options
|
|
52
|
+
#
|
|
53
|
+
# ===== Valid Options
|
|
54
|
+
#
|
|
55
|
+
# +include+ | The list of associated objects to return on the initial request.
|
|
56
|
+
#
|
|
57
|
+
# ===== Valid Includable Associations
|
|
58
|
+
#
|
|
59
|
+
# See {API documentation}[http://api-docs.evident.io?ruby#team-attributes] for valid arguments
|
|
60
|
+
#
|
|
37
61
|
# :call-seq:
|
|
38
|
-
# find(id)
|
|
62
|
+
# find(id, options = {})
|
|
39
63
|
|
|
40
64
|
# :singleton-method: all
|
|
41
65
|
# Return a paginated Team list
|
|
@@ -49,24 +73,24 @@ module ESP
|
|
|
49
73
|
#
|
|
50
74
|
# +attributes+ | Required | A hash of team attributes
|
|
51
75
|
#
|
|
52
|
-
#
|
|
76
|
+
# ===== Valid Attributes
|
|
53
77
|
#
|
|
54
|
-
#
|
|
78
|
+
# See {API documentation}[http://api-docs.evident.io?ruby#team-create] for valid arguments
|
|
55
79
|
#
|
|
56
|
-
#
|
|
80
|
+
# ==== Example
|
|
81
|
+
#
|
|
82
|
+
# team = ESP::Team.create(name: "Team Name", sub_organization_id: 9)
|
|
57
83
|
|
|
58
84
|
# :method: save
|
|
59
85
|
# Create and update a Team.
|
|
60
86
|
#
|
|
61
|
-
#
|
|
87
|
+
# ===== Valid Attributes when updating
|
|
62
88
|
#
|
|
63
89
|
# +name+ | Required | The new name of the team
|
|
64
90
|
#
|
|
65
|
-
#
|
|
66
|
-
#
|
|
67
|
-
# +sub_organization_id+ | Required | The ID of the sub organization to attach this team to
|
|
91
|
+
# ===== Valid Attributes when creating
|
|
68
92
|
#
|
|
69
|
-
#
|
|
93
|
+
# See {API documentation}[http://api-docs.evident.io?ruby#team-create] for valid arguments
|
|
70
94
|
#
|
|
71
95
|
# ==== Example
|
|
72
96
|
#
|
data/lib/esp/resources/user.rb
CHANGED
|
@@ -17,15 +17,31 @@ module ESP
|
|
|
17
17
|
##
|
|
18
18
|
# The collection of sub organizations that belong to the user.
|
|
19
19
|
def sub_organizations
|
|
20
|
-
|
|
20
|
+
return attributes['sub_organizations'] if attributes['sub_organizations'].present?
|
|
21
|
+
SubOrganization.where(id_in: sub_organization_ids)
|
|
21
22
|
end
|
|
22
23
|
|
|
23
24
|
##
|
|
24
25
|
# The collection of teams that belong to the user.
|
|
25
26
|
def teams
|
|
26
|
-
|
|
27
|
+
return attributes['teams'] if attributes['teams'].present?
|
|
28
|
+
Team.where(id_in: team_ids)
|
|
27
29
|
end
|
|
28
30
|
|
|
31
|
+
# :singleton-method: where
|
|
32
|
+
# Return a paginated User list filtered by search parameters
|
|
33
|
+
#
|
|
34
|
+
# ==== Parameters
|
|
35
|
+
#
|
|
36
|
+
# +clauses+ | Hash of attributes with appended predicates to search, sort and include.
|
|
37
|
+
#
|
|
38
|
+
# ===== Valid Clauses
|
|
39
|
+
#
|
|
40
|
+
# See {API documentation}[http://api-docs.evident.io?ruby#user-attributes] for valid arguments
|
|
41
|
+
#
|
|
42
|
+
# :call-seq:
|
|
43
|
+
# where(clauses = {})
|
|
44
|
+
|
|
29
45
|
##
|
|
30
46
|
# :singleton-method: find
|
|
31
47
|
# Find a User by id
|
|
@@ -34,8 +50,18 @@ module ESP
|
|
|
34
50
|
#
|
|
35
51
|
# +id+ | Required | The ID of the user to retrieve
|
|
36
52
|
#
|
|
53
|
+
# +options+ | Optional | A hash of options
|
|
54
|
+
#
|
|
55
|
+
# ===== Valid Options
|
|
56
|
+
#
|
|
57
|
+
# +include+ | The list of associated objects to return on the initial request.
|
|
58
|
+
#
|
|
59
|
+
# ===== Valid Includable Associations
|
|
60
|
+
#
|
|
61
|
+
# See {API documentation}[http://api-docs.evident.io?ruby#user-attributes] for valid arguments
|
|
62
|
+
#
|
|
37
63
|
# :call-seq:
|
|
38
|
-
# find(id)
|
|
64
|
+
# find(id, options = {})
|
|
39
65
|
|
|
40
66
|
# :singleton-method: all
|
|
41
67
|
# Return a paginated User list
|
data/lib/esp/version.rb
CHANGED
data/lib/esp.rb
CHANGED
|
@@ -3,7 +3,7 @@ module ESP
|
|
|
3
3
|
#
|
|
4
4
|
# You can optionally set the `ESP_ACCESS_KEY_ID` environment variable.
|
|
5
5
|
def self.access_key_id=(access_key_id)
|
|
6
|
-
@access_key_id
|
|
6
|
+
@access_key_id = access_key_id
|
|
7
7
|
ESP::Resource.hmac_access_id = access_key_id
|
|
8
8
|
end
|
|
9
9
|
|
|
@@ -16,7 +16,7 @@ module ESP
|
|
|
16
16
|
#
|
|
17
17
|
# You can optionally set the `ESP_SECRET_ACCESS_KEY` environment variable.
|
|
18
18
|
def self.secret_access_key=(secret_access_key)
|
|
19
|
-
@secret_access_key
|
|
19
|
+
@secret_access_key = secret_access_key
|
|
20
20
|
ESP::Resource.hmac_secret_key = secret_access_key
|
|
21
21
|
end
|
|
22
22
|
|
|
@@ -28,8 +28,8 @@ module ESP
|
|
|
28
28
|
PATH = '/api/v2'.freeze
|
|
29
29
|
|
|
30
30
|
HOST = { development: "http://localhost:3000".freeze,
|
|
31
|
-
test:
|
|
32
|
-
production:
|
|
31
|
+
test: "http://localhost:3000".freeze,
|
|
32
|
+
production: "https://api.evident.io".freeze }.freeze # :nodoc:
|
|
33
33
|
|
|
34
34
|
# Users of the Evident.io marketplace appliance application will need to set the host for their instance.
|
|
35
35
|
#
|
|
@@ -37,7 +37,7 @@ module ESP
|
|
|
37
37
|
#
|
|
38
38
|
# * +host+ - The host for the installed appliance instance.
|
|
39
39
|
def self.host=(host)
|
|
40
|
-
@host
|
|
40
|
+
@host = host
|
|
41
41
|
ESP::Resource.site = site
|
|
42
42
|
end
|
|
43
43
|
|
|
@@ -46,6 +46,23 @@ module ESP
|
|
|
46
46
|
"#{(@host || HOST[ESP.env.to_sym] || ENV['ESP_HOST'])}#{PATH}"
|
|
47
47
|
end
|
|
48
48
|
|
|
49
|
+
# Manually set an http_proxy
|
|
50
|
+
#
|
|
51
|
+
# You can optionally set the `HTTP_PROXY` environment variable.
|
|
52
|
+
#
|
|
53
|
+
# ==== Attribute
|
|
54
|
+
#
|
|
55
|
+
# * +http_proxy+ - The URI of the http proxy
|
|
56
|
+
def self.http_proxy=(proxy)
|
|
57
|
+
@http_proxy = proxy
|
|
58
|
+
ESP::Resource.proxy = http_proxy
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Reads the `HTTP_PROXY` environment variable if ::http_proxy was not set manually.
|
|
62
|
+
def self.http_proxy
|
|
63
|
+
@http_proxy || ENV['http_proxy']
|
|
64
|
+
end
|
|
65
|
+
|
|
49
66
|
# For use in a Rails initializer to set the ::access_key_id, ::secret_access_key and ::site.
|
|
50
67
|
#
|
|
51
68
|
# ==== Example
|
|
@@ -54,6 +71,7 @@ module ESP
|
|
|
54
71
|
# config.access_key_id = <your key>
|
|
55
72
|
# config.secret_access_key = <your secret key>
|
|
56
73
|
# config.host = <host of your appliance instance>
|
|
74
|
+
# config.http_proxy = <your proxy URI>
|
|
57
75
|
# end
|
|
58
76
|
def self.configure
|
|
59
77
|
yield self
|
|
@@ -93,4 +111,6 @@ module ESP
|
|
|
93
111
|
autoload :StatSignature, File.expand_path(File.dirname(__FILE__) + '/esp/resources/stat_signature')
|
|
94
112
|
autoload :StatRegion, File.expand_path(File.dirname(__FILE__) + '/esp/resources/stat_region')
|
|
95
113
|
autoload :StatService, File.expand_path(File.dirname(__FILE__) + '/esp/resources/stat_service')
|
|
114
|
+
autoload :ExternalAccountCreator, File.expand_path(File.dirname(__FILE__) + '/../lib/esp/external_account_creator')
|
|
115
|
+
autoload :AWSClients, File.expand_path(File.dirname(__FILE__) + '/../lib/esp/aws_clients')
|
|
96
116
|
end
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
require_relative '../test_helper'
|
|
2
|
+
require_relative '../../lib/esp/aws_clients'
|
|
3
|
+
|
|
4
|
+
module ESP
|
|
5
|
+
class AWSClientsTest < ActiveSupport::TestCase
|
|
6
|
+
context ESP::AWSClients do
|
|
7
|
+
context 'validations' do
|
|
8
|
+
should 'be 12 chars' do
|
|
9
|
+
aws = AWSClients.new
|
|
10
|
+
aws.stubs(:owner_id).returns("ABC123")
|
|
11
|
+
|
|
12
|
+
refute aws.valid?
|
|
13
|
+
assert_contains aws.errors.full_messages, 'Owner is the wrong length (should be 12 characters)'
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
should 'contain only numeric chars' do
|
|
17
|
+
aws = AWSClients.new
|
|
18
|
+
aws.stubs(:owner_id).returns("ABC123")
|
|
19
|
+
|
|
20
|
+
refute aws.valid?
|
|
21
|
+
assert_contains aws.errors.full_messages, 'Owner is not a number'
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
should 'contain 12 numeric chars' do
|
|
25
|
+
aws = AWSClients.new
|
|
26
|
+
aws.stubs(:owner_id).returns("012345678912")
|
|
27
|
+
|
|
28
|
+
assert aws.valid?
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
context "#create_and_attach_role" do
|
|
33
|
+
setup do
|
|
34
|
+
ENV['AWS_REGION'] = 'us-east-1'
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
teardown do
|
|
38
|
+
ENV['AWS_REGION'] = nil
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
should "make iam call to create_role with external account id" do
|
|
42
|
+
aws = AWSClients.new
|
|
43
|
+
iam_client = mock
|
|
44
|
+
iam_client.stubs(:create_role)
|
|
45
|
+
iam_client.stubs(:attach_role_policy)
|
|
46
|
+
aws.stubs(:iam).returns(iam_client)
|
|
47
|
+
|
|
48
|
+
aws.create_and_attach_role!('1234')
|
|
49
|
+
|
|
50
|
+
assert_received(iam_client, :create_role) do |expected|
|
|
51
|
+
expected.with do |params|
|
|
52
|
+
assert_equal AWSClients::AWS_ROLE_NAME, params[:role_name]
|
|
53
|
+
assert_equal aws.send(:trust_policy, '1234'), params[:assume_role_policy_document]
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
should "make iam call to attach_role_policy" do
|
|
59
|
+
aws = AWSClients.new
|
|
60
|
+
iam_client = mock
|
|
61
|
+
iam_client.stubs(:create_role)
|
|
62
|
+
iam_client.stubs(:attach_role_policy)
|
|
63
|
+
aws.stubs(:iam).returns(iam_client)
|
|
64
|
+
|
|
65
|
+
aws.create_and_attach_role!('1234')
|
|
66
|
+
|
|
67
|
+
assert_received(iam_client, :attach_role_policy) do |expected|
|
|
68
|
+
expected.with do |params|
|
|
69
|
+
assert_equal AWSClients::AWS_ROLE_NAME, params[:role_name]
|
|
70
|
+
assert_equal AWSClients::AWS_ROLE_POLICY_ARN, params[:policy_arn]
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
should "return the role" do
|
|
76
|
+
aws = AWSClients.new
|
|
77
|
+
iam_client = mock
|
|
78
|
+
iam_client.expects(:create_role).returns('the role')
|
|
79
|
+
iam_client.expects(:attach_role_policy)
|
|
80
|
+
aws.stubs(:iam).returns(iam_client)
|
|
81
|
+
|
|
82
|
+
role = aws.create_and_attach_role!('1234')
|
|
83
|
+
|
|
84
|
+
assert_equal 'the role', role
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
context '#trust_policy' do
|
|
89
|
+
should 'have the esp_owner_id and external_account_id' do
|
|
90
|
+
aws = AWSClients.new
|
|
91
|
+
ESP.stubs(:env).returns("production")
|
|
92
|
+
|
|
93
|
+
policy = aws.send(:trust_policy, '1234')
|
|
94
|
+
|
|
95
|
+
assert_match(/\"AWS\": \"arn:aws:iam::613698206329:root\"/, policy)
|
|
96
|
+
assert_match(/\"sts:ExternalId\": \"1234"/, policy)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|