go.etcd.io/etcd@v3.3.27+incompatible/clientv3/integration/cluster_test.go (about) 1 // Copyright 2016 The etcd Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package integration 16 17 import ( 18 "context" 19 "reflect" 20 "testing" 21 22 "github.com/coreos/etcd/integration" 23 "github.com/coreos/etcd/pkg/testutil" 24 "github.com/coreos/etcd/pkg/types" 25 ) 26 27 func TestMemberList(t *testing.T) { 28 defer testutil.AfterTest(t) 29 30 clus := integration.NewClusterV3(t, &integration.ClusterConfig{Size: 3}) 31 defer clus.Terminate(t) 32 33 capi := clus.RandClient() 34 35 resp, err := capi.MemberList(context.Background()) 36 if err != nil { 37 t.Fatalf("failed to list member %v", err) 38 } 39 40 if len(resp.Members) != 3 { 41 t.Errorf("number of members = %d, want %d", len(resp.Members), 3) 42 } 43 } 44 45 func TestMemberAdd(t *testing.T) { 46 defer testutil.AfterTest(t) 47 48 clus := integration.NewClusterV3(t, &integration.ClusterConfig{Size: 3}) 49 defer clus.Terminate(t) 50 51 capi := clus.RandClient() 52 53 urls := []string{"http://127.0.0.1:1234"} 54 resp, err := capi.MemberAdd(context.Background(), urls) 55 if err != nil { 56 t.Fatalf("failed to add member %v", err) 57 } 58 59 if !reflect.DeepEqual(resp.Member.PeerURLs, urls) { 60 t.Errorf("urls = %v, want %v", urls, resp.Member.PeerURLs) 61 } 62 } 63 64 func TestMemberRemove(t *testing.T) { 65 defer testutil.AfterTest(t) 66 67 clus := integration.NewClusterV3(t, &integration.ClusterConfig{Size: 3}) 68 defer clus.Terminate(t) 69 70 capi := clus.Client(1) 71 resp, err := capi.MemberList(context.Background()) 72 if err != nil { 73 t.Fatalf("failed to list member %v", err) 74 } 75 76 rmvID := resp.Members[0].ID 77 // indexes in capi member list don't necessarily match cluster member list; 78 // find member that is not the client to remove 79 for _, m := range resp.Members { 80 mURLs, _ := types.NewURLs(m.PeerURLs) 81 if !reflect.DeepEqual(mURLs, clus.Members[1].ServerConfig.PeerURLs) { 82 rmvID = m.ID 83 break 84 } 85 } 86 87 _, err = capi.MemberRemove(context.Background(), rmvID) 88 if err != nil { 89 t.Fatalf("failed to remove member %v", err) 90 } 91 92 resp, err = capi.MemberList(context.Background()) 93 if err != nil { 94 t.Fatalf("failed to list member %v", err) 95 } 96 97 if len(resp.Members) != 2 { 98 t.Errorf("number of members = %d, want %d", len(resp.Members), 2) 99 } 100 } 101 102 func TestMemberUpdate(t *testing.T) { 103 defer testutil.AfterTest(t) 104 105 clus := integration.NewClusterV3(t, &integration.ClusterConfig{Size: 3}) 106 defer clus.Terminate(t) 107 108 capi := clus.RandClient() 109 resp, err := capi.MemberList(context.Background()) 110 if err != nil { 111 t.Fatalf("failed to list member %v", err) 112 } 113 114 urls := []string{"http://127.0.0.1:1234"} 115 _, err = capi.MemberUpdate(context.Background(), resp.Members[0].ID, urls) 116 if err != nil { 117 t.Fatalf("failed to update member %v", err) 118 } 119 120 resp, err = capi.MemberList(context.Background()) 121 if err != nil { 122 t.Fatalf("failed to list member %v", err) 123 } 124 125 if !reflect.DeepEqual(resp.Members[0].PeerURLs, urls) { 126 t.Errorf("urls = %v, want %v", urls, resp.Members[0].PeerURLs) 127 } 128 } 129 130 func TestMemberAddUpdateWrongURLs(t *testing.T) { 131 defer testutil.AfterTest(t) 132 133 clus := integration.NewClusterV3(t, &integration.ClusterConfig{Size: 1}) 134 defer clus.Terminate(t) 135 136 capi := clus.RandClient() 137 tt := [][]string{ 138 // missing protocol scheme 139 {"://127.0.0.1:2379"}, 140 // unsupported scheme 141 {"mailto://127.0.0.1:2379"}, 142 // not conform to host:port 143 {"http://127.0.0.1"}, 144 // contain a path 145 {"http://127.0.0.1:2379/path"}, 146 // first path segment in URL cannot contain colon 147 {"127.0.0.1:1234"}, 148 // URL scheme must be http, https, unix, or unixs 149 {"localhost:1234"}, 150 } 151 for i := range tt { 152 _, err := capi.MemberAdd(context.Background(), tt[i]) 153 if err == nil { 154 t.Errorf("#%d: MemberAdd err = nil, but error", i) 155 } 156 _, err = capi.MemberUpdate(context.Background(), 0, tt[i]) 157 if err == nil { 158 t.Errorf("#%d: MemberUpdate err = nil, but error", i) 159 } 160 } 161 }