@@ -808,6 +808,7 @@ func (client *NginxClient) DeleteHTTPServer(ctx context.Context, upstream string
808808// Servers that are in the slice, but don't exist in NGINX will be added to NGINX.
809809// Servers that aren't in the slice, but exist in NGINX, will be removed from NGINX.
810810// Servers that are in the slice and exist in NGINX, but have different parameters, will be updated.
811+ // The client will attempt to update all servers, returning all the errors that occurred.
811812func (client * NginxClient ) UpdateHTTPServers (ctx context.Context , upstream string , servers []UpstreamServer ) (added []UpstreamServer , deleted []UpstreamServer , updated []UpstreamServer , err error ) {
812813 serversInNginx , err := client .GetHTTPServers (ctx , upstream )
813814 if err != nil {
@@ -824,27 +825,37 @@ func (client *NginxClient) UpdateHTTPServers(ctx context.Context, upstream strin
824825 toAdd , toDelete , toUpdate := determineUpdates (formattedServers , serversInNginx )
825826
826827 for _ , server := range toAdd {
827- err := client .AddHTTPServer (ctx , upstream , server )
828- if err != nil {
829- return nil , nil , nil , fmt .Errorf ("failed to update servers of %v upstream: %w" , upstream , err )
828+ addErr := client .AddHTTPServer (ctx , upstream , server )
829+ if addErr != nil {
830+ err = errors .Join (err , addErr )
831+ continue
830832 }
833+ added = append (added , server )
831834 }
832835
833836 for _ , server := range toDelete {
834- err := client .DeleteHTTPServer (ctx , upstream , server .Server )
835- if err != nil {
836- return nil , nil , nil , fmt .Errorf ("failed to update servers of %v upstream: %w" , upstream , err )
837+ deleteErr := client .DeleteHTTPServer (ctx , upstream , server .Server )
838+ if deleteErr != nil {
839+ err = errors .Join (err , deleteErr )
840+ continue
837841 }
842+ deleted = append (deleted , server )
838843 }
839844
840845 for _ , server := range toUpdate {
841- err := client .UpdateHTTPServer (ctx , upstream , server )
842- if err != nil {
843- return nil , nil , nil , fmt .Errorf ("failed to update servers of %v upstream: %w" , upstream , err )
846+ updateErr := client .UpdateHTTPServer (ctx , upstream , server )
847+ if updateErr != nil {
848+ err = errors .Join (err , updateErr )
849+ continue
844850 }
851+ updated = append (updated , server )
852+ }
853+
854+ if err != nil {
855+ err = fmt .Errorf ("failed to update servers of %s upstream: %w" , upstream , err )
845856 }
846857
847- return toAdd , toDelete , toUpdate , nil
858+ return added , deleted , updated , err
848859}
849860
850861// haveSameParameters checks if a given server has the same parameters as a server already present in NGINX. Order matters.
@@ -1108,6 +1119,7 @@ func (client *NginxClient) DeleteStreamServer(ctx context.Context, upstream stri
11081119// Servers that are in the slice, but don't exist in NGINX will be added to NGINX.
11091120// Servers that aren't in the slice, but exist in NGINX, will be removed from NGINX.
11101121// Servers that are in the slice and exist in NGINX, but have different parameters, will be updated.
1122+ // The client will attempt to update all servers, returning all the errors that occurred.
11111123func (client * NginxClient ) UpdateStreamServers (ctx context.Context , upstream string , servers []StreamUpstreamServer ) (added []StreamUpstreamServer , deleted []StreamUpstreamServer , updated []StreamUpstreamServer , err error ) {
11121124 serversInNginx , err := client .GetStreamServers (ctx , upstream )
11131125 if err != nil {
@@ -1123,27 +1135,37 @@ func (client *NginxClient) UpdateStreamServers(ctx context.Context, upstream str
11231135 toAdd , toDelete , toUpdate := determineStreamUpdates (formattedServers , serversInNginx )
11241136
11251137 for _ , server := range toAdd {
1126- err := client .AddStreamServer (ctx , upstream , server )
1127- if err != nil {
1128- return nil , nil , nil , fmt .Errorf ("failed to update stream servers of %v upstream: %w" , upstream , err )
1138+ addErr := client .AddStreamServer (ctx , upstream , server )
1139+ if addErr != nil {
1140+ err = errors .Join (err , addErr )
1141+ continue
11291142 }
1143+ added = append (added , server )
11301144 }
11311145
11321146 for _ , server := range toDelete {
1133- err := client .DeleteStreamServer (ctx , upstream , server .Server )
1134- if err != nil {
1135- return nil , nil , nil , fmt .Errorf ("failed to update stream servers of %v upstream: %w" , upstream , err )
1147+ deleteErr := client .DeleteStreamServer (ctx , upstream , server .Server )
1148+ if deleteErr != nil {
1149+ err = errors .Join (err , deleteErr )
1150+ continue
11361151 }
1152+ deleted = append (deleted , server )
11371153 }
11381154
11391155 for _ , server := range toUpdate {
1140- err := client .UpdateStreamServer (ctx , upstream , server )
1141- if err != nil {
1142- return nil , nil , nil , fmt .Errorf ("failed to update stream servers of %v upstream: %w" , upstream , err )
1156+ updateErr := client .UpdateStreamServer (ctx , upstream , server )
1157+ if updateErr != nil {
1158+ err = errors .Join (err , updateErr )
1159+ continue
11431160 }
1161+ updated = append (updated , server )
1162+ }
1163+
1164+ if err != nil {
1165+ err = fmt .Errorf ("failed to update stream servers of %s upstream: %w" , upstream , err )
11441166 }
11451167
1146- return toAdd , toDelete , toUpdate , nil
1168+ return added , deleted , updated , err
11471169}
11481170
11491171func (client * NginxClient ) getIDOfStreamServer (ctx context.Context , upstream string , name string ) (int , error ) {
0 commit comments