Merge pull request #7 from arthurbarr/sctest

Add test for Storage Classes
This commit is contained in:
Rob Parker
2017-10-02 11:01:05 +01:00
committed by GitHub
2 changed files with 76 additions and 6 deletions

View File

@@ -24,11 +24,27 @@ import (
var namespace = "default" var namespace = "default"
func TestHelmGoldenPath(t *testing.T) { // Prior to running this test, a Persistent Volume must be created
func TestHelmPredefinedVolume(t *testing.T) {
cs := kubeLogin(t) cs := kubeLogin(t)
release := strings.ToLower(t.Name()) release := strings.ToLower(t.Name())
if !volumesAvailable(t, cs) {
t.Skipf("Skipping test because no persistent volumes were found")
}
helmInstall(t, cs, release, "license=accept", "persistence.useDynamicProvisioning=false") helmInstall(t, cs, release, "license=accept", "persistence.useDynamicProvisioning=false")
defer helmDelete(t, release) defer helmDelete(t, cs, release)
defer helmDeletePVC(t, cs, release)
waitForReady(t, cs, release)
}
func TestHelmStorageClass(t *testing.T) {
cs := kubeLogin(t)
release := strings.ToLower(t.Name())
if !storageClassesDefined(t, cs) {
t.Skipf("Skipping test because no storage classes were found")
}
helmInstall(t, cs, release, "license=accept", "persistence.useDynamicProvisioning=true")
defer helmDelete(t, cs, release)
defer helmDeletePVC(t, cs, release) defer helmDeletePVC(t, cs, release)
waitForReady(t, cs, release) waitForReady(t, cs, release)
} }
@@ -37,7 +53,7 @@ func TestPersistenceDisabled(t *testing.T) {
cs := kubeLogin(t) cs := kubeLogin(t)
release := strings.ToLower(t.Name()) release := strings.ToLower(t.Name())
helmInstall(t, cs, release, "license=accept", "persistence.enabled=false") helmInstall(t, cs, release, "license=accept", "persistence.enabled=false")
defer helmDelete(t, release) defer helmDelete(t, cs, release)
waitForReady(t, cs, release) waitForReady(t, cs, release)
// Check that no PVCs were created // Check that no PVCs were created

View File

@@ -16,6 +16,7 @@ limitations under the License.
package main package main
import ( import (
"bytes"
"fmt" "fmt"
"os" "os"
"os/exec" "os/exec"
@@ -31,6 +32,14 @@ import (
"k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/tools/clientcmd"
) )
func imageName() string {
image, ok := os.LookupEnv("TEST_IMAGE")
if !ok {
image = "ibmcom/mq"
}
return image
}
// runCommand runs an OS command. On Linux it waits for the command to // runCommand runs an OS command. On Linux it waits for the command to
// complete and returns the exit status (return code). // complete and returns the exit status (return code).
// TODO: duplicated from cmd/runmqserver/main.go // TODO: duplicated from cmd/runmqserver/main.go
@@ -57,9 +66,23 @@ func runCommand(t *testing.T, name string, arg ...string) (string, int, error) {
return string(out), 0, nil return string(out), 0, nil
} }
func inspectLogs(t *testing.T, cs *kubernetes.Clientset, release string) string {
pods := getPodsForHelmRelease(t, cs, release)
opt := v1.PodLogOptions{}
r := cs.CoreV1().Pods(namespace).GetLogs(pods.Items[0].Name, &opt)
buf := new(bytes.Buffer)
rc, err := r.Stream()
if err != nil {
t.Fatal(err)
}
buf.ReadFrom(rc)
return buf.String()
}
func helmInstall(t *testing.T, cs *kubernetes.Clientset, release string, values ...string) { func helmInstall(t *testing.T, cs *kubernetes.Clientset, release string, values ...string) {
chart := "../../charts/ibm-mqadvanced-server-prod" chart := "../../charts/ibm-mqadvanced-server-prod"
image := "mycluster.icp:8500/default/mq-devserver" //image := "mycluster.icp:8500/default/mq-devserver"
//image := "ibmcom/mq"
tag := "latest" tag := "latest"
arg := []string{ arg := []string{
"install", "install",
@@ -68,12 +91,13 @@ func helmInstall(t *testing.T, cs *kubernetes.Clientset, release string, values
"--name", "--name",
release, release,
"--set", "--set",
"image.repository=" + image, "image.repository=" + imageName(),
"--set", "--set",
"image.tag=" + tag, "image.tag=" + tag,
"--set", "--set",
"image.pullSecret=admin.registrykey", "image.pullSecret=admin.registrykey",
} }
// Add any extra values to the Helm command
for _, value := range values { for _, value := range values {
arg = append(arg, "--set", value) arg = append(arg, "--set", value)
} }
@@ -85,7 +109,8 @@ func helmInstall(t *testing.T, cs *kubernetes.Clientset, release string, values
} }
} }
func helmDelete(t *testing.T, release string) { func helmDelete(t *testing.T, cs *kubernetes.Clientset, release string) {
t.Log(inspectLogs(t, cs, release))
out, _, err := runCommand(t, "helm", "delete", "--purge", release) out, _, err := runCommand(t, "helm", "delete", "--purge", release)
if err != nil { if err != nil {
t.Error(out) t.Error(out)
@@ -184,3 +209,32 @@ func getPodsForHelmRelease(t *testing.T, cs *kubernetes.Clientset, release strin
} }
return pods return pods
} }
func storageClassesDefined(t *testing.T, cs *kubernetes.Clientset) bool {
c, err := cs.Storage().StorageClasses().List(metav1.ListOptions{})
if err != nil {
t.Fatal(err)
}
if len(c.Items) > 0 {
return true
}
return false
}
// volumesAvailable checks to see if any persistent volumes are available.
// On some Kubernetes clusters, only storage classes are used, so there won't
// be any volumes pre-created.
func volumesAvailable(t *testing.T, cs *kubernetes.Clientset) bool {
pvs, err := cs.CoreV1().PersistentVolumes().List(metav1.ListOptions{})
if err != nil {
t.Fatal(err)
}
for _, pv := range pvs.Items {
if pv.Status.Phase == v1.VolumeAvailable {
return true
}
}
return false
}
// TODO: On Minikube, need to make sure Helm is initialized first