MEDIUM: server: remove experimental-mode for dynamic servers

Dynamic servers feature is now judged to be stable enough. Remove the
experimental-mode requirement for "add/del server" commands. This should
facilitate dynamic servers adoption.
diff --git a/doc/management.txt b/doc/management.txt
index e3a4abc..2e1b87d 100644
--- a/doc/management.txt
+++ b/doc/management.txt
@@ -1541,9 +1541,7 @@
     >
 
 add server <backend>/<server> [args]*
-  Instantiate a new server attached to the backend <backend>. Only supported on
-  a CLI connection running in experimental mode (see "experimental-mode on").
-  This method is still in development and may change in the future.
+  Instantiate a new server attached to the backend <backend>.
 
   The <server> name must not be already used in the backend. A special
   restriction is put on the backend which must used a dynamic load-balancing
@@ -2014,8 +2012,8 @@
   set the mode for any worker when connecting to its CLI.
 
   Example:
-    echo "@1; experimental-mode on; del server be1/s2" | socat /var/run/haproxy.master -
-    echo "experimental-mode on; @1 del server be1/s2" | socat /var/run/haproxy.master -
+    echo "@1; experimental-mode on; <experimental_cmd>..." | socat /var/run/haproxy.master -
+    echo "experimental-mode on; @1 <experimental_cmd>..." | socat /var/run/haproxy.master -
 
 expert-mode [on|off]
   This command is similar to experimental-mode but is used to toggle the
diff --git a/reg-tests/server/cli_add_check_server.vtc b/reg-tests/server/cli_add_check_server.vtc
index 9f48c0d..c63710c 100644
--- a/reg-tests/server/cli_add_check_server.vtc
+++ b/reg-tests/server/cli_add_check_server.vtc
@@ -79,7 +79,7 @@
 
 # check on a functional server
 haproxy h1 -cli {
-	send "experimental-mode on; add server be1/s1 ${s1_addr}:${s1_port} check inter 200ms rise 1 fall 1"
+	send "add server be1/s1 ${s1_addr}:${s1_port} check inter 200ms rise 1 fall 1"
 	expect ~ "New server registered."
 
 	send "enable server be1/s1"
@@ -92,7 +92,7 @@
 	send "disable server be1/s1"
 	expect ~ ".*"
 
-	send "experimental-mode on; del server be1/s1"
+	send "del server be1/s1"
 	expect ~ "Server deleted."
 }
 
@@ -100,7 +100,7 @@
 
 # check on a disabled server
 haproxy h1 -cli {
-	send "experimental-mode on; add server be1/s2 ${s2_addr}:${s2_port} check inter 200ms rise 1 fall 1"
+	send "add server be1/s2 ${s2_addr}:${s2_port} check inter 200ms rise 1 fall 1"
 	expect ~ "New server registered."
 
 	send "enable server be1/s2"
@@ -113,13 +113,13 @@
 	send "disable server be1/s2"
 	expect ~ ".*"
 
-	send "experimental-mode on; del server be1/s2"
+	send "del server be1/s2"
 	expect ~ "Server deleted."
 }
 
 # agent check
 haproxy h1 -cli {
-	send "experimental-mode on; add server be1/s3 ${s1_addr}:${s1_port} agent-check agent-addr ${s3_addr} agent-port ${s3_port} agent-send 'hello' agent-inter 200ms rise 1 fall 1"
+	send "add server be1/s3 ${s1_addr}:${s1_port} agent-check agent-addr ${s3_addr} agent-port ${s3_port} agent-send 'hello' agent-inter 200ms rise 1 fall 1"
 	expect ~ "New server registered."
 
 	send "enable agent be1/s3"
@@ -130,7 +130,7 @@
 	send "disable agent be1/s3; disable server be1/s3"
 	expect ~ ".*"
 
-	send "experimental-mode on; del server be1/s3"
+	send "del server be1/s3"
 	expect ~ "Server deleted."
 }
 
