Skip to content

Commit

Permalink
feat: Add gRPC Registry Server (#3924)
Browse files Browse the repository at this point in the history
  • Loading branch information
tokoko authored Feb 6, 2024
1 parent 1f3cab8 commit 373e624
Show file tree
Hide file tree
Showing 9 changed files with 532 additions and 5 deletions.
230 changes: 230 additions & 0 deletions protos/feast/registry/RegistryServer.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,230 @@
syntax = "proto3";

package feast.registry;

import "google/protobuf/timestamp.proto";
import "google/protobuf/empty.proto";
import "feast/core/Registry.proto";
import "feast/core/Entity.proto";
import "feast/core/DataSource.proto";
import "feast/core/FeatureView.proto";
import "feast/core/RequestFeatureView.proto";
import "feast/core/StreamFeatureView.proto";
import "feast/core/OnDemandFeatureView.proto";
import "feast/core/FeatureService.proto";
import "feast/core/SavedDataset.proto";
import "feast/core/ValidationProfile.proto";
import "feast/core/InfraObject.proto";

service RegistryServer{
// Entity RPCs
rpc GetEntity (GetEntityRequest) returns (feast.core.Entity) {}
rpc ListEntities (ListEntitiesRequest) returns (ListEntitiesResponse) {}

// DataSource RPCs
rpc GetDataSource (GetDataSourceRequest) returns (feast.core.DataSource) {}
rpc ListDataSources (ListDataSourcesRequest) returns (ListDataSourcesResponse) {}

// FeatureView RPCs
rpc GetFeatureView (GetFeatureViewRequest) returns (feast.core.FeatureView) {}
rpc ListFeatureViews (ListFeatureViewsRequest) returns (ListFeatureViewsResponse) {}

// RequestFeatureView RPCs
rpc GetRequestFeatureView (GetRequestFeatureViewRequest) returns (feast.core.RequestFeatureView) {}
rpc ListRequestFeatureViews (ListRequestFeatureViewsRequest) returns (ListRequestFeatureViewsResponse) {}

// StreamFeatureView RPCs
rpc GetStreamFeatureView (GetStreamFeatureViewRequest) returns (feast.core.StreamFeatureView) {}
rpc ListStreamFeatureViews (ListStreamFeatureViewsRequest) returns (ListStreamFeatureViewsResponse) {}

// OnDemandFeatureView RPCs
rpc GetOnDemandFeatureView (GetOnDemandFeatureViewRequest) returns (feast.core.OnDemandFeatureView) {}
rpc ListOnDemandFeatureViews (ListOnDemandFeatureViewsRequest) returns (ListOnDemandFeatureViewsResponse) {}

// FeatureService RPCs
rpc GetFeatureService (GetFeatureServiceRequest) returns (feast.core.FeatureService) {}
rpc ListFeatureServices (ListFeatureServicesRequest) returns (ListFeatureServicesResponse) {}

// SavedDataset RPCs
rpc GetSavedDataset (GetSavedDatasetRequest) returns (feast.core.SavedDataset) {}
rpc ListSavedDatasets (ListSavedDatasetsRequest) returns (ListSavedDatasetsResponse) {}

// ValidationReference RPCs
rpc GetValidationReference (GetValidationReferenceRequest) returns (feast.core.ValidationReference) {}
rpc ListValidationReferences (ListValidationReferencesRequest) returns (ListValidationReferencesResponse) {}

rpc ListProjectMetadata (ListProjectMetadataRequest) returns (ListProjectMetadataResponse) {}
rpc GetInfra (GetInfraRequest) returns (feast.core.Infra) {}
rpc Refresh (RefreshRequest) returns (google.protobuf.Empty) {}
rpc Proto (google.protobuf.Empty) returns (feast.core.Registry) {}

}

message RefreshRequest {
string project = 1;
}

message GetInfraRequest {
string project = 1;
bool allow_cache = 2;
}

message ListProjectMetadataRequest {
string project = 1;
bool allow_cache = 2;
}

message ListProjectMetadataResponse {
repeated feast.core.ProjectMetadata project_metadata = 1;
}

message GetEntityRequest {
string name = 1;
string project = 2;
bool allow_cache = 3;
}

message ListEntitiesRequest {
string project = 1;
bool allow_cache = 2;
}

message ListEntitiesResponse {
repeated feast.core.Entity entities = 1;
}

// DataSources

message GetDataSourceRequest {
string name = 1;
string project = 2;
bool allow_cache = 3;
}

message ListDataSourcesRequest {
string project = 1;
bool allow_cache = 2;
}

message ListDataSourcesResponse {
repeated feast.core.DataSource data_sources = 1;
}

// FeatureViews

message GetFeatureViewRequest {
string name = 1;
string project = 2;
bool allow_cache = 3;
}

message ListFeatureViewsRequest {
string project = 1;
bool allow_cache = 2;
}

message ListFeatureViewsResponse {
repeated feast.core.FeatureView feature_views = 1;
}

// RequestFeatureView

message GetRequestFeatureViewRequest {
string name = 1;
string project = 2;
bool allow_cache = 3;
}

message ListRequestFeatureViewsRequest {
string project = 1;
bool allow_cache = 2;
}

message ListRequestFeatureViewsResponse {
repeated feast.core.RequestFeatureView request_feature_views = 1;
}

// StreamFeatureView

message GetStreamFeatureViewRequest {
string name = 1;
string project = 2;
bool allow_cache = 3;
}

message ListStreamFeatureViewsRequest {
string project = 1;
bool allow_cache = 2;
}

message ListStreamFeatureViewsResponse {
repeated feast.core.StreamFeatureView stream_feature_views = 1;
}

// OnDemandFeatureView

message GetOnDemandFeatureViewRequest {
string name = 1;
string project = 2;
bool allow_cache = 3;
}

message ListOnDemandFeatureViewsRequest {
string project = 1;
bool allow_cache = 2;
}

message ListOnDemandFeatureViewsResponse {
repeated feast.core.OnDemandFeatureView on_demand_feature_views = 1;
}

// FeatureServices

message GetFeatureServiceRequest {
string name = 1;
string project = 2;
bool allow_cache = 3;
}

message ListFeatureServicesRequest {
string project = 1;
bool allow_cache = 2;
}

message ListFeatureServicesResponse {
repeated feast.core.FeatureService feature_services = 1;
}

// SavedDataset

message GetSavedDatasetRequest {
string name = 1;
string project = 2;
bool allow_cache = 3;
}

message ListSavedDatasetsRequest {
string project = 1;
bool allow_cache = 2;
}

message ListSavedDatasetsResponse {
repeated feast.core.SavedDataset saved_datasets = 1;
}

// ValidationReference

message GetValidationReferenceRequest {
string name = 1;
string project = 2;
bool allow_cache = 3;
}

message ListValidationReferencesRequest {
string project = 1;
bool allow_cache = 2;
}

message ListValidationReferencesResponse {
repeated feast.core.ValidationReference validation_references = 1;
}
21 changes: 20 additions & 1 deletion sdk/python/feast/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,10 @@
from pygments import formatters, highlight, lexers

from feast import utils
from feast.constants import DEFAULT_FEATURE_TRANSFORMATION_SERVER_PORT
from feast.constants import (
DEFAULT_FEATURE_TRANSFORMATION_SERVER_PORT,
DEFAULT_REGISTRY_SERVER_PORT,
)
from feast.errors import FeastObjectNotFoundException, FeastProviderLoginError
from feast.feature_view import FeatureView
from feast.infra.contrib.grpc_server import get_grpc_server
Expand Down Expand Up @@ -753,6 +756,22 @@ def serve_transformations_command(ctx: click.Context, port: int):
store.serve_transformations(port)


@cli.command("serve_registry")
@click.option(
"--port",
"-p",
type=click.INT,
default=DEFAULT_REGISTRY_SERVER_PORT,
help="Specify a port for the server",
)
@click.pass_context
def serve_registry_command(ctx: click.Context, port: int):
"""Start a registry server locally on a given port."""
store = create_feature_store(ctx)

store.serve_registry(port)


@cli.command("validate")
@click.option(
"--feature-service",
Expand Down
3 changes: 3 additions & 0 deletions sdk/python/feast/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,5 +44,8 @@
# Default FTS port
DEFAULT_FEATURE_TRANSFORMATION_SERVER_PORT = 6569

# Default registry server port
DEFAULT_REGISTRY_SERVER_PORT = 6570

# Environment variable for feature server docker image tag
DOCKER_IMAGE_TAG_ENV_NAME: str = "FEAST_SERVER_DOCKER_IMAGE_TAG"
7 changes: 7 additions & 0 deletions sdk/python/feast/feature_store.py
Original file line number Diff line number Diff line change
Expand Up @@ -2278,6 +2278,13 @@ def serve_ui(
root_path=root_path,
)

@log_exceptions_and_usage
def serve_registry(self, port: int) -> None:
"""Start registry server locally on a given port."""
from feast import registry_server

registry_server.start_server(self, port)

@log_exceptions_and_usage
def serve_transformations(self, port: int) -> None:
"""Start the feature transformation server locally on a given port."""
Expand Down
4 changes: 3 additions & 1 deletion sdk/python/feast/infra/registry/base_registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,9 @@ def list_feature_views(

# request feature view operations
@abstractmethod
def get_request_feature_view(self, name: str, project: str) -> RequestFeatureView:
def get_request_feature_view(
self, name: str, project: str, allow_cache: bool = False
) -> RequestFeatureView:
"""
Retrieves a request feature view.
Expand Down
8 changes: 6 additions & 2 deletions sdk/python/feast/infra/registry/registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -528,8 +528,12 @@ def list_feature_views(
)
return proto_registry_utils.list_feature_views(registry_proto, project)

def get_request_feature_view(self, name: str, project: str):
registry_proto = self._get_registry_proto(project=project, allow_cache=False)
def get_request_feature_view(
self, name: str, project: str, allow_cache: bool = False
):
registry_proto = self._get_registry_proto(
project=project, allow_cache=allow_cache
)
return proto_registry_utils.get_request_feature_view(
registry_proto, name, project
)
Expand Down
Loading

0 comments on commit 373e624

Please sign in to comment.