Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
664fdca
feat: add per-service scaling and grpc support
jatin5251 Feb 2, 2026
fe4a6f1
fix: avoid default http when grpc only
jatin5251 Feb 2, 2026
246fa44
test: update operator tests for per-service deployments
jatin5251 Feb 2, 2026
5646545
refactor: reduce complexity in defaults and deploy
jatin5251 Feb 2, 2026
f396a6d
feat: Add per-service scaling and gRPC support
jatin5251 Feb 2, 2026
ee50edf
test: Fix reconcile error expectations
jatin5251 Feb 2, 2026
8914508
chore: Update install.yaml
jatin5251 Feb 2, 2026
9d81a14
chore: Update generated manifests and docs
jatin5251 Feb 2, 2026
836ca09
chore: Addressed devin ai comments
jatin5251 Feb 2, 2026
c288dce
chore: retrigger CI
jatin5251 Feb 2, 2026
06330e2
chore: fixed test cases
jatin5251 Feb 2, 2026
99b5ca7
chore: fixed test cases
jatin5251 Feb 2, 2026
81350f6
chore: fixed test cases
jatin5251 Feb 2, 2026
004552f
chore: fixed format issue
jatin5251 Feb 3, 2026
918aab0
chore: fixed devin ai comments
jatin5251 Feb 3, 2026
cc6b34b
chore: remove unused variables
jatin5251 Feb 3, 2026
44cc015
chore: fixed test cases
jatin5251 Feb 3, 2026
6cdc2fa
chore: fixed test cases
jatin5251 Feb 3, 2026
0f8a959
Merge branch 'master' into feat-feast-operator-mcp-grpc-per-service
jatin5251 Feb 3, 2026
d90e9f6
chore: addressed devin ai comments
jatin5251 Feb 3, 2026
9572b69
Merge branch 'feat-feast-operator-mcp-grpc-per-service' of github.com…
jatin5251 Feb 3, 2026
b2d90fe
chore: fixed test cases
jatin5251 Feb 3, 2026
5488be8
chore: fixed test cases
jatin5251 Feb 3, 2026
af3dbae
chore: fixed test cases
jatin5251 Feb 3, 2026
4ce3f26
chore: fixed test cases
jatin5251 Feb 3, 2026
02bede9
chore: fixed test cases
jatin5251 Feb 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 77 additions & 16 deletions infra/feast-operator/api/v1/featurestore_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,21 +30,23 @@ const (
FailedPhase = "Failed"

// Feast condition types:
ClientReadyType = "Client"
OfflineStoreReadyType = "OfflineStore"
OnlineStoreReadyType = "OnlineStore"
RegistryReadyType = "Registry"
UIReadyType = "UI"
ReadyType = "FeatureStore"
AuthorizationReadyType = "Authorization"
CronJobReadyType = "CronJob"
ClientReadyType = "Client"
OfflineStoreReadyType = "OfflineStore"
OnlineStoreReadyType = "OnlineStore"
OnlineStoreGrpcReadyType = "OnlineStoreGrpc"
RegistryReadyType = "Registry"
UIReadyType = "UI"
ReadyType = "FeatureStore"
AuthorizationReadyType = "Authorization"
CronJobReadyType = "CronJob"

// Feast condition reasons:
ReadyReason = "Ready"
FailedReason = "FeatureStoreFailed"
DeploymentNotAvailableReason = "DeploymentNotAvailable"
OfflineStoreFailedReason = "OfflineStoreDeploymentFailed"
OnlineStoreFailedReason = "OnlineStoreDeploymentFailed"
OnlineStoreGrpcFailedReason = "OnlineStoreGrpcDeploymentFailed"
RegistryFailedReason = "RegistryDeploymentFailed"
UIFailedReason = "UIDeploymentFailed"
ClientFailedReason = "ClientDeploymentFailed"
Expand All @@ -55,6 +57,7 @@ const (
ReadyMessage = "FeatureStore installation complete"
OfflineStoreReadyMessage = "Offline Store installation complete"
OnlineStoreReadyMessage = "Online Store installation complete"
OnlineStoreGrpcReadyMessage = "Online Store gRPC installation complete"
RegistryReadyMessage = "Registry installation complete"
UIReadyMessage = "UI installation complete"
ClientReadyMessage = "Client installation complete"
Expand All @@ -73,8 +76,44 @@ type FeatureStoreSpec struct {
FeastProject string `json:"feastProject"`
FeastProjectDir *FeastProjectDir `json:"feastProjectDir,omitempty"`
Services *FeatureStoreServices `json:"services,omitempty"`
AuthzConfig *AuthzConfig `json:"authz,omitempty"`
CronJob *FeastCronJob `json:"cronJob,omitempty"`
// FeatureServer configures the Feast feature server, including MCP support.
FeatureServer *FeatureServerConfig `json:"feature_server,omitempty"`
AuthzConfig *AuthzConfig `json:"authz,omitempty"`
CronJob *FeastCronJob `json:"cronJob,omitempty"`
}

// FeatureServerConfig defines feature server configuration settings.
// Fields are aligned with Feast's feature_store.yaml feature_server schema.
type FeatureServerConfig struct {
// Feature server type selector (e.g. local, mcp)
Type *string `json:"type,omitempty" yaml:"type,omitempty"`
// Whether the feature server should be launched.
Enabled *bool `json:"enabled,omitempty" yaml:"enabled,omitempty"`
// Enable MCP server support - defaults to false.
MCPEnabled *bool `json:"mcp_enabled,omitempty" yaml:"mcp_enabled,omitempty"`
// MCP server name for identification.
MCPServerName *string `json:"mcp_server_name,omitempty" yaml:"mcp_server_name,omitempty"`
// MCP server version.
MCPServerVersion *string `json:"mcp_server_version,omitempty" yaml:"mcp_server_version,omitempty"`
// Optional MCP transport configuration.
MCPTransport *string `json:"mcp_transport,omitempty" yaml:"mcp_transport,omitempty"`
// The endpoint definition for transformation_service.
TransformationServiceEndpoint *string `json:"transformation_service_endpoint,omitempty" yaml:"transformation_service_endpoint,omitempty"`
// Feature logging configuration.
FeatureLogging *FeatureLoggingConfig `json:"feature_logging,omitempty" yaml:"feature_logging,omitempty"`
}

// FeatureLoggingConfig defines feature server logging settings.
type FeatureLoggingConfig struct {
Enabled *bool `json:"enabled,omitempty" yaml:"enabled,omitempty"`
// Interval of flushing logs to the destination in offline store.
FlushIntervalSecs *int32 `json:"flush_interval_secs,omitempty" yaml:"flush_interval_secs,omitempty"`
// Interval of dumping logs collected in memory to local disk.
WriteToDiskIntervalSecs *int32 `json:"write_to_disk_interval_secs,omitempty" yaml:"write_to_disk_interval_secs,omitempty"`
// Log queue capacity.
QueueCapacity *int32 `json:"queue_capacity,omitempty" yaml:"queue_capacity,omitempty"`
// Timeout for adding new log item to the queue.
EmitTimeoutMicroSecs *int32 `json:"emit_timeout_micro_secs,omitempty" yaml:"emit_timeout_micro_secs,omitempty"`
}

// FeastProjectDir defines how to create the feast project directory.
Expand Down Expand Up @@ -348,7 +387,9 @@ var ValidOfflineStoreDBStorePersistenceTypes = []string{
// OnlineStore configures the online store service
type OnlineStore struct {
// Creates a feature server container
Server *ServerConfigs `json:"server,omitempty"`
Server *ServerConfigs `json:"server,omitempty"`
// Creates a gRPC feature server container (feast listen)
Grpc *GrpcServerConfigs `json:"grpc,omitempty"`
Persistence *OnlineStorePersistence `json:"persistence,omitempty"`
}

Expand Down Expand Up @@ -512,6 +553,8 @@ type FeatureStoreRef struct {
type ServerConfigs struct {
ContainerConfigs `json:",inline"`
TLS *TlsConfigs `json:"tls,omitempty"`
// Replicas sets the number of replicas for the service deployment.
Replicas *int32 `json:"replicas,omitempty"`
// LogLevel sets the logging level for the server
// Allowed values: "debug", "info", "warning", "error", "critical".
// +kubebuilder:validation:Enum=debug;info;warning;error;critical
Expand Down Expand Up @@ -563,6 +606,23 @@ type WorkerConfigs struct {
RegistryTTLSeconds *int32 `json:"registryTTLSeconds,omitempty"`
}

// GrpcServerConfigs creates a gRPC feature server for the online store.
type GrpcServerConfigs struct {
ContainerConfigs `json:",inline"`
// Replicas sets the number of replicas for the gRPC service deployment.
Replicas *int32 `json:"replicas,omitempty"`
// TLS configures TLS for the gRPC server.
TLS *TlsConfigs `json:"tls,omitempty"`
// VolumeMounts defines the list of volumes that should be mounted into the gRPC container.
VolumeMounts []corev1.VolumeMount `json:"volumeMounts,omitempty"`
// Port sets the gRPC server port. Defaults to 50051 if unset.
Port *int32 `json:"port,omitempty"`
// MaxWorkers sets the maximum number of threads for handling gRPC calls.
MaxWorkers *int32 `json:"maxWorkers,omitempty"`
// RegistryTTLSeconds sets how often the registry is refreshed.
RegistryTTLSeconds *int32 `json:"registryTTLSeconds,omitempty"`
}

// RegistryServerConfigs creates a registry server for the feast service, with specified container configurations.
// +kubebuilder:validation:XValidation:rule="self.restAPI == true || self.grpc == true || !has(self.grpc)", message="At least one of restAPI or grpc must be true"
type RegistryServerConfigs struct {
Expand Down Expand Up @@ -684,11 +744,12 @@ type FeatureStoreStatus struct {

// ServiceHostnames defines the service hostnames in the format of <domain>:<port>, e.g. example.svc.cluster.local:80
type ServiceHostnames struct {
OfflineStore string `json:"offlineStore,omitempty"`
OnlineStore string `json:"onlineStore,omitempty"`
Registry string `json:"registry,omitempty"`
RegistryRest string `json:"registryRest,omitempty"`
UI string `json:"ui,omitempty"`
OfflineStore string `json:"offlineStore,omitempty"`
OnlineStore string `json:"onlineStore,omitempty"`
OnlineStoreGrpc string `json:"onlineStoreGrpc,omitempty"`
Registry string `json:"registry,omitempty"`
RegistryRest string `json:"registryRest,omitempty"`
UI string `json:"ui,omitempty"`
}

// +kubebuilder:object:root=true
Expand Down
158 changes: 158 additions & 0 deletions infra/feast-operator/api/v1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading