Skip to content

Commit 29d20c4

Browse files
committed
MEDIUM: runtime: add all supported server parameters
1 parent 11611a0 commit 29d20c4

File tree

2 files changed

+72
-7
lines changed

2 files changed

+72
-7
lines changed

.aspell.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ allowed:
4444
- txt
4545
- testname
4646
- uid
47+
- url
4748
- DPAPI
4849
- PROPAGDELAY
4950
- PROPAGTIMEOUT

handlers/runtime_server.go

Lines changed: 71 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package handlers
1717

1818
import (
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

Comments
 (0)