Skip to content

Commit a087118

Browse files
fra98adamjensenbot
authored andcommitted
fix: added unique names to all controllers
1 parent e2bba7b commit a087118

File tree

52 files changed

+157
-123
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+157
-123
lines changed

cmd/crd-replicator/main.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -95,13 +95,13 @@ func main() {
9595
clusterID, namespaceManager),
9696
}
9797
if err = d.SetupWithManager(mgr); err != nil {
98-
klog.Error(err, "unable to setup the crdreplicator-operator")
98+
klog.Error(err, "unable to setup the crdReplicator controller")
9999
os.Exit(1)
100100
}
101101

102-
klog.Info("Starting crdreplicator-operator")
102+
klog.Info("Starting crdReplicator manager")
103103
if err := mgr.Start(ctx); err != nil {
104-
klog.Error(err, "problem running manager")
104+
klog.Error(err, "unable to start the crdReplicator manager")
105105
os.Exit(1)
106106
}
107107
}

cmd/liqo-controller-manager/main.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ import (
5050
identitymanager "github.com/liqotech/liqo/pkg/identityManager"
5151
"github.com/liqotech/liqo/pkg/ipam"
5252
remoteresourceslicecontroller "github.com/liqotech/liqo/pkg/liqo-controller-manager/authentication/remoteresourceslice-controller"
53-
foreignclustercontroller "github.com/liqotech/liqo/pkg/liqo-controller-manager/foreigncluster-controller"
53+
foreignclustercontroller "github.com/liqotech/liqo/pkg/liqo-controller-manager/core/foreigncluster-controller"
5454
ipmapping "github.com/liqotech/liqo/pkg/liqo-controller-manager/ipmapping"
5555
quotacreatorcontroller "github.com/liqotech/liqo/pkg/liqo-controller-manager/quotacreator-controller"
5656
virtualnodecreatorcontroller "github.com/liqotech/liqo/pkg/liqo-controller-manager/virtualnodecreator-controller"
@@ -393,6 +393,7 @@ func main() {
393393
}
394394
}
395395

396+
// CORE OPERATORS
396397
// Configure the foreigncluster controller.
397398
idManager := identitymanager.NewCertificateIdentityManager(ctx, mgr.GetClient(), clientset, mgr.GetConfig(), clusterID, namespaceManager)
398399
foreignClusterReconciler := &foreignclustercontroller.ForeignClusterReconciler{

internal/crdReplicator/crdReplicator-operator.go

+3-5
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,7 @@ import (
4343
)
4444

4545
const (
46-
operatorName = "crdReplicator-operator"
47-
finalizer = "crdreplicator.liqo.io/operator"
46+
finalizer = "crdreplicator.liqo.io/operator"
4847
)
4948

5049
// Controller reconciles identity Secrets to start/stop the reflection of registered resources to remote clusters.
@@ -166,10 +165,9 @@ func (c *Controller) SetupWithManager(mgr ctrl.Manager) error {
166165
return err
167166
}
168167

169-
return ctrl.NewControllerManagedBy(mgr).
170-
Named(operatorName).
171-
WithEventFilter(resourceToBeProccesedPredicate).
168+
return ctrl.NewControllerManagedBy(mgr).Named(consts.CtrlSecretCRDReplicator).
172169
For(&corev1.Secret{}, builder.WithPredicates(secretsFilter)).
170+
WithEventFilter(resourceToBeProccesedPredicate).
173171
Complete(c)
174172
}
175173

