77 lines
2.1 KiB
Go
77 lines
2.1 KiB
Go
package v1
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"github.com/gorilla/mux"
|
|
)
|
|
|
|
// ConfigUpdate represents a single configuration update
|
|
type ConfigUpdate struct {
|
|
Path string `json:"path"`
|
|
Value interface{} `json:"value"`
|
|
}
|
|
|
|
// ConfigUpdateBatchRequest represents a batch configuration update request
|
|
type ConfigUpdateBatchRequest struct {
|
|
Updates []ConfigUpdate `json:"updates"`
|
|
}
|
|
|
|
// ConfigUpdateBatch updates multiple configuration values atomically
|
|
func (api *API) ConfigUpdateBatch(w http.ResponseWriter, r *http.Request) {
|
|
vars := mux.Vars(r)
|
|
name := vars["name"]
|
|
|
|
// Validate instance exists
|
|
if err := api.instance.ValidateInstance(name); err != nil {
|
|
respondError(w, http.StatusNotFound, fmt.Sprintf("Instance not found: %v", err))
|
|
return
|
|
}
|
|
|
|
// Parse request body
|
|
var req ConfigUpdateBatchRequest
|
|
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
|
respondError(w, http.StatusBadRequest, "Invalid request body")
|
|
return
|
|
}
|
|
|
|
if len(req.Updates) == 0 {
|
|
respondError(w, http.StatusBadRequest, "updates array is required and cannot be empty")
|
|
return
|
|
}
|
|
|
|
// Get config path
|
|
configPath := api.instance.GetInstanceConfigPath(name)
|
|
|
|
// Validate all paths before applying changes
|
|
for i, update := range req.Updates {
|
|
if update.Path == "" {
|
|
respondError(w, http.StatusBadRequest, fmt.Sprintf("update[%d]: path is required", i))
|
|
return
|
|
}
|
|
}
|
|
|
|
// Apply all updates atomically
|
|
// The config manager's SetConfigValue already uses file locking,
|
|
// so each individual update is atomic. For true atomicity across
|
|
// all updates, we would need to implement transaction support.
|
|
// For now, we apply updates sequentially within the lock.
|
|
updateCount := 0
|
|
for _, update := range req.Updates {
|
|
valueStr := fmt.Sprintf("%v", update.Value)
|
|
if err := api.config.SetConfigValue(configPath, update.Path, valueStr); err != nil {
|
|
respondError(w, http.StatusInternalServerError,
|
|
fmt.Sprintf("Failed to update config path %s: %v", update.Path, err))
|
|
return
|
|
}
|
|
updateCount++
|
|
}
|
|
|
|
respondJSON(w, http.StatusOK, map[string]interface{}{
|
|
"message": "Configuration updated successfully",
|
|
"updated": updateCount,
|
|
})
|
|
}
|