From 8555f8250af383903280efeb2fdbd896e7454e19 Mon Sep 17 00:00:00 2001 From: Hans Knecht Date: Fri, 11 Jun 2021 16:18:29 -0400 Subject: [PATCH 1/3] feat: copy labels from upstream Signed-off-by: Hans Knecht --- docs/gitbook/tutorials/gloo-progressive-delivery.md | 2 ++ pkg/apis/gloo/gloo/v1/types.go | 1 + pkg/apis/gloo/gloo/v1/zz_generated.deepcopy.go | 7 +++++++ pkg/router/gloo.go | 11 +++++++++++ 4 files changed, 21 insertions(+) diff --git a/docs/gitbook/tutorials/gloo-progressive-delivery.md b/docs/gitbook/tutorials/gloo-progressive-delivery.md index a661f0a1..f32ed976 100644 --- a/docs/gitbook/tutorials/gloo-progressive-delivery.md +++ b/docs/gitbook/tutorials/gloo-progressive-delivery.md @@ -160,6 +160,8 @@ spec: cmd: "hey -z 2m -q 5 -c 2 -host app.example.com http://gateway-proxy.gloo-system" ``` +*Note: when using upstreamRef the following fields are copied over from the original upstream: `Labels, SslConfig, CircuitBreakers, ConnectionConfig, UseHttp2, InitialStreamWindowSize`* + Save the above resource as podinfo-canary.yaml and then apply it: ```bash diff --git a/pkg/apis/gloo/gloo/v1/types.go b/pkg/apis/gloo/gloo/v1/types.go index 7348f338..77b142f2 100644 --- a/pkg/apis/gloo/gloo/v1/types.go +++ b/pkg/apis/gloo/gloo/v1/types.go @@ -18,6 +18,7 @@ type Upstream struct { type UpstreamSpec struct { Kube *KubeUpstream `json:"kube,omitempty"` + Labels map[string]string `json:"Labels,omitempty"` SslConfig *UpstreamSslConfig `json:"sslConfig,omitempty"` CircuitBreakers *CircuitBreakerConfig `json:"circuitBreakers,omitempty"` ConnectionConfig *ConnectionConfig `json:"connectionConfig,omitempty"` diff --git a/pkg/apis/gloo/gloo/v1/zz_generated.deepcopy.go b/pkg/apis/gloo/gloo/v1/zz_generated.deepcopy.go index edf42622..0b305b25 100644 --- a/pkg/apis/gloo/gloo/v1/zz_generated.deepcopy.go +++ b/pkg/apis/gloo/gloo/v1/zz_generated.deepcopy.go @@ -294,6 +294,13 @@ func (in *UpstreamSpec) DeepCopyInto(out *UpstreamSpec) { *out = new(KubeUpstream) (*in).DeepCopyInto(*out) } + if in.Labels != nil { + in, out := &in.Labels, &out.Labels + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } if in.SslConfig != nil { in, out := &in.SslConfig, &out.SslConfig *out = new(UpstreamSslConfig) diff --git a/pkg/router/gloo.go b/pkg/router/gloo.go index e5dc9bcd..3388f663 100644 --- a/pkg/router/gloo.go +++ b/pkg/router/gloo.go @@ -276,6 +276,7 @@ func (gr *GlooRouter) getGlooUpstreamKubeService(canary *flaggerv1.Canary, svc * if glooUpstreamWithConfig != nil { configSpec := glooUpstreamWithConfig.Spec upstreamSpec = gloov1.UpstreamSpec{ + Labels: configSpec.Labels, SslConfig: configSpec.SslConfig, CircuitBreakers: configSpec.CircuitBreakers, ConnectionConfig: configSpec.ConnectionConfig, @@ -293,10 +294,20 @@ func (gr *GlooRouter) getGlooUpstreamKubeService(canary *flaggerv1.Canary, svc * Selector: svc.Spec.Selector, } + upstreamLabels := make(map[string]string) + if upstreamSpec.Labels != nil { + for k, v := range upstreamSpec.Labels { // Order not specified + if _, ok := upstreamLabels[k]; !ok { + upstreamLabels[k] = v + } + } + } + return &gloov1.Upstream{ ObjectMeta: metav1.ObjectMeta{ Name: upstreamName, Namespace: canary.Namespace, + Labels: upstreamLabels, OwnerReferences: []metav1.OwnerReference{ *metav1.NewControllerRef(canary, schema.GroupVersionKind{ Group: flaggerv1.SchemeGroupVersion.Group, From 35c8957a5585f9aa7d4446fd211c0289baa7a6ea Mon Sep 17 00:00:00 2001 From: Hans Knecht Date: Sat, 12 Jun 2021 21:57:45 -0400 Subject: [PATCH 2/3] chore: lowercase labels Signed-off-by: Hans Knecht --- pkg/apis/gloo/gloo/v1/types.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/apis/gloo/gloo/v1/types.go b/pkg/apis/gloo/gloo/v1/types.go index 77b142f2..e37ba5d5 100644 --- a/pkg/apis/gloo/gloo/v1/types.go +++ b/pkg/apis/gloo/gloo/v1/types.go @@ -18,7 +18,7 @@ type Upstream struct { type UpstreamSpec struct { Kube *KubeUpstream `json:"kube,omitempty"` - Labels map[string]string `json:"Labels,omitempty"` + Labels map[string]string `json:"labels,omitempty"` SslConfig *UpstreamSslConfig `json:"sslConfig,omitempty"` CircuitBreakers *CircuitBreakerConfig `json:"circuitBreakers,omitempty"` ConnectionConfig *ConnectionConfig `json:"connectionConfig,omitempty"` From e7357c4e0727d8538671b80e0954db41fd87c6e8 Mon Sep 17 00:00:00 2001 From: Hans Knecht Date: Mon, 14 Jun 2021 11:39:55 -0400 Subject: [PATCH 3/3] fix: updating to use include-label-prefix fix: remove copy of labels Signed-off-by: Hans Knecht --- pkg/router/gloo.go | 18 +++++-------- pkg/router/util.go | 19 ++++++++++++++ pkg/router/util_test.go | 57 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 12 deletions(-) create mode 100644 pkg/router/util.go create mode 100644 pkg/router/util_test.go diff --git a/pkg/router/gloo.go b/pkg/router/gloo.go index 3388f663..823a16b5 100644 --- a/pkg/router/gloo.go +++ b/pkg/router/gloo.go @@ -38,10 +38,11 @@ import ( // GlooRouter is managing Gloo route tables type GlooRouter struct { - kubeClient kubernetes.Interface - glooClient clientset.Interface - flaggerClient clientset.Interface - logger *zap.SugaredLogger + kubeClient kubernetes.Interface + glooClient clientset.Interface + flaggerClient clientset.Interface + logger *zap.SugaredLogger + includeLabelPrefix []string } // Reconcile creates or updates the Gloo Edge route table @@ -294,14 +295,7 @@ func (gr *GlooRouter) getGlooUpstreamKubeService(canary *flaggerv1.Canary, svc * Selector: svc.Spec.Selector, } - upstreamLabels := make(map[string]string) - if upstreamSpec.Labels != nil { - for k, v := range upstreamSpec.Labels { // Order not specified - if _, ok := upstreamLabels[k]; !ok { - upstreamLabels[k] = v - } - } - } + upstreamLabels := includeLabelsByPrefix(upstreamSpec.Labels, gr.includeLabelPrefix) return &gloov1.Upstream{ ObjectMeta: metav1.ObjectMeta{ diff --git a/pkg/router/util.go b/pkg/router/util.go new file mode 100644 index 00000000..e2bb04ee --- /dev/null +++ b/pkg/router/util.go @@ -0,0 +1,19 @@ +package router + +import ( + "strings" +) + +func includeLabelsByPrefix(labels map[string]string, includeLabelPrefixes []string) map[string]string { + filteredLabels := make(map[string]string) + for key, value := range labels { + for _, includeLabelPrefix := range includeLabelPrefixes { + if includeLabelPrefix == "*" || strings.HasPrefix(key, includeLabelPrefix) { + filteredLabels[key] = value + break + } + } + } + + return filteredLabels +} diff --git a/pkg/router/util_test.go b/pkg/router/util_test.go new file mode 100644 index 00000000..2069810e --- /dev/null +++ b/pkg/router/util_test.go @@ -0,0 +1,57 @@ +/* +Copyright 2020 The Flux authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package router + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestIncludeLabelsByPrefix(t *testing.T) { + labels := map[string]string{ + "foo": "foo-value", + "bar": "bar-value", + "lorem": "ipsum", + } + includeLabelPrefix := []string{"foo", "lor"} + + filteredLabels := includeLabelsByPrefix(labels, includeLabelPrefix) + + assert.Equal(t, filteredLabels, map[string]string{ + "foo": "foo-value", + "lorem": "ipsum", + // bar excluded + }) +} + +func TestIncludeLabelsByPrefixWithWildcard(t *testing.T) { + labels := map[string]string{ + "foo": "foo-value", + "bar": "bar-value", + "lorem": "ipsum", + } + includeLabelPrefix := []string{"*"} + + filteredLabels := includeLabelsByPrefix(labels, includeLabelPrefix) + + assert.Equal(t, filteredLabels, map[string]string{ + "foo": "foo-value", + "bar": "bar-value", + "lorem": "ipsum", + }) +}