func shouldOrphanDependents(e event, accessor meta.Object) bool { // The delta_fifo may combine the creation and update of the object into one // event, so we need to check AddEvent as well. if e.oldObj == nil { if accessor.GetDeletionTimestamp() == nil { return false } } else { oldAccessor, err := meta.Accessor(e.oldObj) if err != nil { utilruntime.HandleError(fmt.Errorf("cannot access oldObj: %v", err)) return false } // ignore the event if it's not updating DeletionTimestamp from non-nil to nil. if accessor.GetDeletionTimestamp() == nil || oldAccessor.GetDeletionTimestamp() != nil { return false } } finalizers := accessor.GetFinalizers() for _, finalizer := range finalizers { if finalizer == api.FinalizerOrphan { return true } } return false }
// shouldUpdateFinalizers returns if we need to update the finalizers of the // object, and the desired list of finalizers. // When deciding whether to add the OrphanDependent finalizer, factors in the // order of highest to lowest priority are: options.OrphanDependents, existing // finalizers of the object, e.DeleteStrategy.DefaultGarbageCollectionPolicy. func shouldUpdateFinalizers(e *Store, accessor meta.Object, options *api.DeleteOptions) (shouldUpdate bool, newFinalizers []string) { shouldOrphan := false // Get default orphan policy from this REST object type if gcStrategy, ok := e.DeleteStrategy.(rest.GarbageCollectionDeleteStrategy); ok { if gcStrategy.DefaultGarbageCollectionPolicy() == rest.OrphanDependents { shouldOrphan = true } } // If a finalizer is set in the object, it overrides the default hasOrphanFinalizer := false finalizers := accessor.GetFinalizers() for _, f := range finalizers { if f == api.FinalizerOrphan { shouldOrphan = true hasOrphanFinalizer = true break } // TODO: update this when we add a finalizer indicating a preference for the other behavior } // If an explicit policy was set at deletion time, that overrides both if options != nil && options.OrphanDependents != nil { shouldOrphan = *options.OrphanDependents } if shouldOrphan && !hasOrphanFinalizer { finalizers = append(finalizers, api.FinalizerOrphan) return true, finalizers } if !shouldOrphan && hasOrphanFinalizer { var newFinalizers []string for _, f := range finalizers { if f == api.FinalizerOrphan { continue } newFinalizers = append(newFinalizers, f) } return true, newFinalizers } return false, finalizers }
// return if we need to update the finalizers of the object, and the desired list of finalizers func shouldUpdateFinalizers(accessor meta.Object, options *api.DeleteOptions) (shouldUpdate bool, newFinalizers []string) { if options == nil || options.OrphanDependents == nil { return false, accessor.GetFinalizers() } shouldOrphan := *options.OrphanDependents alreadyOrphan := false finalizers := accessor.GetFinalizers() newFinalizers = make([]string, 0, len(finalizers)) for _, f := range finalizers { if f == api.FinalizerOrphan { alreadyOrphan = true if !shouldOrphan { continue } } newFinalizers = append(newFinalizers, f) } if shouldOrphan && !alreadyOrphan { newFinalizers = append(newFinalizers, api.FinalizerOrphan) } shouldUpdate = shouldOrphan != alreadyOrphan return shouldUpdate, newFinalizers }