Skip to content

Commit 4bde27f

Browse files
acouvreurBapRx
authored andcommitted
fix(kubernetes): support public labels
closes sablierapp#449
1 parent 79f83d7 commit 4bde27f

File tree

10 files changed

+83
-74
lines changed

10 files changed

+83
-74
lines changed

app/discovery/autostop.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,13 @@ import (
1515
func StopAllUnregisteredInstances(ctx context.Context, provider providers.Provider, registered []string) error {
1616
log.Info("Stopping all unregistered running instances")
1717

18-
log.Tracef("Retrieving all instances with label [%v=true]", LabelEnable)
19-
instances, err := provider.InstanceList(ctx, providers.InstanceListOptions{
20-
All: false, // Only running containers
21-
Labels: []string{LabelEnable},
22-
})
18+
log.Trace("Retrieving all registered instances")
19+
instances, err := provider.List(ctx)
2320
if err != nil {
2421
return err
2522
}
2623

27-
log.Tracef("Found %v instances with label [%v=true]", len(instances), LabelEnable)
24+
log.Tracef("Found %v instances", len(instances))
2825
names := make([]string, 0, len(instances))
2926
for _, instance := range instances {
3027
names = append(names, instance.Name)

app/discovery/autostop_test.go

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"context"
55
"errors"
66
"github.com/sablierapp/sablier/app/discovery"
7-
"github.com/sablierapp/sablier/app/providers"
87
"github.com/sablierapp/sablier/app/providers/mock"
98
"github.com/sablierapp/sablier/app/types"
109
"testing"
@@ -22,11 +21,8 @@ func TestStopAllUnregisteredInstances(t *testing.T) {
2221
}
2322
registered := []string{"instance1"}
2423

25-
// Set up expectations for InstanceList
26-
mockProvider.On("InstanceList", ctx, providers.InstanceListOptions{
27-
All: false,
28-
Labels: []string{discovery.LabelEnable},
29-
}).Return(instances, nil)
24+
// Set up expectations for List
25+
mockProvider.On("List", ctx).Return(instances, nil)
3026

3127
// Set up expectations for Stop
3228
mockProvider.On("Stop", ctx, "instance2").Return(nil)
@@ -54,11 +50,8 @@ func TestStopAllUnregisteredInstances_WithError(t *testing.T) {
5450
}
5551
registered := []string{"instance1"}
5652

57-
// Set up expectations for InstanceList
58-
mockProvider.On("InstanceList", ctx, providers.InstanceListOptions{
59-
All: false,
60-
Labels: []string{discovery.LabelEnable},
61-
}).Return(instances, nil)
53+
// Set up expectations for List
54+
mockProvider.On("List", ctx).Return(instances, nil)
6255

6356
// Set up expectations for Stop with error
6457
mockProvider.On("Stop", ctx, "instance2").Return(errors.New("stop error"))

app/providers/docker/list.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,16 @@ import (
77
"github.com/docker/docker/api/types/container"
88
"github.com/docker/docker/api/types/filters"
99
"github.com/sablierapp/sablier/app/discovery"
10-
"github.com/sablierapp/sablier/app/providers"
1110
"github.com/sablierapp/sablier/app/types"
1211
"strings"
1312
)
1413

15-
func (provider *DockerClassicProvider) InstanceList(ctx context.Context, options providers.InstanceListOptions) ([]types.Instance, error) {
14+
func (provider *DockerClassicProvider) List(ctx context.Context) ([]types.Instance, error) {
1615
args := filters.NewArgs()
17-
for _, label := range options.Labels {
18-
args.Add("label", label)
19-
args.Add("label", fmt.Sprintf("%s=true", label))
20-
}
16+
args.Add("label", fmt.Sprintf("%s=true", discovery.LabelEnable))
2117

2218
containers, err := provider.Client.ContainerList(ctx, container.ListOptions{
23-
All: options.All,
19+
All: true,
2420
Filters: args,
2521
})
2622

app/providers/dockerswarm/list.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,14 @@ import (
77
"github.com/docker/docker/api/types/filters"
88
"github.com/docker/docker/api/types/swarm"
99
"github.com/sablierapp/sablier/app/discovery"
10-
"github.com/sablierapp/sablier/app/providers"
1110
"github.com/sablierapp/sablier/app/types"
1211
log "github.com/sirupsen/logrus"
1312
"strconv"
1413
)
1514

16-
func (provider *DockerSwarmProvider) InstanceList(ctx context.Context, options providers.InstanceListOptions) ([]types.Instance, error) {
15+
func (provider *DockerSwarmProvider) List(ctx context.Context) ([]types.Instance, error) {
1716
args := filters.NewArgs()
18-
for _, label := range options.Labels {
19-
args.Add("label", label)
20-
args.Add("label", fmt.Sprintf("%s=true", label))
21-
}
17+
args.Add("label", fmt.Sprintf("%s=true", discovery.LabelEnable))
2218

2319
services, err := provider.Client.ServiceList(ctx, dockertypes.ServiceListOptions{
2420
Filters: args,

app/providers/kubernetes/list.go

Lines changed: 49 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,33 +3,51 @@ package kubernetes
33
import (
44
"context"
55
"github.com/sablierapp/sablier/app/discovery"
6-
"github.com/sablierapp/sablier/app/providers"
76
"github.com/sablierapp/sablier/app/types"
87
log "github.com/sirupsen/logrus"
98
v1 "k8s.io/api/apps/v1"
109
core_v1 "k8s.io/api/core/v1"
1110
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11+
"k8s.io/apimachinery/pkg/labels"
12+
"k8s.io/apimachinery/pkg/selection"
1213
"strconv"
13-
"strings"
1414
)
1515

16-
func (provider *KubernetesProvider) InstanceList(ctx context.Context, options providers.InstanceListOptions) ([]types.Instance, error) {
17-
deployments, err := provider.deploymentList(ctx, options)
16+
const (
17+
LabelEnable = "sablierapp.dev/enable"
18+
LabelGroup = "sablierapp.dev/group"
19+
LabelGroupDefaultValue = "default"
20+
LabelReplicas = "sablierapp.dev/replicas"
21+
LabelReplicasDefaultValue uint64 = 1
22+
)
23+
24+
func (provider *KubernetesProvider) List(ctx context.Context) ([]types.Instance, error) {
25+
deployments, err := provider.deploymentList(ctx)
1826
if err != nil {
1927
return nil, err
2028
}
2129

22-
statefulSets, err := provider.statefulSetList(ctx, options)
30+
statefulSets, err := provider.statefulSetList(ctx)
2331
if err != nil {
2432
return nil, err
2533
}
2634

2735
return append(deployments, statefulSets...), nil
2836
}
2937

30-
func (provider *KubernetesProvider) deploymentList(ctx context.Context, options providers.InstanceListOptions) ([]types.Instance, error) {
38+
func (provider *KubernetesProvider) deploymentList(ctx context.Context) ([]types.Instance, error) {
39+
requirement, err := labels.NewRequirement(LabelEnable, selection.Equals, []string{"true"})
40+
if err != nil {
41+
return nil, err
42+
}
43+
requirementDeprecated, err := labels.NewRequirement(discovery.LabelEnable, selection.Equals, []string{"true"})
44+
if err != nil {
45+
return nil, err
46+
}
47+
selector := labels.NewSelector()
48+
selector = selector.Add(*requirement, *requirementDeprecated)
3149
deployments, err := provider.Client.AppsV1().Deployments(core_v1.NamespaceAll).List(ctx, metav1.ListOptions{
32-
LabelSelector: strings.Join(options.Labels, ","),
50+
LabelSelector: selector.String(),
3351
})
3452

3553
if err != nil {
@@ -49,23 +67,23 @@ func (provider *KubernetesProvider) deploymentToInstance(d v1.Deployment) types.
4967
var group string
5068
var replicas uint64
5169

52-
if _, ok := d.Labels[discovery.LabelEnable]; ok {
53-
if g, ok := d.Labels[discovery.LabelGroup]; ok {
70+
if _, ok := d.Labels[LabelEnable]; ok {
71+
if g, ok := d.Labels[LabelGroup]; ok {
5472
group = g
5573
} else {
56-
group = discovery.LabelGroupDefaultValue
74+
group = LabelGroupDefaultValue
5775
}
5876

59-
if r, ok := d.Labels[discovery.LabelReplicas]; ok {
77+
if r, ok := d.Labels[LabelReplicas]; ok {
6078
atoi, err := strconv.Atoi(r)
6179
if err != nil {
6280
log.Warnf("Defaulting to default replicas value, could not convert value \"%v\" to int: %v", r, err)
63-
replicas = discovery.LabelReplicasDefaultValue
81+
replicas = LabelReplicasDefaultValue
6482
} else {
6583
replicas = uint64(atoi)
6684
}
6785
} else {
68-
replicas = discovery.LabelReplicasDefaultValue
86+
replicas = LabelReplicasDefaultValue
6987
}
7088
}
7189

@@ -82,9 +100,19 @@ func (provider *KubernetesProvider) deploymentToInstance(d v1.Deployment) types.
82100
}
83101
}
84102

85-
func (provider *KubernetesProvider) statefulSetList(ctx context.Context, options providers.InstanceListOptions) ([]types.Instance, error) {
103+
func (provider *KubernetesProvider) statefulSetList(ctx context.Context) ([]types.Instance, error) {
104+
requirement, err := labels.NewRequirement(LabelEnable, selection.Equals, []string{"true"})
105+
if err != nil {
106+
return nil, err
107+
}
108+
requirementDeprecated, err := labels.NewRequirement(discovery.LabelEnable, selection.Equals, []string{"true"})
109+
if err != nil {
110+
return nil, err
111+
}
112+
selector := labels.NewSelector()
113+
selector = selector.Add(*requirement, *requirementDeprecated)
86114
statefulSets, err := provider.Client.AppsV1().StatefulSets(core_v1.NamespaceAll).List(ctx, metav1.ListOptions{
87-
LabelSelector: strings.Join(options.Labels, ","),
115+
LabelSelector: selector.String(),
88116
})
89117

90118
if err != nil {
@@ -104,23 +132,23 @@ func (provider *KubernetesProvider) statefulSetToInstance(ss v1.StatefulSet) typ
104132
var group string
105133
var replicas uint64
106134

107-
if _, ok := ss.Labels[discovery.LabelEnable]; ok {
108-
if g, ok := ss.Labels[discovery.LabelGroup]; ok {
135+
if _, ok := ss.Labels[LabelEnable]; ok {
136+
if g, ok := ss.Labels[LabelGroup]; ok {
109137
group = g
110138
} else {
111-
group = discovery.LabelGroupDefaultValue
139+
group = LabelGroupDefaultValue
112140
}
113141

114-
if r, ok := ss.Labels[discovery.LabelReplicas]; ok {
142+
if r, ok := ss.Labels[LabelReplicas]; ok {
115143
atoi, err := strconv.Atoi(r)
116144
if err != nil {
117145
log.Warnf("Defaulting to default replicas value, could not convert value \"%v\" to int: %v", r, err)
118-
replicas = discovery.LabelReplicasDefaultValue
146+
replicas = LabelReplicasDefaultValue
119147
} else {
120148
replicas = uint64(atoi)
121149
}
122150
} else {
123-
replicas = discovery.LabelReplicasDefaultValue
151+
replicas = LabelReplicasDefaultValue
124152
}
125153
}
126154

app/providers/mock/mock.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ func (m *ProviderMock) GetGroups(ctx context.Context) (map[string][]string, erro
3232
args := m.Called(ctx)
3333
return args.Get(0).(map[string][]string), args.Error(1)
3434
}
35-
func (m *ProviderMock) InstanceList(ctx context.Context, options providers.InstanceListOptions) ([]types.Instance, error) {
36-
args := m.Called(ctx, options)
35+
func (m *ProviderMock) List(ctx context.Context) ([]types.Instance, error) {
36+
args := m.Called(ctx)
3737
return args.Get(0).([]types.Instance), args.Error(1)
3838
}
3939

app/providers/provider.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ type Provider interface {
1212
Stop(ctx context.Context, name string) error
1313
GetState(ctx context.Context, name string) (instance.State, error)
1414
GetGroups(ctx context.Context) (map[string][]string, error)
15-
InstanceList(ctx context.Context, options InstanceListOptions) ([]types.Instance, error)
15+
List(ctx context.Context) ([]types.Instance, error)
1616

1717
NotifyInstanceStopped(ctx context.Context, instance chan<- string)
1818
}

app/providers/types.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package providers
22

33
type InstanceListOptions struct {
4-
All bool
5-
Labels []string
4+
All bool
65
}

docs/providers/kubernetes.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,17 +74,17 @@ kind: Deployment
7474
metadata:
7575
name: whoami
7676
labels:
77-
app: whoami
78-
sablier.enable: "true"
79-
sablier.group: mygroup
77+
app.kubernetes.io/name: whoami
78+
sablierapp.dev/enable: "true"
79+
sablierapp.dev/group: mygroup
8080
spec:
8181
selector:
8282
matchLabels:
83-
app: whoami
83+
app.kubernetes.io/name: whoami
8484
template:
8585
metadata:
8686
labels:
87-
app: whoami
87+
app.kubernetes.io/name: whoami
8888
spec:
8989
containers:
9090
- name: whoami

plugins/traefik/e2e/kubernetes/manifests/deployment.yml

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
apiVersion: apps/v1
22
kind: Deployment
33
metadata:
4-
name: whoami-deployment
4+
name: whoami
55
labels:
6-
app: whoami
7-
sablier.enable: "true"
8-
sablier.group: "E2E"
6+
app.kubernetes.io/name: whoami
7+
sablierapp.dev/enable: "true"
8+
sablierapp.dev/group: "E2E"
99
spec:
1010
replicas: 0
1111
selector:
1212
matchLabels:
13-
app: whoami
13+
app.kubernetes.io/name: whoami
1414
template:
1515
metadata:
1616
labels:
17-
app: whoami
17+
app.kubernetes.io/name: whoami
1818
spec:
1919
containers:
2020
- name: whoami
@@ -36,7 +36,7 @@ spec:
3636
targetPort: 80
3737
port: 80
3838
selector:
39-
app: whoami
39+
app.kubernetes.io/name: whoami
4040
---
4141
apiVersion: traefik.io/v1alpha1
4242
kind: Middleware
@@ -160,18 +160,18 @@ kind: Deployment
160160
metadata:
161161
name: nginx-deployment
162162
labels:
163-
app: nginx
164-
sablier.enable: "true"
165-
sablier.group: "E2E"
163+
app.kubernetes.io/name: nginx
164+
sablierapp.dev/enable: "true"
165+
sablierapp.dev/group: "E2E"
166166
spec:
167167
replicas: 0
168168
selector:
169169
matchLabels:
170-
app: nginx
170+
app.kubernetes.io/name: nginx
171171
template:
172172
metadata:
173173
labels:
174-
app: nginx
174+
app.kubernetes.io/name: nginx
175175
spec:
176176
containers:
177177
- name: nginx
@@ -195,7 +195,7 @@ spec:
195195
targetPort: 80
196196
port: 80
197197
selector:
198-
app: nginx
198+
app.kubernetes.io/name: nginx
199199
---
200200
apiVersion: traefik.io/v1alpha1
201201
kind: Middleware

0 commit comments

Comments
 (0)