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 }