MCPcopy
hub / github.com/apecloud/kubeblocks / buildChanges

Function buildChanges

controllers/trace/util.go:517–587  ·  view source on GitHub ↗
(oldObjectMap, newObjectMap map[model.GVKNObjKey]client.Object,
	descriptionFormat func(client.Object, client.Object, tracev1.ObjectChangeType, *schema.GroupVersionKind) (string, *string))

Source from the content-addressed store, hash-verified

515}
516
517func buildChanges(oldObjectMap, newObjectMap map[model.GVKNObjKey]client.Object,
518 descriptionFormat func(client.Object, client.Object, tracev1.ObjectChangeType, *schema.GroupVersionKind) (string, *string)) []tracev1.ObjectChange {
519 // calculate createSet, deleteSet and updateSet
520 newObjectSet := sets.KeySet(newObjectMap)
521 oldObjectSet := sets.KeySet(oldObjectMap)
522 createSet := newObjectSet.Difference(oldObjectSet)
523 updateSet := newObjectSet.Intersection(oldObjectSet)
524 deleteSet := oldObjectSet.Difference(newObjectSet)
525
526 // build new slice of reconciliation changes from last round calculation
527 var changes []tracev1.ObjectChange
528 allObjectMap := map[tracev1.ObjectChangeType]sets.Set[model.GVKNObjKey]{
529 tracev1.ObjectCreationType: createSet,
530 tracev1.ObjectUpdateType: updateSet,
531 tracev1.ObjectDeletionType: deleteSet,
532 }
533 // Why not use for-range on allObjectMap:
534 // Order is important here. A for-range on a map can't guarantee the built changes' order.
535 for _, changeType := range []tracev1.ObjectChangeType{tracev1.ObjectCreationType, tracev1.ObjectUpdateType, tracev1.ObjectDeletionType} {
536 changeSet := allObjectMap[changeType]
537 for key := range changeSet {
538 var oldObj, newObj client.Object
539 if oldObjectMap != nil {
540 oldObj = oldObjectMap[key]
541 }
542 if newObjectMap != nil {
543 newObj = newObjectMap[key]
544 }
545 obj := newObj
546 if changeType == tracev1.ObjectDeletionType {
547 obj = oldObj
548 }
549 if changeType == tracev1.ObjectUpdateType &&
550 (oldObj == nil || newObj == nil || oldObj.GetResourceVersion() == newObj.GetResourceVersion()) {
551 continue
552 }
553 isEvent := isEvent(&key.GroupVersionKind)
554 if isEvent && changeType == tracev1.ObjectDeletionType {
555 continue
556 }
557 var (
558 ref *corev1.ObjectReference
559 eventAttributes *tracev1.EventAttributes
560 )
561 if isEvent {
562 changeType = tracev1.EventType
563 evt, _ := obj.(*corev1.Event)
564 ref = &evt.InvolvedObject
565 eventAttributes = &tracev1.EventAttributes{
566 Name: evt.Name,
567 Type: evt.Type,
568 Reason: evt.Reason,
569 }
570 } else {
571 ref = objectRefToReference(key, obj.GetUID(), obj.GetResourceVersion())
572 }
573 description, localDescription := descriptionFormat(oldObj, newObj, changeType, &key.GroupVersionKind)
574 change := tracev1.ObjectChange{

Callers 5

util_test.goFile · 0.85
ReconcileMethod · 0.85
captureCreationMethod · 0.85
captureUpdateMethod · 0.85
captureDeletionMethod · 0.85

Calls 3

isEventFunction · 0.85
objectRefToReferenceFunction · 0.85
parseRevisionFunction · 0.70

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…