mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-26 21:17:23 +00:00
Merge pull request #46430 from sttts/sttts-fix-cdr-deletion-panic
Automatic merge from submit-queue (batch tested with PRs 44774, 46266, 46248, 46403, 46430) apiextensions: fix nil dereference during deletion The returned condition was possibly nil and we dereferenced it.
This commit is contained in:
commit
714ac7c95e
@ -131,7 +131,7 @@ func (c *CRDFinalizer) sync(key string) error {
|
|||||||
// Since we control the endpoints, we know that delete collection works. No need to delete if not established.
|
// Since we control the endpoints, we know that delete collection works. No need to delete if not established.
|
||||||
if apiextensions.IsCRDConditionTrue(crd, apiextensions.Established) {
|
if apiextensions.IsCRDConditionTrue(crd, apiextensions.Established) {
|
||||||
cond, deleteErr := c.deleteInstances(crd)
|
cond, deleteErr := c.deleteInstances(crd)
|
||||||
apiextensions.SetCRDCondition(crd, *cond)
|
apiextensions.SetCRDCondition(crd, cond)
|
||||||
if deleteErr != nil {
|
if deleteErr != nil {
|
||||||
crd, err = c.crdClient.CustomResourceDefinitions().UpdateStatus(crd)
|
crd, err = c.crdClient.CustomResourceDefinitions().UpdateStatus(crd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -158,19 +158,25 @@ func (c *CRDFinalizer) sync(key string) error {
|
|||||||
return c.crdClient.CustomResourceDefinitions().Delete(crd.Name, nil)
|
return c.crdClient.CustomResourceDefinitions().Delete(crd.Name, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *CRDFinalizer) deleteInstances(crd *apiextensions.CustomResourceDefinition) (*apiextensions.CustomResourceDefinitionCondition, error) {
|
func (c *CRDFinalizer) deleteInstances(crd *apiextensions.CustomResourceDefinition) (apiextensions.CustomResourceDefinitionCondition, error) {
|
||||||
// Now we can start deleting items. While it would be ideal to use a REST API client, doing so
|
// Now we can start deleting items. While it would be ideal to use a REST API client, doing so
|
||||||
// could incorrectly delete a ThirdPartyResource with the same URL as the CustomResource, so we go
|
// could incorrectly delete a ThirdPartyResource with the same URL as the CustomResource, so we go
|
||||||
// directly to the storage instead. Since we control the storage, we know that delete collection works.
|
// directly to the storage instead. Since we control the storage, we know that delete collection works.
|
||||||
crClient := c.crClientGetter.GetCustomResourceListerCollectionDeleter(crd.UID)
|
crClient := c.crClientGetter.GetCustomResourceListerCollectionDeleter(crd.UID)
|
||||||
if crClient == nil {
|
if crClient == nil {
|
||||||
return nil, fmt.Errorf("unable to find a custom resource client for %s.%s", crd.Status.AcceptedNames.Plural, crd.Spec.Group)
|
err := fmt.Errorf("unable to find a custom resource client for %s.%s", crd.Status.AcceptedNames.Plural, crd.Spec.Group)
|
||||||
|
return apiextensions.CustomResourceDefinitionCondition{
|
||||||
|
Type: apiextensions.Terminating,
|
||||||
|
Status: apiextensions.ConditionTrue,
|
||||||
|
Reason: "InstanceDeletionFailed",
|
||||||
|
Message: fmt.Sprintf("could not list instances: %v", err),
|
||||||
|
}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx := genericapirequest.NewContext()
|
ctx := genericapirequest.NewContext()
|
||||||
allResources, err := crClient.List(ctx, nil)
|
allResources, err := crClient.List(ctx, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return &apiextensions.CustomResourceDefinitionCondition{
|
return apiextensions.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.Terminating,
|
Type: apiextensions.Terminating,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensions.ConditionTrue,
|
||||||
Reason: "InstanceDeletionFailed",
|
Reason: "InstanceDeletionFailed",
|
||||||
@ -198,7 +204,7 @@ func (c *CRDFinalizer) deleteInstances(crd *apiextensions.CustomResourceDefiniti
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if deleteError := utilerrors.NewAggregate(deleteErrors); deleteError != nil {
|
if deleteError := utilerrors.NewAggregate(deleteErrors); deleteError != nil {
|
||||||
return &apiextensions.CustomResourceDefinitionCondition{
|
return apiextensions.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.Terminating,
|
Type: apiextensions.Terminating,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensions.ConditionTrue,
|
||||||
Reason: "InstanceDeletionFailed",
|
Reason: "InstanceDeletionFailed",
|
||||||
@ -221,14 +227,14 @@ func (c *CRDFinalizer) deleteInstances(crd *apiextensions.CustomResourceDefiniti
|
|||||||
return false, nil
|
return false, nil
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return &apiextensions.CustomResourceDefinitionCondition{
|
return apiextensions.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.Terminating,
|
Type: apiextensions.Terminating,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensions.ConditionTrue,
|
||||||
Reason: "InstanceDeletionCheck",
|
Reason: "InstanceDeletionCheck",
|
||||||
Message: fmt.Sprintf("could not confirm zero CustomResources remaining: %v", err),
|
Message: fmt.Sprintf("could not confirm zero CustomResources remaining: %v", err),
|
||||||
}, err
|
}, err
|
||||||
}
|
}
|
||||||
return &apiextensions.CustomResourceDefinitionCondition{
|
return apiextensions.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.Terminating,
|
Type: apiextensions.Terminating,
|
||||||
Status: apiextensions.ConditionFalse,
|
Status: apiextensions.ConditionFalse,
|
||||||
Reason: "InstanceDeletionCompleted",
|
Reason: "InstanceDeletionCompleted",
|
||||||
|
Loading…
Reference in New Issue
Block a user