@@ -17,6 +17,7 @@ package handlers
1717
1818import (
1919 "fmt"
20+ "strconv"
2021 "strings"
2122
2223 "github.com/go-openapi/runtime/middleware"
@@ -122,24 +123,80 @@ func (h *ReplaceRuntimeServerHandlerImpl) Handle(params server.ReplaceRuntimeSer
122123 return server .NewReplaceRuntimeServerNotFound ().WithPayload (& models.Error {Code : & code , Message : & msg })
123124 }
124125
126+ // save original values for rollback
127+ origOperationalState := rs .OperationalState
128+ origAdminState := rs .AdminState
129+ origWeight := rs .Weight
130+
131+ var changedOperational , changedAdmin , changedWeight bool
132+
125133 // change operational state
126134 if params .Data .OperationalState != "" && rs .OperationalState != params .Data .OperationalState {
127- err = runtime .SetServerHealth (params .ParentName , params .Name , params .Data .OperationalState )
128- if err != nil {
135+ if err = runtime .SetServerHealth (params .ParentName , params .Name , params .Data .OperationalState ); err != nil {
129136 e := misc .HandleError (err )
130137 return server .NewReplaceRuntimeServerDefault (int (* e .Code )).WithPayload (e )
131138 }
139+ changedOperational = true
132140 }
133141
134142 // change admin state
135143 if params .Data .AdminState != "" && rs .AdminState != params .Data .AdminState {
136- err = runtime .SetServerState (params .ParentName , params .Name , params .Data .AdminState )
137- if err != nil {
144+ if err = runtime .SetServerState (params .ParentName , params .Name , params .Data .AdminState ); err != nil {
145+ e := misc .HandleError (err )
146+ if changedOperational {
147+ //nolint:errcheck
148+ runtime .SetServerHealth (params .ParentName , params .Name , origOperationalState )
149+ }
150+ return server .NewReplaceRuntimeServerDefault (int (* e .Code )).WithPayload (e )
151+ }
152+ changedAdmin = true
153+ }
154+
155+ // change weight
156+ if params .Data .Weight != nil && (rs .Weight == nil || * params .Data .Weight != * rs .Weight ) {
157+ if err = runtime .SetServerWeight (params .ParentName , params .Name , strconv .FormatInt (* params .Data .Weight , 10 )); err != nil {
138158 e := misc .HandleError (err )
159+ if changedAdmin {
160+ //nolint:errcheck
161+ runtime .SetServerState (params .ParentName , params .Name , origAdminState )
162+ }
163+ if changedOperational {
164+ //nolint:errcheck
165+ runtime .SetServerHealth (params .ParentName , params .Name , origOperationalState )
166+ }
167+ return server .NewReplaceRuntimeServerDefault (int (* e .Code )).WithPayload (e )
168+ }
169+ changedWeight = true
170+ }
139171
140- // try to revert operational state and fall silently
141- //nolint:errcheck
142- runtime .SetServerHealth (params .ParentName , params .Name , rs .OperationalState )
172+ // change address/port
173+ addrChanged := params .Data .Address != "" && rs .Address != params .Data .Address
174+ portChanged := params .Data .Port != nil && (rs .Port == nil || * params .Data .Port != * rs .Port )
175+ if addrChanged || portChanged {
176+ newAddr := rs .Address
177+ if params .Data .Address != "" {
178+ newAddr = params .Data .Address
179+ }
180+ var newPort int
181+ if params .Data .Port != nil {
182+ newPort = int (* params .Data .Port )
183+ } else if rs .Port != nil {
184+ newPort = int (* rs .Port )
185+ }
186+ if err = runtime .SetServerAddr (params .ParentName , params .Name , newAddr , newPort ); err != nil {
187+ e := misc .HandleError (err )
188+ if changedWeight {
189+ //nolint:errcheck
190+ runtime .SetServerWeight (params .ParentName , params .Name , formatWeightPtr (origWeight ))
191+ }
192+ if changedAdmin {
193+ //nolint:errcheck
194+ runtime .SetServerState (params .ParentName , params .Name , origAdminState )
195+ }
196+ if changedOperational {
197+ //nolint:errcheck
198+ runtime .SetServerHealth (params .ParentName , params .Name , origOperationalState )
199+ }
143200 return server .NewReplaceRuntimeServerDefault (int (* e .Code )).WithPayload (e )
144201 }
145202 }
@@ -153,6 +210,13 @@ func (h *ReplaceRuntimeServerHandlerImpl) Handle(params server.ReplaceRuntimeSer
153210 return server .NewReplaceRuntimeServerOK ().WithPayload (rs )
154211}
155212
213+ func formatWeightPtr (w * int64 ) string {
214+ if w == nil {
215+ return "0"
216+ }
217+ return strconv .FormatInt (* w , 10 )
218+ }
219+
156220// Adds a new server dynamically without modifying the configuration.
157221// Warning: this only works if you have not defined a `default_server` in the defaults
158222// or in the current `backend` section.
0 commit comments