Skip to content

Commit

Permalink
Merge pull request #932 from KnechtionsCoding/feat/gloo-label-copy
Browse files Browse the repository at this point in the history
gloo: copy labels from upstream
  • Loading branch information
stefanprodan authored Jun 15, 2021
2 parents c44de2d + e7357c4 commit 17c310d
Show file tree
Hide file tree
Showing 6 changed files with 95 additions and 4 deletions.
2 changes: 2 additions & 0 deletions docs/gitbook/tutorials/gloo-progressive-delivery.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions pkg/apis/gloo/gloo/v1/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"`
Expand Down
7 changes: 7 additions & 0 deletions pkg/apis/gloo/gloo/v1/zz_generated.deepcopy.go

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

13 changes: 9 additions & 4 deletions pkg/router/gloo.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -276,6 +277,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,
Expand All @@ -293,10 +295,13 @@ func (gr *GlooRouter) getGlooUpstreamKubeService(canary *flaggerv1.Canary, svc *
Selector: svc.Spec.Selector,
}

upstreamLabels := includeLabelsByPrefix(upstreamSpec.Labels, gr.includeLabelPrefix)

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,
Expand Down
19 changes: 19 additions & 0 deletions pkg/router/util.go
Original file line number Diff line number Diff line change
@@ -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
}
57 changes: 57 additions & 0 deletions pkg/router/util_test.go
Original file line number Diff line number Diff line change
@@ -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",
})
}

0 comments on commit 17c310d

Please sign in to comment.