diff --git a/reg-tests/server/cli_add_server.vtc b/reg-tests/server/cli_add_server.vtc
index fefdb0c..8c29305 100644
--- a/reg-tests/server/cli_add_server.vtc
+++ b/reg-tests/server/cli_add_server.vtc
@@ -38,37 +38,33 @@
 } -run
 
 haproxy h1 -cli {
-	# experimental mode disabled
-	send "add server foo/s1 ${s1_addr}:${s1_port}"
-	expect ~ "This command is restricted to experimental mode only."
-
 	# non existent backend
-	send "experimental-mode on; add server foo/s1 ${s1_addr}:${s1_port}"
+	send "add server foo/s1 ${s1_addr}:${s1_port}"
 	expect ~ "No such backend."
 
 	# missing address
-	send "experimental-mode on; add server test/s1"
+	send "add server test/s1"
 	expect ~ "'server' expects <name> and <addr>\\[:<port>\\] as arguments."
 
 	# invalid load-balancing algo
-	send "experimental-mode on; add server other/s1 ${s1_addr}:${s1_port}"
+	send "add server other/s1 ${s1_addr}:${s1_port}"
 	expect ~ "Backend must use a dynamic load balancing to support dynamic servers."
 
 	# invalid mux proto
-	send "experimental-mode on; add server other2/s1 ${s1_addr}:${s1_port} proto h2"
+	send "add server other2/s1 ${s1_addr}:${s1_port} proto h2"
 	expect ~ "MUX protocol is not usable for server."
 
 	# valid command
-	send "experimental-mode on; add server test/s1 ${s1_addr}:${s1_port}"
+	send "add server test/s1 ${s1_addr}:${s1_port}"
 	expect ~ "New server registered."
 
 	# duplicate server
-	send "experimental-mode on; add server test/s1 ${s1_addr}:${s1_port}"
+	send "add server test/s1 ${s1_addr}:${s1_port}"
 	expect ~ "Already exists a server with the same name in backend."
 
 	# valid command
 	# specify the proto, it should be accepted for this backend
-	send "experimental-mode on; add server test/s2 ${s1_addr}:${s1_port} proto h2"
+	send "add server test/s2 ${s1_addr}:${s1_port} proto h2"
 	expect ~ "New server registered."
 }
 
