Skip to content

Commit 4fa2c9b

Browse files
author
Lavkesh Lahngir
committed
Merge branch 'master' of github.com:lavkesh/feast
2 parents 63f0681 + 0feb768 commit 4fa2c9b

File tree

8 files changed

+329
-98
lines changed

8 files changed

+329
-98
lines changed

sdk/python/feast/client.py

Lines changed: 71 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@
2121
from collections import OrderedDict
2222
from math import ceil
2323
from typing import Dict, List, Tuple, Union, Optional
24-
from typing import List
2524
from urllib.parse import urlparse
2625

2726
import fastavro
2827
import grpc
2928
import pandas as pd
3029
import pyarrow as pa
3130
import pyarrow.parquet as pq
31+
3232
from feast.core.CoreService_pb2 import (
3333
GetFeastCoreVersionRequest,
3434
ListFeatureSetsResponse,
@@ -48,11 +48,11 @@
4848
from feast.core.FeatureSet_pb2 import FeatureSetStatus
4949
from feast.feature_set import FeatureSet, Entity
5050
from feast.job import Job
51-
from feast.serving.ServingService_pb2 import FeatureReference
5251
from feast.loaders.abstract_producer import get_producer
5352
from feast.loaders.file import export_source_to_staging_location
5453
from feast.loaders.ingest import KAFKA_CHUNK_PRODUCTION_TIMEOUT
5554
from feast.loaders.ingest import get_feature_row_chunks
55+
from feast.serving.ServingService_pb2 import FeatureReference
5656
from feast.serving.ServingService_pb2 import GetFeastServingInfoResponse
5757
from feast.serving.ServingService_pb2 import (
5858
GetOnlineFeaturesRequest,
@@ -69,9 +69,11 @@
6969

7070
GRPC_CONNECTION_TIMEOUT_DEFAULT = 3 # type: int
7171
GRPC_CONNECTION_TIMEOUT_APPLY = 600 # type: int
72-
FEAST_SERVING_URL_ENV_KEY = "FEAST_SERVING_URL" # type: str
73-
FEAST_CORE_URL_ENV_KEY = "FEAST_CORE_URL" # type: str
74-
FEAST_PROJECT_ENV_KEY = "FEAST_PROJECT" # type: str
72+
FEAST_CORE_URL_ENV_KEY = "FEAST_CORE_URL"
73+
FEAST_SERVING_URL_ENV_KEY = "FEAST_SERVING_URL"
74+
FEAST_PROJECT_ENV_KEY = "FEAST_PROJECT"
75+
FEAST_CORE_SECURE_ENV_KEY = "FEAST_CORE_SECURE"
76+
FEAST_SERVING_SECURE_ENV_KEY = "FEAST_SERVING_SECURE"
7577
BATCH_FEATURE_REQUEST_WAIT_TIME_SECONDS = 300
7678
CPU_COUNT = os.cpu_count() # type: int
7779

@@ -82,7 +84,8 @@ class Client:
8284
"""
8385

8486
def __init__(
85-
self, core_url: str = None, serving_url: str = None, project: str = None
87+
self, core_url: str = None, serving_url: str = None, project: str = None,
88+
core_secure: bool = None, serving_secure: bool = None
8689
):
8790
"""
8891
The Feast Client should be initialized with at least one service url
@@ -91,10 +94,14 @@ def __init__(
9194
core_url: Feast Core URL. Used to manage features
9295
serving_url: Feast Serving URL. Used to retrieve features
9396
project: Sets the active project. This field is optional.
94-
"""
95-
self._core_url = core_url
96-
self._serving_url = serving_url
97-
self._project = project
97+
core_secure: Use client-side SSL/TLS for Core gRPC API
98+
serving_secure: Use client-side SSL/TLS for Serving gRPC API
99+
"""
100+
self._core_url: str = core_url
101+
self._serving_url: str = serving_url
102+
self._project: str = project
103+
self._core_secure: bool = core_secure
104+
self._serving_secure: bool = serving_secure
98105
self.__core_channel: grpc.Channel = None
99106
self.__serving_channel: grpc.Channel = None
100107
self._core_service_stub: CoreServiceStub = None
@@ -149,6 +156,52 @@ def serving_url(self, value: str):
149156
"""
150157
self._serving_url = value
151158

159+
@property
160+
def core_secure(self) -> bool:
161+
"""
162+
Retrieve Feast Core client-side SSL/TLS setting
163+
164+
Returns:
165+
Whether client-side SSL/TLS is enabled
166+
"""
167+
168+
if self._core_secure is not None:
169+
return self._core_secure
170+
return os.getenv(FEAST_CORE_SECURE_ENV_KEY, "").lower() is "true"
171+
172+
@core_secure.setter
173+
def core_secure(self, value: bool):
174+
"""
175+
Set the Feast Core client-side SSL/TLS setting
176+
177+
Args:
178+
value: True to enable client-side SSL/TLS
179+
"""
180+
self._core_secure = value
181+
182+
@property
183+
def serving_secure(self) -> bool:
184+
"""
185+
Retrieve Feast Serving client-side SSL/TLS setting
186+
187+
Returns:
188+
Whether client-side SSL/TLS is enabled
189+
"""
190+
191+
if self._serving_secure is not None:
192+
return self._serving_secure
193+
return os.getenv(FEAST_SERVING_SECURE_ENV_KEY, "").lower() is "true"
194+
195+
@serving_secure.setter
196+
def serving_secure(self, value: bool):
197+
"""
198+
Set the Feast Serving client-side SSL/TLS setting
199+
200+
Args:
201+
value: True to enable client-side SSL/TLS
202+
"""
203+
self._serving_secure = value
204+
152205
def version(self):
153206
"""
154207
Returns version information from Feast Core and Feast Serving
@@ -185,7 +238,10 @@ def _connect_core(self, skip_if_connected: bool = True):
185238
raise ValueError("Please set Feast Core URL.")
186239

187240
if self.__core_channel is None:
188-
self.__core_channel = grpc.insecure_channel(self.core_url)
241+
if self.core_secure or self.core_url.endswith(":443"):
242+
self.__core_channel = grpc.secure_channel(self.core_url, grpc.ssl_channel_credentials())
243+
else:
244+
self.__core_channel = grpc.insecure_channel(self.core_url)
189245

190246
try:
191247
grpc.channel_ready_future(self.__core_channel).result(
@@ -214,7 +270,10 @@ def _connect_serving(self, skip_if_connected=True):
214270
raise ValueError("Please set Feast Serving URL.")
215271

216272
if self.__serving_channel is None:
217-
self.__serving_channel = grpc.insecure_channel(self.serving_url)
273+
if self.serving_secure or self.serving_url.endswith(":443"):
274+
self.__serving_channel = grpc.secure_channel(self.serving_url, grpc.ssl_channel_credentials())
275+
else:
276+
self.__serving_channel = grpc.insecure_channel(self.serving_url)
218277

219278
try:
220279
grpc.channel_ready_future(self.__serving_channel).result(

sdk/python/requirements-ci.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ mock==2.0.0
1212
pandas==0.*
1313
protobuf==3.*
1414
pytest
15+
pytest-lazy-fixture==0.6.3
1516
pytest-mock
1617
pytest-timeout
1718
PyYAML==5.1.*
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIC5zCCAc+gAwIBAgIJAKzukpnyuwsVMA0GCSqGSIb3DQEBCwUAMBQxEjAQBgNV
3+
BAMMCWxvY2FsaG9zdDAgFw0yMDAyMTcxMTE4NDNaGA8zMDE5MDYyMDExMTg0M1ow
4+
FDESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
5+
CgKCAQEAqoanhiy4EUZjPA/m8IWk50OyTjKAnqZvEW5glqmTHP6lQbfyWQnzj3Ny
6+
c++4Xn901FO2v07h+7lE3BScjgCX6klsLOHRnWcLX8lQygR6zzO+Oey1yXuCebBA
7+
yhrsqgTDC/8zoCxe0W3t0vqvE4AJs3tJHq5Y1ba/X9OiKKsDZuMSSsbdd4qVEL6y
8+
BD8PRNLT/iiD84Kq58GZtOI3fJls8E/bYbvksugcPI3kmlU4Plg3VrVplMl3DcMz
9+
7BbvQP6jmVqdPtUT7+lL0C5CsNqbdDOIwg09+Gwus+A/g8PerBBd+ZCmdvSa9LYJ
10+
OmlJszgZPIL9AagXLfuGQvNN2Y6WowIDAQABozowODAUBgNVHREEDTALgglsb2Nh
11+
bGhvc3QwCwYDVR0PBAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA0GCSqGSIb3
12+
DQEBCwUAA4IBAQAuF1/VeQL73Y1FKrBX4bAb/Rdh2+Dadpi+w1pgEOi3P4udmQ+y
13+
Xn9GwwLRQmHRLjyCT5KT8lNHdldPdlBamqPGGku449aCAjA/YHVHhcHaXl0MtPGq
14+
BfKhHYSsvI2sIymlzZIvvIaf04yuJ1g+L0j8Px4Ecor9YwcKDZmpnIXLgdUtUrIQ
15+
5Omrb4jImX6q8jp6Bjplb4H3o4TqKoa74NLOWUiH5/Rix3Lo8MRoEVbX2GhKk+8n
16+
0eD3AuyrI1i+ce7zY8qGJKKFHGLDWPA/+006ZIS4j/Hr2FWo07CPFQ4/3gdJ8Erw
17+
SzgO9vvIhQrBJn2CIH4+P5Cb1ktdobNWW9XK
18+
-----END CERTIFICATE-----
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCqhqeGLLgRRmM8
3+
D+bwhaTnQ7JOMoCepm8RbmCWqZMc/qVBt/JZCfOPc3Jz77hef3TUU7a/TuH7uUTc
4+
FJyOAJfqSWws4dGdZwtfyVDKBHrPM7457LXJe4J5sEDKGuyqBMML/zOgLF7Rbe3S
5+
+q8TgAmze0kerljVtr9f06IoqwNm4xJKxt13ipUQvrIEPw9E0tP+KIPzgqrnwZm0
6+
4jd8mWzwT9thu+Sy6Bw8jeSaVTg+WDdWtWmUyXcNwzPsFu9A/qOZWp0+1RPv6UvQ
7+
LkKw2pt0M4jCDT34bC6z4D+Dw96sEF35kKZ29Jr0tgk6aUmzOBk8gv0BqBct+4ZC
8+
803ZjpajAgMBAAECggEADE4FHphxe8WheX8IQgjSumFXJ29bepc14oMdcyGvXOM/
9+
F3vnf+dI7Ov+sUD2A9OcoYmc4TcW9WwL/Pl7xn9iduRvatmsn3gFCRdkvf8OwY7R
10+
Riq/f1drNc6zDiJdO3N2g5IZrpAlE2WkSJoQMg8GJC5cO1uHS3yRWJ/Tzq1wZGcW
11+
Dot9hAFgN0qNdP0xFkOsPM5ptC3DjLqsZWboJhIM19hgsIYaWQWHvcYlCcWTVhkj
12+
FYzvLj5GrzAgyE89RpdXus670q5E2R2Rlnja21TfcxK0UOdIrKghZ0jxZMsXEwdB
13+
8V7kIzL5kh//RhT/dIt0mHNMSdLFFx3yMTb2wTzpWQKBgQDRiCRslDSjiNSFySkn
14+
6IivAwJtV2gLSxV05D9u9lrrlskHogrZUJkpVF1VzSnwv/ASaCZX4AGTtNPaz+vy
15+
yDviwfjADsuum8jkzoxKCHnR1HVMyX+vm/g+pE20PMskTUuDE4zROtrqo9Ky0afv
16+
94mJrf93Q815rsbEM5osugaeBQKBgQDQWAPTKy1wcG7edwfu3EaLYHPZ8pW9MldP
17+
FvCLTMwSDkSzU+wA4BGE/5Tuu0WHSAfUc5C1LnMQXKBQXun+YCaBR6GZjUAmntz3
18+
poBIOYaxe651zqzCmo4ip1h5wIfPvynsyGmhsbpDSNhvXFgH2mF3XSY1nduKSRHu
19+
389cHk3ahwKBgA4gAWSYcRv9I2aJcw7PrDcwGr/IPqlUPHQO1v/h96seFRtAnz6b
20+
IlgY6dnY5NTn+4UiJEOUREbyz71Weu949CCLNvurg6uXsOlLy0VKYPv2OJoek08B
21+
UrDWXq6h0of19fs2HC4Wq59Zv+ByJcIVi94OLsSZe4aSc6/SUrhlKgEJAoGBAIvR
22+
5Y88NNx2uBEYdPx6W+WBr34e7Rrxw+JSFNCHk5SyeqyWr5XOyjMliv/EMl8dmhOc
23+
Ewtkxte+MeB+Mi8CvBSay/rO7rR8fPK+jOzrnldSF7z8HLjlHGppQFlFOl/TfQFp
24+
ZmqbadNp+caShImQp0SCAPiOnh1p+F0FWpYJyFnVAoGAKhSRP0iUmd+tId94px2m
25+
G248BhcM9/0r+Y3yRX1eBx5eBzlzPUPcW1MSbhiZ1DIyLZ/MyObl98A1oNBGun11
26+
H/7Mq0E8BcJoXmt/6Z+2NhREBV9tDNuINyS/coYBV7H50pnSqyPpREPxNmu3Ukbm
27+
u7ggLRfH+DexDysbpbCZ9l4=
28+
-----END PRIVATE KEY-----
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIC5zCCAc+gAwIBAgIJAKzukpnyuwsVMA0GCSqGSIb3DQEBCwUAMBQxEjAQBgNV
3+
BAMMCWxvY2FsaG9zdDAgFw0yMDAyMTcxMTE4NDNaGA8zMDE5MDYyMDExMTg0M1ow
4+
FDESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
5+
CgKCAQEAqoanhiy4EUZjPA/m8IWk50OyTjKAnqZvEW5glqmTHP6lQbfyWQnzj3Ny
6+
c++4Xn901FO2v07h+7lE3BScjgCX6klsLOHRnWcLX8lQygR6zzO+Oey1yXuCebBA
7+
yhrsqgTDC/8zoCxe0W3t0vqvE4AJs3tJHq5Y1ba/X9OiKKsDZuMSSsbdd4qVEL6y
8+
BD8PRNLT/iiD84Kq58GZtOI3fJls8E/bYbvksugcPI3kmlU4Plg3VrVplMl3DcMz
9+
7BbvQP6jmVqdPtUT7+lL0C5CsNqbdDOIwg09+Gwus+A/g8PerBBd+ZCmdvSa9LYJ
10+
OmlJszgZPIL9AagXLfuGQvNN2Y6WowIDAQABozowODAUBgNVHREEDTALgglsb2Nh
11+
bGhvc3QwCwYDVR0PBAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA0GCSqGSIb3
12+
DQEBCwUAA4IBAQAuF1/VeQL73Y1FKrBX4bAb/Rdh2+Dadpi+w1pgEOi3P4udmQ+y
13+
Xn9GwwLRQmHRLjyCT5KT8lNHdldPdlBamqPGGku449aCAjA/YHVHhcHaXl0MtPGq
14+
BfKhHYSsvI2sIymlzZIvvIaf04yuJ1g+L0j8Px4Ecor9YwcKDZmpnIXLgdUtUrIQ
15+
5Omrb4jImX6q8jp6Bjplb4H3o4TqKoa74NLOWUiH5/Rix3Lo8MRoEVbX2GhKk+8n
16+
0eD3AuyrI1i+ce7zY8qGJKKFHGLDWPA/+006ZIS4j/Hr2FWo07CPFQ4/3gdJ8Erw
17+
SzgO9vvIhQrBJn2CIH4+P5Cb1ktdobNWW9XK
18+
-----END CERTIFICATE-----

0 commit comments

Comments
 (0)