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  }