@@ -808,6 +808,7 @@ func (client *NginxClient) DeleteHTTPServer(ctx context.Context, upstream string
808
808
// Servers that are in the slice, but don't exist in NGINX will be added to NGINX.
809
809
// Servers that aren't in the slice, but exist in NGINX, will be removed from NGINX.
810
810
// 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.
811
812
func (client * NginxClient ) UpdateHTTPServers (ctx context.Context , upstream string , servers []UpstreamServer ) (added []UpstreamServer , deleted []UpstreamServer , updated []UpstreamServer , err error ) {
812
813
serversInNginx , err := client .GetHTTPServers (ctx , upstream )
813
814
if err != nil {
@@ -824,27 +825,37 @@ func (client *NginxClient) UpdateHTTPServers(ctx context.Context, upstream strin
824
825
toAdd , toDelete , toUpdate := determineUpdates (formattedServers , serversInNginx )
825
826
826
827
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
830
832
}
833
+ added = append (added , server )
831
834
}
832
835
833
836
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
837
841
}
842
+ deleted = append (deleted , server )
838
843
}
839
844
840
845
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
844
850
}
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 )
845
856
}
846
857
847
- return toAdd , toDelete , toUpdate , nil
858
+ return added , deleted , updated , err
848
859
}
849
860
850
861
// 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
1108
1119
// Servers that are in the slice, but don't exist in NGINX will be added to NGINX.
1109
1120
// Servers that aren't in the slice, but exist in NGINX, will be removed from NGINX.
1110
1121
// 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.
1111
1123
func (client * NginxClient ) UpdateStreamServers (ctx context.Context , upstream string , servers []StreamUpstreamServer ) (added []StreamUpstreamServer , deleted []StreamUpstreamServer , updated []StreamUpstreamServer , err error ) {
1112
1124
serversInNginx , err := client .GetStreamServers (ctx , upstream )
1113
1125
if err != nil {
@@ -1123,27 +1135,37 @@ func (client *NginxClient) UpdateStreamServers(ctx context.Context, upstream str
1123
1135
toAdd , toDelete , toUpdate := determineStreamUpdates (formattedServers , serversInNginx )
1124
1136
1125
1137
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
1129
1142
}
1143
+ added = append (added , server )
1130
1144
}
1131
1145
1132
1146
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
1136
1151
}
1152
+ deleted = append (deleted , server )
1137
1153
}
1138
1154
1139
1155
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
1143
1160
}
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 )
1144
1166
}
1145
1167
1146
- return toAdd , toDelete , toUpdate , nil
1168
+ return added , deleted , updated , err
1147
1169
}
1148
1170
1149
1171
func (client * NginxClient ) getIDOfStreamServer (ctx context.Context , upstream string , name string ) (int , error ) {
0 commit comments