Skip to content

Commit

Permalink
Merge pull request #1185 from philnichol/adding-appprotocol
Browse files Browse the repository at this point in the history
feat: Add an optional `appProtocol` field to `spec.service`
  • Loading branch information
aryan9600 authored May 19, 2022
2 parents c03d138 + d798988 commit 560f884
Show file tree
Hide file tree
Showing 6 changed files with 17 additions and 0 deletions.
3 changes: 3 additions & 0 deletions artifacts/flagger/crd.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,9 @@ spec:
portName:
description: Container port name
type: string
appProtocol:
description: Application protocol of the port
type: string
targetPort:
description: Container target port name
x-kubernetes-int-or-string: true
Expand Down
2 changes: 2 additions & 0 deletions docs/gitbook/usage/how-it-works.md
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ spec:
name: podinfo
port: 9898
portName: http
appProtocol: http
targetPort: 9898
portDiscovery: true
```
Expand All @@ -142,6 +143,7 @@ The container port from the target workload should match the `service.port` or `
The `service.name` is optional, defaults to `spec.targetRef.name`.
The `service.targetPort` can be a container port number or name.
The `service.portName` is optional (defaults to `http`), if your workload uses gRPC then set the port name to `grpc`.
The `service.appProtocol` is optional, more details can be found [here](https://kubernetes.io/docs/concepts/services-networking/service/#application-protocol).

If port discovery is enabled, Flagger scans the target workload and extracts the containers ports
excluding the port specified in the canary service and service mesh sidecar ports.
Expand Down
5 changes: 5 additions & 0 deletions pkg/apis/flagger/v1beta1/canary.go
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,11 @@ type CanaryService struct {
// +optional
TargetPort intstr.IntOrString `json:"targetPort,omitempty"`

// AppProtocol of the service
// https://kubernetes.io/docs/concepts/services-networking/service/#application-protocol
// +optional
AppProtocol string `json:"appProtocol,omitempty"`

// PortDiscovery adds all container ports to the generated Kubernetes service
PortDiscovery bool `json:"portDiscovery"`

Expand Down
4 changes: 4 additions & 0 deletions pkg/router/kubernetes_default.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,10 @@ func (c *KubernetesDefaultRouter) reconcileService(canary *flaggerv1.Canary, nam
},
}

if v := canary.Spec.Service.AppProtocol; v != "" {
svcSpec.Ports[0].AppProtocol = &v
}

// set additional ports
for n, p := range c.ports {
cp := corev1.ServicePort{
Expand Down
2 changes: 2 additions & 0 deletions pkg/router/kubernetes_default_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ func TestServiceRouter_Create(t *testing.T) {
flaggerClient: mocks.flaggerClient,
logger: mocks.logger,
}
appProtocol := "http"

err := router.Initialize(mocks.canary)
require.NoError(t, err)
Expand All @@ -49,6 +50,7 @@ func TestServiceRouter_Create(t *testing.T) {
canarySvc, err := mocks.kubeClient.CoreV1().Services("default").Get(context.TODO(), "podinfo-canary", metav1.GetOptions{})
require.NoError(t, err)

assert.Equal(t, &appProtocol, canarySvc.Spec.Ports[0].AppProtocol)
assert.Equal(t, "http", canarySvc.Spec.Ports[0].Name)
assert.Equal(t, int32(9898), canarySvc.Spec.Ports[0].Port)

Expand Down
1 change: 1 addition & 0 deletions pkg/router/router_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ func newTestCanary() *flaggerv1.Canary {
Service: flaggerv1.CanaryService{
Port: 9898,
PortDiscovery: true,
AppProtocol: "http",
Headers: &istiov1alpha3.Headers{
Request: &istiov1alpha3.HeaderOperations{
Add: map[string]string{
Expand Down

0 comments on commit 560f884

Please sign in to comment.