Skip to content

Commit a5c6dce

Browse files
authored
Add support for version method in Feast SDK and Core (#759)
* Add support for version method * Fix typo in e2e tests for version method
1 parent d22fb88 commit a5c6dce

3 files changed

Lines changed: 43 additions & 10 deletions

File tree

core/src/main/java/feast/core/grpc/CoreServiceImpl.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import com.google.api.gax.rpc.InvalidArgumentException;
2020
import com.google.protobuf.InvalidProtocolBufferException;
21+
import feast.core.config.FeastProperties;
2122
import feast.core.exception.RetrievalException;
2223
import feast.core.grpc.interceptors.MonitoringInterceptor;
2324
import feast.core.model.Project;
@@ -64,6 +65,7 @@
6465
@GRpcService(interceptors = {MonitoringInterceptor.class})
6566
public class CoreServiceImpl extends CoreServiceImplBase {
6667

68+
private final FeastProperties feastProperties;
6769
private SpecService specService;
6870
private AccessManagementService accessManagementService;
6971
private JobService jobService;
@@ -72,17 +74,28 @@ public class CoreServiceImpl extends CoreServiceImplBase {
7274
public CoreServiceImpl(
7375
SpecService specService,
7476
AccessManagementService accessManagementService,
75-
JobService jobService) {
77+
JobService jobService,
78+
FeastProperties feastProperties) {
7679
this.specService = specService;
7780
this.accessManagementService = accessManagementService;
7881
this.jobService = jobService;
82+
this.feastProperties = feastProperties;
7983
}
8084

8185
@Override
8286
public void getFeastCoreVersion(
8387
GetFeastCoreVersionRequest request,
8488
StreamObserver<GetFeastCoreVersionResponse> responseObserver) {
85-
super.getFeastCoreVersion(request, responseObserver);
89+
try {
90+
GetFeastCoreVersionResponse response =
91+
GetFeastCoreVersionResponse.newBuilder().setVersion(feastProperties.getVersion()).build();
92+
responseObserver.onNext(response);
93+
responseObserver.onCompleted();
94+
} catch (RetrievalException | StatusRuntimeException e) {
95+
log.error("Could not determine Feast Core version: ", e);
96+
responseObserver.onError(
97+
Status.INTERNAL.withDescription(e.getMessage()).withCause(e).asRuntimeException());
98+
}
8699
}
87100

88101
@Override

sdk/python/feast/client.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,13 @@ def version(self):
195195
"""
196196
Returns version information from Feast Core and Feast Serving
197197
"""
198-
result = {}
198+
import pkg_resources
199+
200+
result = {
201+
"sdk": {"version": pkg_resources.get_distribution("feast").version},
202+
"serving": "not configured",
203+
"core": "not configured",
204+
}
199205

200206
if self.serving_url:
201207
self._connect_serving()

tests/e2e/basic-ingest-redis-serving.py

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
FLOAT_TOLERANCE = 0.00001
3131
PROJECT_NAME = 'basic_' + uuid.uuid4().hex.upper()[0:6]
3232

33+
3334
@pytest.fixture(scope='module')
3435
def core_url(pytestconfig):
3536
return pytestconfig.getoption("core_url")
@@ -62,6 +63,7 @@ def client(core_url, serving_url, allow_dirty):
6263

6364
return client
6465

66+
6567
def basic_dataframe(entities, features, ingest_time, n_size):
6668
offset = random.randint(1000, 100000) # ensure a unique key space is used
6769
df_dict = {
@@ -79,20 +81,29 @@ def basic_dataframe(entities, features, ingest_time, n_size):
7981
def ingest_time():
8082
return datetime.utcnow()
8183

84+
8285
@pytest.fixture(scope="module")
8386
def cust_trans_df(ingest_time):
8487
return basic_dataframe(entities=["customer_id"],
8588
features=["daily_transactions", "total_transactions"],
8689
ingest_time=ingest_time,
8790
n_size=5)
8891

92+
8993
@pytest.fixture(scope="module")
9094
def driver_df(ingest_time):
9195
return basic_dataframe(entities=["driver_id"],
9296
features=["rating", "cost"],
9397
ingest_time=ingest_time,
9498
n_size=5)
9599

100+
101+
def test_version_returns_results(client):
102+
version_info = client.version()
103+
assert not version_info['core'] is 'not configured'
104+
assert not version_info['serving'] is 'not configured'
105+
106+
96107
@pytest.mark.timeout(45)
97108
@pytest.mark.run(order=10)
98109
def test_basic_register_feature_set_success(client):
@@ -117,6 +128,7 @@ def test_basic_register_feature_set_success(client):
117128
# reset client's project for other tests
118129
client.set_project()
119130

131+
120132
@pytest.mark.timeout(300)
121133
@pytest.mark.run(order=11)
122134
def test_basic_ingest_success(client, cust_trans_df, driver_df):
@@ -157,16 +169,16 @@ def test_basic_retrieve_online_success(client, cust_trans_df):
157169

158170
returned_daily_transactions = float(
159171
response.field_values[0]
160-
.fields["daily_transactions"]
161-
.float_val
172+
.fields["daily_transactions"]
173+
.float_val
162174
)
163175
sent_daily_transactions = float(
164176
cust_trans_df.iloc[0]["daily_transactions"])
165177

166178
if math.isclose(
167-
sent_daily_transactions,
168-
returned_daily_transactions,
169-
abs_tol=FLOAT_TOLERANCE,
179+
sent_daily_transactions,
180+
returned_daily_transactions,
181+
abs_tol=FLOAT_TOLERANCE,
170182
):
171183
break
172184

@@ -206,8 +218,8 @@ def test_basic_retrieve_online_multiple_featureset(client, cust_trans_df, driver
206218
def check_response(ingest_df, response, feature_ref):
207219
returned_value = float(
208220
response.field_values[0]
209-
.fields[feature_ref]
210-
.float_val
221+
.fields[feature_ref]
222+
.float_val
211223
)
212224
feature_ref_splits = feature_ref.split(":")
213225
if len(feature_ref_splits) == 1:
@@ -223,9 +235,11 @@ def check_response(ingest_df, response, feature_ref):
223235
returned_value,
224236
abs_tol=FLOAT_TOLERANCE,
225237
)
238+
226239
if all([check_response(df, response, ref) for ref, df in feature_ref_df_mapping]):
227240
break
228241

242+
229243
@pytest.mark.timeout(300)
230244
@pytest.mark.run(order=19)
231245
def test_basic_ingest_jobs(client):

0 commit comments

Comments
 (0)