Skip to content

Commit 983f508

Browse files
committed
Reject grpcRouter creation when grpcPort is unspecified; Add warning messages when router is enabled but the exposed service is of type LoadBalancer
Signed-off-by: Sheng Lin <[email protected]>
1 parent 4984d16 commit 983f508

File tree

10 files changed

+48
-12
lines changed

10 files changed

+48
-12
lines changed

api/apps/v1alpha1/common_types.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ import (
3030
const (
3131
// DefaultAPIPort is the default api port.
3232
DefaultAPIPort = 8000
33-
// DefaultGRPCPort is the default grpc port.
34-
DefaultGRPCPort = 50051
3533
// DefaultNamedPortAPI is the default name for api port.
3634
DefaultNamedPortAPI = "api"
3735
// DefaultNamedPortGRPC is the default name for grpc port.

api/apps/v1alpha1/nimservice_types.go

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ const (
9090

9191
// NIMServiceSpec defines the desired state of NIMService.
9292
// +kubebuilder:validation:XValidation:rule="!(has(self.multiNode) && has(self.scale) && has(self.scale.enabled) && self.scale.enabled)", message="autoScaling must be nil or disabled when multiNode is set"
93+
// +kubebuilder:validation:XValidation:rule="!(has(self.router.gateway) && self.router.gateway.grpcRoutesEnabled && !has(self.expose.service.grpcPort))", message=".spec.expose.service.grpcPort must be set when .spec.router.gateway.grpcRoutesEnabled is true"
9394
// +kubebuilder:validation:XValidation:rule="!(has(self.expose.ingress) && has(self.expose.ingress.enabled) && self.expose.ingress.enabled && has(self.router) && has(self.router.ingress))", message=".spec.expose.ingress is deprecated, and will be removed in a future release. If .spec.expose.ingress is set, please do not set .spec.router.ingress."
9495
type NIMServiceSpec struct {
9596
Image Image `json:"image"`
@@ -968,7 +969,10 @@ func (n *NIMService) IsGRPCRouteEnabled() bool {
968969
}
969970

970971
func (n *NIMService) GetGRPCRouteSpec() gatewayv1.GRPCRouteSpec {
971-
return n.Spec.Router.GenerateGatewayGRPCRouteSpec(n.GetNamespace(), n.GetName(), n.GetGRPCServicePort())
972+
if n.Spec.Expose.Service.GRPCPort == nil {
973+
return gatewayv1.GRPCRouteSpec{}
974+
}
975+
return n.Spec.Router.GenerateGatewayGRPCRouteSpec(n.GetNamespace(), n.GetName(), *n.Spec.Expose.Service.GRPCPort)
972976
}
973977

974978
// IsServiceMonitorEnabled returns true if servicemonitor is enabled for NIMService deployment.
@@ -984,14 +988,6 @@ func (n *NIMService) GetServicePort() int32 {
984988
return *n.Spec.Expose.Service.Port
985989
}
986990

987-
// GetGRPCServicePort returns the grpc service port for the NIMService deployment or default port.
988-
func (n *NIMService) GetGRPCServicePort() int32 {
989-
if n.Spec.Expose.Service.GRPCPort == nil {
990-
return DefaultGRPCPort
991-
}
992-
return *n.Spec.Expose.Service.GRPCPort
993-
}
994-
995991
// GetServiceType returns the service type for the NIMService deployment.
996992
func (n *NIMService) GetServiceType() string {
997993
return string(n.Spec.Expose.Service.Type)
@@ -1372,6 +1368,7 @@ func (n *NIMService) GetGRPCRouteParams() *rendertypes.GRPCRouteParams {
13721368
params.Name = n.GetName()
13731369
params.Namespace = n.GetNamespace()
13741370
params.Labels = n.GetServiceLabels()
1371+
params.Annotations = n.GetRouterAnnotations()
13751372
params.Spec = n.GetGRPCRouteSpec()
13761373
return params
13771374
}

bundle/manifests/apps.nvidia.com_nimpipelines.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2674,6 +2674,10 @@ spec:
26742674
is set
26752675
rule: '!(has(self.multiNode) && has(self.scale) && has(self.scale.enabled)
26762676
&& self.scale.enabled)'
2677+
- message: .spec.expose.service.grpcPort must be set when .spec.router.gateway.grpcRoutesEnabled
2678+
is true
2679+
rule: '!(has(self.router.gateway) && self.router.gateway.grpcRoutesEnabled
2680+
&& !has(self.expose.service.grpcPort))'
26772681
- message: .spec.expose.ingress is deprecated, and will be removed
26782682
in a future release. If .spec.expose.ingress is set, please
26792683
do not set .spec.router.ingress.

bundle/manifests/apps.nvidia.com_nimservices.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2577,6 +2577,10 @@ spec:
25772577
- message: autoScaling must be nil or disabled when multiNode is set
25782578
rule: '!(has(self.multiNode) && has(self.scale) && has(self.scale.enabled)
25792579
&& self.scale.enabled)'
2580+
- message: .spec.expose.service.grpcPort must be set when .spec.router.gateway.grpcRoutesEnabled
2581+
is true
2582+
rule: '!(has(self.router.gateway) && self.router.gateway.grpcRoutesEnabled
2583+
&& !has(self.expose.service.grpcPort))'
25802584
- message: .spec.expose.ingress is deprecated, and will be removed in
25812585
a future release. If .spec.expose.ingress is set, please do not set
25822586
.spec.router.ingress.

config/crd/bases/apps.nvidia.com_nimpipelines.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2674,6 +2674,10 @@ spec:
26742674
is set
26752675
rule: '!(has(self.multiNode) && has(self.scale) && has(self.scale.enabled)
26762676
&& self.scale.enabled)'
2677+
- message: .spec.expose.service.grpcPort must be set when .spec.router.gateway.grpcRoutesEnabled
2678+
is true
2679+
rule: '!(has(self.router.gateway) && self.router.gateway.grpcRoutesEnabled
2680+
&& !has(self.expose.service.grpcPort))'
26772681
- message: .spec.expose.ingress is deprecated, and will be removed
26782682
in a future release. If .spec.expose.ingress is set, please
26792683
do not set .spec.router.ingress.

