Skip to content

Commit 57e26f0

Browse files
Merge pull request #581 from stevekuznetsov/skuznets/bump-vendor
Skuznets/bump vendor
2 parents d2d7c32 + c51db58 commit 57e26f0

File tree

110 files changed

+2972
-1555
lines changed

Some content is hidden

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

110 files changed

+2972
-1555
lines changed

staging/operator-lifecycle-manager/cmd/olm/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ func main() {
173173
olm.WithExternalClient(crClient),
174174
olm.WithMetadataClient(metadataClient),
175175
olm.WithOperatorClient(opClient),
176-
olm.WithRestConfig(config),
176+
olm.WithRestConfig(validatingConfig),
177177
olm.WithConfigClient(versionedConfigClient),
178178
olm.WithProtectedCopiedCSVNamespaces(*protectedCopiedCSVNamespaces),
179179
)

staging/operator-lifecycle-manager/cmd/olm/manager.go

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,15 @@ package main
33
import (
44
"context"
55

6+
appsv1 "k8s.io/api/apps/v1"
67
corev1 "k8s.io/api/core/v1"
8+
rbacv1 "k8s.io/api/rbac/v1"
9+
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
710
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
811
"k8s.io/apimachinery/pkg/labels"
912
"k8s.io/apimachinery/pkg/runtime"
1013
"k8s.io/apimachinery/pkg/selection"
14+
apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
1115
ctrl "sigs.k8s.io/controller-runtime"
1216
"sigs.k8s.io/controller-runtime/pkg/cache"
1317
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -53,7 +57,34 @@ func Manager(ctx context.Context, debug bool) (ctrl.Manager, error) {
5357
MetricsBindAddress: "0", // TODO(njhale): Enable metrics on non-conflicting port (not 8080)
5458
Cache: cache.Options{
5559
ByObject: map[client.Object]cache.ByObject{
56-
&corev1.Secret{}: {
60+
&appsv1.Deployment{}: {
61+
Label: labels.SelectorFromValidatedSet(map[string]string{install.OLMManagedLabelKey: install.OLMManagedLabelValue}),
62+
},
63+
&corev1.Service{}: {
64+
Label: labels.SelectorFromValidatedSet(map[string]string{install.OLMManagedLabelKey: install.OLMManagedLabelValue}),
65+
},
66+
&apiextensionsv1.CustomResourceDefinition{}: {
67+
Label: labels.SelectorFromValidatedSet(map[string]string{install.OLMManagedLabelKey: install.OLMManagedLabelValue}),
68+
},
69+
&apiregistrationv1.APIService{}: {
70+
Label: labels.SelectorFromValidatedSet(map[string]string{install.OLMManagedLabelKey: install.OLMManagedLabelValue}),
71+
},
72+
&corev1.ConfigMap{}: {
73+
Label: labels.SelectorFromValidatedSet(map[string]string{install.OLMManagedLabelKey: install.OLMManagedLabelValue}),
74+
},
75+
&corev1.ServiceAccount{}: {
76+
Label: labels.SelectorFromValidatedSet(map[string]string{install.OLMManagedLabelKey: install.OLMManagedLabelValue}),
77+
},
78+
&rbacv1.Role{}: {
79+
Label: labels.SelectorFromValidatedSet(map[string]string{install.OLMManagedLabelKey: install.OLMManagedLabelValue}),
80+
},
81+
&rbacv1.RoleBinding{}: {
82+
Label: labels.SelectorFromValidatedSet(map[string]string{install.OLMManagedLabelKey: install.OLMManagedLabelValue}),
83+
},
84+
&rbacv1.ClusterRole{}: {
85+
Label: labels.SelectorFromValidatedSet(map[string]string{install.OLMManagedLabelKey: install.OLMManagedLabelValue}),
86+
},
87+
&rbacv1.ClusterRoleBinding{}: {
5788
Label: labels.SelectorFromValidatedSet(map[string]string{install.OLMManagedLabelKey: install.OLMManagedLabelValue}),
5889
},
5990
&operatorsv1alpha1.ClusterServiceVersion{}: {

staging/operator-lifecycle-manager/deploy/chart/templates/0000_50_olm_07-olm-operator.deployment.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,10 @@ spec:
110110
fieldPath: metadata.namespace
111111
- name: OPERATOR_NAME
112112
value: olm-operator
113+
{{- if .Values.debug }}
114+
- name: CI
115+
value: "true"
116+
{{- end }}
113117
{{- if .Values.olm.resources }}
114118
resources:
115119
{{ toYaml .Values.olm.resources | indent 12 }}

staging/operator-lifecycle-manager/deploy/chart/templates/0000_50_olm_08-catalog-operator.deployment.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,11 @@ spec:
9090
- --set-workload-user-id=false
9191
{{ end }}
9292
image: {{ .Values.catalog.image.ref }}
93+
{{- if .Values.debug }}
94+
env:
95+
- name: CI
96+
value: "true"
97+
{{- end }}
9398
imagePullPolicy: {{ .Values.catalog.image.pullPolicy }}
9499
ports:
95100
- containerPort: {{ .Values.olm.service.internalPort }}

staging/operator-lifecycle-manager/pkg/controller/install/apiservice.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ func (i *StrategyDeploymentInstaller) createOrUpdateAPIService(caPEM []byte, des
6161
if err := ownerutil.AddOwnerLabels(apiService, i.owner); err != nil {
6262
return err
6363
}
64+
apiService.Labels[OLMManagedLabelKey] = OLMManagedLabelValue
6465

6566
// Create a service for the deployment
6667
containerPort := int32(443)

staging/operator-lifecycle-manager/pkg/controller/install/certresources.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ func (i *StrategyDeploymentInstaller) installCertRequirementsForDeployment(deplo
456456
Name: "system:auth-delegator",
457457
},
458458
}
459-
authDelegatorClusterRoleBinding.SetName(service.GetName() + "-system:auth-delegator")
459+
authDelegatorClusterRoleBinding.SetName(AuthDelegatorClusterRoleBindingName(service.GetName()))
460460
authDelegatorClusterRoleBinding.SetLabels(map[string]string{OLMManagedLabelKey: OLMManagedLabelValue})
461461

462462
existingAuthDelegatorClusterRoleBinding, err := i.strategyClient.GetOpLister().RbacV1().ClusterRoleBindingLister().Get(authDelegatorClusterRoleBinding.GetName())
@@ -504,7 +504,7 @@ func (i *StrategyDeploymentInstaller) installCertRequirementsForDeployment(deplo
504504
Name: "extension-apiserver-authentication-reader",
505505
},
506506
}
507-
authReaderRoleBinding.SetName(service.GetName() + "-auth-reader")
507+
authReaderRoleBinding.SetName(AuthReaderRoleBindingName(service.GetName()))
508508
authReaderRoleBinding.SetNamespace(KubeSystem)
509509
authReaderRoleBinding.SetLabels(map[string]string{OLMManagedLabelKey: OLMManagedLabelValue})
510510

@@ -543,6 +543,14 @@ func (i *StrategyDeploymentInstaller) installCertRequirementsForDeployment(deplo
543543
return &depSpec, caPEM, nil
544544
}
545545

546+
func AuthDelegatorClusterRoleBindingName(serviceName string) string {
547+
return serviceName + "-system:auth-delegator"
548+
}
549+
550+
func AuthReaderRoleBindingName(serviceName string) string {
551+
return serviceName + "-auth-reader"
552+
}
553+
546554
func SetCAAnnotation(depSpec *appsv1.DeploymentSpec, caHash string) {
547555
if len(depSpec.Template.ObjectMeta.GetAnnotations()) == 0 {
548556
depSpec.Template.ObjectMeta.SetAnnotations(map[string]string{OLMCAHashAnnotationKey: caHash})

staging/operator-lifecycle-manager/pkg/controller/install/deployment.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,11 +152,11 @@ func (i *StrategyDeploymentInstaller) deploymentForSpec(name string, spec appsv1
152152
dep.Spec.Template.SetAnnotations(annotations)
153153

154154
// Set custom labels before CSV owner labels
155+
dep.SetLabels(specLabels)
155156
if dep.Labels == nil {
156157
dep.Labels = map[string]string{}
157158
}
158159
dep.Labels[OLMManagedLabelKey] = OLMManagedLabelValue
159-
dep.SetLabels(specLabels)
160160

161161
ownerutil.AddNonBlockingOwner(dep, i.owner)
162162
ownerutil.AddOwnerLabelsForKind(dep, i.owner, v1alpha1.ClusterServiceVersionKind)

staging/operator-lifecycle-manager/pkg/controller/install/deployment_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,7 @@ func TestInstallStrategyDeploymentCheckInstallErrors(t *testing.T) {
353353
dep.Spec.Template.SetAnnotations(map[string]string{"test": "annotation"})
354354
dep.Spec.RevisionHistoryLimit = &revisionHistoryLimit
355355
dep.SetLabels(labels.CloneAndAddLabel(dep.ObjectMeta.GetLabels(), DeploymentSpecHashLabelKey, HashDeploymentSpec(dep.Spec)))
356+
dep.Labels[OLMManagedLabelKey] = OLMManagedLabelValue
356357
dep.Status.Conditions = append(dep.Status.Conditions, appsv1.DeploymentCondition{
357358
Type: appsv1.DeploymentAvailable,
358359
Status: corev1.ConditionTrue,

staging/operator-lifecycle-manager/pkg/controller/operators/adoption_controller_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66

77
. "github.com/onsi/ginkgo/v2"
88
. "github.com/onsi/gomega"
9+
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install"
910
appsv1 "k8s.io/api/apps/v1"
1011
corev1 "k8s.io/api/core/v1"
1112
rbacv1 "k8s.io/api/rbac/v1"
@@ -350,6 +351,12 @@ var _ = Describe("Adoption Controller", func() {
350351
),
351352
}
352353
for _, component := range components {
354+
labels := component.GetLabels()
355+
if labels == nil {
356+
labels = map[string]string{}
357+
}
358+
labels[install.OLMManagedLabelKey] = install.OLMManagedLabelValue
359+
component.SetLabels(labels)
353360
Eventually(func() error {
354361
return k8sClient.Create(ctx, component)
355362
}, timeout, interval).Should(Succeed())

staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go

Lines changed: 65 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ func NewOperator(ctx context.Context, kubeconfigPath string, clock utilclock.Clo
186186
return nil, err
187187
}
188188

189-
canFilter, err := labeller.Validate(ctx, logger, metadataClient)
189+
canFilter, err := labeller.Validate(ctx, logger, metadataClient, crClient)
190190
if err != nil {
191191
return nil, err
192192
}
@@ -208,10 +208,10 @@ func NewOperator(ctx context.Context, kubeconfigPath string, clock utilclock.Clo
208208
ogQueueSet: queueinformer.NewEmptyResourceQueueSet(),
209209
catalogSubscriberIndexer: map[string]cache.Indexer{},
210210
serviceAccountQuerier: scoped.NewUserDefinedServiceAccountQuerier(logger, crClient),
211-
clientAttenuator: scoped.NewClientAttenuator(logger, config, opClient),
211+
clientAttenuator: scoped.NewClientAttenuator(logger, validatingConfig, opClient),
212212
installPlanTimeout: installPlanTimeout,
213213
bundleUnpackTimeout: bundleUnpackTimeout,
214-
clientFactory: clients.NewFactory(config),
214+
clientFactory: clients.NewFactory(validatingConfig),
215215
}
216216
op.sources = grpc.NewSourceStore(logger, 10*time.Second, 10*time.Minute, op.syncSourceState)
217217
op.sourceInvalidator = resolver.SourceProviderFromRegistryClientProvider(op.sources, logger)
@@ -381,10 +381,27 @@ func NewOperator(ctx context.Context, kubeconfigPath string, clock utilclock.Clo
381381
op.lister.RbacV1().RegisterRoleLister(metav1.NamespaceAll, roleInformer.Lister())
382382
sharedIndexInformers = append(sharedIndexInformers, roleInformer.Informer())
383383

384-
labelObjects := func(gvr schema.GroupVersionResource, informer cache.SharedIndexInformer, sync queueinformer.LegacySyncHandler) error {
384+
complete := map[schema.GroupVersionResource][]bool{}
385+
completeLock := &sync.Mutex{}
386+
387+
labelObjects := func(gvr schema.GroupVersionResource, informer cache.SharedIndexInformer, sync func(done func() bool) queueinformer.LegacySyncHandler) error {
385388
if canFilter {
386389
return nil
387390
}
391+
392+
// for each GVR, we may have more than one labelling controller active; each of which detects
393+
// when it is done; we allocate a space in complete[gvr][idx] to hold that outcome and track it
394+
var idx int
395+
if _, exists := complete[gvr]; exists {
396+
idx = len(complete[gvr])
397+
complete[gvr] = append(complete[gvr], false)
398+
} else {
399+
idx = 0
400+
complete[gvr] = []bool{false}
401+
}
402+
logger := op.logger.WithFields(logrus.Fields{"gvr": gvr.String(), "index": idx})
403+
logger.Info("registering labeller")
404+
388405
queue := workqueue.NewRateLimitingQueueWithConfig(workqueue.DefaultControllerRateLimiter(), workqueue.RateLimitingQueueConfig{
389406
Name: gvr.String(),
390407
})
@@ -393,7 +410,24 @@ func NewOperator(ctx context.Context, kubeconfigPath string, clock utilclock.Clo
393410
queueinformer.WithQueue(queue),
394411
queueinformer.WithLogger(op.logger),
395412
queueinformer.WithInformer(informer),
396-
queueinformer.WithSyncer(sync.ToSyncer()),
413+
queueinformer.WithSyncer(sync(func() bool {
414+
// this function is called by the processor when it detects that it's work is done - so, for that
415+
// particular labelling action on that particular GVR, all objects are in the correct state. when
416+
// that action is done, we need to further know if that was the last action to be completed, as
417+
// when every action we know about has been completed, we re-start the process to allow the future
418+
// invocation of this process to filter informers (canFilter = true) and elide all this logic
419+
completeLock.Lock()
420+
logger.Info("labeller complete")
421+
complete[gvr][idx] = true
422+
allDone := true
423+
for _, items := range complete {
424+
for _, done := range items {
425+
allDone = allDone && done
426+
}
427+
}
428+
completeLock.Unlock()
429+
return allDone
430+
}).ToSyncer()),
397431
)
398432
if err != nil {
399433
return err
@@ -409,6 +443,7 @@ func NewOperator(ctx context.Context, kubeconfigPath string, clock utilclock.Clo
409443
rolesgvk := rbacv1.SchemeGroupVersion.WithResource("roles")
410444
if err := labelObjects(rolesgvk, roleInformer.Informer(), labeller.ObjectLabeler[*rbacv1.Role, *rbacv1applyconfigurations.RoleApplyConfiguration](
411445
ctx, op.logger, labeller.Filter(rolesgvk),
446+
roleInformer.Lister().List,
412447
rbacv1applyconfigurations.Role,
413448
func(namespace string, ctx context.Context, cfg *rbacv1applyconfigurations.RoleApplyConfiguration, opts metav1.ApplyOptions) (*rbacv1.Role, error) {
414449
return op.opClient.KubernetesInterface().RbacV1().Roles(namespace).Apply(ctx, cfg, opts)
@@ -421,6 +456,7 @@ func NewOperator(ctx context.Context, kubeconfigPath string, clock utilclock.Clo
421456
func(role *rbacv1.Role) (string, error) {
422457
return resolver.PolicyRuleHashLabelValue(role.Rules)
423458
},
459+
roleInformer.Lister().List,
424460
rbacv1applyconfigurations.Role,
425461
func(namespace string, ctx context.Context, cfg *rbacv1applyconfigurations.RoleApplyConfiguration, opts metav1.ApplyOptions) (*rbacv1.Role, error) {
426462
return op.opClient.KubernetesInterface().RbacV1().Roles(namespace).Apply(ctx, cfg, opts)
@@ -437,6 +473,7 @@ func NewOperator(ctx context.Context, kubeconfigPath string, clock utilclock.Clo
437473
rolebindingsgvk := rbacv1.SchemeGroupVersion.WithResource("rolebindings")
438474
if err := labelObjects(rolebindingsgvk, roleBindingInformer.Informer(), labeller.ObjectLabeler[*rbacv1.RoleBinding, *rbacv1applyconfigurations.RoleBindingApplyConfiguration](
439475
ctx, op.logger, labeller.Filter(rolebindingsgvk),
476+
roleBindingInformer.Lister().List,
440477
rbacv1applyconfigurations.RoleBinding,
441478
func(namespace string, ctx context.Context, cfg *rbacv1applyconfigurations.RoleBindingApplyConfiguration, opts metav1.ApplyOptions) (*rbacv1.RoleBinding, error) {
442479
return op.opClient.KubernetesInterface().RbacV1().RoleBindings(namespace).Apply(ctx, cfg, opts)
@@ -449,6 +486,7 @@ func NewOperator(ctx context.Context, kubeconfigPath string, clock utilclock.Clo
449486
func(roleBinding *rbacv1.RoleBinding) (string, error) {
450487
return resolver.RoleReferenceAndSubjectHashLabelValue(roleBinding.RoleRef, roleBinding.Subjects)
451488
},
489+
roleBindingInformer.Lister().List,
452490
rbacv1applyconfigurations.RoleBinding,
453491
func(namespace string, ctx context.Context, cfg *rbacv1applyconfigurations.RoleBindingApplyConfiguration, opts metav1.ApplyOptions) (*rbacv1.RoleBinding, error) {
454492
return op.opClient.KubernetesInterface().RbacV1().RoleBindings(namespace).Apply(ctx, cfg, opts)
@@ -464,7 +502,19 @@ func NewOperator(ctx context.Context, kubeconfigPath string, clock utilclock.Clo
464502

465503
serviceaccountsgvk := corev1.SchemeGroupVersion.WithResource("serviceaccounts")
466504
if err := labelObjects(serviceaccountsgvk, serviceAccountInformer.Informer(), labeller.ObjectLabeler[*corev1.ServiceAccount, *corev1applyconfigurations.ServiceAccountApplyConfiguration](
467-
ctx, op.logger, labeller.Filter(serviceaccountsgvk),
505+
ctx, op.logger, labeller.ServiceAccountFilter(func(namespace, name string) bool {
506+
operatorGroups, err := operatorGroupInformer.Lister().OperatorGroups(namespace).List(labels.Everything())
507+
if err != nil {
508+
return false
509+
}
510+
for _, operatorGroup := range operatorGroups {
511+
if operatorGroup.Spec.ServiceAccountName == name {
512+
return true
513+
}
514+
}
515+
return false
516+
}),
517+
serviceAccountInformer.Lister().List,
468518
corev1applyconfigurations.ServiceAccount,
469519
func(namespace string, ctx context.Context, cfg *corev1applyconfigurations.ServiceAccountApplyConfiguration, opts metav1.ApplyOptions) (*corev1.ServiceAccount, error) {
470520
return op.opClient.KubernetesInterface().CoreV1().ServiceAccounts(namespace).Apply(ctx, cfg, opts)
@@ -481,6 +531,7 @@ func NewOperator(ctx context.Context, kubeconfigPath string, clock utilclock.Clo
481531
servicesgvk := corev1.SchemeGroupVersion.WithResource("services")
482532
if err := labelObjects(servicesgvk, serviceInformer.Informer(), labeller.ObjectLabeler[*corev1.Service, *corev1applyconfigurations.ServiceApplyConfiguration](
483533
ctx, op.logger, labeller.Filter(servicesgvk),
534+
serviceInformer.Lister().List,
484535
corev1applyconfigurations.Service,
485536
func(namespace string, ctx context.Context, cfg *corev1applyconfigurations.ServiceApplyConfiguration, opts metav1.ApplyOptions) (*corev1.Service, error) {
486537
return op.opClient.KubernetesInterface().CoreV1().Services(namespace).Apply(ctx, cfg, opts)
@@ -506,6 +557,7 @@ func NewOperator(ctx context.Context, kubeconfigPath string, clock utilclock.Clo
506557
podsgvk := corev1.SchemeGroupVersion.WithResource("pods")
507558
if err := labelObjects(podsgvk, csPodInformer.Informer(), labeller.ObjectLabeler[*corev1.Pod, *corev1applyconfigurations.PodApplyConfiguration](
508559
ctx, op.logger, labeller.Filter(podsgvk),
560+
csPodInformer.Lister().List,
509561
corev1applyconfigurations.Pod,
510562
func(namespace string, ctx context.Context, cfg *corev1applyconfigurations.PodApplyConfiguration, opts metav1.ApplyOptions) (*corev1.Pod, error) {
511563
return op.opClient.KubernetesInterface().CoreV1().Pods(namespace).Apply(ctx, cfg, opts)
@@ -543,6 +595,7 @@ func NewOperator(ctx context.Context, kubeconfigPath string, clock utilclock.Clo
543595
ctx, op.logger, labeller.JobFilter(func(namespace, name string) (metav1.Object, error) {
544596
return configMapInformer.Lister().ConfigMaps(namespace).Get(name)
545597
}),
598+
jobInformer.Lister().List,
546599
batchv1applyconfigurations.Job,
547600
func(namespace string, ctx context.Context, cfg *batchv1applyconfigurations.JobApplyConfiguration, opts metav1.ApplyOptions) (*batchv1.Job, error) {
548601
return op.opClient.KubernetesInterface().BatchV1().Jobs(namespace).Apply(ctx, cfg, opts)
@@ -618,6 +671,7 @@ func NewOperator(ctx context.Context, kubeconfigPath string, clock utilclock.Clo
618671
customresourcedefinitionsgvk := apiextensionsv1.SchemeGroupVersion.WithResource("customresourcedefinitions")
619672
if err := labelObjects(customresourcedefinitionsgvk, crdInformer, labeller.ObjectPatchLabeler(
620673
ctx, op.logger, labeller.Filter(customresourcedefinitionsgvk),
674+
crdLister.List,
621675
op.opClient.ApiextensionsInterface().ApiextensionsV1().CustomResourceDefinitions().Patch,
622676
)); err != nil {
623677
return nil, err
@@ -1998,13 +2052,15 @@ func transitionInstallPlanState(log logrus.FieldLogger, transitioner installPlan
19982052
}
19992053
log.Debug("attempting to install")
20002054
if err := transitioner.ExecutePlan(out); err != nil {
2001-
if now.Sub(out.Status.StartTime.Time) >= timeout {
2055+
if apierrors.IsForbidden(err) || now.Sub(out.Status.StartTime.Time) < timeout {
2056+
// forbidden problems are never terminal since we don't know when a user might provide
2057+
// the service account they specified with more permissions
2058+
out.Status.Message = fmt.Sprintf("retrying execution due to error: %s", err.Error())
2059+
} else {
20022060
out.Status.SetCondition(v1alpha1.ConditionFailed(v1alpha1.InstallPlanInstalled,
20032061
v1alpha1.InstallPlanReasonComponentFailed, err.Error(), &now))
20042062
out.Status.Phase = v1alpha1.InstallPlanPhaseFailed
20052063
out.Status.Message = err.Error()
2006-
} else {
2007-
out.Status.Message = fmt.Sprintf("retrying execution due to error: %s", err.Error())
20082064
}
20092065
return out, err
20102066
} else if !out.Status.NeedsRequeue() {

0 commit comments

Comments
 (0)