2021-06-18 10:48:36 +02:00
|
|
|
package basic
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"strconv"
|
|
|
|
"strings"
|
|
|
|
"time"
|
|
|
|
|
2023-02-27 07:44:16 +01:00
|
|
|
"github.com/onsi/ginkgo/v2"
|
2022-08-28 19:02:53 +02:00
|
|
|
|
2023-09-15 04:33:32 +02:00
|
|
|
clientsdk "github.com/fatedier/frp/pkg/sdk/client"
|
2021-06-18 10:48:36 +02:00
|
|
|
"github.com/fatedier/frp/test/e2e/framework"
|
|
|
|
"github.com/fatedier/frp/test/e2e/framework/consts"
|
2021-11-23 07:14:27 +01:00
|
|
|
"github.com/fatedier/frp/test/e2e/pkg/request"
|
2021-06-18 10:48:36 +02:00
|
|
|
)
|
|
|
|
|
2022-08-28 19:02:53 +02:00
|
|
|
var _ = ginkgo.Describe("[Feature: ClientManage]", func() {
|
2021-06-18 10:48:36 +02:00
|
|
|
f := framework.NewDefaultFramework()
|
|
|
|
|
2022-08-28 19:02:53 +02:00
|
|
|
ginkgo.It("Update && Reload API", func() {
|
2021-06-18 10:48:36 +02:00
|
|
|
serverConf := consts.DefaultServerConfig
|
|
|
|
|
|
|
|
adminPort := f.AllocPort()
|
|
|
|
|
|
|
|
p1Port := f.AllocPort()
|
|
|
|
p2Port := f.AllocPort()
|
|
|
|
p3Port := f.AllocPort()
|
|
|
|
|
|
|
|
clientConf := consts.DefaultClientConfig + fmt.Sprintf(`
|
2023-09-13 10:32:39 +02:00
|
|
|
webServer.port = %d
|
|
|
|
|
|
|
|
[[proxies]]
|
|
|
|
name = "p1"
|
|
|
|
type = "tcp"
|
|
|
|
localPort = {{ .%s }}
|
|
|
|
remotePort = %d
|
|
|
|
|
|
|
|
[[proxies]]
|
|
|
|
name = "p2"
|
|
|
|
type = "tcp"
|
|
|
|
localPort = {{ .%s }}
|
|
|
|
remotePort = %d
|
|
|
|
|
|
|
|
[[proxies]]
|
|
|
|
name = "p3"
|
|
|
|
type = "tcp"
|
|
|
|
localPort = {{ .%s }}
|
|
|
|
remotePort = %d
|
2021-06-18 10:48:36 +02:00
|
|
|
`, adminPort,
|
|
|
|
framework.TCPEchoServerPort, p1Port,
|
|
|
|
framework.TCPEchoServerPort, p2Port,
|
|
|
|
framework.TCPEchoServerPort, p3Port)
|
|
|
|
|
|
|
|
f.RunProcesses([]string{serverConf}, []string{clientConf})
|
|
|
|
|
|
|
|
framework.NewRequestExpect(f).Port(p1Port).Ensure()
|
|
|
|
framework.NewRequestExpect(f).Port(p2Port).Ensure()
|
|
|
|
framework.NewRequestExpect(f).Port(p3Port).Ensure()
|
|
|
|
|
|
|
|
client := clientsdk.New("127.0.0.1", adminPort)
|
|
|
|
conf, err := client.GetConfig()
|
|
|
|
framework.ExpectNoError(err)
|
|
|
|
|
|
|
|
newP2Port := f.AllocPort()
|
|
|
|
// change p2 port and remove p3 proxy
|
|
|
|
newClientConf := strings.ReplaceAll(conf, strconv.Itoa(p2Port), strconv.Itoa(newP2Port))
|
2023-09-13 10:32:39 +02:00
|
|
|
p3Index := strings.LastIndex(newClientConf, "[[proxies]]")
|
2022-08-28 19:02:53 +02:00
|
|
|
if p3Index >= 0 {
|
|
|
|
newClientConf = newClientConf[:p3Index]
|
|
|
|
}
|
2021-06-18 10:48:36 +02:00
|
|
|
|
|
|
|
err = client.UpdateConfig(newClientConf)
|
|
|
|
framework.ExpectNoError(err)
|
|
|
|
|
2023-11-16 14:03:36 +01:00
|
|
|
err = client.Reload(true)
|
2021-06-18 10:48:36 +02:00
|
|
|
framework.ExpectNoError(err)
|
|
|
|
time.Sleep(time.Second)
|
|
|
|
|
|
|
|
framework.NewRequestExpect(f).Port(p1Port).Explain("p1 port").Ensure()
|
|
|
|
framework.NewRequestExpect(f).Port(p2Port).Explain("original p2 port").ExpectError(true).Ensure()
|
|
|
|
framework.NewRequestExpect(f).Port(newP2Port).Explain("new p2 port").Ensure()
|
|
|
|
framework.NewRequestExpect(f).Port(p3Port).Explain("p3 port").ExpectError(true).Ensure()
|
|
|
|
})
|
2021-11-23 07:14:27 +01:00
|
|
|
|
2022-08-28 19:02:53 +02:00
|
|
|
ginkgo.It("healthz", func() {
|
2021-11-23 07:14:27 +01:00
|
|
|
serverConf := consts.DefaultServerConfig
|
|
|
|
|
|
|
|
dashboardPort := f.AllocPort()
|
|
|
|
clientConf := consts.DefaultClientConfig + fmt.Sprintf(`
|
2023-09-13 10:32:39 +02:00
|
|
|
webServer.addr = "0.0.0.0"
|
|
|
|
webServer.port = %d
|
|
|
|
webServer.user = "admin"
|
|
|
|
webServer.password = "admin"
|
2021-11-23 07:14:27 +01:00
|
|
|
`, dashboardPort)
|
|
|
|
|
|
|
|
f.RunProcesses([]string{serverConf}, []string{clientConf})
|
|
|
|
|
|
|
|
framework.NewRequestExpect(f).RequestModify(func(r *request.Request) {
|
|
|
|
r.HTTP().HTTPPath("/healthz")
|
|
|
|
}).Port(dashboardPort).ExpectResp([]byte("")).Ensure()
|
|
|
|
|
|
|
|
framework.NewRequestExpect(f).RequestModify(func(r *request.Request) {
|
|
|
|
r.HTTP().HTTPPath("/")
|
|
|
|
}).Port(dashboardPort).
|
|
|
|
Ensure(framework.ExpectResponseCode(401))
|
|
|
|
})
|
2023-06-30 11:35:37 +02:00
|
|
|
|
|
|
|
ginkgo.It("stop", func() {
|
|
|
|
serverConf := consts.DefaultServerConfig
|
|
|
|
|
|
|
|
adminPort := f.AllocPort()
|
|
|
|
testPort := f.AllocPort()
|
|
|
|
clientConf := consts.DefaultClientConfig + fmt.Sprintf(`
|
2023-09-13 10:32:39 +02:00
|
|
|
webServer.port = %d
|
2023-06-30 11:35:37 +02:00
|
|
|
|
2023-09-13 10:32:39 +02:00
|
|
|
[[proxies]]
|
|
|
|
name = "test"
|
|
|
|
type = "tcp"
|
|
|
|
localPort = {{ .%s }}
|
|
|
|
remotePort = %d
|
2023-06-30 11:35:37 +02:00
|
|
|
`, adminPort, framework.TCPEchoServerPort, testPort)
|
|
|
|
|
|
|
|
f.RunProcesses([]string{serverConf}, []string{clientConf})
|
|
|
|
|
|
|
|
framework.NewRequestExpect(f).Port(testPort).Ensure()
|
|
|
|
|
|
|
|
client := clientsdk.New("127.0.0.1", adminPort)
|
|
|
|
err := client.Stop()
|
|
|
|
framework.ExpectNoError(err)
|
|
|
|
|
|
|
|
time.Sleep(3 * time.Second)
|
|
|
|
|
|
|
|
// frpc stopped so the port is not listened, expect error
|
|
|
|
framework.NewRequestExpect(f).Port(testPort).ExpectError(true).Ensure()
|
|
|
|
})
|
2021-06-18 10:48:36 +02:00
|
|
|
})
|