config/crd/bases/apps.nvidia.com_nimservices.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2577,6 +2577,10 @@ spec:
25772577
- message: autoScaling must be nil or disabled when multiNode is set
25782578
rule: '!(has(self.multiNode) && has(self.scale) && has(self.scale.enabled)
25792579
&& self.scale.enabled)'
2580+
- message: .spec.expose.service.grpcPort must be set when .spec.router.gateway.grpcRoutesEnabled
2581+
is true
2582+
rule: '!(has(self.router.gateway) && self.router.gateway.grpcRoutesEnabled
2583+
&& !has(self.expose.service.grpcPort))'
25802584
- message: .spec.expose.ingress is deprecated, and will be removed in
25812585
a future release. If .spec.expose.ingress is set, please do not set
25822586
.spec.router.ingress.

config/default/kustomization.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Adds namespace to all resources.
2-
namespace: k8s-nim-operator-system
2+
namespace: nemo
33

44
# Value of this field is prepended to the
55
# names of all resources, e.g. a deployment named

deployments/helm/k8s-nim-operator/crds/apps.nvidia.com_nimpipelines.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2674,6 +2674,10 @@ spec:
26742674
is set
26752675
rule: '!(has(self.multiNode) && has(self.scale) && has(self.scale.enabled)
26762676
&& self.scale.enabled)'
2677+
- message: .spec.expose.service.grpcPort must be set when .spec.router.gateway.grpcRoutesEnabled
2678+
is true
2679+
rule: '!(has(self.router.gateway) && self.router.gateway.grpcRoutesEnabled
2680+
&& !has(self.expose.service.grpcPort))'
26772681
- message: .spec.expose.ingress is deprecated, and will be removed
26782682
in a future release. If .spec.expose.ingress is set, please
26792683
do not set .spec.router.ingress.

deployments/helm/k8s-nim-operator/crds/apps.nvidia.com_nimservices.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2577,6 +2577,10 @@ spec:
25772577
- message: autoScaling must be nil or disabled when multiNode is set
25782578
rule: '!(has(self.multiNode) && has(self.scale) && has(self.scale.enabled)
25792579
&& self.scale.enabled)'
2580+
- message: .spec.expose.service.grpcPort must be set when .spec.router.gateway.grpcRoutesEnabled
2581+
is true
2582+
rule: '!(has(self.router.gateway) && self.router.gateway.grpcRoutesEnabled
2583+
&& !has(self.expose.service.grpcPort))'
25802584
- message: .spec.expose.ingress is deprecated, and will be removed in
25812585
a future release. If .spec.expose.ingress is set, please do not set
25822586
.spec.router.ingress.

internal/webhook/apps/v1alpha1/nimservice_webhook_validation_helper.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,23 @@ func validateNIMServiceSpec(spec *appsv1alpha1.NIMServiceSpec, fldPath *field.Pa
111111
warningList = append(warningList, w...)
112112
errList = append(errList, err...)
113113

114+
w, err = validateExposeRouterConfiguration(spec, fldPath)
115+
warningList = append(warningList, w...)
116+
errList = append(errList, err...)
117+
118+
return warningList, errList
119+
}
120+
121+
func validateExposeRouterConfiguration(spec *appsv1alpha1.NIMServiceSpec, fldPath *field.Path) (admission.Warnings, field.ErrorList) {
122+
warningList := admission.Warnings{}
123+
errList := field.ErrorList{}
124+
if spec.Expose.Service.Type == corev1.ServiceTypeLoadBalancer && (spec.Router.Gateway != nil || spec.Router.Ingress != nil) {
125+
warningList = append(warningList, "spec.expose.service.type is set to LoadBalancer, but spec.router.gateway or spec.router.ingress is also set. This creates two entry points for the service. Consider only using one of them.")
126+
}
127+
128+
if spec.Router.Gateway != nil && spec.Router.Gateway.GRPCRoutesEnabled && spec.Expose.Service.GRPCPort == nil {
129+
errList = append(errList, field.Required(fldPath.Child("expose").Child("service").Child("grpcPort"), "must be set when .spec.router.gateway.grpcRoutesEnabled is true"))
130+
}
114131
return warningList, errList
115132
}
116133

0 commit comments

Comments
 (0)