diff --git a/reg-tests/server/cli_add_ssl_server.vtc b/reg-tests/server/cli_add_ssl_server.vtc
index 843958d..95caf3f 100644
--- a/reg-tests/server/cli_add_ssl_server.vtc
+++ b/reg-tests/server/cli_add_ssl_server.vtc
@@ -70,7 +70,7 @@
 
 haproxy h1 -cli {
 	# non existent backend
-	send "experimental-mode on; add server li-ssl/s1 ${h1_feSslTerm_addr}:${h1_feSslTerm_port} ssl ca-file common.pem verify none"
+	send "add server li-ssl/s1 ${h1_feSslTerm_addr}:${h1_feSslTerm_port} ssl ca-file common.pem verify none"
 	expect ~ "New server registered."
 
 	send "enable server li-ssl/s1"
diff --git a/reg-tests/server/cli_add_track_server.vtc b/reg-tests/server/cli_add_track_server.vtc
index 6e90c62..318f236 100644
--- a/reg-tests/server/cli_add_track_server.vtc
+++ b/reg-tests/server/cli_add_track_server.vtc
@@ -117,15 +117,15 @@
 ###
 haproxy h1 -cli {
 	# invalid command: track on a non-checked server
-	send "experimental-mode on; add server be_check/s1 ${s1_addr}:${s1_port} track be_check/srv_no_check"
+	send "add server be_check/s1 ${s1_addr}:${s1_port} track be_check/srv_no_check"
 	expect ~ "unable to use be_check/srv_no_check for tracking as it does not have any check nor agent enabled."
 
 	# valid track usage
-	send "experimental-mode on; add server be_check/s1 ${s1_addr}:${s1_port} track be_check/srv_check"
+	send "add server be_check/s1 ${s1_addr}:${s1_port} track be_check/srv_check"
 	expect ~ "New server registered."
 
 	# invalid command: track on a dynamic server
-	send "experimental-mode on; add server be_check/s3 ${s1_addr}:${s1_port} track be_check/s1"
+	send "add server be_check/s3 ${s1_addr}:${s1_port} track be_check/s1"
 	expect ~ "unable to use be_check/s1 for tracking as it is a dynamic server."
 }
 
@@ -137,17 +137,17 @@
 # Delete the first dynamic server, enable be1/srv, S1 should report s1 and s3 UP
 ####
 haproxy h1 -cli {
-	send "experimental-mode on; add server be1/s1 ${s1_addr}:${s1_port} track be1/srv"
+	send "add server be1/s1 ${s1_addr}:${s1_port} track be1/srv"
 	expect ~ "New server registered."
 	send "enable server be1/s1"
 	expect ~ ".*"
 
-	send "experimental-mode on; add server be1/s2 ${s1_addr}:${s1_port} track be1/srv"
+	send "add server be1/s2 ${s1_addr}:${s1_port} track be1/srv"
 	expect ~ "New server registered."
 	send "enable server be1/s2"
 	expect ~ ".*"
 
-	send "experimental-mode on; add server be1/s3 ${s1_addr}:${s1_port} track be1/srv"
+	send "add server be1/s3 ${s1_addr}:${s1_port} track be1/srv"
 	expect ~ "New server registered."
 	send "enable server be1/s3"
 	expect ~ ".*"
@@ -155,7 +155,7 @@
 	send "disable server be1/srv"
 	expect ~ ".*"
 
-	send "experimental-mode on; del server be1/s1"
+	send "del server be1/s1"
 	expect ~ "Server deleted."
 
 	send "enable server be1/srv"
@@ -170,17 +170,17 @@
 # Delete the second dynamic server, enable be2/srv, S2 should report s2 and s3 UP
 ####
 haproxy h1 -cli {
-	send "experimental-mode on; add server be2/s1 ${s1_addr}:${s1_port} track be2/srv"
+	send "add server be2/s1 ${s1_addr}:${s1_port} track be2/srv"
 	expect ~ "New server registered."
 	send "enable server be2/s1"
 	expect ~ ".*"
 
-	send "experimental-mode on; add server be2/s2 ${s1_addr}:${s1_port} track be2/srv"
+	send "add server be2/s2 ${s1_addr}:${s1_port} track be2/srv"
 	expect ~ "New server registered."
 	send "enable server be2/s2"
 	expect ~ ".*"
 
-	send "experimental-mode on; add server be2/s3 ${s1_addr}:${s1_port} track be2/srv"
+	send "add server be2/s3 ${s1_addr}:${s1_port} track be2/srv"
 	expect ~ "New server registered."
 	send "enable server be2/s3"
 	expect ~ ".*"
@@ -188,7 +188,7 @@
 	send "disable server be2/srv"
 	expect ~ ".*"
 
-	send "experimental-mode on; del server be2/s2"
+	send "del server be2/s2"
 	expect ~ "Server deleted."
 
 	send "enable server be2/srv"
@@ -204,29 +204,29 @@
 ####
 haproxy h1 -cli {
 	# create server 1, track on be3/srv
-	send "experimental-mode on; add server be3/s1 ${s1_addr}:${s1_port} track be3/srv"
+	send "add server be3/s1 ${s1_addr}:${s1_port} track be3/srv"
 	expect ~ "New server registered."
 	send "enable server be3/s1"
 	expect ~ ".*"
 
 	# create server 2, track on be3/srv
-	send "experimental-mode on; add server be3/s2 ${s1_addr}:${s1_port} track be3/srv"
+	send "add server be3/s2 ${s1_addr}:${s1_port} track be3/srv"
 	expect ~ "New server registered."
 	send "enable server be3/s2"
 	expect ~ ".*"
 
 	# create server 3, track on be3/srv
-	send "experimental-mode on; add server be3/s3 ${s1_addr}:${s1_port} track be3/srv"
+	send "add server be3/s3 ${s1_addr}:${s1_port} track be3/srv"
 	expect ~ "New server registered."
 	send "enable server be3/s3"
 	expect ~ ".*"
 
 	# delete all dynamic servers
-	send "experimental-mode on; disable server be3/s1; del server be3/s1"
+	send "disable server be3/s1; del server be3/s1"
 	expect ~ "Server deleted."
-	send "experimental-mode on; disable server be3/s3; del server be3/s3"
+	send "disable server be3/s3; del server be3/s3"
 	expect ~ "Server deleted."
-	send "experimental-mode on; disable server be3/s2; del server be3/s2"
+	send "disable server be3/s2; del server be3/s2"
 	expect ~ "Server deleted."
 
 	# disable / enable the static server
diff --git a/reg-tests/server/cli_delete_dynamic_server.vtc b/reg-tests/server/cli_delete_dynamic_server.vtc
index a8b3036..e667641 100644
--- a/reg-tests/server/cli_delete_dynamic_server.vtc
+++ b/reg-tests/server/cli_delete_dynamic_server.vtc
@@ -39,7 +39,7 @@
 # add a new dynamic server to be able to delete it then
 haproxy h1 -cli {
 	# add a dynamic server and enable it
-	send "experimental-mode on; add server test/s2 ${s2_addr}:${s2_port}"
+	send "add server test/s2 ${s2_addr}:${s2_port}"
 	expect ~ "New server registered."
 
 	send "enable server test/s2"
@@ -47,16 +47,12 @@
 }
 
 haproxy h1 -cli {
-	# experimental mode disabled
-	send "del server test/s1"
-	expect ~ "This command is restricted to experimental mode only."
-
 	# non existent backend
-	send "experimental-mode on; del server foo/s1"
+	send "del server foo/s1"
 	expect ~ "No such backend."
 
 	# non existent server
-	send "experimental-mode on; del server test/other"
+	send "del server test/other"
 	expect ~ "No such server."
 }
 
@@ -74,14 +70,14 @@
 # delete the dynamic server
 haproxy h1 -cli {
 	# server not in maintenance mode
-	send "experimental-mode on; del server test/s2"
+	send "del server test/s2"
 	expect ~ "Only servers in maintenance mode can be deleted."
 
 	send "disable server test/s2"
 	expect ~ ".*"
 
 	# valid command
-	send "experimental-mode on; del server test/s2"
+	send "del server test/s2"
 	expect ~ "Server deleted."
 }
 
diff --git a/reg-tests/server/cli_delete_server.vtc b/reg-tests/server/cli_delete_server.vtc
index 9721518..61d241c 100644
--- a/reg-tests/server/cli_delete_server.vtc
+++ b/reg-tests/server/cli_delete_server.vtc
@@ -27,38 +27,34 @@
 } -start
 
 haproxy h1 -cli {
-	# experimental mode disabled
-	send "del server test/s1"
-	expect ~ "This command is restricted to experimental mode only."
-
 	# non existent backend
-	send "experimental-mode on; del server foo/s1"
+	send "del server foo/s1"
 	expect ~ "No such backend."
 
 	# non existent server
-	send "experimental-mode on; del server test/other"
+	send "del server test/other"
 	expect ~ "No such server."
 
 	# server referenced in ACL
-	send "experimental-mode on; del server test/s1"
+	send "del server test/s1"
 	expect ~ "This server cannot be removed at runtime due to other configuration elements pointing to it."
 
 	# tracked server
-	send "experimental-mode on; del server test/s2"
+	send "del server test/s2"
 	expect ~ "This server cannot be removed at runtime due to other configuration elements pointing to it."
 
 	# tracked server
-	send "experimental-mode on; del server test/s3"
+	send "del server test/s3"
 	expect ~ "This server cannot be removed at runtime due to other configuration elements pointing to it."
 
 	# server in running mode
-	send "experimental-mode on; del server test/s4"
+	send "del server test/s4"
 	expect ~ "Only servers in maintenance mode can be deleted."
 
 	send "disable server test/s4"
 	expect ~ ".*"
 
 	# valid command
-	send "experimental-mode on; del server test/s4"
+	send "del server test/s4"
 	expect ~ "Server deleted."
 }
diff --git a/reg-tests/ssl/dynamic_server_ssl.vtc b/reg-tests/ssl/dynamic_server_ssl.vtc
index e498a81..b7730f5 100644
--- a/reg-tests/ssl/dynamic_server_ssl.vtc
+++ b/reg-tests/ssl/dynamic_server_ssl.vtc
@@ -70,11 +70,11 @@
 	expect ~ ".*"
 
 	# valid command
-	send "experimental-mode on; del server test/s1"
+	send "del server test/s1"
 	expect ~ "Server deleted."
-	send "experimental-mode on; del server test/s2"
+	send "del server test/s2"
 	expect ~ "Server deleted."
-	send "experimental-mode on; del server test/s3"
+	send "del server test/s3"
 	expect ~ "Server deleted."
 }
 
@@ -95,7 +95,7 @@
 }
 
 haproxy h1 -cli {
-	send "experimental-mode on; add server test/s1 ${tmpdir}/ssl.sock ssl verify none crt ${testdir}/client1.pem"
+	send "add server test/s1 ${tmpdir}/ssl.sock ssl verify none crt ${testdir}/client1.pem"
 	expect ~ "New server registered."
 	send "enable server test/s1"
 	expect ~ ".*"
diff --git a/src/server.c b/src/server.c
index 6e1e2f1..83295b6 100644
--- a/src/server.c
+++ b/src/server.c
@@ -5034,8 +5034,8 @@
 	{ { "set", "server", NULL },             "set server <bk>/<srv> [opts]            : change a server's state, weight, address or ssl",             cli_parse_set_server },
 	{ { "get", "weight", NULL },             "get weight <bk>/<srv>                   : report a server's current weight",                            cli_parse_get_weight },
 	{ { "set", "weight", NULL },             "set weight <bk>/<srv>  (DEPRECATED)     : change a server's weight (use 'set server' instead)",         cli_parse_set_weight },
-	{ { "add", "server", NULL },             "add server <bk>/<srv>                   : create a new server (EXPERIMENTAL)",                          cli_parse_add_server, NULL, NULL, NULL, ACCESS_EXPERIMENTAL },
-	{ { "del", "server", NULL },             "del server <bk>/<srv>                   : remove a dynamically added server (EXPERIMENTAL)",            cli_parse_delete_server, NULL, NULL, NULL, ACCESS_EXPERIMENTAL },
+	{ { "add", "server", NULL },             "add server <bk>/<srv>                   : create a new server",                                         cli_parse_add_server, NULL },
+	{ { "del", "server", NULL },             "del server <bk>/<srv>                   : remove a dynamically added server",                           cli_parse_delete_server, NULL },
 	{{},}
 }};