pkg/consts/controllers.go

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
// Copyright 2019-2024 The Liqo Authors
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package consts
16+
17+
// Constants used to name and identify controllers.
18+
// Controller-runtime requires that each controller has a unique name within the container.
19+
// This name is used, for example, to identify a controller univocally in the logs
20+
// and must be a prometheus compatible name (underscores and alphanumeric characters only).
21+
// As a convention to avoid conflicts, we use the name of the reconciled resource (lowercase version of their kind),
22+
// and, if already used, we add a recognizable identifier, separated by the underscore character.
23+
// To catch duplicated names, we name the constant as its value (in CamelCase and stripping the separator character),
24+
// with the prefix "Ctrl".
25+
const (
26+
// Core.
27+
CtrlForeignCluster = "foreigncluster"
28+
CtrlSecretCRDReplicator = "secret_crdreplicator" //nolint:gosec // not a credential
29+
30+
// Networking.
31+
CtrlConfigurationExternal = "configuration_external"
32+
CtrlConfigurationInternal = "configuration_internal"
33+
CtrlConfigurationRemapping = "configuration_remapping"
34+
CtrlConfigurationRoute = "configuration_route"
35+
CtrlConnection = "connection"
36+
CtrlFirewallConfiguration = "firewallconfiguration"
37+
CtrlGatewayClientExternal = "gatewayclient_external"
38+
CtrlGatewayClientInternal = "gatewayclient_internal"
39+
CtrlGatewayServerExternal = "gatewayserver_external"
40+
CtrlGatewayServerInternal = "gatewayserver_internal"
41+
CtrlInternalFabricCM = "internalfabric_cm"
42+
CtrlInternalFabricFabric = "internalfabric_fabric"
43+
CtrlInternalNodeGeneve = "internalnode_geneve"
44+
CtrlInternalNodeRoute = "internalnode_route"
45+
CtrlIP = "ip"
46+
CtrlIPRemapping = "ip_remapping"
47+
CtrlNetwork = "network"
48+
CtrlNode = "node"
49+
CtrlPodGateway = "pod_gateway"
50+
CtrlPodGwMasq = "pod_gw_masq"
51+
CtrlPodInternalNet = "pod_internalnet"
52+
CtrlPublicKey = "publickey"
53+
CtrlRouteConfiguration = "routeconfiguration"
54+
CtrlWGGatewayClient = "wggatewayclient"
55+
CtrlWGGatewayServer = "wggatewayserver"
56+
57+
// Authentication.
58+
CtrlIdentity = "identity"
59+
CtrlIdentityCreator = "identity_creator"
60+
CtrlSecretNonceCreator = "secret_noncecreator"
61+
CtrlSecretNonceSigner = "secret_noncesigner"
62+
CtrlResourceSliceLocal = "resourceslice_local"
63+
CtrlResourceSliceRemote = "resourceslice_remote"
64+
CtrlTenant = "tenant"
65+
66+
// Offloading.
67+
CtrlNamespaceMap = "namespacemap"
68+
CtrlNamespaceOffloading = "namespaceoffloading"
69+
CtrlNodeFailure = "node_failure"
70+
CtrlPodStatus = "pod_status"
71+
CtrlShadowEndpointSlice = "shadowendpointslice"
72+
CtrlShadowPod = "shadowpod"
73+
CtrlVirtualNode = "virtualnode"
74+
75+
// Cross modules.
76+
CtrlResourceSliceQuotaCreator = "resourceslice_quotacreator"
77+
CtrlResourceSliceVNCreator = "resourceslice_vncreator"
78+
CtrlPodIPMapping = "pod_ipmapping"
79+
CtrlConfigurationIPMapping = "configuration_ipmapping"
80+
)

pkg/fabric/internalfabric_controller.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
ctrlutil "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
2929

3030
networkingv1beta1 "github.com/liqotech/liqo/apis/networking/v1beta1"
31+
"github.com/liqotech/liqo/pkg/consts"
3132
"github.com/liqotech/liqo/pkg/utils/network/geneve"
3233
)
3334

@@ -126,7 +127,7 @@ func (r *InternalFabricReconciler) Reconcile(ctx context.Context, req ctrl.Reque
126127

127128
// SetupWithManager register the InternalFabricReconciler to the manager.
128129
func (r *InternalFabricReconciler) SetupWithManager(mgr ctrl.Manager) error {
129-
return ctrl.NewControllerManagedBy(mgr).
130+
return ctrl.NewControllerManagedBy(mgr).Named(consts.CtrlInternalFabricFabric).
130131
For(&networkingv1beta1.InternalFabric{}).
131132
Complete(r)
132133
}

pkg/fabric/source-detector/gateway_controller.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import (
3232
"sigs.k8s.io/controller-runtime/pkg/predicate"
3333

3434
networkingv1beta1 "github.com/liqotech/liqo/apis/networking/v1beta1"
35+
"github.com/liqotech/liqo/pkg/consts"
3536
"github.com/liqotech/liqo/pkg/fabric"
3637
"github.com/liqotech/liqo/pkg/gateway"
3738
)
@@ -115,7 +116,7 @@ func (r *GatewayReconciler) SetupWithManager(mgr ctrl.Manager) error {
115116
return err
116117
}
117118

118-
return ctrl.NewControllerManagedBy(mgr).
119+
return ctrl.NewControllerManagedBy(mgr).Named(consts.CtrlPodGateway).
119120
For(&corev1.Pod{}, builder.WithPredicates(filterByLabelsGatewayPods)).
120121
Complete(r)
121122
}

