Change:
<!-- Please only use this template for submitting reports about flaky tests or jobs (pass or fail with no underlying change in code) in Kubernetes CI --Which jobs are flaking: pull-kubernetes-bazel-test Which test(s) are flaking: Testgrid link: Example pass: Example fail: Reason for failure: Unknown Anything else we need to know: Looks like it's an apiserver test, but I'm not too sure. links to appreciated: <!-- Please see the deflaking doc () for more guidance! --/kind flake
Looks like is flaky too. Example fail:
/sig api-machinery
Thanks for the report. Please report individual failing tests/packages so the responsible sigs can be assigned. The cm/devicemanager issue is tracked in
/assign
Issues go stale after 90d of inactivity. Mark the issue as fresh with . Stale issues rot after an additional 30d of inactivity and eventually close. If this issue is safe to close now please do so with . Send feedback to sig-testing, kubernetes/test-infra and/or . /lifecycle stale
Stale issues rot after 30d of inactivity. Mark the issue as fresh with . Rotten issues close after an additional 30d of inactivity. If this issue is safe to close now please do so with . Send feedback to sig-testing, kubernetes/test-infra and/or . /lifecycle rotten
I don't see individual issues yet, but I do see open PRs targeting this issue /remove-lifecycle rotten
closing in favor of specific issues: /close
Closing this issue. <detailsIn response to : closing in favor of specific issues: Instructions for interacting with me using PR comments are available . If you have questions or suggestions related to my behavior, please file an issue against the repository. </details

Discussion:
configuration *atomic.Value lister        admissionregistrationlisters.MutatingWebhookConfigurationLister hasSynced     func() bool <ins> // initialConfigurationSynced stores a boolean value, which tracks if // the existing webhook configs have been synced (honored) by the // manager at startup-- the informer has synced and either has no items // or has finished executing updateConfiguration() once. initialConfigurationSynced *atomic.Value </ins> } var _ generic.Source = &mutatingWebhookConfigurationManager{}

func NewMutatingWebhookConfigurationManager(f informers.SharedInformerFactory) generic.Source { informer := f.Admissionregistration().V1().MutatingWebhookConfigurations() manager := &mutatingWebhookConfigurationManager{ <del> configuration: &atomic.Value{}, lister:        informer.Lister(), hasSynced:     informer.Informer().HasSynced, </del> <ins> configuration:              &atomic.Value{}, lister:                     informer.Lister(), hasSynced:                  informer.Informer().HasSynced, initialConfigurationSynced: &atomic.Value{}, </ins> } // Start with an empty list manager.configuration.Store([]webhook.WebhookAccessor{}) <ins> manager.initialConfigurationSynced.Store(false) </ins> // On any change, rebuild the config informer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{

return m.configuration.Load().([]webhook.WebhookAccessor) } <ins> // HasSynced returns true when the manager is synced with existing webhookconfig // objects at startup-- which means the informer is synced and either has no items // or updateConfiguration() has completed. </ins> func (m *mutatingWebhookConfigurationManager) HasSynced() bool { <del> return m.hasSynced() </del> <ins> if !m.hasSynced() { return false } if m.initialConfigurationSynced.Load().(bool) { // the informer has synced and configuration has been updated return true } if configurations, err := m.lister.List(labels.Everything()); err == nil && len(configurations) == 0 { // the empty list we initially stored is valid to use. // Setting initialConfigurationSynced to true, so subsequent checks // would be able to take the fast path on the atomic boolean in a // cluster without any admission webhooks configured. m.initialConfigurationSynced.Store(true) // the informer has synced and we don't have any items return true } return false </ins> } func (m *mutatingWebhookConfigurationManager) updateConfiguration() {

return } m.configuration.Store(mergeMutatingWebhookConfigurations(configurations)) <ins> m.initialConfigurationSynced.Store(true) </ins> } func mergeMutatingWebhookConfigurations(configurations []*v1.MutatingWebhookConfiguration) []webhook.WebhookAccessor {

configuration *atomic.Value lister        admissionregistrationlisters.ValidatingWebhookConfigurationLister hasSynced     func() bool <ins> // initialConfigurationSynced stores a boolean value, which tracks if // the existing webhook configs have been synced (honored) by the // manager at startup-- the informer has synced and either has no items // or has finished executing updateConfiguration() once. initialConfigurationSynced *atomic.Value </ins> } var _ generic.Source = &validatingWebhookConfigurationManager{}

func NewValidatingWebhookConfigurationManager(f informers.SharedInformerFactory) generic.Source { informer := f.Admissionregistration().V1().ValidatingWebhookConfigurations() manager := &validatingWebhookConfigurationManager{ <del> configuration: &atomic.Value{}, lister:        informer.Lister(), hasSynced:     informer.Informer().HasSynced, </del> <ins> configuration:              &atomic.Value{}, lister:                     informer.Lister(), hasSynced:                  informer.Informer().HasSynced, initialConfigurationSynced: &atomic.Value{}, </ins> } // Start with an empty list manager.configuration.Store([]webhook.WebhookAccessor{}) <ins> manager.initialConfigurationSynced.Store(false) </ins> // On any change, rebuild the config informer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{

return v.configuration.Load().([]webhook.WebhookAccessor) } <del> // HasSynced returns true if the shared informers have synced. </del> <ins> // HasSynced returns true when the manager is synced with existing webhookconfig // objects at startup-- which means the informer is synced and either has no items // or updateConfiguration() has completed. </ins> func (v *validatingWebhookConfigurationManager) HasSynced() bool { <del> return v.hasSynced() </del> <ins> if !v.hasSynced() { return false } if v.initialConfigurationSynced.Load().(bool) { // the informer has synced and configuration has been updated return true } if configurations, err := v.lister.List(labels.Everything()); err == nil && len(configurations) == 0 { // the empty list we initially stored is valid to use. // Setting initialConfigurationSynced to true, so subsequent checks // would be able to take the fast path on the atomic boolean in a // cluster without any admission webhooks configured. v.initialConfigurationSynced.Store(true) // the informer has synced and we don't have any items return true } return false </ins> } func (v *validatingWebhookConfigurationManager) updateConfiguration() {

return } v.configuration.Store(mergeValidatingWebhookConfigurations(configurations)) <ins> v.initialConfigurationSynced.Store(true) </ins> } func mergeValidatingWebhookConfigurations(configurations []*v1.ValidatingWebhookConfiguration) []webhook.WebhookAccessor {