opensearch-aws-sigv4 1.3.0 → 2.0.0.pre.beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/README.md +11 -5
- data/USER_GUIDE.md +49 -41
- data/lib/opensearch-aws-sigv4/version.rb +1 -1
- data/lib/opensearch-aws-sigv4.rb +40 -77
- data/opensearch-aws-sigv4.gemspec +4 -6
- data.tar.gz.sig +0 -0
- metadata +8 -30
- metadata.gz.sig +0 -0
- data/spec/unit/open_search/aws/sigv4_client_spec.rb +0 -107
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 102c17b87f52f20a9d554f36347e9e458d846e6a00c0a98637fc308ba9e2846f
|
4
|
+
data.tar.gz: b2f41069ad25a0da064331550b1f83aea76f7abacc384c1c8b44b919057b3513
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 47b70757731a9cd594d1491d95c1576a53eb73cabe494d98813a1b69f3b5eef6d0a37a7f8f4fefdfacc5c7e440a8a1d587199e42fe95b9e9c4c6381bf3dfb710
|
7
|
+
data.tar.gz: cdf066b67d5df7e6167d8cb8bd3ec02b94e33d354da124532e5004a5906f035f54d51c07c5f4a2e9d0efc95e26ddd93091d470a2a480a5479a674050e6422a2e
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/README.md
CHANGED
@@ -1,14 +1,20 @@
|
|
1
1
|
[<img src="OpenSearch.svg" width="400">](https://opensearch.org)
|
2
2
|
|
3
|
-
# OpenSearch AWS
|
3
|
+
# OpenSearch AWS SigV4 Request Signer
|
4
4
|
|
5
|
-
The `opensearch-aws-sigv4` library provides an AWS Sigv4
|
6
|
-
|
7
|
-
This library is an AWS Sigv4 wrapper for [`opensearch-ruby`](https://github.com/opensearch-project/opensearch-ruby/tree/main), which is a Ruby client for OpenSearch. The `OpenSearch::Aws::Sigv4Client`, therefore, has all features of `OpenSearch::Client`.
|
5
|
+
The `opensearch-aws-sigv4` library provides an AWS Sigv4 request signer for [`opensearch-ruby`](https://github.com/opensearch-project/opensearch-ruby/tree/main), which is a Ruby client for OpenSearch.
|
8
6
|
|
9
7
|
## Compatibility
|
10
8
|
|
11
|
-
The `opensearch-aws-sigv4`
|
9
|
+
The compatibility between `opensearch-aws-sigv4` and `opensearch-ruby` is as follows:
|
10
|
+
|
11
|
+
| `opensearch-aws-sigv4` Version | Compatible `opensearch-ruby` Versions |
|
12
|
+
|-------------------------------|--------------------------------------|
|
13
|
+
| `< 2.0` | `> 4.0` |
|
14
|
+
| `>= 2.0` | `<= 4.0` |
|
15
|
+
|
16
|
+
- **`opensearch-aws-sigv4 < 2.0`** is compatible with all versions of **`opensearch-ruby > 4.0`**.
|
17
|
+
- **`opensearch-aws-sigv4 >= 2.0`** is compatible with all versions of **`opensearch-ruby <= 4.0`**.
|
12
18
|
|
13
19
|
## User Guide
|
14
20
|
|
data/USER_GUIDE.md
CHANGED
@@ -23,7 +23,7 @@ bundle install
|
|
23
23
|
|
24
24
|
## Usage
|
25
25
|
|
26
|
-
This library
|
26
|
+
This library provides an AWS SigV4 request signer for [`opensearch-ruby`](https://github.com/opensearch-project/opensearch-ruby/tree/main), which is a Ruby client for OpenSearch.
|
27
27
|
|
28
28
|
### Amazon OpenSearch Service
|
29
29
|
To sign requests for the Amazon OpenSearch Service:
|
@@ -32,22 +32,30 @@ To sign requests for the Amazon OpenSearch Service:
|
|
32
32
|
require 'opensearch-aws-sigv4'
|
33
33
|
require 'aws-sigv4'
|
34
34
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
35
|
+
request_signer = OpenSearch::Aws::Sigv4RequestSigner.new(
|
36
|
+
service: 'es', # signing service name, use "aoss" for OpenSearch Serverless
|
37
|
+
region: 'us-west-2', # signing service region
|
38
|
+
access_key_id: 'key_id',
|
39
|
+
secret_access_key: 'secret'
|
40
|
+
)
|
39
41
|
|
40
|
-
client = OpenSearch::
|
41
|
-
|
42
|
-
|
43
|
-
|
42
|
+
client = OpenSearch::Client.new(
|
43
|
+
host: 'https://your.amz-managed-opensearch.domain', # serverless endpoint for OpenSearch Serverless
|
44
|
+
request_signer: request_signer
|
45
|
+
)
|
44
46
|
|
45
47
|
# create an index and document
|
46
48
|
index = 'prime'
|
47
49
|
client.indices.create(index: index)
|
48
|
-
client.index(
|
49
|
-
|
50
|
-
|
50
|
+
client.index(
|
51
|
+
index: index,
|
52
|
+
id: '1',
|
53
|
+
body: {
|
54
|
+
name: 'Amazon Echo',
|
55
|
+
msrp: '5999',
|
56
|
+
year: 2011
|
57
|
+
}
|
58
|
+
)
|
51
59
|
|
52
60
|
# search for the document
|
53
61
|
client.search(body: { query: { match: { name: 'Echo' } } })
|
@@ -60,37 +68,37 @@ client.indices.delete(index: index)
|
|
60
68
|
```
|
61
69
|
|
62
70
|
### Enable Sigv4 Debug Logging
|
63
|
-
If you run into credentials errors, usually from expired session, set the `sigv4_debug` option to `true` when creating the client to print out the Sigv4 Signing Debug information.
|
64
71
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
}, signer, sigv4_debug: true)
|
72
|
+
The `opensearch-aws-sigv4` gem outputs the contents of the signature at the `debug` level via the logger passed to the `OpenSearch::Client`.
|
73
|
+
|
74
|
+
To inspect the actual signature content being generated for each request (e.g. for debugging purposes or troubleshooting), pass a logger configured with `DEBUG` level like this:
|
69
75
|
|
70
|
-
|
76
|
+
```ruby
|
77
|
+
request_signer = OpenSearch::Aws::Sigv4RequestSigner.new(
|
78
|
+
service: 'es', # signing service name, use "aoss" for OpenSearch Serverless
|
79
|
+
region: 'us-west-2', # signing service region
|
80
|
+
access_key_id: 'key_id',
|
81
|
+
secret_access_key: 'secret'
|
82
|
+
)
|
83
|
+
|
84
|
+
logger = Logger.new($stdout)
|
85
|
+
logger.level = Logger::DEBUG
|
86
|
+
|
87
|
+
client = OpenSearch::Client.new(
|
88
|
+
host: 'https://your.amz-managed-opensearch.domain', # serverless endpoint for OpenSearch Serverless
|
89
|
+
logger: logger,
|
90
|
+
request_signer: request_signer
|
91
|
+
)
|
92
|
+
|
93
|
+
puts client.info
|
71
94
|
```
|
72
95
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
(2023-04-25 11:02:59 -0600) Sigv4 - CANONICAL REQUEST:
|
81
|
-
GET
|
82
|
-
/
|
83
|
-
|
84
|
-
host:your.amz-managed-opensearch.domain
|
85
|
-
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
86
|
-
x-amz-date:20230425T170259Z
|
87
|
-
|
88
|
-
host;x-amz-content-sha256;x-amz-date
|
89
|
-
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
90
|
-
|
91
|
-
(2023-04-25 11:02:59 -0600) Sigv4 - SIGNATURE HEADERS:
|
92
|
-
{"host"=>"your.amz-managed-opensearch.domain",
|
93
|
-
"x-amz-date"=>"20230425T170259Z",
|
94
|
-
"x-amz-content-sha256"=>"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
95
|
-
"authorization"=>"AWS4-HMAC-SHA256 Credential=ABCDEFGH/20230425/us-east-1/aoss/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=858f171c834231ae3c885c670217f94c68f010e85c50b0ad095444966fb5df0c"}
|
96
|
+
This will output log messages like this:
|
97
|
+
|
98
|
+
```
|
99
|
+
I, [2025-03-31T20:32:24.398301 #77479] INFO -- : Signing request with AWS SigV4: GET http://your.amz-managed-opensearch.domain/
|
100
|
+
D, [2025-03-31T20:32:24.399198 #77479] DEBUG -- : Signed headers with AWS SigV4: {"host" => "your.amz-managed-opensearch.domain", "x-amz-date" => "20250331T113224Z", "x-amz-content-sha256" => "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "authorization" => "AWS4-HMAC-SHA256 Credential=key_id/20250331/us-west-2/es/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=57c69c2da9597c40625e2dbef3806bdfa0e9e50c99918d2ae10a264110352e51"}
|
101
|
+
...
|
96
102
|
```
|
103
|
+
|
104
|
+
By default, the signer will use the logger from the `opensearch-ruby` gem. To ensure safe logging in a production environment, make sure its level is set to `INFO` to avoid logging debug-level signed headers.
|
data/lib/opensearch-aws-sigv4.rb
CHANGED
@@ -14,100 +14,63 @@ require 'opensearch-ruby'
|
|
14
14
|
require 'aws-sigv4/signer'
|
15
15
|
require 'faraday'
|
16
16
|
require 'json'
|
17
|
+
require 'forwardable'
|
17
18
|
|
18
19
|
module OpenSearch
|
19
20
|
module Aws
|
20
|
-
# AWS Sigv4
|
21
|
-
# This client accepts a Sigv4 Signer during initialization, and signs every request
|
22
|
-
# with a Sigv4 Signature with the provided signer.
|
21
|
+
# AWS Sigv4 request signer for <tt>OpenSearch::Transport::Client</tt>.
|
23
22
|
#
|
24
|
-
# @
|
25
|
-
# signer = Aws::Sigv4::Signer.new(service: 'es',
|
26
|
-
# region: 'us-east-1',
|
27
|
-
# access_key_id: '<access_key_id>',
|
28
|
-
# secret_access_key: '<secret_access_key>',
|
29
|
-
# session_token: '<session_token>')
|
23
|
+
# @link https://github.com/opensearch-project/opensearch-ruby/blob/main/DEVELOPER_GUIDE.md#create-a-request-signer
|
30
24
|
#
|
31
|
-
#
|
32
|
-
#
|
33
|
-
#
|
34
|
-
#
|
25
|
+
# @param [Hash] options Signer options
|
26
|
+
# @option options [String] :service ('es') The AWS service name.
|
27
|
+
# @option options [String] :region The AWS region.
|
28
|
+
# @option options [String] :access_key_id The AWS access key ID.
|
29
|
+
# @option options [String] :secret_access_key The AWS secret access key.
|
30
|
+
# @option options [String] :session_token (optional) The AWS session token.
|
35
31
|
#
|
36
|
-
#
|
32
|
+
# @example
|
33
|
+
# client = OpenSearch::Client.new({
|
34
|
+
# host: 'https://my-os-domain.us-east-1.es.amazonaws.com/',
|
35
|
+
# request_signer: OpenSearch::Aws::Sigv4RequestSigner.new(
|
36
|
+
# service: 'es',
|
37
|
+
# region: 'us-east-1',
|
38
|
+
# access_key_id: '<access_key_id>',
|
39
|
+
# secret_access_key: '<secret_access_key>',
|
40
|
+
# session_token: '<session_token>'
|
41
|
+
# )
|
42
|
+
# })
|
37
43
|
#
|
38
|
-
#
|
39
|
-
class
|
40
|
-
|
44
|
+
# puts client.cat.health
|
45
|
+
class Sigv4RequestSigner
|
46
|
+
extend Forwardable
|
47
|
+
|
48
|
+
attr_reader :signer
|
41
49
|
|
42
|
-
|
43
|
-
# @param [&block] block code block to be passed to OpenSearch::Transport::Client.
|
44
|
-
# @param [Aws::Sigv4::Signer] sigv4_signer an instance of AWS Sigv4 Signer.
|
45
|
-
# @param [Hash] options
|
46
|
-
# @option options [Boolean] :sigv4_debug whether to log debug info for Sigv4 Signing
|
47
|
-
def initialize(transport_args, sigv4_signer, options: {}, &block)
|
48
|
-
unless sigv4_signer.is_a?(::Aws::Sigv4::Signer)
|
49
|
-
raise ArgumentError, "Please pass a Aws::Sigv4::Signer. A #{sigv4_signer.class} was given."
|
50
|
-
end
|
50
|
+
def_delegators :@signer, :service, :region, :credentials_provider, :unsigned_headers, :apply_checksum_header
|
51
51
|
|
52
|
-
|
53
|
-
@
|
54
|
-
|
55
|
-
|
52
|
+
def initialize(options = {})
|
53
|
+
@signer = ::Aws::Sigv4::Signer.new({
|
54
|
+
service: 'es'
|
55
|
+
}.merge(options))
|
56
56
|
end
|
57
57
|
|
58
|
-
#
|
59
|
-
|
58
|
+
def sign_request(method:, path:, params:, body:, headers:, host:, port:, url:, logger:) # rubocop:disable Lint/UnusedMethodArgument
|
59
|
+
logger&.info("Signing request with AWS SigV4: #{method} #{url}")
|
60
|
+
|
60
61
|
signature_body = body.is_a?(Hash) ? body.to_json : body.to_s
|
61
|
-
signature =
|
62
|
+
signature = @signer.sign_request(
|
62
63
|
http_method: method,
|
63
|
-
url:
|
64
|
+
url: url,
|
64
65
|
headers: headers,
|
65
|
-
body: signature_body
|
66
|
+
body: signature_body,
|
67
|
+
logger: logger
|
66
68
|
)
|
67
|
-
headers = (headers || {}).merge(signature.headers)
|
68
|
-
|
69
|
-
log_signature_info(signature)
|
70
|
-
super(method, path, params, signature_body, headers)
|
71
|
-
end
|
72
69
|
|
73
|
-
|
74
|
-
|
75
|
-
def verify_open_search
|
76
|
-
@verified = true
|
77
|
-
end
|
70
|
+
signed_headers = signature.headers
|
71
|
+
logger&.debug("Signed headers with AWS SigV4: #{signed_headers}")
|
78
72
|
|
79
|
-
|
80
|
-
host = @transport.transport.hosts.dig(0, :host)
|
81
|
-
path = "/#{path}" unless path.start_with?('/')
|
82
|
-
params = params.clone
|
83
|
-
params.delete(:ignore)
|
84
|
-
params.delete('ignore')
|
85
|
-
query_string = params.empty? ? '' : Faraday::Utils::ParamsHash[params].to_query.to_s
|
86
|
-
URI::HTTP.build(host: host, path: path, query: query_string)
|
87
|
-
end
|
88
|
-
|
89
|
-
# @param [Aws::Sigv4::Signature] signature
|
90
|
-
def log_signature_info(signature)
|
91
|
-
return unless @sigv4_debug
|
92
|
-
|
93
|
-
log('string to sign', signature.string_to_sign)
|
94
|
-
log('canonical request', signature.canonical_request)
|
95
|
-
log('signature headers', signature.headers)
|
96
|
-
end
|
97
|
-
|
98
|
-
def log(title, message)
|
99
|
-
logger.debug("#{title.upcase}:\n\e[36m#{message}\e[0m")
|
100
|
-
end
|
101
|
-
|
102
|
-
def logger
|
103
|
-
return @logger if @logger
|
104
|
-
|
105
|
-
require 'logger'
|
106
|
-
@logger = Logger.new(
|
107
|
-
$stdout,
|
108
|
-
progname: 'Sigv4',
|
109
|
-
formatter: proc { |_severity, datetime, progname, msg| "\e[34m(#{datetime}) #{progname} - #{msg}\e[0m\n\n" }
|
110
|
-
)
|
73
|
+
(headers || {}).merge(signed_headers)
|
111
74
|
end
|
112
75
|
end
|
113
76
|
end
|
@@ -33,7 +33,6 @@ Gem::Specification.new do |s|
|
|
33
33
|
}
|
34
34
|
|
35
35
|
s.files = Dir['lib/**/*', '*.gemspec']
|
36
|
-
s.test_files = Dir['spec/unit/**/*']
|
37
36
|
s.require_paths = ['lib']
|
38
37
|
s.bindir = 'bin'
|
39
38
|
s.executables = 'opensearch_sigv4_console'
|
@@ -41,14 +40,13 @@ Gem::Specification.new do |s|
|
|
41
40
|
s.extra_rdoc_files = %w[README.md USER_GUIDE.md LICENSE]
|
42
41
|
s.rdoc_options = ['--charset=UTF-8']
|
43
42
|
|
44
|
-
signing_key = File.expand_path('gem-private_key.pem')
|
43
|
+
signing_key = File.expand_path(ENV.fetch('GEM_PRIVATE_KEY', 'gem-private_key.pem'))
|
45
44
|
if $PROGRAM_NAME.end_with?('gem') && ARGV.first == 'build' && File.exist?(signing_key)
|
46
45
|
s.signing_key = signing_key
|
47
|
-
s.cert_chain = ['.github/opensearch-rubygems.pem']
|
46
|
+
s.cert_chain = [ENV.fetch('GEM_PUBLIC_CERT', '.github/opensearch-rubygems.pem')]
|
48
47
|
end
|
49
48
|
|
50
|
-
s.required_ruby_version = '>=
|
49
|
+
s.required_ruby_version = '>= 3.0'
|
51
50
|
|
52
|
-
s.add_dependency 'aws-sigv4', '
|
53
|
-
s.add_dependency 'opensearch-ruby', '>= 1.0.1', '< 4.0'
|
51
|
+
s.add_dependency 'aws-sigv4', '~> 1'
|
54
52
|
end
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opensearch-aws-sigv4
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0.pre.beta.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- OpenSearch Contributors
|
@@ -30,42 +30,22 @@ cert_chain:
|
|
30
30
|
m0rB25J1sO2yjlalRdBoV5p7OKaWG4CGMr+q6vCC2za7yrtZiYOOv+KpWmheTwds
|
31
31
|
P1nbdIL2eAXGfNU3cbtYisS1sSYi7VSkS52pVk8Jgtw=
|
32
32
|
-----END CERTIFICATE-----
|
33
|
-
date: 2025-
|
33
|
+
date: 2025-04-04 00:00:00.000000000 Z
|
34
34
|
dependencies:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: aws-sigv4
|
37
37
|
requirement: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- - "
|
39
|
+
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: '1'
|
42
42
|
type: :runtime
|
43
43
|
prerelease: false
|
44
44
|
version_requirements: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- - "
|
46
|
+
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
48
|
version: '1'
|
49
|
-
- !ruby/object:Gem::Dependency
|
50
|
-
name: opensearch-ruby
|
51
|
-
requirement: !ruby/object:Gem::Requirement
|
52
|
-
requirements:
|
53
|
-
- - ">="
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
version: 1.0.1
|
56
|
-
- - "<"
|
57
|
-
- !ruby/object:Gem::Version
|
58
|
-
version: '4.0'
|
59
|
-
type: :runtime
|
60
|
-
prerelease: false
|
61
|
-
version_requirements: !ruby/object:Gem::Requirement
|
62
|
-
requirements:
|
63
|
-
- - ">="
|
64
|
-
- !ruby/object:Gem::Version
|
65
|
-
version: 1.0.1
|
66
|
-
- - "<"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '4.0'
|
69
49
|
description: |
|
70
50
|
A wrapper for opensearch-ruby gem that provides AWS Sigv4 signing.
|
71
51
|
It behaves like OpenSearch::Client, but signs every request with AWS Sigv4
|
@@ -87,7 +67,6 @@ files:
|
|
87
67
|
- lib/opensearch-aws-sigv4/version.rb
|
88
68
|
- lib/opensearch_aws_sigv4.rb
|
89
69
|
- opensearch-aws-sigv4.gemspec
|
90
|
-
- spec/unit/open_search/aws/sigv4_client_spec.rb
|
91
70
|
homepage: https://github.com/opensearch-project/opensearch-ruby-aws-sigv4
|
92
71
|
licenses:
|
93
72
|
- Apache-2.0
|
@@ -106,16 +85,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
106
85
|
requirements:
|
107
86
|
- - ">="
|
108
87
|
- !ruby/object:Gem::Version
|
109
|
-
version: '
|
88
|
+
version: '3.0'
|
110
89
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
90
|
requirements:
|
112
|
-
- - "
|
91
|
+
- - ">"
|
113
92
|
- !ruby/object:Gem::Version
|
114
|
-
version:
|
93
|
+
version: 1.3.1
|
115
94
|
requirements: []
|
116
95
|
rubygems_version: 3.3.27
|
117
96
|
signing_key:
|
118
97
|
specification_version: 4
|
119
98
|
summary: Ruby AWS Sigv4 Client for OpenSearch
|
120
|
-
test_files:
|
121
|
-
- spec/unit/open_search/aws/sigv4_client_spec.rb
|
99
|
+
test_files: []
|
metadata.gz.sig
CHANGED
Binary file
|
@@ -1,107 +0,0 @@
|
|
1
|
-
# SPDX-License-Identifier: Apache-2.0
|
2
|
-
#
|
3
|
-
# The OpenSearch Contributors require contributions made to
|
4
|
-
# this file be licensed under the Apache-2.0 license or a
|
5
|
-
# compatible open source license.
|
6
|
-
#
|
7
|
-
# Modifications Copyright OpenSearch Contributors. See
|
8
|
-
# GitHub history for details.
|
9
|
-
|
10
|
-
# frozen_string_literal: true
|
11
|
-
|
12
|
-
require_relative '../../../spec_helper'
|
13
|
-
require 'aws-sigv4'
|
14
|
-
require 'timecop'
|
15
|
-
|
16
|
-
describe OpenSearch::Aws::Sigv4Client do
|
17
|
-
subject(:client) do
|
18
|
-
described_class.new(
|
19
|
-
{ host: 'http://localhost:9200',
|
20
|
-
transport_options: { ssl: { verify: false } } },
|
21
|
-
signer
|
22
|
-
)
|
23
|
-
end
|
24
|
-
|
25
|
-
let(:signer) do
|
26
|
-
Aws::Sigv4::Signer.new(service: 'es',
|
27
|
-
region: 'us-west-2',
|
28
|
-
access_key_id: 'key_id',
|
29
|
-
secret_access_key: 'secret')
|
30
|
-
end
|
31
|
-
|
32
|
-
describe '.initialize' do
|
33
|
-
context 'when a Sigv4 Signer is NOT provided' do
|
34
|
-
let(:signer) { nil }
|
35
|
-
|
36
|
-
it 'raises an argument error' do
|
37
|
-
expect { client }.to raise_error ArgumentError, 'Please pass a Aws::Sigv4::Signer. A NilClass was given.'
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
context 'when a Sigv4 Signer is provided' do
|
42
|
-
it 'does NOT raise any error' do
|
43
|
-
expect { client }.not_to raise_error
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
describe '#perform_request' do
|
49
|
-
let(:response) { { body: 'Response Body' } }
|
50
|
-
let(:transport_double) do
|
51
|
-
double = instance_double(OpenSearch::Transport::Client, perform_request: response)
|
52
|
-
allow(double).to receive_message_chain(:transport, :hosts, :dig).and_return('localhost')
|
53
|
-
double
|
54
|
-
end
|
55
|
-
let(:signed_headers) do
|
56
|
-
{ 'authorization' => 'AWS4-HMAC-SHA256 Credential=key_id/20220101/us-west-2/es/aws4_request, '\
|
57
|
-
'SignedHeaders=host;x-amz-content-sha256;x-amz-date, ' \
|
58
|
-
'Signature=9c4c690110483308f62a91c2ca873857750bca2607ba1aabdae0d2303950310a',
|
59
|
-
'host' => 'localhost',
|
60
|
-
'x-amz-content-sha256' => 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855',
|
61
|
-
'x-amz-date' => '20220101T000000Z' }
|
62
|
-
end
|
63
|
-
|
64
|
-
before do
|
65
|
-
Timecop.freeze(Time.utc(2022))
|
66
|
-
client.transport = transport_double
|
67
|
-
end
|
68
|
-
|
69
|
-
after { Timecop.return }
|
70
|
-
|
71
|
-
it 'signs the request before passing it to @transport' do
|
72
|
-
output = client.perform_request('GET', '/', {}, '', {})
|
73
|
-
expect(output).to eq(response)
|
74
|
-
expect(transport_double).to have_received(:perform_request).with('GET', '/', {}, '', signed_headers)
|
75
|
-
end
|
76
|
-
|
77
|
-
it 'excludes the `ignore` param to make a signature' do
|
78
|
-
output = client.perform_request('GET', '/', { ignore: 404 }, '', {})
|
79
|
-
expect(output).to eq(response)
|
80
|
-
expect(transport_double).to have_received(:perform_request).with('GET', '/', { ignore: 404 }, '', signed_headers)
|
81
|
-
end
|
82
|
-
|
83
|
-
it 'skips the opensearch verification' do
|
84
|
-
allow(client).to receive(:open_search_validation_request)
|
85
|
-
client.perform_request('GET', '/_stats', {}, '', {})
|
86
|
-
expect(client).not_to have_received(:open_search_validation_request)
|
87
|
-
end
|
88
|
-
|
89
|
-
it 'passes the same body to sign_request and super' do
|
90
|
-
body = {
|
91
|
-
char_filter: {
|
92
|
-
test: {
|
93
|
-
type: 'mapping',
|
94
|
-
mappings: ["’ => '"]
|
95
|
-
}
|
96
|
-
}
|
97
|
-
}
|
98
|
-
signature_body = body.to_json
|
99
|
-
|
100
|
-
allow(signer).to receive(:sign_request).with(a_hash_including(body: signature_body)).and_call_original
|
101
|
-
|
102
|
-
client.perform_request('GET', '/', {}, body, {})
|
103
|
-
|
104
|
-
expect(transport_double).to have_received(:perform_request).with('GET', '/', {}, signature_body, kind_of(Hash))
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|