pkg/firewall/firewallconfiguration_controller.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import (
3535
"sigs.k8s.io/controller-runtime/pkg/predicate"
3636

3737
networkingv1beta1 "github.com/liqotech/liqo/apis/networking/v1beta1"
38+
"github.com/liqotech/liqo/pkg/consts"
3839
"github.com/liqotech/liqo/pkg/utils/network/netmonitor"
3940
)
4041

@@ -172,7 +173,7 @@ func (r *FirewallConfigurationReconciler) SetupWithManager(ctx context.Context,
172173
go func() {
173174
utilruntime.Must(netmonitor.InterfacesMonitoring(ctx, src, &netmonitor.Options{Nftables: &netmonitor.OptionsNftables{Delete: true}}))
174175
}()
175-
return ctrl.NewControllerManagedBy(mgr).
176+
return ctrl.NewControllerManagedBy(mgr).Named(consts.CtrlFirewallConfiguration).
176177
For(&networkingv1beta1.FirewallConfiguration{}, builder.WithPredicates(filterByLabelsPredicate)).
177178
WatchesRawSource(NewFirewallWatchSource(src, NewFirewallWatchEventHandler(r.Client, r.LabelsSets))).
178179
Complete(r)

pkg/gateway/connection/connections_controller.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ func (r *ConnectionsReconciler) SetupWithManager(mgr ctrl.Manager) error {
117117
if err != nil {
118118
return err
119119
}
120-
return ctrl.NewControllerManagedBy(mgr).
120+
return ctrl.NewControllerManagedBy(mgr).Named(consts.CtrlConnection).
121121
For(&networkingv1beta1.Connection{}, builder.WithPredicates(filterByLabelsPredicate)).
122122
Complete(r)
123123
}

pkg/gateway/fabric/geneve/internalnode_controller.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
"sigs.k8s.io/controller-runtime/pkg/client"
2929

3030
networkingv1beta1 "github.com/liqotech/liqo/apis/networking/v1beta1"
31+
"github.com/liqotech/liqo/pkg/consts"
3132
"github.com/liqotech/liqo/pkg/gateway/fabric"
3233
"github.com/liqotech/liqo/pkg/utils/network/geneve"
3334
)
@@ -116,7 +117,7 @@ func (r *InternalNodeReconciler) Reconcile(ctx context.Context, req ctrl.Request
116117

117118
// SetupWithManager register the InternalNodeReconciler to the manager.
118119
func (r *InternalNodeReconciler) SetupWithManager(mgr ctrl.Manager) error {
119-
return ctrl.NewControllerManagedBy(mgr).
120+
return ctrl.NewControllerManagedBy(mgr).Named(consts.CtrlInternalNodeGeneve).
120121
For(&networkingv1beta1.InternalNode{}).
121122
Complete(r)
122123
}

pkg/gateway/tunnel/wireguard/publickeys_controller.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ func (r *PublicKeysReconciler) Reconcile(ctx context.Context, req ctrl.Request)
8888

8989
// SetupWithManager register the ConfigurationReconciler to the manager.
9090
func (r *PublicKeysReconciler) SetupWithManager(mgr ctrl.Manager, src <-chan event.GenericEvent) error {
91-
return ctrl.NewControllerManagedBy(mgr).
91+
return ctrl.NewControllerManagedBy(mgr).Named(consts.CtrlPublicKey).
9292
For(&networkingv1beta1.PublicKey{}, r.Predicates()).
9393
WatchesRawSource(NewDNSSource(src, NewDNSEventHandler(r.Client, r.Options))).
9494
Complete(r)

pkg/liqo-controller-manager/authentication/identity-controller/identity_controller.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
2929

3030
authv1beta1 "github.com/liqotech/liqo/apis/authentication/v1beta1"
31+
"github.com/liqotech/liqo/pkg/consts"
3132
"github.com/liqotech/liqo/pkg/liqo-controller-manager/authentication"
3233
"github.com/liqotech/liqo/pkg/liqo-controller-manager/authentication/forge"
3334
)
@@ -88,7 +89,7 @@ func (r *IdentityReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
8889

8990
// SetupWithManager sets up the controller with the Manager.
9091
func (r *IdentityReconciler) SetupWithManager(mgr ctrl.Manager) error {
91-
return ctrl.NewControllerManagedBy(mgr).
92+
return ctrl.NewControllerManagedBy(mgr).Named(consts.CtrlIdentity).
9293
For(&authv1beta1.Identity{}).
9394
Owns(&corev1.Secret{}).
9495
Complete(r)

pkg/liqo-controller-manager/authentication/identitycreator-controller/identitycreator_controller.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ func (r *IdentityCreatorReconciler) SetupWithManager(mgr ctrl.Manager) error {
135135
return err
136136
}
137137

138-
return ctrl.NewControllerManagedBy(mgr).
138+
return ctrl.NewControllerManagedBy(mgr).Named(consts.CtrlIdentityCreator).
139139
For(&authv1beta1.ResourceSlice{}, builder.WithPredicates(predicate.And(localResSliceFilter, withAuthCondition()))).
140140
Owns(&authv1beta1.Identity{}).
141141
Complete(r)

pkg/liqo-controller-manager/authentication/localresourceslice-controller/localresourceslice_controller.go

+2-5
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,6 @@ import (
3636
tenantnamespace "github.com/liqotech/liqo/pkg/tenantNamespace"
3737
)
3838

39-
// ControllerName is the name of the controller.
40-
const ControllerName = "localResourceSlice"
41-
4239
// NewLocalResourceSliceReconciler returns a new LocalResourceSliceReconciler.
4340
func NewLocalResourceSliceReconciler(cl client.Client, s *runtime.Scheme,
4441
recorder record.EventRecorder, liqoNamespace string,
@@ -120,7 +117,7 @@ func (r *LocalResourceSliceReconciler) Reconcile(ctx context.Context, req ctrl.R
120117
return ctrl.Result{}, err
121118
}
122119

123-
if resourceSlice.Spec.CSR == nil || len(resourceSlice.Spec.CSR) == 0 {
120+
if len(resourceSlice.Spec.CSR) == 0 {
124121
// Generate a CSR for the remote cluster.
125122
CSR, err := authentication.GenerateCSRForResourceSlice(privateKey, &resourceSlice)
126123
if err != nil {
@@ -153,7 +150,7 @@ func (r *LocalResourceSliceReconciler) SetupWithManager(mgr ctrl.Manager) error
153150
return err
154151
}
155152

156-
return ctrl.NewControllerManagedBy(mgr).Named(ControllerName).
153+
return ctrl.NewControllerManagedBy(mgr).Named(consts.CtrlResourceSliceLocal).
157154
For(&authv1beta1.ResourceSlice{}, builder.WithPredicates(localResSliceFilter)).
158155
Complete(r)
159156
}

pkg/liqo-controller-manager/authentication/noncecreator-controller/noncecreator_controller.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ func (r *NonceCreatorReconciler) SetupWithManager(mgr ctrl.Manager) error {
148148
return selector.Matches(labels.Set(o.GetLabels()))
149149
})
150150

151-
return ctrl.NewControllerManagedBy(mgr).
151+
return ctrl.NewControllerManagedBy(mgr).Named(consts.CtrlSecretNonceCreator).
152152
For(&corev1.Secret{}, builder.WithPredicates(filter)).
153153
Complete(r)
154154
}

pkg/liqo-controller-manager/authentication/noncesigner-controller/noncesigner_controller.go

+1-6
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,6 @@ import (
3737
"github.com/liqotech/liqo/pkg/utils"
3838
)
3939

40-
const (
41-
// ControllerName is the name of the controller.
42-
ControllerName = "nonceSigner"
43-
)
44-
4540
// NewNonceSignerReconciler returns a new SecretReconciler.
4641
func NewNonceSignerReconciler(cl client.Client, s *runtime.Scheme,
4742
recorder record.EventRecorder,
@@ -153,7 +148,7 @@ func (r *NonceSignerReconciler) SetupWithManager(mgr ctrl.Manager) error {
153148
return selector.Matches(labels.Set(o.GetLabels()))
154149
})
155150

156-
return ctrl.NewControllerManagedBy(mgr).Named(ControllerName).
151+
return ctrl.NewControllerManagedBy(mgr).Named(consts.CtrlSecretNonceSigner).
157152
For(&corev1.Secret{}, builder.WithPredicates(filter)).
158153
Complete(r)
159154
}

pkg/liqo-controller-manager/authentication/remoteresourceslice-controller/remoteresourceslice_controller.go

+3-5
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,13 @@ import (
3636

3737
authv1beta1 "github.com/liqotech/liqo/apis/authentication/v1beta1"
3838
"github.com/liqotech/liqo/internal/crdReplicator/reflection"
39+
"github.com/liqotech/liqo/pkg/consts"
3940
identitymanager "github.com/liqotech/liqo/pkg/identityManager"
4041
"github.com/liqotech/liqo/pkg/liqo-controller-manager/authentication"
4142
"github.com/liqotech/liqo/pkg/utils/getters"
4243
liqolabels "github.com/liqotech/liqo/pkg/utils/labels"
4344
)
4445

45-
// ControllerName is the name of the controller.
46-
const ControllerName = "remoteResourceSlice"
47-
4846
// NewRemoteResourceSliceReconciler returns a new RemoteResourceSliceReconciler.
4947
func NewRemoteResourceSliceReconciler(cl client.Client, s *runtime.Scheme, config *rest.Config,
5048
recorder record.EventRecorder,
@@ -257,7 +255,7 @@ func (r *RemoteResourceSliceReconciler) SetupWithManager(mgr ctrl.Manager) error
257255
return err
258256
}
259257

260-
return ctrl.NewControllerManagedBy(mgr).Named(ControllerName).
258+
return ctrl.NewControllerManagedBy(mgr).Named(consts.CtrlResourceSliceRemote).
261259
For(&authv1beta1.ResourceSlice{}, builder.WithPredicates(predicate.And(remoteResSliceFilter, withCSR()))).
262260
Watches(&authv1beta1.Tenant{}, handler.EnqueueRequestsFromMapFunc(r.resourceSlicesEnquer())).
263261
Complete(r)
@@ -300,7 +298,7 @@ func withCSR() predicate.Funcs {
300298
if !ok {
301299
return false
302300
}
303-
return rs.Spec.CSR != nil && len(rs.Spec.CSR) > 0
301+
return len(rs.Spec.CSR) > 0
304302
})
305303
}
306304

