@ -411,7 +411,25 @@ func TestUpdate(t *testing.T) {
"/namespaces/default/pods/forbidden:GET" ,
"/namespaces/default/pods/forbidden:DELETE" ,
) ,
ExpectedError : "failed to delete resource forbidden:" ,
ExpectedError : "failed to delete resource namespace=default, name=forbidden, kind=Pod:" ,
} ,
"rollback after failed upgrade with removed resource" : {
// Simulates rollback scenario:
// - Revision 1 had "newpod"
// - Revision 2 removed "newpod" but upgrade failed (OriginalPods is empty)
// - Cluster still has "newpod" from Revision 1
// - Rolling back to Revision 1 (TargetPods with "newpod") should succeed
OriginalPods : v1 . PodList { } , // Revision 2 (failed) - resource was removed
TargetPods : newPodList ( "newpod" ) , // Revision 1 - rolling back to this
ThreeWayMergeForUnstructured : false ,
ServerSideApply : true ,
ExpectedActions : [ ] string {
"/namespaces/default/pods/newpod:GET" , // Check if resource exists
"/namespaces/default/pods/newpod:GET" , // Get current state (first call in update path)
"/namespaces/default/pods/newpod:GET" , // Get current cluster state to use as baseline
"/namespaces/default/pods/newpod:PATCH" , // Update using cluster state as baseline
} ,
ExpectedError : "" ,
} ,
}
@ -428,6 +446,10 @@ func TestUpdate(t *testing.T) {
p , m := req . URL . Path , req . Method
switch {
case p == "/namespaces/default/pods/newpod" && m == http . MethodGet :
return newResponse ( http . StatusOK , & listTarget . Items [ 0 ] )
case p == "/namespaces/default/pods/newpod" && m == http . MethodPatch :
return newResponse ( http . StatusOK , & listTarget . Items [ 0 ] )
case p == "/namespaces/default/pods/starfish" && m == http . MethodGet :
return newResponse ( http . StatusOK , & listOriginal . Items [ 0 ] )
case p == "/namespaces/default/pods/otter" && m == http . MethodGet :
@ -519,9 +541,23 @@ func TestUpdate(t *testing.T) {
require . NoError ( t , err )
}
assert . Len ( t , result . Created , 1 , "expected 1 resource created, got %d" , len ( result . Created ) )
assert . Len ( t , result . Updated , 2 , "expected 2 resource updated, got %d" , len ( result . Updated ) )
assert . Len ( t , result . Deleted , 1 , "expected 1 resource deleted, got %d" , len ( result . Deleted ) )
// Special handling for the rollback test case
if name == "rollback after failed upgrade with removed resource" {
assert . Len ( t , result . Created , 0 , "expected 0 resource created, got %d" , len ( result . Created ) )
assert . Len ( t , result . Updated , 1 , "expected 1 resource updated, got %d" , len ( result . Updated ) )
assert . Len ( t , result . Deleted , 0 , "expected 0 resource deleted, got %d" , len ( result . Deleted ) )
} else {
assert . Len ( t , result . Created , 1 , "expected 1 resource created, got %d" , len ( result . Created ) )
assert . Len ( t , result . Updated , 2 , "expected 2 resource updated, got %d" , len ( result . Updated ) )
assert . Len ( t , result . Deleted , 1 , "expected 1 resource deleted, got %d" , len ( result . Deleted ) )
}
if tc . ExpectedError != "" {
require . Error ( t , err )
require . Contains ( t , err . Error ( ) , tc . ExpectedError )
} else {
require . NoError ( t , err )
}
actions := [ ] string { }
for _ , action := range client . Actions {