Skip to content

Commit 4c54097

Browse files
authored
Merge pull request #2 from Teradata/http_proxy-and-sslmode
http_proxy and sslmode support
2 parents 9d53be3 + 79438df commit 4c54097

File tree

3 files changed

+263
-1
lines changed

3 files changed

+263
-1
lines changed

libraries/dagster-teradata/dagster_teradata/resources.py

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,28 @@ class TeradataResource(ConfigurableResource, IAttachDifferentObjectToOpContext):
3030
default=None,
3131
description=("Name of the default database to use."),
3232
)
33+
port: Optional[str] = None
34+
tmode: Optional[str] = "ANSI"
3335
logmech: Optional[str] = None
3436
browser: Optional[str] = None
3537
browser_tab_timeout: Optional[int] = None
3638
browser_timeout: Optional[int] = None
39+
http_proxy: Optional[str] = None
40+
http_proxy_user: Optional[str] = None
41+
http_proxy_password: Optional[str] = None
42+
https_proxy: Optional[str] = None
43+
https_proxy_user: Optional[str] = None
44+
https_proxy_password: Optional[str] = None
45+
proxy_bypass_hosts: Optional[str] = None
46+
sslmode: Optional[str] = None
47+
sslca: Optional[str] = None
48+
sslcapath: Optional[str] = None
49+
sslcrc: Optional[str] = None
50+
sslcipher: Optional[str] = None
51+
sslprotocol: Optional[str] = None
52+
slcrl: Optional[bool] = None
53+
sslocsp: Optional[bool] = None
54+
oidc_sslmode: Optional[str] = None
3755

3856
@property
3957
@cached_method
@@ -45,10 +63,28 @@ def _connection_args(self) -> Mapping[str, Any]:
4563
"user",
4664
"password",
4765
"database",
66+
"port",
67+
"tmode",
4868
"logmech",
4969
"browser",
5070
"browser_tab_timeout",
5171
"browser_timeout",
72+
"http_proxy",
73+
"http_proxy_user",
74+
"http_proxy_password",
75+
"https_proxy",
76+
"https_proxy_user",
77+
"https_proxy_password",
78+
"proxy_bypass_hosts",
79+
"sslmode",
80+
"sslca",
81+
"sslcapath",
82+
"sslcrc",
83+
"sslcipher",
84+
"sslprotocol",
85+
"slcrl",
86+
"sslocsp",
87+
"oidc_sslmode",
5288
)
5389
if self._resolved_config_dict.get(k) is not None
5490
}
@@ -80,11 +116,46 @@ def get_connection(self):
80116
if not self.password:
81117
raise ValueError("Password is required but not provided.")
82118
connection_params.update({"user": self.user, "password": self.password})
83-
84119
if self.database is not None:
85120
connection_params["database"] = self.database
121+
if self.port is not None:
122+
connection_params["port"] = self.port
123+
if self.tmode is not None:
124+
connection_params["tmode"] = self.tmode
86125
if self.logmech is not None:
87126
connection_params["logmech"] = self.logmech
127+
if self.http_proxy is not None:
128+
connection_params["http_proxy"] = self.http_proxy
129+
if self.http_proxy_user is not None:
130+
connection_params["http_proxy_user"] = self.http_proxy_user
131+
if self.http_proxy_password is not None:
132+
connection_params["http_proxy_password"] = self.http_proxy_password
133+
if self.https_proxy is not None:
134+
connection_params["https_proxy"] = self.https_proxy
135+
if self.https_proxy_user is not None:
136+
connection_params["https_proxy_user"] = self.https_proxy_user
137+
if self.https_proxy_password is not None:
138+
connection_params["https_proxy_password"] = self.https_proxy_password
139+
if self.proxy_bypass_hosts is not None:
140+
connection_params["proxy_bypass_hosts"] = self.proxy_bypass_hosts
141+
if self.sslmode is not None:
142+
connection_params["sslmode"] = self.sslmode
143+
if self.sslca is not None:
144+
connection_params["sslca"] = self.sslca
145+
if self.sslcapath is not None:
146+
connection_params["sslcapath"] = self.sslcapath
147+
if self.sslcrc is not None:
148+
connection_params["sslcrc"] = self.sslcrc
149+
if self.sslcipher is not None:
150+
connection_params["sslcipher"] = self.sslcipher
151+
if self.sslprotocol is not None:
152+
connection_params["sslprotocol"] = self.sslprotocol
153+
if self.slcrl is not None:
154+
connection_params["slcrl"] = str(self.slcrl)
155+
if self.sslocsp is not None:
156+
connection_params["sslocsp"] = str(self.sslocsp)
157+
if self.oidc_sslmode is not None:
158+
connection_params["oidc_sslmode"] = self.oidc_sslmode
88159

