pull/32708/merge
玉升 2 days ago committed by GitHub
commit fc98e7fb32
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -204,10 +204,12 @@ func (i *Install) installCRDs(crds []chart.CRD) error {
return fmt.Errorf("failed to install CRD %s: resources are empty", obj.Name) return fmt.Errorf("failed to install CRD %s: resources are empty", obj.Name)
} }
// Send them to Kube // Send them to Kube. Upgrade any leftover client-side field manager so
// a later server-side apply does not conflict with a previous Helm CSA write.
if _, err := i.cfg.KubeClient.Create( if _, err := i.cfg.KubeClient.Create(
res, res,
kube.ClientCreateOptionServerSideApply(i.ServerSideApply, i.ForceConflicts)); err != nil { kube.ClientCreateOptionServerSideApply(i.ServerSideApply, i.ForceConflicts),
kube.ClientCreateOptionUpgradeClientSideFieldManager(i.ServerSideApply)); err != nil {
// If the error is CRD already exists, continue. // If the error is CRD already exists, continue.
if apierrors.IsAlreadyExists(err) { if apierrors.IsAlreadyExists(err) {
crdName := obj.Name crdName := obj.Name

@ -271,6 +271,7 @@ type clientCreateOptions struct {
forceConflicts bool forceConflicts bool
dryRun bool dryRun bool
fieldValidationDirective FieldValidationDirective fieldValidationDirective FieldValidationDirective
upgradeClientSideFieldManager bool
} }
type ClientCreateOption func(*clientCreateOptions) error type ClientCreateOption func(*clientCreateOptions) error
@ -315,13 +316,25 @@ func ClientCreateOptionFieldValidationDirective(fieldValidationDirective FieldVa
} }
} }
func (c *Client) makeCreateApplyFunc(serverSideApply, forceConflicts, dryRun bool, fieldValidationDirective FieldValidationDirective) CreateApplyFunc { // ClientCreateOptionUpgradeClientSideFieldManager upgrades client-side field
// management to server-side apply before creating with SSA. This is required
// when a resource already exists from a previous client-side write by Helm.
func ClientCreateOptionUpgradeClientSideFieldManager(upgradeClientSideFieldManager bool) ClientCreateOption {
return func(o *clientCreateOptions) error {
o.upgradeClientSideFieldManager = upgradeClientSideFieldManager
return nil
}
}
func (c *Client) makeCreateApplyFunc(serverSideApply, forceConflicts, dryRun bool, fieldValidationDirective FieldValidationDirective, upgradeCSAFieldManager bool) CreateApplyFunc {
if serverSideApply { if serverSideApply {
c.Logger().Debug( c.Logger().Debug(
"using server-side apply for resource creation", "using server-side apply for resource creation",
slog.Bool("forceConflicts", forceConflicts), slog.Bool("forceConflicts", forceConflicts),
slog.Bool("dryRun", dryRun), slog.Bool("dryRun", dryRun),
slog.String("fieldValidationDirective", string(fieldValidationDirective))) slog.String("fieldValidationDirective", string(fieldValidationDirective)),
slog.Bool("upgradeClientSideFieldManager", upgradeCSAFieldManager))
return func(target *resource.Info) error { return func(target *resource.Info) error {
logger := c.Logger().With( logger := c.Logger().With(
@ -333,6 +346,17 @@ func (c *Client) makeCreateApplyFunc(serverSideApply, forceConflicts, dryRun boo
retry.DefaultRetry, retry.DefaultRetry,
isServerSideRetryable, isServerSideRetryable,
func() error { func() error {
if upgradeCSAFieldManager {
patched, err := upgradeClientSideFieldManager(target, dryRun, fieldValidationDirective)
if err != nil && !apierrors.IsNotFound(err) {
logger.Debug("Error patching resource to replace CSA field management", slog.Any("error", err))
return err
}
if patched {
logger.Debug("Upgraded object client-side field management with server-side apply field management")
}
}
err := patchResourceServerSide(target, dryRun, forceConflicts, fieldValidationDirective) err := patchResourceServerSide(target, dryRun, forceConflicts, fieldValidationDirective)
if err != nil { if err != nil {
logger.Debug("Error creating resource via patch", slog.Any("error", err)) logger.Debug("Error creating resource via patch", slog.Any("error", err))
@ -370,7 +394,8 @@ func (c *Client) Create(resources ResourceList, options ...ClientCreateOption) (
createOptions.serverSideApply, createOptions.serverSideApply,
createOptions.forceConflicts, createOptions.forceConflicts,
createOptions.dryRun, createOptions.dryRun,
createOptions.fieldValidationDirective) createOptions.fieldValidationDirective,
createOptions.upgradeClientSideFieldManager)
if err := perform(resources, createApplyFunc); err != nil { if err := perform(resources, createApplyFunc); err != nil {
return nil, err return nil, err
} }
@ -835,7 +860,8 @@ func (c *Client) Update(originals, targets ResourceList, options ...ClientUpdate
updateOptions.serverSideApply, updateOptions.serverSideApply,
updateOptions.forceConflicts, updateOptions.forceConflicts,
updateOptions.dryRun, updateOptions.dryRun,
updateOptions.fieldValidationDirective) updateOptions.fieldValidationDirective,
false)
makeUpdateApplyFunc := func() UpdateApplyFunc { makeUpdateApplyFunc := func() UpdateApplyFunc {
if updateOptions.forceReplace { if updateOptions.forceReplace {

Loading…
Cancel
Save