Skip to content

Commit 0e3db1c

Browse files
committed
BUG/MEDIUM: fix add server endpoint for other resources than backend.
Moreover, the convertion to the socket param (ie was always failling because ras was nil. Though runtime socket, servers can only be added on backend. Signed-off-by: Vincent Gramer <[email protected]>
1 parent 78a4e05 commit 0e3db1c

File tree

4 files changed

+121
-19
lines changed

4 files changed

+121
-19
lines changed

e2e/tests/servers/create.bats

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,50 @@ load '../../libs/version'
2323

2424
load 'utils/_helpers'
2525

26-
@test "servers: Add a new server" {
26+
@test "servers: Add a new server to backend" {
2727
resource_post "$_SERVER_BASE_PATH" "data/post.json" "backend=test_backend&force_reload=true"
2828
assert_equal "$SC" 201
2929
}
30+
31+
@test "servers: Add a new server to backend thought runtime with deprecated backend param" {
32+
haproxy_version_ge 2.6 || skip "requires HAProxy 2.6+"
33+
pre_logs_count=$(dpa_docker_exec 'cat /var/log/dataplaneapi.log' | wc -l)
34+
35+
resource_post "$_SERVER_BASE_PATH" "data/post.json" "backend=test_backend"
36+
assert_equal "$SC" 201
37+
38+
# check that server has been added thought runtime socket
39+
post_logs_count=$(dpa_docker_exec 'sh /var/log/dataplaneapi.log' | wc -l)
40+
new_logs_count=$(( $pre_logs_count - $post_logs_count ))
41+
new_logs=$(dpa_docker_exec 'cat /var/log/dataplaneapi.log' | tail -n $new_logs_count)
42+
43+
echo "$new_logs" # this will help debugging if the test fails
44+
assert echo -e "$new_logs" | grep -q "backend test_backend: server test_server added though runtime"
45+
}
46+
47+
@test "servers: Add a new server to backend thought runtime with parent_type/ parent_name" {
48+
haproxy_version_ge 2.6 || skip "requires HAProxy 2.6+"
49+
pre_logs_count=$(dpa_docker_exec 'cat /var/log/dataplaneapi.log' | wc -l)
50+
51+
resource_post "$_SERVER_BASE_PATH" "data/post.json" "parent_type=backend&parent_name=test_backend"
52+
assert_equal "$SC" 201
53+
54+
# check that server has been added thought runtime socket
55+
post_logs_count=$(dpa_docker_exec 'sh /var/log/dataplaneapi.log' | wc -l)
56+
new_logs_count=$(( $pre_logs_count - $post_logs_count ))
57+
new_logs=$(dpa_docker_exec 'cat /var/log/dataplaneapi.log' | tail -n $new_logs_count)
58+
59+
echo "$new_logs" # this will help debugging if the test fails
60+
assert echo -e "$new_logs" | grep -q "backend test_backend: server test_server added though runtime"
61+
}
62+
63+
@test "servers: Add a new server to peer" {
64+
resource_post "$_SERVER_BASE_PATH" "data/post.json" "parent_type=peers&parent_name=fusion"
65+
assert_equal "$SC" 202
66+
}
67+
68+
@test "servers: Add a new server to ring" {
69+
haproxy_version_ge 2.2 || skip "requires HAProxy 2.2+"
70+
resource_post "$_SERVER_BASE_PATH" "data/post.json" "parent_type=ring&parent_name=logbuffer"
71+
assert_equal "$SC" 202
72+
}

e2e/tests/servers/data/haproxy.cfg

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ defaults
2525
timeout http-keep-alive 10s
2626
retries 3
2727

28+
peers fusion
29+
peer peer1 127.0.0.1:5108
30+
2831
backend test_backend
2932
mode http
3033
balance roundrobin
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
global
2+
chroot /var/lib/haproxy
3+
user haproxy
4+
group haproxy
5+
maxconn 4000
6+
pidfile /var/run/haproxy.pid
7+
stats socket /var/lib/haproxy/stats level admin
8+
log 127.0.0.1 local2
9+
10+
defaults
11+
mode http
12+
maxconn 3000
13+
log global
14+
option httplog
15+
option redispatch
16+
option dontlognull
17+
option http-server-close
18+
option forwardfor except 127.0.0.0/8
19+
timeout http-request 10s
20+
timeout check 10s
21+
timeout connect 10s
22+
timeout client 1m
23+
timeout queue 1m
24+
timeout server 1m
25+
timeout http-keep-alive 10s
26+
retries 3
27+
28+
peers fusion
29+
peer peer1 127.0.0.1:5108
30+
31+
ring logbuffer
32+
description "buffer for logs"
33+
format rfc5424
34+
maxlen 1500
35+
size 65536
36+
timeout connect 10s
37+
timeout server 20s
38+
39+
# Sends outgoing messages via TCP
40+
server logserver 192.168.1.100:514
41+
42+
backend test_backend
43+
mode http
44+
balance roundrobin
45+
option forwardfor
46+
server server_01 10.1.1.1:8080 check weight 80
47+
server server_02 10.1.1.2:8080 check weight 80
48+
server server_03 10.1.1.2:8080 check weight 80
49+
server server_ipv6 [fd00:6:48:c85:deb:f:62:4]:80 check
50+
server server_04 192.168.1.1:80 check resolve-opts allow-dup-ip,ignore-weight resolve-net 10.0.0.0/8,10.200.200.0/12

handlers/server.go

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ package handlers
1818
import (
1919
"fmt"
2020

21+
"github.com/haproxytech/client-native/v6/runtime"
22+
2123
"github.com/go-openapi/runtime/middleware"
2224
client_native "github.com/haproxytech/client-native/v6"
2325
"github.com/haproxytech/client-native/v6/models"
@@ -108,25 +110,28 @@ func (h *CreateServerHandlerImpl) Handle(params server.CreateServerParams, princ
108110
return server.NewCreateServerDefault(int(*e.Code)).WithPayload(e)
109111
}
110112

111-
// Try to create the new server dynamically. This is only possible if no `default_server`
113+
// Try to create the new server dynamically. This is only possible if parentType is `backend` and no `default_server`
112114
// was defined in the current backend or in the `defaults` section.
113115
useRuntime := false
114-
var ras *models.RuntimeAddServer
115-
_, defaults, err := configuration.GetDefaultsConfiguration(t)
116-
if err != nil {
117-
e := misc.HandleError(err)
118-
return server.NewCreateServerDefault(int(*e.Code)).WithPayload(e)
119-
}
120-
_, backend, err := configuration.GetBackend(pName, t)
121-
if err != nil {
122-
e := misc.HandleError(err)
123-
return server.NewCreateServerDefault(int(*e.Code)).WithPayload(e)
124-
}
125-
runtime, err := h.Client.Runtime()
126-
if err == nil && defaults.DefaultServer == nil && backend.DefaultServer == nil {
127-
// Also make sure the server attributes are supported by the runtime API.
128-
err = misc.ConvertStruct(params.Data, ras)
129-
useRuntime = err == nil
116+
ras := &models.RuntimeAddServer{}
117+
var runtimeClient runtime.Runtime
118+
if pType == "backend" {
119+
_, defaults, errRuntime := configuration.GetDefaultsConfiguration(t)
120+
if errRuntime != nil {
121+
e := misc.HandleError(errRuntime)
122+
return server.NewCreateServerDefault(int(*e.Code)).WithPayload(e)
123+
}
124+
_, backend, errRuntime := configuration.GetBackend(pName, t)
125+
if errRuntime != nil {
126+
e := misc.HandleError(errRuntime)
127+
return server.NewCreateServerDefault(int(*e.Code)).WithPayload(e)
128+
}
129+
runtimeClient, errRuntime = h.Client.Runtime()
130+
if errRuntime == nil && defaults.DefaultServer == nil && backend.DefaultServer == nil {
131+
// Also make sure the server attributes are supported by the runtime API.
132+
errRuntime = misc.ConvertStruct(params.Data, ras)
133+
useRuntime = errRuntime == nil
134+
}
130135
}
131136

132137
if params.TransactionID == nil {
@@ -139,9 +144,10 @@ func (h *CreateServerHandlerImpl) Handle(params server.CreateServerParams, princ
139144
return server.NewCreateServerCreated().WithPayload(params.Data)
140145
}
141146
if useRuntime {
142-
err = runtime.AddServer(pName, params.Data.Name, SerializeRuntimeAddServer(ras))
147+
err = runtimeClient.AddServer(pName, params.Data.Name, SerializeRuntimeAddServer(ras))
143148
if err == nil {
144149
// No need to reload.
150+
log.Debugf("backend %s: server %s added though runtime", pName, params.Data.Name)
145151
return server.NewCreateServerCreated().WithPayload(params.Data)
146152
}
147153
log.Warning("failed to add server through runtime:", err)

0 commit comments

Comments
 (0)