@ -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 {