@ -31,6 +31,7 @@ import (
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/cli-runtime/pkg/resource"
chartcommon "helm.sh/helm/v4/pkg/chart/common"
chart "helm.sh/helm/v4/pkg/chart/v2"
"helm.sh/helm/v4/pkg/kube"
kubefake "helm.sh/helm/v4/pkg/kube/fake"
@ -332,6 +333,56 @@ func TestUpgradeRelease_ReuseValues(t *testing.T) {
}
is . Equal ( expectedValues , updatedRes . Config )
} )
t . Run ( "nulling a previously set nested value with reuse-values takes effect on the first upgrade" , func ( t * testing . T ) {
is := assert . New ( t )
req := require . New ( t )
upAction := upgradeAction ( t )
imageTemplate := & chartcommon . File {
Name : "templates/image" ,
ModTime : time . Now ( ) ,
Data : [ ] byte ( ` image : { { . Values . services . myservice . image | default "chart-default" } }
tag : { { . Values . services . myservice . tag } } ` ) ,
}
ch := buildChartWithTemplates ( [ ] * chartcommon . File { imageTemplate } )
rel := releaseStub ( )
rel . Name = "nuketown"
rel . Info . Status = common . StatusDeployed
rel . Chart = ch
rel . Config = map [ string ] any {
"services" : map [ string ] any {
"myservice" : map [ string ] any {
"image" : "old-image" ,
} ,
} ,
}
req . NoError ( upAction . cfg . Releases . Create ( rel ) )
upAction . ReuseValues = true
resi , err := upAction . Run ( rel . Name , ch , map [ string ] any {
"services" : map [ string ] any {
"myservice" : map [ string ] any {
"image" : nil ,
"tag" : "1.0.0" ,
} ,
} ,
} )
req . NoError ( err )
res , err := releaserToV1Release ( resi )
req . NoError ( err )
services , ok := res . Config [ "services" ] . ( map [ string ] any )
req . True ( ok , "expected services key in persisted config" )
myservice , ok := services [ "myservice" ] . ( map [ string ] any )
req . True ( ok , "expected services.myservice key in persisted config" )
is . NotContains ( myservice , "image" , "explicit null should remove the nested key from the persisted config, at whatever depth it appears" )
is . Equal ( "1.0.0" , myservice [ "tag" ] )
is . Contains ( res . Manifest , "image: chart-default" , "nulling a reused nested value should fall back to the chart default on the first upgrade, not the second" )
is . Contains ( res . Manifest , "tag: 1.0.0" )
} )
}
func TestUpgradeRelease_ResetThenReuseValues ( t * testing . T ) {