Skip to content

Commit 55e9ec4

Browse files
committed
build backend sg name and cluster sg rule label based on config
1 parent 75e6587 commit 55e9ec4

7 files changed

+94
-77
lines changed

main.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,9 @@ func main() {
115115
tgbResManager := targetgroupbinding.NewDefaultResourceManager(mgr.GetClient(), cloud.ELBV2(), cloud.EC2(),
116116
podInfoRepo, sgManager, sgReconciler, vpcInfoProvider, multiClusterManager,
117117
cloud.VpcID(), controllerCFG.ClusterName, controllerCFG.FeatureGates.Enabled(config.EndpointsFailOpen), controllerCFG.EnableEndpointSlices, controllerCFG.DisableRestrictedSGRules,
118-
controllerCFG.ServiceTargetENISGTags, mgr.GetEventRecorderFor("targetGroupBinding"), ctrl.Log)
118+
controllerCFG.ServiceTargetENISGTags, controllerCFG.ResourcePrefix[config.ClusterSgRuleLabelPrefixKey], mgr.GetEventRecorderFor("targetGroupBinding"), ctrl.Log)
119119
backendSGProvider := networking.NewBackendSGProvider(controllerCFG.ClusterName, controllerCFG.BackendSecurityGroup,
120-
cloud.VpcID(), cloud.EC2(), mgr.GetClient(), controllerCFG.DefaultTags, ctrl.Log.WithName("backend-sg-provider"))
120+
cloud.VpcID(), cloud.EC2(), mgr.GetClient(), controllerCFG.ResourcePrefix[config.ClusterTagPrefixKey], controllerCFG.ResourcePrefix[config.BackendSGNamePrefixKey], controllerCFG.DefaultTags, ctrl.Log.WithName("backend-sg-provider"))
121121
sgResolver := networking.NewDefaultSecurityGroupResolver(cloud.EC2(), cloud.VpcID())
122122
elbv2TaggingManager := elbv2deploy.NewDefaultTaggingManager(cloud.ELBV2(), cloud.VpcID(), controllerCFG.FeatureGates, cloud.RGT(), ctrl.Log)
123123
ingGroupReconciler := ingress.NewGroupReconciler(cloud, mgr.GetClient(), mgr.GetEventRecorderFor("ingress"),

pkg/config/controller_config.go

-11
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,6 @@ func (cfg *ControllerConfig) BindFlags(fs *pflag.FlagSet) {
160160
fs.StringToStringVar(&cfg.ResourcePrefix, flagResourcePrefix, defaultResourcePrefix,
161161
"the prefixes for resource tags, backend SG name and worker node SG rules label.")
162162

163-
cfg.mergeDefaultResourcePrefixVal()
164163
cfg.FeatureGates.BindFlags(fs)
165164
cfg.AWSConfig.BindFlags(fs)
166165
cfg.RuntimeConfig.BindFlags(fs)
@@ -268,13 +267,3 @@ func (cfg *ControllerConfig) validateResourcePrefixKeys() error {
268267
}
269268
return nil
270269
}
271-
272-
// mergeDefaultResourcePrefixVal make sure the ResourcePrefix map always has default val for unspecified key in user-passed flag
273-
func (cfg *ControllerConfig) mergeDefaultResourcePrefixVal() {
274-
// Merge user-provided values with defaults
275-
for key, defaultVal := range defaultResourcePrefix {
276-
if _, exists := cfg.ResourcePrefix[key]; !exists {
277-
cfg.ResourcePrefix[key] = defaultVal
278-
}
279-
}
280-
}

pkg/networking/backend_sg_provider.go

+26-22
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@ const (
3131
defaultSGDeletionTimeout = 2 * time.Minute
3232

3333
resourceTypeSecurityGroup = "security-group"
34-
tagKeyK8sCluster = "elbv2.k8s.aws/cluster"
35-
tagKeyResource = "elbv2.k8s.aws/resource"
3634
tagValueBackend = "backend-sg"
3735

3836
explicitGroupFinalizerPrefix = "group.ingress.k8s.aws/"
@@ -59,16 +57,19 @@ type BackendSGProvider interface {
5957

6058
// NewBackendSGProvider constructs a new defaultBackendSGProvider
6159
func NewBackendSGProvider(clusterName string, backendSG string, vpcID string,
62-
ec2Client services.EC2, k8sClient client.Client, defaultTags map[string]string, logger logr.Logger) *defaultBackendSGProvider {
60+
ec2Client services.EC2, k8sClient client.Client, clusterTagPrefixKey string, backendSGNamePrefix string, defaultTags map[string]string, logger logr.Logger) *defaultBackendSGProvider {
6361
return &defaultBackendSGProvider{
64-
vpcID: vpcID,
65-
clusterName: clusterName,
66-
backendSG: backendSG,
67-
defaultTags: defaultTags,
68-
ec2Client: ec2Client,
69-
k8sClient: k8sClient,
70-
logger: logger,
71-
mutex: sync.Mutex{},
62+
vpcID: vpcID,
63+
clusterName: clusterName,
64+
backendSG: backendSG,
65+
tagKeyK8sCluster: clusterTagPrefixKey + "/cluster",
66+
tagKeyResource: clusterTagPrefixKey + "/resource",
67+
backendSGNamePrefix: backendSGNamePrefix,
68+
defaultTags: defaultTags,
69+
ec2Client: ec2Client,
70+
k8sClient: k8sClient,
71+
logger: logger,
72+
mutex: sync.Mutex{},
7273

7374
checkIngressFinalizersFunc: func(finalizers []string) bool {
7475
for _, fin := range finalizers {
@@ -100,12 +101,15 @@ type defaultBackendSGProvider struct {
100101
clusterName string
101102
mutex sync.Mutex
102103

103-
backendSG string
104-
autoGeneratedSG string
105-
defaultTags map[string]string
106-
ec2Client services.EC2
107-
k8sClient client.Client
108-
logger logr.Logger
104+
backendSG string
105+
autoGeneratedSG string
106+
tagKeyK8sCluster string
107+
tagKeyResource string
108+
backendSGNamePrefix string
109+
defaultTags map[string]string
110+
ec2Client services.EC2
111+
k8sClient client.Client
112+
logger logr.Logger
109113
// objectsMap keeps track of whether the backend SG is required for any tracked resources in the cluster.
110114
// If any entry in the map is true, or there are resources with this controller specific finalizers which
111115
// haven't been tracked in the map yet, controller doesn't delete the backend SG. If the controller has
@@ -269,11 +273,11 @@ func (p *defaultBackendSGProvider) buildBackendSGTags(_ context.Context) []ec2ty
269273
ResourceType: resourceTypeSecurityGroup,
270274
Tags: append(defaultTags, []ec2types.Tag{
271275
{
272-
Key: awssdk.String(tagKeyK8sCluster),
276+
Key: awssdk.String(p.tagKeyK8sCluster),
273277
Value: awssdk.String(p.clusterName),
274278
},
275279
{
276-
Key: awssdk.String(tagKeyResource),
280+
Key: awssdk.String(p.tagKeyResource),
277281
Value: awssdk.String(tagValueBackend),
278282
},
279283
}...),
@@ -289,11 +293,11 @@ func (p *defaultBackendSGProvider) getBackendSGFromEC2(ctx context.Context, sgNa
289293
Values: []string{vpcID},
290294
},
291295
{
292-
Name: awssdk.String(fmt.Sprintf("tag:%v", tagKeyK8sCluster)),
296+
Name: awssdk.String(fmt.Sprintf("tag:%v", p.tagKeyK8sCluster)),
293297
Values: []string{p.clusterName},
294298
},
295299
{
296-
Name: awssdk.String(fmt.Sprintf("tag:%v", tagKeyResource)),
300+
Name: awssdk.String(fmt.Sprintf("tag:%v", p.tagKeyResource)),
297301
Values: []string{tagValueBackend},
298302
},
299303
},
@@ -342,7 +346,7 @@ func (p *defaultBackendSGProvider) getBackendSGName() string {
342346
_, _ = sgNameHash.Write([]byte(p.clusterName))
343347
sgHash := hex.EncodeToString(sgNameHash.Sum(nil))
344348
sanitizedClusterName := invalidSGNamePattern.ReplaceAllString(p.clusterName, "")
345-
return fmt.Sprintf("k8s-traffic-%.232s-%.10s", sanitizedClusterName, sgHash)
349+
return fmt.Sprintf("%v-%.232s-%.10s", p.backendSGNamePrefix, sanitizedClusterName, sgHash)
346350
}
347351

348352
func isSecurityGroupDependencyViolationError(err error) bool {

pkg/networking/backend_sg_provider_test.go

+31-14
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,12 @@ import (
2626
)
2727

2828
const (
29-
defaultVPCID = "vpc-xxxyyy"
30-
defaultClusterName = "testCluster"
29+
defaultVPCID = "vpc-xxxyyy"
30+
defaultClusterName = "testCluster"
31+
defaultClusterTagPrefixKey = "elbv2.k8s.aws"
32+
defaultBackendSGNamePrefix = "k8s-traffic"
33+
defaultTagKeyK8sCluster = "elbv2.k8s.aws/cluster"
34+
defaultTagKeyResource = "elbv2.k8s.aws/resource"
3135
)
3236

3337
func Test_defaultBackendSGProvider_Get(t *testing.T) {
@@ -42,12 +46,14 @@ func Test_defaultBackendSGProvider_Get(t *testing.T) {
4246
err error
4347
}
4448
type fields struct {
45-
backendSG string
46-
ingResources []*networking.Ingress
47-
svcResource *corev1.Service
48-
defaultTags map[string]string
49-
describeSGCalls []describeSecurityGroupsAsListCall
50-
createSGCalls []createSecurityGroupWithContexCall
49+
backendSG string
50+
ingResources []*networking.Ingress
51+
svcResource *corev1.Service
52+
clusterTagPrefixKey string
53+
backendSGNamePrefix string
54+
defaultTags map[string]string
55+
describeSGCalls []describeSecurityGroupsAsListCall
56+
createSGCalls []createSecurityGroupWithContexCall
5157
}
5258
defaultEC2Filters := []ec2types.Filter{
5359
{
@@ -110,7 +116,8 @@ func Test_defaultBackendSGProvider_Get(t *testing.T) {
110116
},
111117
},
112118
},
113-
ingResources: []*networking.Ingress{ing, ing1},
119+
ingResources: []*networking.Ingress{ing, ing1},
120+
clusterTagPrefixKey: defaultClusterTagPrefixKey,
114121
},
115122
want: "sg-autogen",
116123
},
@@ -152,7 +159,9 @@ func Test_defaultBackendSGProvider_Get(t *testing.T) {
152159
},
153160
},
154161
},
155-
ingResources: []*networking.Ingress{ing, ing1},
162+
ingResources: []*networking.Ingress{ing, ing1},
163+
clusterTagPrefixKey: defaultClusterTagPrefixKey,
164+
backendSGNamePrefix: defaultBackendSGNamePrefix,
156165
},
157166
want: "sg-newauto",
158167
},
@@ -206,6 +215,8 @@ func Test_defaultBackendSGProvider_Get(t *testing.T) {
206215
},
207216
},
208217
},
218+
clusterTagPrefixKey: defaultClusterTagPrefixKey,
219+
backendSGNamePrefix: defaultBackendSGNamePrefix,
209220
defaultTags: map[string]string{
210221
"zzzKey": "value",
211222
"KubernetesCluster": defaultClusterName,
@@ -226,7 +237,9 @@ func Test_defaultBackendSGProvider_Get(t *testing.T) {
226237
err: &smithy.GenericAPIError{Code: "Some.Other.Error", Message: "describe security group as list error"},
227238
},
228239
},
229-
ingResources: []*networking.Ingress{ing},
240+
ingResources: []*networking.Ingress{ing},
241+
clusterTagPrefixKey: defaultClusterTagPrefixKey,
242+
backendSGNamePrefix: defaultBackendSGNamePrefix,
230243
},
231244
wantErr: errors.New("api error Some.Other.Error: describe security group as list error"),
232245
},
@@ -266,7 +279,9 @@ func Test_defaultBackendSGProvider_Get(t *testing.T) {
266279
err: &smithy.GenericAPIError{Code: "Create.Error", Message: "unable to create security group"},
267280
},
268281
},
269-
ingResources: []*networking.Ingress{ing1},
282+
ingResources: []*networking.Ingress{ing1},
283+
clusterTagPrefixKey: defaultClusterTagPrefixKey,
284+
backendSGNamePrefix: defaultBackendSGNamePrefix,
270285
},
271286
wantErr: errors.New("api error Create.Error: unable to create security group"),
272287
},
@@ -285,7 +300,7 @@ func Test_defaultBackendSGProvider_Get(t *testing.T) {
285300
}
286301
k8sClient := mock_client.NewMockClient(ctrl)
287302
sgProvider := NewBackendSGProvider(defaultClusterName, tt.fields.backendSG,
288-
defaultVPCID, ec2Client, k8sClient, tt.fields.defaultTags, logr.New(&log.NullLogSink{}))
303+
defaultVPCID, ec2Client, k8sClient, tt.fields.clusterTagPrefixKey, tt.fields.backendSGNamePrefix, tt.fields.defaultTags, logr.New(&log.NullLogSink{}))
289304

