github.com/lfch/etcd-io/tests/v3@v3.0.0-20221004140520-eac99acd3e9d/integration/clientv3/naming/endpoints_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 naming_test
    16  
    17  import (
    18  	"context"
    19  	"reflect"
    20  	"testing"
    21  
    22  	etcd "github.com/lfch/etcd-io/client/v3"
    23  	"github.com/lfch/etcd-io/client/v3/naming/endpoints"
    24  	integration2 "github.com/lfch/etcd-io/tests/v3/framework/integration"
    25  )
    26  
    27  func TestEndpointManager(t *testing.T) {
    28  	integration2.BeforeTest(t)
    29  
    30  	clus := integration2.NewCluster(t, &integration2.ClusterConfig{Size: 1})
    31  	defer clus.Terminate(t)
    32  
    33  	em, err := endpoints.NewManager(clus.RandClient(), "foo")
    34  	if err != nil {
    35  		t.Fatal("failed to create EndpointManager", err)
    36  	}
    37  	ctx, watchCancel := context.WithCancel(context.Background())
    38  	defer watchCancel()
    39  	w, err := em.NewWatchChannel(ctx)
    40  	if err != nil {
    41  		t.Fatal("failed to establish watch", err)
    42  	}
    43  
    44  	e1 := endpoints.Endpoint{Addr: "127.0.0.1", Metadata: "metadata"}
    45  	err = em.AddEndpoint(context.TODO(), "foo/a1", e1)
    46  	if err != nil {
    47  		t.Fatal("failed to add foo", err)
    48  	}
    49  
    50  	us := <-w
    51  
    52  	if us == nil {
    53  		t.Fatal("failed to get update")
    54  	}
    55  
    56  	wu := &endpoints.Update{
    57  		Op:       endpoints.Add,
    58  		Key:      "foo/a1",
    59  		Endpoint: e1,
    60  	}
    61  
    62  	if !reflect.DeepEqual(us[0], wu) {
    63  		t.Fatalf("up = %#v, want %#v", us[0], wu)
    64  	}
    65  
    66  	err = em.DeleteEndpoint(context.TODO(), "foo/a1")
    67  	if err != nil {
    68  		t.Fatalf("failed to udpate %v", err)
    69  	}
    70  
    71  	us = <-w
    72  	if us == nil {
    73  		t.Fatal("failed to get udpate")
    74  	}
    75  
    76  	wu = &endpoints.Update{
    77  		Op:  endpoints.Delete,
    78  		Key: "foo/a1",
    79  	}
    80  
    81  	if !reflect.DeepEqual(us[0], wu) {
    82  		t.Fatalf("up = %#v, want %#v", us[1], wu)
    83  	}
    84  }
    85  
    86  // TestEndpointManagerAtomicity ensures the resolver will initialize
    87  // correctly with multiple hosts and correctly receive multiple
    88  // updates in a single revision.
    89  func TestEndpointManagerAtomicity(t *testing.T) {
    90  	integration2.BeforeTest(t)
    91  
    92  	clus := integration2.NewCluster(t, &integration2.ClusterConfig{Size: 1})
    93  	defer clus.Terminate(t)
    94  
    95  	c := clus.RandClient()
    96  	em, err := endpoints.NewManager(c, "foo")
    97  	if err != nil {
    98  		t.Fatal("failed to create EndpointManager", err)
    99  	}
   100  
   101  	err = em.Update(context.TODO(), []*endpoints.UpdateWithOpts{
   102  		endpoints.NewAddUpdateOpts("foo/host", endpoints.Endpoint{Addr: "127.0.0.1:2000"}),
   103  		endpoints.NewAddUpdateOpts("foo/host2", endpoints.Endpoint{Addr: "127.0.0.1:2001"})})
   104  	if err != nil {
   105  		t.Fatal(err)
   106  	}
   107  
   108  	ctx, watchCancel := context.WithCancel(context.Background())
   109  	defer watchCancel()
   110  	w, err := em.NewWatchChannel(ctx)
   111  	if err != nil {
   112  		t.Fatal(err)
   113  	}
   114  
   115  	updates := <-w
   116  	if len(updates) != 2 {
   117  		t.Fatalf("expected two updates, got %+v", updates)
   118  	}
   119  
   120  	_, err = c.Txn(context.TODO()).Then(etcd.OpDelete("foo/host"), etcd.OpDelete("foo/host2")).Commit()
   121  	if err != nil {
   122  		t.Fatal(err)
   123  	}
   124  
   125  	updates = <-w
   126  	if len(updates) != 2 || (updates[0].Op != endpoints.Delete && updates[1].Op != endpoints.Delete) {
   127  		t.Fatalf("expected two delete updates, got %+v", updates)
   128  	}
   129  }
   130  
   131  func TestEndpointManagerCRUD(t *testing.T) {
   132  	integration2.BeforeTest(t)
   133  
   134  	clus := integration2.NewCluster(t, &integration2.ClusterConfig{Size: 1})
   135  	defer clus.Terminate(t)
   136  
   137  	em, err := endpoints.NewManager(clus.RandClient(), "foo")
   138  	if err != nil {
   139  		t.Fatal("failed to create EndpointManager", err)
   140  	}
   141  
   142  	// Add
   143  	k1 := "foo/a1"
   144  	e1 := endpoints.Endpoint{Addr: "127.0.0.1", Metadata: "metadata1"}
   145  	err = em.AddEndpoint(context.TODO(), k1, e1)
   146  	if err != nil {
   147  		t.Fatal("failed to add", k1, err)
   148  	}
   149  
   150  	k2 := "foo/a2"
   151  	e2 := endpoints.Endpoint{Addr: "127.0.0.2", Metadata: "metadata2"}
   152  	err = em.AddEndpoint(context.TODO(), k2, e2)
   153  	if err != nil {
   154  		t.Fatal("failed to add", k2, err)
   155  	}
   156  
   157  	eps, err := em.List(context.TODO())
   158  	if err != nil {
   159  		t.Fatal("failed to list foo")
   160  	}
   161  	if len(eps) != 2 {
   162  		t.Fatalf("unexpected the number of endpoints: %d", len(eps))
   163  	}
   164  	if !reflect.DeepEqual(eps[k1], e1) {
   165  		t.Fatalf("unexpected endpoints: %s", k1)
   166  	}
   167  	if !reflect.DeepEqual(eps[k2], e2) {
   168  		t.Fatalf("unexpected endpoints: %s", k2)
   169  	}
   170  
   171  	// Delete
   172  	err = em.DeleteEndpoint(context.TODO(), k1)
   173  	if err != nil {
   174  		t.Fatal("failed to delete", k2, err)
   175  	}
   176  
   177  	eps, err = em.List(context.TODO())
   178  	if err != nil {
   179  		t.Fatal("failed to list foo")
   180  	}
   181  	if len(eps) != 1 {
   182  		t.Fatalf("unexpected the number of endpoints: %d", len(eps))
   183  	}
   184  	if !reflect.DeepEqual(eps[k2], e2) {
   185  		t.Fatalf("unexpected endpoints: %s", k2)
   186  	}
   187  
   188  	// Update
   189  	k3 := "foo/a3"
   190  	e3 := endpoints.Endpoint{Addr: "127.0.0.3", Metadata: "metadata3"}
   191  	updates := []*endpoints.UpdateWithOpts{
   192  		{Update: endpoints.Update{Op: endpoints.Add, Key: k3, Endpoint: e3}},
   193  		{Update: endpoints.Update{Op: endpoints.Delete, Key: k2}},
   194  	}
   195  	err = em.Update(context.TODO(), updates)
   196  	if err != nil {
   197  		t.Fatal("failed to update", err)
   198  	}
   199  
   200  	eps, err = em.List(context.TODO())
   201  	if err != nil {
   202  		t.Fatal("failed to list foo")
   203  	}
   204  	if len(eps) != 1 {
   205  		t.Fatalf("unexpected the number of endpoints: %d", len(eps))
   206  	}
   207  	if !reflect.DeepEqual(eps[k3], e3) {
   208  		t.Fatalf("unexpected endpoints: %s", k3)
   209  	}
   210  }