89160
teradata_conn = teradatasql.connect(**connection_params)
90161

Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
from unittest import mock
2+
3+
from dagster_teradata import TeradataResource
4+
5+
6+
@mock.patch("teradatasql.connect")
7+
def test_get_conn(mock_connect):
8+
resource = TeradataResource(
9+
host="host", user="login", password="password", database="schema", port="1025"
10+
)
11+
12+
with resource.get_connection():
13+
pass
14+
15+
assert mock_connect.call_count == 1
16+
args, kwargs = mock_connect.call_args
17+
assert args == ()
18+
assert kwargs["host"] == "host"
19+
assert kwargs["database"] == "schema"
20+
assert kwargs["port"] == "1025"
21+
assert kwargs["user"] == "login"
22+
assert kwargs["password"] == "password"
23+
24+
25+
@mock.patch("teradatasql.connect")
26+
def test_get_tmode_conn(mock_connect):
27+
resource = TeradataResource(
28+
host="host",
29+
user="login",
30+
password="password",
31+
database="schema",
32+
port="1025",
33+
tmode="tera",
34+
)
35+
36+
with resource.get_connection():
37+
pass
38+
39+
assert mock_connect.call_count == 1
40+
args, kwargs = mock_connect.call_args
41+
assert kwargs["tmode"] == "tera"
42+
43+
44+
@mock.patch("teradatasql.connect")
45+
def test_get_sslmode_conn(mock_connect):
46+
resource = TeradataResource(
47+
host="host",
48+
user="login",
49+
password="password",
50+
database="schema",
51+
port="1025",
52+
sslmode="require",
53+
)
54+
55+
with resource.get_connection():
56+
pass
57+
58+
assert mock_connect.call_count == 1
59+
args, kwargs = mock_connect.call_args
60+
assert kwargs["sslmode"] == "require"
61+
62+
63+
@mock.patch("teradatasql.connect")
64+
def test_get_sslverifyca_conn(mock_connect):
65+
resource = TeradataResource(
66+
host="host",
67+
user="login",
68+
password="password",
69+
database="schema",
70+
port="1025",
71+
sslmode="verify-ca",
72+
sslca="/tmp/cert",
73+
)
74+
75+
with resource.get_connection():
76+
pass
77+
78+
assert mock_connect.call_count == 1
79+
args, kwargs = mock_connect.call_args
80+
assert kwargs["sslmode"] == "verify-ca"
81+
assert kwargs["sslca"] == "/tmp/cert"
82+
83+
84+
@mock.patch("teradatasql.connect")
85+
def test_get_sslverifyfull_conn(mock_connect):
86+
resource = TeradataResource(
87+
host="host",
88+
user="login",
89+
password="password",
90+
database="schema",
91+
port="1025",
92+
sslmode="verify-full",
93+
sslca="/tmp/cert",
94+
)
95+
96+
with resource.get_connection():
97+
pass
98+
99+
assert mock_connect.call_count == 1
100+
args, kwargs = mock_connect.call_args
101+
assert kwargs["sslmode"] == "verify-full"
102+
assert kwargs["sslca"] == "/tmp/cert"
103+
104+
105+
@mock.patch("teradatasql.connect")
106+
def test_get_sslcrc_conn(mock_connect):
107+
resource = TeradataResource(
108+
host="host",
109+
user="login",
110+
password="password",
111+
database="schema",
112+
port="1025",
113+
sslcrc="sslcrc",
114+
)
115+
116+
with resource.get_connection():
117+
pass
118+
119+
assert mock_connect.call_count == 1
120+
args, kwargs = mock_connect.call_args
121+
assert kwargs["sslcrc"] == "sslcrc"
122+
123+
124+
@mock.patch("teradatasql.connect")
125+
def test_get_sslprotocol_conn(mock_connect):
126+
resource = TeradataResource(
127+
host="host",
128+
user="login",
129+
password="password",
130+
database="schema",
131+
port="1025",
132+
sslprotocol="protocol",
133+
)
134+
135+
with resource.get_connection():
136+
pass
137+
138+
assert mock_connect.call_count == 1
139+
args, kwargs = mock_connect.call_args
140+
assert kwargs["sslprotocol"] == "protocol"
141+
142+
143+
@mock.patch("teradatasql.connect")
144+
def test_get_sslcipher_conn(mock_connect):
145+
resource = TeradataResource(
146+
host="host",
147+
user="login",
148+
password="password",
149+
database="schema",
150+
port="1025",
151+
sslcipher="cipher",
152+
)
153+
154+
with resource.get_connection():
155+
pass
156+
157+
assert mock_connect.call_count == 1
158+
args, kwargs = mock_connect.call_args
159+
assert kwargs["sslcipher"] == "cipher"
160+
161+
162+
@mock.patch("teradatasql.connect")
163+
def test_get_proxy_conn(mock_connect):
164+
resource = TeradataResource(
165+
host="host",
166+
user="login",
167+
password="password",
168+
database="schema",
169+
port="1025",
170+
http_proxy="http://proxy",
171+
http_proxy_user="proxyuser",
172+
http_proxy_password="proxypass",
173+
https_proxy="https://secureproxy",
174+
https_proxy_user="secureuser",
175+
https_proxy_password="securepass",
176+
proxy_bypass_hosts="bypass.host.com",
177+
)
178+
179+
with resource.get_connection():
180+
pass
181+
182+
assert mock_connect.call_count == 1
183+
args, kwargs = mock_connect.call_args
184+
assert kwargs["http_proxy"] == "http://proxy"
185+
assert kwargs["http_proxy_user"] == "proxyuser"
186+
assert kwargs["http_proxy_password"] == "proxypass"
187+
assert kwargs["https_proxy"] == "https://secureproxy"
188+
assert kwargs["https_proxy_user"] == "secureuser"
189+
assert kwargs["https_proxy_password"] == "securepass"
190+
assert kwargs["proxy_bypass_hosts"] == "bypass.host.com"

libraries/dagster-teradata/dagster_teradata_tests/test_teradata_resource.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,5 @@ def teradata_job():
3636
user="bar",
3737
password="baz",
3838
database="TESTDB",
39+
tmode='ANSI'
3940
)

0 commit comments

Comments
 (0)