Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 17 additions & 12 deletions pkg/operator/resource/resourceapply/core.go
Original file line number Diff line number Diff line change
Expand Up @@ -337,24 +337,17 @@ func ApplyConfigMapImproved(ctx context.Context, client coreclientv1.ConfigMapsG

// ApplySecret merges objectmeta, requires data
func ApplySecretImproved(ctx context.Context, client coreclientv1.SecretsGetter, recorder events.Recorder, requiredInput *corev1.Secret, cache ResourceCache) (*corev1.Secret, bool, error) {
// copy the stringData to data. Error on a data content conflict inside required. This is usually a bug.

existing, err := client.Secrets(requiredInput.Namespace).Get(ctx, requiredInput.Name, metav1.GetOptions{})
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

existing, err := 
if err != nil && !apierrors.IsNotFound(err){
    return nil, false, err
}
if cache.SafeToSkipApply(requiredInput, existing) {
	return existing, false, nil
}

// do the required deep copy and string data stuff

if apierrors.IsNotFound(err) {
		requiredCopy := requiredInput.DeepCopy()
		actual, err := client.Secrets(requiredCopy.Namespace).
			Create(ctx, resourcemerge.WithCleanLabelsAndAnnotations(requiredCopy).(*corev1.Secret), metav1.CreateOptions{})
		reportCreateEvent(recorder, requiredCopy, err)
		cache.UpdateCachedResourceMetadata(requiredInput, actual)
		return actual, true, err
	}

// make sure all UpdateCachedResourceMetadata use requiredInput and not required

and you keep your "skip deep copy" behavior, right?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just tested your suggestion, but I had to make a small change to get the unit tests to pass (requiredCopy := required.DeepCopy() instead of requiredCopy := requiredInput.DeepCopy()

if apierrors.IsNotFound(err) {
requiredCopy := requiredInput.DeepCopy()
actual, err := client.Secrets(requiredCopy.Namespace).
Create(ctx, resourcemerge.WithCleanLabelsAndAnnotations(requiredCopy).(*corev1.Secret), metav1.CreateOptions{})
reportCreateEvent(recorder, requiredCopy, err)
cache.UpdateCachedResourceMetadata(requiredInput, actual)
return actual, true, err
}
if err != nil {
if err != nil && !apierrors.IsNotFound(err) {
return nil, false, err
}

if cache.SafeToSkipApply(requiredInput, existing) {
return existing, false, nil
}

// copy the stringData to data. Error on a data content conflict inside required. This is usually a bug.
required := requiredInput.DeepCopy()
if required.Data == nil {
required.Data = map[string][]byte{}
Expand All @@ -369,6 +362,18 @@ func ApplySecretImproved(ctx context.Context, client coreclientv1.SecretsGetter,
}
required.StringData = nil

if apierrors.IsNotFound(err) {
requiredCopy := required.DeepCopy()
actual, err := client.Secrets(requiredCopy.Namespace).
Create(ctx, resourcemerge.WithCleanLabelsAndAnnotations(requiredCopy).(*corev1.Secret), metav1.CreateOptions{})
reportCreateEvent(recorder, requiredCopy, err)
cache.UpdateCachedResourceMetadata(requiredInput, actual)
return actual, true, err
}
if err != nil {
return nil, false, err
}

existingCopy := existing.DeepCopy()

resourcemerge.EnsureObjectMeta(resourcemerge.BoolPtr(false), &existingCopy.ObjectMeta, required.ObjectMeta)
Expand Down Expand Up @@ -397,7 +402,7 @@ func ApplySecretImproved(ctx context.Context, client coreclientv1.SecretsGetter,
}

if equality.Semantic.DeepEqual(existingCopy, existing) {
cache.UpdateCachedResourceMetadata(required, existingCopy)
cache.UpdateCachedResourceMetadata(requiredInput, existingCopy)
return existing, false, nil
}

Expand Down Expand Up @@ -431,7 +436,7 @@ func ApplySecretImproved(ctx context.Context, client coreclientv1.SecretsGetter,
existingCopy.ResourceVersion = ""
actual, err = client.Secrets(required.Namespace).Create(ctx, existingCopy, metav1.CreateOptions{})
reportCreateEvent(recorder, existingCopy, err)
cache.UpdateCachedResourceMetadata(required, actual)
cache.UpdateCachedResourceMetadata(requiredInput, actual)
return actual, true, err
}

Expand Down