multiwoven-integrations 0.3.0 → 0.3.2
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/lib/multiwoven/integrations/protocol/protocol.rb +1 -1
- data/lib/multiwoven/integrations/rollout.rb +1 -1
- data/lib/multiwoven/integrations/source/amazon_s3/client.rb +29 -8
- data/lib/multiwoven/integrations/source/amazon_s3/config/spec.json +63 -11
- data/lib/multiwoven/integrations.rb +1 -0
- data/multiwoven-integrations.gemspec +1 -0
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b4c9d23f9f2c64aa4e25911e6e399b2e316237902d742bb09cdc2fd4cb538666
|
4
|
+
data.tar.gz: 3257d08bcdf074497cd26dca09b3d8367039cda5b1c6922dcc8d943a5e0d293d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29ba8c2cc87689a8bf51ac6ea0e0ab439e83197cd1aaa81b390928cf088651a827de5ce66361f13a3cada6c8252fbe38b4ec5cd5ebd8f73e6d1ec44f7f2e16a0
|
7
|
+
data.tar.gz: c4361564c16167cc5f2c59b24c9ff644c59ea5fd6c09979d17dbcb11adc63f526e82cbc00783c5f23621ce5339e9a8f82f023c516234bea4f98f0bb3dcbbd7a1
|
@@ -11,7 +11,7 @@ module Multiwoven
|
|
11
11
|
DestinationSyncMode = Types::String.enum("insert", "upsert")
|
12
12
|
ConnectorType = Types::String.enum("source", "destination")
|
13
13
|
ConnectorQueryType = Types::String.enum("raw_sql", "soql")
|
14
|
-
ModelQueryType = Types::String.enum("raw_sql", "dbt", "soql")
|
14
|
+
ModelQueryType = Types::String.enum("raw_sql", "dbt", "soql", "table_selector")
|
15
15
|
ConnectionStatusType = Types::String.enum("succeeded", "failed")
|
16
16
|
StreamType = Types::String.enum("static", "dynamic")
|
17
17
|
StreamAction = Types::String.enum("fetch", "create", "update", "delete")
|
@@ -8,8 +8,9 @@ module Multiwoven::Integrations::Source
|
|
8
8
|
|
9
9
|
def check_connection(connection_config)
|
10
10
|
connection_config = connection_config.with_indifferent_access
|
11
|
-
|
12
|
-
client
|
11
|
+
auth_data = get_auth_data(connection_config)
|
12
|
+
client = config_aws(auth_data, connection_config[:region])
|
13
|
+
client.get_bucket_location({ bucket: connection_config[:bucket] })
|
13
14
|
ConnectionStatus.new(status: ConnectionStatusType["succeeded"]).to_multiwoven_message
|
14
15
|
rescue StandardError => e
|
15
16
|
ConnectionStatus.new(status: ConnectionStatusType["failed"], message: e.message).to_multiwoven_message
|
@@ -17,6 +18,10 @@ module Multiwoven::Integrations::Source
|
|
17
18
|
|
18
19
|
def discover(connection_config)
|
19
20
|
connection_config = connection_config.with_indifferent_access
|
21
|
+
auth_data = get_auth_data(connection_config)
|
22
|
+
connection_config[:access_id] = auth_data.credentials.access_key_id
|
23
|
+
connection_config[:secret_access] = auth_data.credentials.secret_access_key
|
24
|
+
connection_config[:session_token] = auth_data.credentials.session_token
|
20
25
|
conn = create_connection(connection_config)
|
21
26
|
# If pulling from multiple files, all files must have the same schema
|
22
27
|
path = build_path(connection_config[:path])
|
@@ -32,6 +37,10 @@ module Multiwoven::Integrations::Source
|
|
32
37
|
|
33
38
|
def read(sync_config)
|
34
39
|
connection_config = sync_config.source.connection_specification.with_indifferent_access
|
40
|
+
auth_data = get_auth_data(connection_config)
|
41
|
+
connection_config[:access_id] = auth_data.credentials.access_key_id
|
42
|
+
connection_config[:secret_access] = auth_data.credentials.secret_access_key
|
43
|
+
connection_config[:session_token] = auth_data.credentials.session_token
|
35
44
|
conn = create_connection(connection_config)
|
36
45
|
query = sync_config.model.query
|
37
46
|
query = batched_query(query, sync_config.limit, sync_config.offset) unless sync_config.limit.nil? && sync_config.offset.nil?
|
@@ -47,6 +56,19 @@ module Multiwoven::Integrations::Source
|
|
47
56
|
|
48
57
|
private
|
49
58
|
|
59
|
+
def get_auth_data(connection_config)
|
60
|
+
if connection_config[:auth_type] == "user"
|
61
|
+
Aws::Credentials.new(connection_config[:access_id], connection_config[:secret_access])
|
62
|
+
elsif connection_config[:auth_type] == "role"
|
63
|
+
sts_client = Aws::STS::Client.new(region: connection_config[:region])
|
64
|
+
session_name = "s3-check-connection"
|
65
|
+
sts_client.assume_role({
|
66
|
+
role_arn: connection_config[:arn],
|
67
|
+
role_session_name: session_name
|
68
|
+
})
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
50
72
|
# DuckDB
|
51
73
|
def create_connection(connection_config)
|
52
74
|
conn = DuckDB::Database.open.connect
|
@@ -56,7 +78,8 @@ module Multiwoven::Integrations::Source
|
|
56
78
|
TYPE S3,
|
57
79
|
KEY_ID '#{connection_config[:access_id]}',
|
58
80
|
SECRET '#{connection_config[:secret_access]}',
|
59
|
-
REGION '#{connection_config[:region]}'
|
81
|
+
REGION '#{connection_config[:region]}',
|
82
|
+
SESSION_TOKEN '#{connection_config[:session_token]}'
|
60
83
|
);
|
61
84
|
"
|
62
85
|
get_results(conn, secret_query)
|
@@ -111,13 +134,11 @@ module Multiwoven::Integrations::Source
|
|
111
134
|
end
|
112
135
|
|
113
136
|
# AWS SDK
|
114
|
-
def config_aws(config)
|
115
|
-
config = config.with_indifferent_access
|
137
|
+
def config_aws(config, region)
|
116
138
|
Aws.config.update({
|
117
|
-
region:
|
118
|
-
credentials:
|
139
|
+
region: region,
|
140
|
+
credentials: config
|
119
141
|
})
|
120
|
-
config.with_indifferent_access
|
121
142
|
Aws::S3::Client.new
|
122
143
|
end
|
123
144
|
|
@@ -6,13 +6,51 @@
|
|
6
6
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
7
7
|
"title": "AmazonS3",
|
8
8
|
"type": "object",
|
9
|
-
"
|
9
|
+
"if": {
|
10
|
+
"properties": {
|
11
|
+
"auth_type": {
|
12
|
+
"enum": ["user"]
|
13
|
+
}
|
14
|
+
}
|
15
|
+
},
|
16
|
+
"then": {
|
17
|
+
"required": [
|
18
|
+
"auth_type",
|
19
|
+
"region",
|
20
|
+
"bucket",
|
21
|
+
"access_id",
|
22
|
+
"secret_access",
|
23
|
+
"file_type"
|
24
|
+
]
|
25
|
+
},
|
26
|
+
"else": {
|
27
|
+
"required": [
|
28
|
+
"auth_type",
|
29
|
+
"region",
|
30
|
+
"bucket",
|
31
|
+
"arn",
|
32
|
+
"file_type"
|
33
|
+
]
|
34
|
+
},
|
10
35
|
"properties": {
|
11
|
-
"
|
12
|
-
"
|
13
|
-
"examples": ["us-east-2"],
|
36
|
+
"auth_type": {
|
37
|
+
"title": "Authentication type",
|
14
38
|
"type": "string",
|
15
|
-
"
|
39
|
+
"default": "user",
|
40
|
+
"description": "Authenticate either by using an IAM User (Access Key ID & Secret Access Key) or an IAM Role (ARN)",
|
41
|
+
"enum": [
|
42
|
+
"user",
|
43
|
+
"role"
|
44
|
+
],
|
45
|
+
"enumNames": [
|
46
|
+
"IAM User",
|
47
|
+
"IAM Role"
|
48
|
+
],
|
49
|
+
"order": 0
|
50
|
+
},
|
51
|
+
"arn": {
|
52
|
+
"type": "string",
|
53
|
+
"title": "IAM Role ARN",
|
16
54
|
"order": 1
|
17
55
|
},
|
18
56
|
"access_id": {
|
@@ -26,26 +64,40 @@
|
|
26
64
|
"multiwoven_secret": true,
|
27
65
|
"order": 3
|
28
66
|
},
|
67
|
+
"region": {
|
68
|
+
"description": "AWS region",
|
69
|
+
"examples": [
|
70
|
+
"us-east-2"
|
71
|
+
],
|
72
|
+
"type": "string",
|
73
|
+
"title": "Region",
|
74
|
+
"order": 4
|
75
|
+
},
|
29
76
|
"bucket": {
|
30
77
|
"description": "Bucket Name",
|
31
78
|
"type": "string",
|
32
79
|
"title": "Bucket",
|
33
|
-
"order":
|
80
|
+
"order": 5
|
34
81
|
},
|
35
82
|
"path": {
|
36
83
|
"description": "Path to csv or parquet files",
|
37
|
-
"examples": [
|
84
|
+
"examples": [
|
85
|
+
"/path/to/files"
|
86
|
+
],
|
38
87
|
"type": "string",
|
39
88
|
"title": "Path",
|
40
|
-
"order":
|
89
|
+
"order": 6
|
41
90
|
},
|
42
91
|
"file_type": {
|
43
92
|
"description": "The type of file to read",
|
44
93
|
"type": "string",
|
45
94
|
"title": "File Type",
|
46
|
-
"enum": [
|
47
|
-
|
95
|
+
"enum": [
|
96
|
+
"csv",
|
97
|
+
"parquet"
|
98
|
+
],
|
99
|
+
"order": 7
|
48
100
|
}
|
49
101
|
}
|
50
102
|
}
|
51
|
-
}
|
103
|
+
}
|
@@ -37,6 +37,7 @@ Gem::Specification.new do |spec|
|
|
37
37
|
spec.add_runtime_dependency "async-websocket"
|
38
38
|
spec.add_runtime_dependency "aws-sdk-athena"
|
39
39
|
spec.add_runtime_dependency "aws-sdk-s3"
|
40
|
+
spec.add_runtime_dependency "aws-sdk-sts"
|
40
41
|
spec.add_runtime_dependency "csv"
|
41
42
|
spec.add_runtime_dependency "dry-schema"
|
42
43
|
spec.add_runtime_dependency "dry-struct"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: multiwoven-integrations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Subin T P
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-06-
|
11
|
+
date: 2024-06-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: aws-sdk-sts
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: csv
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|