Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions embedded_spec.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ require (
github.com/google/go-cmp v0.7.0
github.com/google/renameio v1.0.1
github.com/google/uuid v1.6.0
github.com/haproxytech/client-native/v6 v6.4.1-0.20261022092524-610c7d3287fa
github.com/haproxytech/client-native/v6 v6.4.1-0.20261104133604-38ece8d4f635
github.com/jessevdk/go-flags v1.6.1
github.com/joho/godotenv v1.5.1
github.com/json-iterator/go v1.1.12
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -190,8 +190,8 @@ github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
github.com/haproxytech/client-native/v5 v5.1.28 h1:s9cLjRwliQdj7ILvEhbcoAgnWkFS7/Iw9ZWFrr1RjCM=
github.com/haproxytech/client-native/v5 v5.1.28/go.mod h1:N5+fpFTThhKX/ufddjJ2QWi+d0NZYz8fKfI6mxeeafc=
github.com/haproxytech/client-native/v6 v6.4.1-0.20261022092524-610c7d3287fa h1:eRg25yN3O0J489N/fHwFdUo0ui8BPkulUE0jslMaw2I=
github.com/haproxytech/client-native/v6 v6.4.1-0.20261022092524-610c7d3287fa/go.mod h1:kz4LCTX7Fu8Oh+lgsR1KFHoU1biJHoQQxj2IhVuA69I=
github.com/haproxytech/client-native/v6 v6.4.1-0.20261104133604-38ece8d4f635 h1:Qh2nkA7+/rNAtAIFp/gVAwtILCCL9B40aDfxz8gy0To=
github.com/haproxytech/client-native/v6 v6.4.1-0.20261104133604-38ece8d4f635/go.mod h1:kz4LCTX7Fu8Oh+lgsR1KFHoU1biJHoQQxj2IhVuA69I=
github.com/haproxytech/go-logger v1.1.0 h1:HgGtYaI1ApkvbQdsm7f9AzQQoxTB7w37criTflh7IQE=
github.com/haproxytech/go-logger v1.1.0/go.mod h1:OekUd8HCb7ubxMplzHUPBTHNxZmddOWfOjWclZsqIeM=
github.com/haproxytech/go-method-gen v0.1.4 h1:LZgt5aGlHdOAEEYObYf8W5e/ZVVmvm7ViXkeECNQSA4=
Expand Down
2,187 changes: 1,095 additions & 1,092 deletions handlers/dataplane/specification/dataplane_spec.gen.go

Large diffs are not rendered by default.

102 changes: 83 additions & 19 deletions handlers/runtime/map_entries/map_entries.gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

89 changes: 89 additions & 0 deletions handlers/runtime/map_entries/map_entries.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,15 @@
package map_entries

import (
"errors"
"net/http"
"path/filepath"
"strings"

"github.com/go-chi/chi/v5"
client_native "github.com/haproxytech/client-native/v6"
"github.com/haproxytech/client-native/v6/models"
"github.com/haproxytech/client-native/v6/storage"

config "github.com/haproxytech/dataplaneapi/configuration"
"github.com/haproxytech/dataplaneapi/handlers/middleware"
Expand Down Expand Up @@ -94,6 +99,90 @@ func (h *HandlerImpl) AddMapEntry(w http.ResponseWriter, r *http.Request, parent
respond.JSON(w, http.StatusCreated, &data)
}

func (h *HandlerImpl) ReplaceRuntimeMapEntries(w http.ResponseWriter, r *http.Request, parentName string, params ReplaceRuntimeMapEntriesParams) {
var data ReplaceRuntimeMapEntriesJSONRequestBody
if !respond.DecodeBody(r, w, &data) {
return
}
contents, err := serializeMapEntries(data)
if err != nil {
respond.BadRequest(w, err.Error())
return
}

rt, err := h.Client.Runtime()
if err != nil {
respond.Error(w, err)
return
}

var storageName string
var st storage.Storage
if params.ForceSync {
m, err := rt.GetMap(parentName)
if err != nil {
respond.RuntimeError(w, err)
return
}
mapsDir, err := rt.GetMapsDir()
if err != nil {
respond.RuntimeError(w, err)
return
}
storageName, err = managedMapStorageName(m, mapsDir)
if err != nil {
respond.BadRequest(w, err.Error())
return
}
st, err = h.Client.MapStorage()
if err != nil {
respond.Error(w, err)
return
}
}

if err = rt.ReplaceMapPayload(parentName, data); err != nil {
respond.RuntimeError(w, err)
return
}

if params.ForceSync {
if _, err = st.Replace(storageName, contents); err != nil {
respond.RuntimeError(w, err)
return
}
}

respond.JSON(w, http.StatusOK, data)
}

func managedMapStorageName(m *models.Map, mapsDir string) (string, error) {
if m == nil || m.File == "" || mapsDir == "" {
return "", errors.New("cannot identify managed storage for runtime map")
}
relative, err := filepath.Rel(filepath.Clean(mapsDir), filepath.Clean(m.File))
if err != nil || relative == "." || filepath.IsAbs(relative) ||
relative == ".." || strings.HasPrefix(relative, ".."+string(filepath.Separator)) ||
filepath.Base(relative) != relative {
return "", errors.New("cannot force sync an unmanaged runtime map")
}
return relative, nil
}

func serializeMapEntries(entries models.MapEntries) (string, error) {
var contents strings.Builder
for _, entry := range entries {
if entry == nil {
return "", errors.New("map entry cannot be null")
}
contents.WriteString(entry.Key)
contents.WriteByte(' ')
contents.WriteString(entry.Value)
contents.WriteByte('\n')
}
return contents.String(), nil
}

func (h *HandlerImpl) DeleteRuntimeMapEntry(w http.ResponseWriter, r *http.Request, parentName string, id string, params DeleteRuntimeMapEntryParams) {
rt, err := h.Client.Runtime()
if err != nil {
Expand Down
Loading