Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
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
Next Next commit
feat: Allow to set registry server rest/grpc mode in operator
Signed-off-by: ntkathole <nikhilkathole2683@gmail.com>
  • Loading branch information
ntkathole committed Jun 9, 2025
commit e67fc0dd0574b89eb2a37b5eff0226c023db31f2
12 changes: 10 additions & 2 deletions infra/feast-operator/api/v1alpha1/featurestore_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -392,8 +392,8 @@ var ValidOnlineStoreDBStorePersistenceTypes = []string{
// LocalRegistryConfig configures the registry service
type LocalRegistryConfig struct {
// Creates a registry server container
Server *ServerConfigs `json:"server,omitempty"`
Persistence *RegistryPersistence `json:"persistence,omitempty"`
Server *RegistryServerConfigs `json:"server,omitempty"`
Persistence *RegistryPersistence `json:"persistence,omitempty"`
}

// RegistryPersistence configures the persistence settings for the registry service
Expand Down Expand Up @@ -502,6 +502,14 @@ type ServerConfigs struct {
VolumeMounts []corev1.VolumeMount `json:"volumeMounts,omitempty"`
}

// RegistryServerConfigs creates a registry server for the feast service, with specified container configurations.
type RegistryServerConfigs struct {
ServerConfigs `json:",inline"`
// RestAPIEnabled determines if the registry should serve using the REST API instead of gRPC.
// +kubebuilder:default=true
RestAPIEnabled bool `json:"restAPIEnabled,omitempty"`
Comment thread
ntkathole marked this conversation as resolved.
Outdated
}

// CronJobContainerConfigs k8s container settings for the CronJob
type CronJobContainerConfigs struct {
ContainerConfigs `json:",inline"`
Expand Down
18 changes: 17 additions & 1 deletion infra/feast-operator/api/v1alpha1/zz_generated.deepcopy.go

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

Original file line number Diff line number Diff line change
Expand Up @@ -1987,6 +1987,11 @@ spec:
of compute resources required.
type: object
type: object
restAPIEnabled:
default: true
description: RestAPIEnabled determines if the registry
should serve using the REST API instead of gRPC.
type: boolean
tls:
description: TlsConfigs configures server TLS for
a feast service.
Expand Down Expand Up @@ -5965,6 +5970,12 @@ spec:
amount of compute resources required.
type: object
type: object
restAPIEnabled:
default: true
description: RestAPIEnabled determines if the
registry should serve using the REST API instead
of gRPC.
type: boolean
tls:
description: TlsConfigs configures server TLS
for a feast service.
Expand Down
11 changes: 11 additions & 0 deletions infra/feast-operator/dist/install.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1995,6 +1995,11 @@ spec:
of compute resources required.
type: object
type: object
restAPIEnabled:
default: true
description: RestAPIEnabled determines if the registry
should serve using the REST API instead of gRPC.
type: boolean
tls:
description: TlsConfigs configures server TLS for
a feast service.
Expand Down Expand Up @@ -5973,6 +5978,12 @@ spec:
amount of compute resources required.
type: object
type: object
restAPIEnabled:
default: true
description: RestAPIEnabled determines if the
registry should serve using the REST API instead
of gRPC.
type: boolean
tls:
description: TlsConfigs configures server TLS
for a feast service.
Expand Down
34 changes: 32 additions & 2 deletions infra/feast-operator/docs/api/markdown/ref.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ ContainerConfigs k8s container settings for the server

_Appears in:_
- [CronJobContainerConfigs](#cronjobcontainerconfigs)
- [RegistryServerConfigs](#registryserverconfigs)
- [ServerConfigs](#serverconfigs)

| Field | Description |
Expand Down Expand Up @@ -76,6 +77,7 @@ DefaultCtrConfigs k8s container settings that are applied by default
_Appears in:_
- [ContainerConfigs](#containerconfigs)
- [CronJobContainerConfigs](#cronjobcontainerconfigs)
- [RegistryServerConfigs](#registryserverconfigs)
- [ServerConfigs](#serverconfigs)

| Field | Description |
Expand Down Expand Up @@ -405,7 +407,7 @@ _Appears in:_

| Field | Description |
| --- | --- |
| `server` _[ServerConfigs](#serverconfigs)_ | Creates a registry server container |
| `server` _[RegistryServerConfigs](#registryserverconfigs)_ | Creates a registry server container |
| `persistence` _[RegistryPersistence](#registrypersistence)_ | |


Expand Down Expand Up @@ -555,6 +557,7 @@ OptionalCtrConfigs k8s container settings that are optional
_Appears in:_
- [ContainerConfigs](#containerconfigs)
- [CronJobContainerConfigs](#cronjobcontainerconfigs)
- [RegistryServerConfigs](#registryserverconfigs)
- [ServerConfigs](#serverconfigs)

| Field | Description |
Expand Down Expand Up @@ -669,6 +672,32 @@ _Appears in:_
| `store` _[RegistryDBStorePersistence](#registrydbstorepersistence)_ | |


#### RegistryServerConfigs



RegistryServerConfigs creates a registry server for the feast service, with specified container configurations.

_Appears in:_
- [LocalRegistryConfig](#localregistryconfig)

| Field | Description |
| --- | --- |
| `image` _string_ | |
| `env` _[EnvVar](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#envvar-v1-core)_ | |
| `envFrom` _[EnvFromSource](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#envfromsource-v1-core)_ | |
| `imagePullPolicy` _[PullPolicy](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#pullpolicy-v1-core)_ | |
| `resources` _[ResourceRequirements](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#resourcerequirements-v1-core)_ | |
| `tls` _[TlsConfigs](#tlsconfigs)_ | |
| `logLevel` _string_ | LogLevel sets the logging level for the server
Allowed values: "debug", "info", "warning", "error", "critical". |
| `volumeMounts` _[VolumeMount](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#volumemount-v1-core) array_ | VolumeMounts defines the list of volumes that should be mounted into the feast container.
This allows attaching persistent storage, config files, secrets, or other resources
required by the Feast components. Ensure that each volume mount has a corresponding
volume definition in the Volumes field. |
| `restAPIEnabled` _boolean_ | RestAPIEnabled determines if the registry should serve using the REST API instead of gRPC. |


#### RemoteRegistryConfig


Expand Down Expand Up @@ -709,9 +738,9 @@ ServerConfigs creates a server for the feast service, with specified container c

_Appears in:_
- [FeatureStoreServices](#featurestoreservices)
- [LocalRegistryConfig](#localregistryconfig)
- [OfflineStore](#offlinestore)
- [OnlineStore](#onlinestore)
- [RegistryServerConfigs](#registryserverconfigs)

| Field | Description |
| --- | --- |
Expand Down Expand Up @@ -753,6 +782,7 @@ _Appears in:_
TlsConfigs configures server TLS for a feast service. in an openshift cluster, this is configured by default using service serving certificates.

_Appears in:_
- [RegistryServerConfigs](#registryserverconfigs)
- [ServerConfigs](#serverconfigs)

| Field | Description |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,10 @@ var _ = Describe("FeatureStore Controller - Feast service LogLevel", func() {
Services: &feastdevv1alpha1.FeatureStoreServices{
Registry: &feastdevv1alpha1.Registry{
Local: &feastdevv1alpha1.LocalRegistryConfig{
Server: &feastdevv1alpha1.ServerConfigs{
LogLevel: strPtr("error"),
Server: &feastdevv1alpha1.RegistryServerConfigs{
ServerConfigs: feastdevv1alpha1.ServerConfigs{
LogLevel: strPtr("error"),
},
},
},
},
Expand Down Expand Up @@ -196,7 +198,9 @@ var _ = Describe("FeatureStore Controller - Feast service LogLevel", func() {
resource.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{
Registry: &feastdevv1alpha1.Registry{
Local: &feastdevv1alpha1.LocalRegistryConfig{
Server: &feastdevv1alpha1.ServerConfigs{},
Server: &feastdevv1alpha1.RegistryServerConfigs{
ServerConfigs: feastdevv1alpha1.ServerConfigs{},
},
},
},
OfflineStore: &feastdevv1alpha1.OfflineStore{},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,9 @@ func createFeatureStoreResource(resourceName string, image string, pullPolicy co
},
Registry: &feastdevv1alpha1.Registry{
Local: &feastdevv1alpha1.LocalRegistryConfig{
Server: &feastdevv1alpha1.ServerConfigs{},
Server: &feastdevv1alpha1.RegistryServerConfigs{
ServerConfigs: feastdevv1alpha1.ServerConfigs{},
},
},
},
UI: &feastdevv1alpha1.ServerConfigs{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,10 @@ var _ = Describe("FeatureStore Controller - Feast service TLS", func() {
},
Registry: &feastdevv1alpha1.Registry{
Local: &feastdevv1alpha1.LocalRegistryConfig{
Server: &feastdevv1alpha1.ServerConfigs{
TLS: tlsConfigs,
Server: &feastdevv1alpha1.RegistryServerConfigs{
ServerConfigs: feastdevv1alpha1.ServerConfigs{
TLS: tlsConfigs,
},
},
},
},
Expand Down Expand Up @@ -463,7 +465,7 @@ var _ = Describe("Test mountCustomCABundle functionality", func() {
Spec: feastdevv1alpha1.FeatureStoreSpec{
FeastProject: feastProject,
Services: &feastdevv1alpha1.FeatureStoreServices{
Registry: &feastdevv1alpha1.Registry{Local: &feastdevv1alpha1.LocalRegistryConfig{Server: &feastdevv1alpha1.ServerConfigs{}}},
Registry: &feastdevv1alpha1.Registry{Local: &feastdevv1alpha1.LocalRegistryConfig{Server: &feastdevv1alpha1.RegistryServerConfigs{ServerConfigs: feastdevv1alpha1.ServerConfigs{}}}},
OnlineStore: &feastdevv1alpha1.OnlineStore{Server: &feastdevv1alpha1.ServerConfigs{}},
OfflineStore: &feastdevv1alpha1.OfflineStore{Server: &feastdevv1alpha1.ServerConfigs{}},
UI: &feastdevv1alpha1.ServerConfigs{},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -374,7 +374,7 @@ func minimalFeatureStoreWithAllServers() *feastdevv1alpha1.FeatureStore {
},
Registry: &feastdevv1alpha1.Registry{
Local: &feastdevv1alpha1.LocalRegistryConfig{
Server: &feastdevv1alpha1.ServerConfigs{},
Server: &feastdevv1alpha1.RegistryServerConfigs{},
},
},
UI: &feastdevv1alpha1.ServerConfigs{},
Expand Down
13 changes: 11 additions & 2 deletions infra/feast-operator/internal/controller/services/services.go
Original file line number Diff line number Diff line change
Expand Up @@ -499,6 +499,13 @@ func (feast *FeastServices) getContainerCommand(feastType FeastServiceType) []st
deploySettings := FeastServiceConstants[feastType]
targetPort := deploySettings.TargetHttpPort
tls := feast.getTlsConfigs(feastType)

if feastType == RegistryFeastType {
registry := feast.Handler.FeatureStore.Spec.Services.Registry
if registry != nil && registry.Local != nil && registry.Local.Server != nil && registry.Local.Server.RestAPIEnabled {
Comment thread
ntkathole marked this conversation as resolved.
Outdated
deploySettings.Args = append(deploySettings.Args, "--rest-api")
}
}
if tls.IsTLS() {
targetPort = deploySettings.TargetHttpsPort
feastTlsPath := GetTlsPath(feastType)
Expand Down Expand Up @@ -645,8 +652,10 @@ func (feast *FeastServices) getServerConfigs(feastType FeastServiceType) *feastd
return appliedServices.OnlineStore.Server
}
case RegistryFeastType:
if feast.isLocalRegistry() {
return appliedServices.Registry.Local.Server
if feast.isLocalRegistry() && appliedServices.Registry != nil &&
appliedServices.Registry.Local != nil &&
appliedServices.Registry.Local.Server != nil {
return &appliedServices.Registry.Local.Server.ServerConfigs
Comment thread
ntkathole marked this conversation as resolved.
Outdated
}
case UIFeastType:
return appliedServices.UI
Expand Down
28 changes: 18 additions & 10 deletions infra/feast-operator/internal/controller/services/tls_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,9 @@ var _ = Describe("TLS Config", func() {
feast.Handler.FeatureStore.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{
Registry: &feastdevv1alpha1.Registry{
Local: &feastdevv1alpha1.LocalRegistryConfig{
Server: &feastdevv1alpha1.ServerConfigs{},
Server: &feastdevv1alpha1.RegistryServerConfigs{
ServerConfigs: feastdevv1alpha1.ServerConfigs{},
},
},
},
}
Expand Down Expand Up @@ -85,7 +87,9 @@ var _ = Describe("TLS Config", func() {
feast.Handler.FeatureStore.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{
Registry: &feastdevv1alpha1.Registry{
Local: &feastdevv1alpha1.LocalRegistryConfig{
Server: &feastdevv1alpha1.ServerConfigs{},
Server: &feastdevv1alpha1.RegistryServerConfigs{
ServerConfigs: feastdevv1alpha1.ServerConfigs{},
},
},
},
}
Expand Down Expand Up @@ -190,11 +194,13 @@ var _ = Describe("TLS Config", func() {
},
Registry: &feastdevv1alpha1.Registry{
Local: &feastdevv1alpha1.LocalRegistryConfig{
Server: &feastdevv1alpha1.ServerConfigs{
TLS: &feastdevv1alpha1.TlsConfigs{
SecretRef: &corev1.LocalObjectReference{},
SecretKeyNames: feastdevv1alpha1.SecretKeyNames{
TlsCrt: "test.crt",
Server: &feastdevv1alpha1.RegistryServerConfigs{
ServerConfigs: feastdevv1alpha1.ServerConfigs{
TLS: &feastdevv1alpha1.TlsConfigs{
SecretRef: &corev1.LocalObjectReference{},
SecretKeyNames: feastdevv1alpha1.SecretKeyNames{
TlsCrt: "test.crt",
},
},
},
},
Expand Down Expand Up @@ -244,9 +250,11 @@ var _ = Describe("TLS Config", func() {
}
feast.Handler.FeatureStore.Spec.Services.Registry = &feastdevv1alpha1.Registry{
Local: &feastdevv1alpha1.LocalRegistryConfig{
Server: &feastdevv1alpha1.ServerConfigs{
TLS: &feastdevv1alpha1.TlsConfigs{
Disable: &disable,
Server: &feastdevv1alpha1.RegistryServerConfigs{
ServerConfigs: feastdevv1alpha1.ServerConfigs{
TLS: &feastdevv1alpha1.TlsConfigs{
Disable: &disable,
},
},
},
},
Expand Down