From 6ab97766015d5e78d740cc409465de9aae247f1f Mon Sep 17 00:00:00 2001 From: Gyuho Lee Date: Fri, 13 Apr 2018 12:09:06 -0700 Subject: [PATCH] integration: add "TestTLSReloadCopyIPOnly" Signed-off-by: Gyuho Lee --- integration/cluster.go | 10 ++++++++ integration/v3_grpc_test.go | 48 +++++++++++++++++++++++++++++++++---- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/integration/cluster.go b/integration/cluster.go index eb26dee62..3dfc11dce 100644 --- a/integration/cluster.go +++ b/integration/cluster.go @@ -124,6 +124,9 @@ type ClusterConfig struct { ClientMaxCallSendMsgSize int ClientMaxCallRecvMsgSize int + + // UseIP is true to use only IP for gRPC requests. + UseIP bool } type cluster struct { @@ -262,6 +265,7 @@ func (c *cluster) mustNewMember(t *testing.T) *member { grpcKeepAliveTimeout: c.cfg.GRPCKeepAliveTimeout, clientMaxCallSendMsgSize: c.cfg.ClientMaxCallSendMsgSize, clientMaxCallRecvMsgSize: c.cfg.ClientMaxCallRecvMsgSize, + useIP: c.cfg.UseIP, }) m.DiscoveryURL = c.cfg.DiscoveryURL if c.cfg.UseGRPC { @@ -525,6 +529,7 @@ type member struct { keepDataDirTerminate bool clientMaxCallSendMsgSize int clientMaxCallRecvMsgSize int + useIP bool } func (m *member) GRPCAddr() string { return m.grpcAddr } @@ -541,6 +546,7 @@ type memberConfig struct { grpcKeepAliveTimeout time.Duration clientMaxCallSendMsgSize int clientMaxCallRecvMsgSize int + useIP bool } // mustNewMember return an inited member with the given name. If peerTLS is @@ -614,6 +620,7 @@ func mustNewMember(t *testing.T, mcfg memberConfig) *member { } m.clientMaxCallSendMsgSize = mcfg.clientMaxCallSendMsgSize m.clientMaxCallRecvMsgSize = mcfg.clientMaxCallRecvMsgSize + m.useIP = mcfg.useIP m.InitialCorruptCheck = true @@ -624,6 +631,9 @@ func mustNewMember(t *testing.T, mcfg memberConfig) *member { func (m *member) listenGRPC() error { // prefix with localhost so cert has right domain m.grpcAddr = "localhost:" + m.Name + if m.useIP { // for IP-only sTLS certs + m.grpcAddr = "127.0.0.1:" + m.Name + } l, err := transport.NewUnixListener(m.grpcAddr) if err != nil { return fmt.Errorf("listen failed on grpc socket %s (%v)", m.grpcAddr, err) diff --git a/integration/v3_grpc_test.go b/integration/v3_grpc_test.go index 4d1c9d811..c936703d5 100644 --- a/integration/v3_grpc_test.go +++ b/integration/v3_grpc_test.go @@ -1654,7 +1654,7 @@ func TestTLSReloadAtomicReplace(t *testing.T) { t.Fatal(err) } } - testTLSReload(t, cloneFunc, replaceFunc, revertFunc) + testTLSReload(t, cloneFunc, replaceFunc, revertFunc, false) } // TestTLSReloadCopy ensures server reloads expired/valid certs @@ -1684,17 +1684,57 @@ func TestTLSReloadCopy(t *testing.T) { t.Fatal(err) } } - testTLSReload(t, cloneFunc, replaceFunc, revertFunc) + testTLSReload(t, cloneFunc, replaceFunc, revertFunc, false) } -func testTLSReload(t *testing.T, cloneFunc func() transport.TLSInfo, replaceFunc func(), revertFunc func()) { +// TestTLSReloadCopyIPOnly ensures server reloads expired/valid certs +// when new certs are copied over, one by one. And expects server +// to reject client requests, and vice versa. +func TestTLSReloadCopyIPOnly(t *testing.T) { + certsDir, err := ioutil.TempDir(os.TempDir(), "fixtures-to-load") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(certsDir) + + cloneFunc := func() transport.TLSInfo { + tlsInfo, terr := copyTLSFiles(testTLSInfoIP, certsDir) + if terr != nil { + t.Fatal(terr) + } + return tlsInfo + } + replaceFunc := func() { + if _, err = copyTLSFiles(testTLSInfoExpiredIP, certsDir); err != nil { + t.Fatal(err) + } + } + revertFunc := func() { + if _, err = copyTLSFiles(testTLSInfoIP, certsDir); err != nil { + t.Fatal(err) + } + } + testTLSReload(t, cloneFunc, replaceFunc, revertFunc, true) +} + +func testTLSReload( + t *testing.T, + cloneFunc func() transport.TLSInfo, + replaceFunc func(), + revertFunc func(), + useIP bool) { defer testutil.AfterTest(t) // 1. separate copies for TLS assets modification tlsInfo := cloneFunc() // 2. start cluster with valid certs - clus := NewClusterV3(t, &ClusterConfig{Size: 1, PeerTLS: &tlsInfo, ClientTLS: &tlsInfo}) + clus := NewClusterV3(t, &ClusterConfig{ + Size: 1, + PeerTLS: &tlsInfo, + ClientTLS: &tlsInfo, + UseIP: useIP, + }) defer clus.Terminate(t) // 3. concurrent client dialing while certs become expired