Skip to content

Commit

Permalink
test/e2e: add etcdctl sanity test
Browse files Browse the repository at this point in the history
Signed-off-by: Sam Batschelet <sbatsche@redhat.com>
  • Loading branch information
hexfusion committed Sep 30, 2020
1 parent ebe3222 commit 2ee7d88
Show file tree
Hide file tree
Showing 23 changed files with 7,297 additions and 0 deletions.
1 change: 1 addition & 0 deletions go.mod
Expand Up @@ -15,6 +15,7 @@ require (
github.com/prometheus/common v0.10.0
github.com/spf13/cobra v1.0.0
github.com/spf13/pflag v1.0.5
github.com/stretchr/testify v1.4.0
github.com/vishvananda/netlink v1.0.0
go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5
golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4
Expand Down
115 changes: 115 additions & 0 deletions test/e2e/etcdctl_test.go
@@ -0,0 +1,115 @@
package e2e

import (
"context"
"fmt"
"os/exec"
"strings"
"testing"

"github.com/openshift/cluster-etcd-operator/test/e2e/framework"
"github.com/stretchr/testify/require"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

// TestEtcdctlCommands executes all known etcdctl commands inside of the etcdctl container.
// The test is not intended to be a functional test yet a sanity test that the container
// ENV is populated correctly and that etcdctl consumes that ENV properly.
func TestEtcdctlCommands(t *testing.T) {
// setup
cs := framework.NewClientSet("")
pod, err := cs.CoreV1Interface.Pods("").List(context.TODO(), metav1.ListOptions{LabelSelector: "k8s-app=etcd"})
require.NoError(t, err)
podName := pod.Items[0].Name

testCases := []struct {
command string
skip bool
skipReason string
expectedError string
}{
{"etcdctl alarm disarm", false, "", ""},
{"etcdctl alarm list", false, "", ""},
{"etcdctl del --prefix /etcdctl-check-perf/", false, "", ""},
{"etcdctl check perf", false, "", ""},
{"etcdctl compaction 0", false, "", "Error: etcdserver: mvcc: required revision has been compacted"},
{"etcdctl defrag", false, "", ""},
{"etcdctl elect myelection", false, "", "no proposal argument but -l not set"},
// endpoint
{"etcdctl endpoint hashkv", false, "", ""},
{"etcdctl endpoint health", false, "", "migrate from v2 is not support for OCP4"},
{"etcdctl endpoint status", false, "", ""},
{"etcdctl get /foo", false, "", ""},
// lease
{"etcdctl lease grant 10", false, "", ""},
{"etcdctl lease keep-alive 694d74da6ca8020b", false, "", "lease 694d74da6ca8020b expired or revoked"},
{"etcdctl lease list", false, "", ""},
{"etcdctl lease revoke 694d74da6ca8020b", false, "", "etcdserver: requested lease not found"},
{"etcdctl lease timetolive 694d74da6ca8020b", false, "", "lease 694d74da6ca8020b expired or revoked"},
// member
{"etcdctl member list", false, "", ""},
{"etcdctl member add tester", false, "", "member peer urls not provided"},
{"etcdctl member promote 8e9e05c52164694d", false, "", "etcdserver: member not found"},
{"etcdctl member remove 8e9e05c52164694d", false, "", "etcdserver: member not found"},
{"etcdctl member update 8e9e05c52164694d", false, "", "member peer urls not provided"},
{"etcdctl move-leader 8e9e05c52164694d", false, "", ""},
{"etcdctl put /etcdctl-check-perf/foo bar", false, "", ""},
{"etcdctl snapshot save ./backup.db", false, "", ""},
{"etcdctl snapshot status ./backup.db", false, "", ""},
{"etcdctl snapshot restore ./backup.db", false, "", ""},
{"etcdctl version", false, "", ""},
// skip
{"etcdctl auth enable", true, "k8s does not use internal etcd RBAC", ""},
{"etcdctl auth disable", true, "k8s does not use internal etcd RBAC", ""},
{"etcdctl lock", true, "distributed locks should not be done via etcdctl", ""},
{"etcdctl make-mirror", true, "", "make-mirror takes one destination argument"},
{"etcdctl migrate", true, "migrate from v2 is not support for OCP4", ""},
{"etcdctl role add", true, "k8s does not use internal etcd RBAC", ""},
{"etcdctl role delete", true, "k8s does not use internal etcd RBAC", ""},
{"etcdctl role get", true, "k8s does not use internal etcd RBAC", ""},
{"etcdctl role grant-permission", true, "k8s does not use internal etcd RBAC", ""},
{"etcdctl role list", true, "k8s does not use internal etcd RBAC", ""},
{"etcdctl role revoke-permission", true, "k8s does not use internal etcd RBAC", ""},
{"etcdctl user add", true, "k8s does not use internal etcd RBAC", ""},
{"etcdctl user delete", true, "k8s does not use internal etcd RBAC", ""},
{"etcdctl user get", true, "k8s does not use internal etcd RBAC", ""},
{"etcdctl user grant-role", true, "k8s does not use internal etcd RBAC", ""},
{"etcdctl user list", true, "k8s does not use internal etcd RBAC", ""},
{"etcdctl user revoke-role", true, "k8s does not use internal etcd RBAC", ""},
// broke
{"etcdctl check datascale", true, "TODO currently fails in test but works fine in container directly", ""},
{"etcdctl txn", true, "TODO figure out multiline command", ""},
}

for _, tc := range testCases {
t.Run(fmt.Sprintf("%s", tc.command), func(t *testing.T) {
if tc.skip {
t.Skip(tc.skipReason)
}

actual, err := exec.Command("oc", getOcExecArgs(tc.command, podName)...).CombinedOutput()
switch {
case err == nil && len(tc.expectedError) == 0:
//pass
case err == nil && len(tc.expectedError) != 0:
case err != nil && len(tc.expectedError) == 0:
require.NoError(t, fmt.Errorf("unexpected error: %q", actual))
case err != nil && len(tc.expectedError) != 0 && !strings.Contains(string(actual), tc.expectedError):
require.NoError(t, fmt.Errorf("unexpected error: %q", actual))
}
})
}

t.Cleanup(func() {
if actual, err := exec.Command("oc", getOcExecArgs("rm -rf ./default.etcd", podName)...).CombinedOutput(); err != nil {
require.NoError(t, fmt.Errorf("cleanup data-dir failed: %s", actual))
}
if actual, err := exec.Command("oc", getOcExecArgs("rm -rf ./default.etcd", podName)...).CombinedOutput(); err != nil {
require.NoError(t, fmt.Errorf("cleanup db file failed: %s", actual))
}
})
}

func getOcExecArgs(command, podName string) []string {
return strings.Split(fmt.Sprintf("rsh -c etcdctl -n openshift-etcd %s %s", podName, command), " ")
}
27 changes: 27 additions & 0 deletions vendor/github.com/pmezard/go-difflib/LICENSE

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 2ee7d88

Please sign in to comment.