pkg/liqo-controller-manager/authentication/tenant-controller/tenant_controller.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ func (r *TenantReconciler) ensureSetup(ctx context.Context) error {
263263

264264
// SetupWithManager sets up the TenantReconciler with the Manager.
265265
func (r *TenantReconciler) SetupWithManager(mgr ctrl.Manager) error {
266-
return ctrl.NewControllerManagedBy(mgr).
266+
return ctrl.NewControllerManagedBy(mgr).Named(consts.CtrlTenant).
267267
For(&authv1beta1.Tenant{}).
268268
Owns(&corev1.Namespace{}).
269269
Complete(r)

pkg/liqo-controller-manager/foreigncluster-controller/foreigncluster_controller.go pkg/liqo-controller-manager/core/foreigncluster-controller/foreigncluster_controller.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ func (r *ForeignClusterReconciler) SetupWithManager(mgr ctrl.Manager, workers in
168168
return err
169169
}
170170

171-
return ctrl.NewControllerManagedBy(mgr).
171+
return ctrl.NewControllerManagedBy(mgr).Named(consts.CtrlForeignCluster).
172172
For(&liqov1beta1.ForeignCluster{}, builder.WithPredicates(foreignClusterPredicate)).
173173
Watches(&networkingv1beta1.Connection{}, handler.EnqueueRequestsFromMapFunc(r.foreignclusterEnqueuer)).
174174
Watches(&networkingv1beta1.GatewayServer{}, handler.EnqueueRequestsFromMapFunc(r.foreignclusterEnqueuer)).

pkg/liqo-controller-manager/ipmapping/configuration_controller.go

+1-4
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,6 @@ import (
3636
configuration "github.com/liqotech/liqo/pkg/liqo-controller-manager/networking/external-network/configuration"
3737
)
3838

39-
// ConfigurationControllerName is the name of the controller.
40-
const ConfigurationControllerName = "IpMappingConfiguration"
41-
4239
// cluster-role
4340
// +kubebuilder:rbac:groups=networking.liqo.io,resources=configurations,verbs=get;list;watch
4441
// +kubebuilder:rbac:groups=ipam.liqo.io,resources=ips,verbs=get;list;watch;create;update;patch;delete
@@ -98,7 +95,7 @@ func (r *ConfigurationReconciler) SetupWithManager(mgr ctrl.Manager) error {
9895
if err != nil {
9996
return err
10097
}
101-
return ctrl.NewControllerManagedBy(mgr).Named(ConfigurationControllerName).
98+
return ctrl.NewControllerManagedBy(mgr).Named(consts.CtrlConfigurationIPMapping).
10299
For(&networkingv1beta1.Configuration{}, builder.WithPredicates(filterByLabelsPredicate)).
103100
Complete(r)
104101
}

0 commit comments

Comments
 (0)