290305
resourceType := ResourceTypeIngress
291306
var activeResources []types.NamespacedName
@@ -329,6 +344,8 @@ func Test_defaultBackendSGProvider_Release(t *testing.T) {
329344
type fields struct {
330345
autogenSG string
331346
backendSG string
347+
clusterTagPrefixKey string
348+
backendSGNamePrefix string
332349
defaultTags map[string]string
333350
listIngressCalls []listIngressCall
334351
deleteSGCalls []deleteSecurityGroupWithContextCall
@@ -732,7 +749,7 @@ func Test_defaultBackendSGProvider_Release(t *testing.T) {
732749
ec2Client := services.NewMockEC2(ctrl)
733750
k8sClient := mock_client.NewMockClient(ctrl)
734751
sgProvider := NewBackendSGProvider(defaultClusterName, tt.fields.backendSG,
735-
defaultVPCID, ec2Client, k8sClient, tt.fields.defaultTags, logr.New(&log.NullLogSink{}))
752+
defaultVPCID, ec2Client, k8sClient, tt.fields.clusterTagPrefixKey, tt.fields.backendSGNamePrefix, tt.fields.defaultTags, logr.New(&log.NullLogSink{}))
736753
if len(tt.fields.autogenSG) > 0 {
737754
sgProvider.backendSG = ""
738755
sgProvider.autoGeneratedSG = tt.fields.autogenSG

pkg/targetgroupbinding/networking_manager.go

+25-24
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import (
2727
)
2828

2929
const (
30-
tgbNetworkingIPPermissionLabelKey = "elbv2.k8s.aws/targetGroupBinding"
30+
//tgbNetworkingIPPermissionLabelKey = "elbv2.k8s.aws/targetGroupBinding"
3131
tgbNetworkingIPPermissionLabelValue = "shared"
3232
defaultTgbMinPort = int32(0)
3333
defaultTgbMaxPort = int32(65535)
@@ -47,18 +47,18 @@ type NetworkingManager interface {
4747

4848
// NewDefaultNetworkingManager constructs defaultNetworkingManager.
4949
func NewDefaultNetworkingManager(k8sClient client.Client, podENIResolver networking.PodENIInfoResolver, nodeENIResolver networking.NodeENIInfoResolver,
50-
sgManager networking.SecurityGroupManager, sgReconciler networking.SecurityGroupReconciler, vpcID string, clusterName string, serviceTargetENISGTags map[string]string, logger logr.Logger, disabledRestrictedSGRulesFlag bool) *defaultNetworkingManager {
51-
50+
sgManager networking.SecurityGroupManager, sgReconciler networking.SecurityGroupReconciler, vpcID string, clusterName string, serviceTargetENISGTags map[string]string, clusterSgRuleLabelPrefix string, logger logr.Logger, disabledRestrictedSGRulesFlag bool) *defaultNetworkingManager {
5251
return &defaultNetworkingManager{
53-
k8sClient: k8sClient,
54-
podENIResolver: podENIResolver,
55-
nodeENIResolver: nodeENIResolver,
56-
sgManager: sgManager,
57-
sgReconciler: sgReconciler,
58-
vpcID: vpcID,
59-
clusterName: clusterName,
60-
serviceTargetENISGTags: serviceTargetENISGTags,
61-
logger: logger,
52+
k8sClient: k8sClient,
53+
podENIResolver: podENIResolver,
54+
nodeENIResolver: nodeENIResolver,
55+
sgManager: sgManager,
56+
sgReconciler: sgReconciler,
57+
vpcID: vpcID,
58+
clusterName: clusterName,
59+
serviceTargetENISGTags: serviceTargetENISGTags,
60+
tgbNetworkingIPPermissionLabelKey: clusterSgRuleLabelPrefix + "/targetGroupBinding",
61+
logger: logger,
6262

6363
mutex: sync.Mutex{},
6464
ingressPermissionsPerSGByTGB: make(map[types.NamespacedName]map[string][]networking.IPPermissionInfo),
@@ -70,15 +70,16 @@ func NewDefaultNetworkingManager(k8sClient client.Client, podENIResolver network
7070

7171
// default implementation for NetworkingManager.
7272
type defaultNetworkingManager struct {
73-
k8sClient client.Client
74-
podENIResolver networking.PodENIInfoResolver
75-
nodeENIResolver networking.NodeENIInfoResolver
76-
sgManager networking.SecurityGroupManager
77-
sgReconciler networking.SecurityGroupReconciler
78-
vpcID string
79-
clusterName string
80-
serviceTargetENISGTags map[string]string
81-
logger logr.Logger
73+
k8sClient client.Client
74+
podENIResolver networking.PodENIInfoResolver
75+
nodeENIResolver networking.NodeENIInfoResolver
76+
sgManager networking.SecurityGroupManager
77+
sgReconciler networking.SecurityGroupReconciler
78+
vpcID string
79+
clusterName string
80+
serviceTargetENISGTags map[string]string
81+
tgbNetworkingIPPermissionLabelKey string
82+
logger logr.Logger
8283

8384
// mutex will serialize our TargetGroup's networking reconcile requests.
8485
mutex sync.Mutex
@@ -202,7 +203,7 @@ func (m *defaultNetworkingManager) reconcileWithIngressPermissionsPerSG(ctx cont
202203
computedForAllTGBs := m.consolidateIngressPermissionsPerSGByTGB(ctx, tgbsWithNetworking)
203204
aggregatedIngressPermissionsPerSG := m.computeAggregatedIngressPermissionsPerSG(ctx)
204205

205-
permissionSelector := labels.SelectorFromSet(labels.Set{tgbNetworkingIPPermissionLabelKey: tgbNetworkingIPPermissionLabelValue})
206+
permissionSelector := labels.SelectorFromSet(labels.Set{m.tgbNetworkingIPPermissionLabelKey: tgbNetworkingIPPermissionLabelValue})
206207
var sgReconciliationErrors []error
207208
for sgID, permissions := range aggregatedIngressPermissionsPerSG {
208209
if err := m.sgReconciler.ReconcileIngress(ctx, sgID, permissions,
@@ -421,7 +422,7 @@ func (m *defaultNetworkingManager) computePermissionsForPeerPort(ctx context.Con
421422
})
422423
}
423424

424-
permissionLabels := map[string]string{tgbNetworkingIPPermissionLabelKey: tgbNetworkingIPPermissionLabelValue}
425+
permissionLabels := map[string]string{m.tgbNetworkingIPPermissionLabelKey: tgbNetworkingIPPermissionLabelValue}
425426
if peer.SecurityGroup != nil {
426427
groupID := peer.SecurityGroup.GroupID
427428
permissions := make([]networking.IPPermissionInfo, 0, len(sdkFromToPortPairs))
@@ -484,7 +485,7 @@ func (m *defaultNetworkingManager) gcIngressPermissionsFromUnusedEndpointSGs(ctx
484485
usedEndpointSGs := sets.StringKeySet(ingressPermissionsPerSG)
485486
unusedEndpointSGs := endpointSGs.Difference(usedEndpointSGs)
486487

487-
permissionSelector := labels.SelectorFromSet(labels.Set{tgbNetworkingIPPermissionLabelKey: tgbNetworkingIPPermissionLabelValue})
488+
permissionSelector := labels.SelectorFromSet(labels.Set{m.tgbNetworkingIPPermissionLabelKey: tgbNetworkingIPPermissionLabelValue})
488489
for sgID := range unusedEndpointSGs {
489490
err := m.sgReconciler.ReconcileIngress(ctx, sgID, nil,
490491
networking.WithPermissionSelector(permissionSelector))

pkg/targetgroupbinding/networking_manager_test.go

+8-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ import (
1717
"sigs.k8s.io/aws-load-balancer-controller/pkg/networking"
1818
)
1919

20+
const tgbNetworkingIPPermissionLabelKey = "elbv2.k8s.aws/targetGroupBinding"
21+
2022
func Test_defaultNetworkingManager_computeIngressPermissionsForTGBNetworking(t *testing.T) {
2123
port8080 := intstr.FromInt(8080)
2224
port8443 := intstr.FromInt(8443)
@@ -228,7 +230,9 @@ func Test_defaultNetworkingManager_computeIngressPermissionsForTGBNetworking(t *
228230
}
229231
for _, tt := range tests {
230232
t.Run(tt.name, func(t *testing.T) {
231-
m := &defaultNetworkingManager{}
233+
m := &defaultNetworkingManager{
234+
tgbNetworkingIPPermissionLabelKey: tgbNetworkingIPPermissionLabelKey,
235+
}
232236
got, err := m.computeIngressPermissionsForTGBNetworking(context.Background(), tt.args.tgbNetworking, tt.args.pods)
233237
if tt.wantErr != nil {
234238
assert.EqualError(t, err, tt.wantErr.Error())
@@ -476,7 +480,9 @@ func Test_defaultNetworkingManager_computePermissionsForPeerPort(t *testing.T) {
476480
}
477481
for _, tt := range tests {
478482
t.Run(tt.name, func(t *testing.T) {
479-
m := &defaultNetworkingManager{}
483+
m := &defaultNetworkingManager{
484+
tgbNetworkingIPPermissionLabelKey: tgbNetworkingIPPermissionLabelKey,
485+
}
480486
got, err := m.computePermissionsForPeerPort(context.Background(), tt.args.peer, tt.args.port, tt.args.pods)
481487
if tt.wantErr != nil {
482488
assert.EqualError(t, err, tt.wantErr.Error())

pkg/targetgroupbinding/resource_manager.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func NewDefaultResourceManager(k8sClient client.Client, elbv2Client services.ELB
3939
podInfoRepo k8s.PodInfoRepo, sgManager networking.SecurityGroupManager, sgReconciler networking.SecurityGroupReconciler,
4040
vpcInfoProvider networking.VPCInfoProvider, multiClusterManager MultiClusterManager,
4141
vpcID string, clusterName string, failOpenEnabled bool, endpointSliceEnabled bool, disabledRestrictedSGRulesFlag bool,
42-
endpointSGTags map[string]string,
42+
endpointSGTags map[string]string, clusterSgRuleLabelPrefix string,
4343
eventRecorder record.EventRecorder, logger logr.Logger) *defaultResourceManager {
4444
targetsManager := NewCachedTargetsManager(elbv2Client, logger)
4545
endpointResolver := backend.NewDefaultEndpointResolver(k8sClient, podInfoRepo, failOpenEnabled, endpointSliceEnabled, logger)
@@ -48,7 +48,7 @@ func NewDefaultResourceManager(k8sClient client.Client, elbv2Client services.ELB
4848
podENIResolver := networking.NewDefaultPodENIInfoResolver(k8sClient, ec2Client, nodeInfoProvider, vpcID, logger)
4949
nodeENIResolver := networking.NewDefaultNodeENIInfoResolver(nodeInfoProvider, logger)
5050

51-
networkingManager := NewDefaultNetworkingManager(k8sClient, podENIResolver, nodeENIResolver, sgManager, sgReconciler, vpcID, clusterName, endpointSGTags, logger, disabledRestrictedSGRulesFlag)
51+
networkingManager := NewDefaultNetworkingManager(k8sClient, podENIResolver, nodeENIResolver, sgManager, sgReconciler, vpcID, clusterName, endpointSGTags, clusterSgRuleLabelPrefix, logger, disabledRestrictedSGRulesFlag)
5252
return &defaultResourceManager{
5353
k8sClient: k8sClient,
5454
targetsManager: targetsManager,

0 commit comments

Comments
 (0)