2019-05-31 09:34:04 +00:00
|
|
|
package e2e
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2019-10-17 04:21:52 +00:00
|
|
|
"regexp"
|
|
|
|
"strconv"
|
2019-05-31 09:34:04 +00:00
|
|
|
"strings"
|
2019-09-04 04:25:40 +00:00
|
|
|
"time"
|
2019-05-31 09:34:04 +00:00
|
|
|
|
|
|
|
. "github.com/onsi/gomega" // nolint
|
|
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
|
|
"k8s.io/client-go/kubernetes"
|
|
|
|
"k8s.io/kubernetes/test/e2e/framework"
|
2019-06-24 07:58:39 +00:00
|
|
|
e2elog "k8s.io/kubernetes/test/e2e/framework/log"
|
2019-05-31 09:34:04 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
rookURL = "https://raw.githubusercontent.com/rook/rook/$version/cluster/examples/kubernetes/ceph"
|
|
|
|
)
|
|
|
|
|
|
|
|
var rookNS = "rook-ceph"
|
|
|
|
|
|
|
|
func formRookURL(version string) {
|
|
|
|
rookURL = strings.Replace(rookURL, "$version", version, 1)
|
|
|
|
}
|
|
|
|
|
|
|
|
func getK8sClient() kubernetes.Interface {
|
2019-06-24 07:58:39 +00:00
|
|
|
e2elog.Logf("Creating a kubernetes client")
|
2019-05-31 09:34:04 +00:00
|
|
|
client, err := framework.LoadClientset()
|
|
|
|
Expect(err).Should(BeNil())
|
|
|
|
return client
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
func deployCommon() {
|
|
|
|
commonPath := fmt.Sprintf("%s/%s", rookURL, "common.yaml")
|
|
|
|
framework.RunKubectlOrDie("create", "-f", commonPath)
|
|
|
|
}
|
|
|
|
|
|
|
|
func createFileSystem(c kubernetes.Interface) {
|
|
|
|
commonPath := fmt.Sprintf("%s/%s", rookURL, "filesystem-test.yaml")
|
|
|
|
framework.RunKubectlOrDie("create", "-f", commonPath)
|
2019-06-10 06:48:41 +00:00
|
|
|
opt := &metav1.ListOptions{
|
2019-05-31 09:34:04 +00:00
|
|
|
LabelSelector: "app=rook-ceph-mds",
|
|
|
|
}
|
|
|
|
err := checkCephPods(rookNS, c, 1, deployTimeout, opt)
|
|
|
|
Expect(err).Should(BeNil())
|
|
|
|
}
|
|
|
|
|
|
|
|
func createRBDPool() {
|
|
|
|
commonPath := fmt.Sprintf("%s/%s", rookURL, "pool-test.yaml")
|
|
|
|
framework.RunKubectlOrDie("create", "-f", commonPath)
|
|
|
|
}
|
|
|
|
func deleteFileSystem() {
|
2019-06-07 05:57:02 +00:00
|
|
|
commonPath := fmt.Sprintf("%s/%s", rookURL, "filesystem-test.yaml")
|
2019-06-18 07:07:11 +00:00
|
|
|
_, err := framework.RunKubectl("delete", "-f", commonPath)
|
|
|
|
if err != nil {
|
2019-06-24 07:58:39 +00:00
|
|
|
e2elog.Logf("failed to delete file-system %v", err)
|
2019-06-18 07:07:11 +00:00
|
|
|
}
|
2019-05-31 09:34:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func deleteRBDPool() {
|
|
|
|
commonPath := fmt.Sprintf("%s/%s", rookURL, "pool-test.yaml")
|
2019-06-18 07:07:11 +00:00
|
|
|
_, err := framework.RunKubectl("delete", "-f", commonPath)
|
|
|
|
if err != nil {
|
2019-06-24 07:58:39 +00:00
|
|
|
e2elog.Logf("failed to delete pool %v", err)
|
2019-06-18 07:07:11 +00:00
|
|
|
}
|
2019-05-31 09:34:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func deployOperator(c kubernetes.Interface) {
|
|
|
|
opPath := fmt.Sprintf("%s/%s", rookURL, "operator.yaml")
|
|
|
|
|
2019-06-18 07:07:11 +00:00
|
|
|
_, err := framework.RunKubectl("create", "-f", opPath)
|
|
|
|
Expect(err).Should(BeNil())
|
2019-05-31 09:34:04 +00:00
|
|
|
err = waitForDaemonSets("rook-discover", rookNS, c, deployTimeout)
|
|
|
|
Expect(err).Should(BeNil())
|
|
|
|
err = waitForDeploymentComplete("rook-ceph-operator", rookNS, c, deployTimeout)
|
|
|
|
Expect(err).Should(BeNil())
|
|
|
|
}
|
|
|
|
|
|
|
|
func deployCluster(c kubernetes.Interface) {
|
|
|
|
opPath := fmt.Sprintf("%s/%s", rookURL, "cluster-test.yaml")
|
|
|
|
framework.RunKubectlOrDie("create", "-f", opPath)
|
2019-10-17 04:21:52 +00:00
|
|
|
|
|
|
|
// After rook-ceph v1.1.0, flex driver is disabled. We don't need to wait for rook-ceph-agent.
|
|
|
|
if !strings.EqualFold(RookVersion, "master") && isOlderRookVersionThan(RookVersion, "v1.1.1") {
|
|
|
|
err := waitForDaemonSets("rook-ceph-agent", rookNS, c, deployTimeout)
|
|
|
|
Expect(err).Should(BeNil())
|
|
|
|
}
|
|
|
|
|
2019-06-10 06:48:41 +00:00
|
|
|
opt := &metav1.ListOptions{
|
2019-05-31 09:34:04 +00:00
|
|
|
LabelSelector: "app=rook-ceph-mon",
|
|
|
|
}
|
2019-10-17 04:21:52 +00:00
|
|
|
err := checkCephPods(rookNS, c, 1, deployTimeout, opt)
|
2019-05-31 09:34:04 +00:00
|
|
|
Expect(err).Should(BeNil())
|
|
|
|
}
|
|
|
|
|
2019-10-17 04:21:52 +00:00
|
|
|
func isOlderRookVersionThan(targetVersion, compareToVersion string) bool {
|
|
|
|
rv := extractRookVersion(targetVersion)
|
|
|
|
cv := extractRookVersion(compareToVersion)
|
|
|
|
|
|
|
|
for i := 0; i < 3; i++ {
|
|
|
|
if rv[i] < cv[i] {
|
|
|
|
return true
|
|
|
|
} else if rv[i] > cv[i] {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
// extract rook version that form is v1.3.2-beta
|
|
|
|
func extractRookVersion(versionString string) []int {
|
|
|
|
reg := regexp.MustCompile(`^v(\d+).(\d+).(\d+)`)
|
|
|
|
parsedVersionString := reg.FindStringSubmatch(versionString)
|
|
|
|
Expect(len(parsedVersionString)).Should(BeNumerically(">=", 4))
|
|
|
|
|
|
|
|
var version []int
|
|
|
|
for i := 1; i < 4; i++ {
|
|
|
|
j, err := strconv.Atoi(parsedVersionString[i])
|
|
|
|
Expect(err).Should(BeNil())
|
|
|
|
|
|
|
|
version = append(version, j)
|
|
|
|
}
|
|
|
|
|
|
|
|
return version
|
|
|
|
}
|
|
|
|
|
2019-05-31 09:34:04 +00:00
|
|
|
func deployToolBox(c kubernetes.Interface) {
|
|
|
|
opPath := fmt.Sprintf("%s/%s", rookURL, "toolbox.yaml")
|
|
|
|
framework.RunKubectlOrDie("create", "-f", opPath)
|
2019-06-10 06:48:41 +00:00
|
|
|
opt := &metav1.ListOptions{
|
2019-05-31 09:34:04 +00:00
|
|
|
LabelSelector: "app=rook-ceph-tools",
|
|
|
|
}
|
|
|
|
|
|
|
|
name := getPodName(rookNS, c, opt)
|
|
|
|
err := waitForPodInRunningState(name, rookNS, c, deployTimeout)
|
|
|
|
Expect(err).Should(BeNil())
|
2019-09-04 04:25:40 +00:00
|
|
|
waitforToolBoX(name)
|
|
|
|
}
|
|
|
|
|
|
|
|
// this is a workaround, as we are hitting "unable to get monitor info from DNS SRV with service name: ceph-mon"
|
|
|
|
func waitforToolBoX(name string) {
|
|
|
|
cmd := []string{"logs", "-nrook-ceph", name}
|
|
|
|
for i := 0; i < 20; i++ {
|
|
|
|
resp, err := framework.RunKubectl(cmd...)
|
|
|
|
if err != nil {
|
|
|
|
e2elog.Logf("failed to get logs %v", err)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
if !strings.Contains(resp, "=") {
|
|
|
|
e2elog.Logf("malformed monitor configuration %+v", resp)
|
|
|
|
time.Sleep(10 * time.Second)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
if strings.TrimRight(resp[strings.LastIndex(resp, "=")+1:], "\n") != "" {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
e2elog.Logf("monitor list is empty in ceph.conf %v", resp)
|
|
|
|
time.Sleep(10 * time.Second)
|
|
|
|
}
|
2019-05-31 09:34:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func deployRook() {
|
|
|
|
c := getK8sClient()
|
|
|
|
deployCommon()
|
|
|
|
deployOperator(c)
|
|
|
|
deployCluster(c)
|
|
|
|
deployToolBox(c)
|
|
|
|
}
|
|
|
|
|
|
|
|
func tearDownRook() {
|
|
|
|
opPath := fmt.Sprintf("%s/%s", rookURL, "cluster-test.yaml")
|
|
|
|
framework.Cleanup(opPath, rookNS, "app=rook-ceph-mon")
|
|
|
|
opPath = fmt.Sprintf("%s/%s", rookURL, "toolbox.yaml")
|
|
|
|
framework.Cleanup(opPath, rookNS, "app=rook-ceph-tools")
|
|
|
|
|
|
|
|
opPath = fmt.Sprintf("%s/%s", rookURL, "operator.yaml")
|
2019-06-10 06:48:41 +00:00
|
|
|
// TODO need to add selector for cleanup validation
|
2019-05-31 09:34:04 +00:00
|
|
|
framework.Cleanup(opPath, rookNS)
|
|
|
|
commonPath := fmt.Sprintf("%s/%s", rookURL, "common.yaml")
|
2019-06-18 07:07:11 +00:00
|
|
|
_, err := framework.RunKubectl("delete", "-f", commonPath)
|
|
|
|
if err != nil {
|
2019-06-24 07:58:39 +00:00
|
|
|
e2elog.Logf("failed to delete rook common %v", err)
|
2019-06-18 07:07:11 +00:00
|
|
|
}
|
2019-05-31 09:34:04 +00:00
|
|
|
}
|