go.etcd.io/etcd@v3.3.27+incompatible/tests/e2e/ctl_v2_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 e2e
    16  
    17  import (
    18  	"os"
    19  	"strings"
    20  	"testing"
    21  
    22  	"github.com/coreos/etcd/pkg/fileutil"
    23  	"github.com/coreos/etcd/pkg/testutil"
    24  )
    25  
    26  func testCtlV2Set(t *testing.T, cfg *etcdProcessClusterConfig, quorum bool) {
    27  	os.Setenv("ETCDCTL_API", "2")
    28  	defer os.Unsetenv("ETCDCTL_API")
    29  	defer testutil.AfterTest(t)
    30  
    31  	cfg.enableV2 = true
    32  	epc := setupEtcdctlTest(t, cfg, quorum)
    33  	defer func() {
    34  		if errC := epc.Close(); errC != nil {
    35  			t.Fatalf("error closing etcd processes (%v)", errC)
    36  		}
    37  	}()
    38  
    39  	key, value := "foo", "bar"
    40  
    41  	if err := etcdctlSet(epc, key, value); err != nil {
    42  		t.Fatalf("failed set (%v)", err)
    43  	}
    44  
    45  	if err := etcdctlGet(epc, key, value, quorum); err != nil {
    46  		t.Fatalf("failed get (%v)", err)
    47  	}
    48  }
    49  
    50  func etcdctlPrefixArgs(clus *etcdProcessCluster) []string {
    51  	endpoints := strings.Join(clus.EndpointsV2(), ",")
    52  	cmdArgs := []string{ctlBinPath, "--endpoints", endpoints}
    53  	if clus.cfg.clientTLS == clientTLS {
    54  		cmdArgs = append(cmdArgs, "--ca-file", caPath, "--cert-file", certPath, "--key-file", privateKeyPath)
    55  	}
    56  	return cmdArgs
    57  }
    58  
    59  func etcdctlClusterHealth(clus *etcdProcessCluster, val string) error {
    60  	cmdArgs := append(etcdctlPrefixArgs(clus), "cluster-health")
    61  	return spawnWithExpect(cmdArgs, val)
    62  }
    63  
    64  func etcdctlSet(clus *etcdProcessCluster, key, value string) error {
    65  	cmdArgs := append(etcdctlPrefixArgs(clus), "set", key, value)
    66  	return spawnWithExpect(cmdArgs, value)
    67  }
    68  
    69  func etcdctlMk(clus *etcdProcessCluster, key, value string, first bool) error {
    70  	cmdArgs := append(etcdctlPrefixArgs(clus), "mk", key, value)
    71  	if first {
    72  		return spawnWithExpect(cmdArgs, value)
    73  	}
    74  	return spawnWithExpect(cmdArgs, "Error:  105: Key already exists")
    75  }
    76  
    77  func etcdctlGet(clus *etcdProcessCluster, key, value string, quorum bool) error {
    78  	cmdArgs := append(etcdctlPrefixArgs(clus), "get", key)
    79  	if quorum {
    80  		cmdArgs = append(cmdArgs, "--quorum")
    81  	}
    82  	return spawnWithExpect(cmdArgs, value)
    83  }
    84  
    85  func etcdctlRm(clus *etcdProcessCluster, key, value string, first bool) error {
    86  	cmdArgs := append(etcdctlPrefixArgs(clus), "rm", key)
    87  	if first {
    88  		return spawnWithExpect(cmdArgs, "PrevNode.Value: "+value)
    89  	}
    90  	return spawnWithExpect(cmdArgs, "Error:  100: Key not found")
    91  }
    92  
    93  func etcdctlLs(clus *etcdProcessCluster, key string, quorum bool) error {
    94  	cmdArgs := append(etcdctlPrefixArgs(clus), "ls")
    95  	if quorum {
    96  		cmdArgs = append(cmdArgs, "--quorum")
    97  	}
    98  	return spawnWithExpect(cmdArgs, key)
    99  }
   100  
   101  func etcdctlWatch(clus *etcdProcessCluster, key, value string, noSync bool) <-chan error {
   102  	cmdArgs := append(etcdctlPrefixArgs(clus), "watch", "--after-index=1", key)
   103  	if noSync {
   104  		cmdArgs = append(cmdArgs, "--no-sync")
   105  	}
   106  	errc := make(chan error, 1)
   107  	go func() {
   108  		errc <- spawnWithExpect(cmdArgs, value)
   109  	}()
   110  	return errc
   111  }
   112  
   113  func etcdctlRoleAdd(clus *etcdProcessCluster, role string) error {
   114  	cmdArgs := append(etcdctlPrefixArgs(clus), "role", "add", role)
   115  	return spawnWithExpect(cmdArgs, role)
   116  }
   117  
   118  func etcdctlRoleGrant(clus *etcdProcessCluster, role string, perms ...string) error {
   119  	cmdArgs := append(etcdctlPrefixArgs(clus), "role", "grant")
   120  	cmdArgs = append(cmdArgs, perms...)
   121  	cmdArgs = append(cmdArgs, role)
   122  	return spawnWithExpect(cmdArgs, role)
   123  }
   124  
   125  func etcdctlRoleList(clus *etcdProcessCluster, expectedRole string) error {
   126  	cmdArgs := append(etcdctlPrefixArgs(clus), "role", "list")
   127  	return spawnWithExpect(cmdArgs, expectedRole)
   128  }
   129  
   130  func etcdctlUserAdd(clus *etcdProcessCluster, user, pass string) error {
   131  	cmdArgs := append(etcdctlPrefixArgs(clus), "user", "add", user+":"+pass)
   132  	return spawnWithExpect(cmdArgs, "User "+user+" created")
   133  }
   134  
   135  func etcdctlUserGrant(clus *etcdProcessCluster, user, role string) error {
   136  	cmdArgs := append(etcdctlPrefixArgs(clus), "user", "grant", "--roles", role, user)
   137  	return spawnWithExpect(cmdArgs, "User "+user+" updated")
   138  }
   139  
   140  func etcdctlUserGet(clus *etcdProcessCluster, user string) error {
   141  	cmdArgs := append(etcdctlPrefixArgs(clus), "user", "get", user)
   142  	return spawnWithExpect(cmdArgs, "User: "+user)
   143  }
   144  
   145  func etcdctlUserList(clus *etcdProcessCluster, expectedUser string) error {
   146  	cmdArgs := append(etcdctlPrefixArgs(clus), "user", "list")
   147  	return spawnWithExpect(cmdArgs, expectedUser)
   148  }
   149  
   150  func etcdctlAuthEnable(clus *etcdProcessCluster) error {
   151  	cmdArgs := append(etcdctlPrefixArgs(clus), "auth", "enable")
   152  	return spawnWithExpect(cmdArgs, "Authentication Enabled")
   153  }
   154  
   155  func etcdctlBackup(clus *etcdProcessCluster, dataDir, backupDir string, v3 bool) error {
   156  	cmdArgs := append(etcdctlPrefixArgs(clus), "backup", "--data-dir", dataDir, "--backup-dir", backupDir)
   157  	if v3 {
   158  		cmdArgs = append(cmdArgs, "--with-v3")
   159  	}
   160  	proc, err := spawnCmd(cmdArgs)
   161  	if err != nil {
   162  		return err
   163  	}
   164  	return proc.Close()
   165  }
   166  
   167  func mustEtcdctl(t *testing.T) {
   168  	if !fileutil.Exist(binDir + "/etcdctl") {
   169  		t.Fatalf("could not find etcdctl binary")
   170  	}
   171  }
   172  
   173  func setupEtcdctlTest(t *testing.T, cfg *etcdProcessClusterConfig, quorum bool) *etcdProcessCluster {
   174  	mustEtcdctl(t)
   175  	if !quorum {
   176  		cfg = configStandalone(*cfg)
   177  	}
   178  	epc, err := newEtcdProcessCluster(cfg)
   179  	if err != nil {
   180  		t.Fatalf("could not start etcd process cluster (%v)", err)
   181  	}
   182  	return epc
   183  }