Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 19 additions & 3 deletions test/kubernetes/helm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,27 @@ import (

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)
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")
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)
waitForReady(t, cs, release)
}
Expand All @@ -37,7 +53,7 @@ func TestPersistenceDisabled(t *testing.T) {
cs := kubeLogin(t)
release := strings.ToLower(t.Name())
helmInstall(t, cs, release, "license=accept", "persistence.enabled=false")
defer helmDelete(t, release)
defer helmDelete(t, cs, release)
waitForReady(t, cs, release)

// Check that no PVCs were created
Expand Down
60 changes: 57 additions & 3 deletions test/kubernetes/helm_test_util.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ limitations under the License.
package main

import (
"bytes"
"fmt"
"os"
"os/exec"
Expand All @@ -31,6 +32,14 @@ import (
"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
// complete and returns the exit status (return code).
// TODO: duplicated from cmd/runmqserver/main.go
Expand All @@ -57,9 +66,23 @@ func runCommand(t *testing.T, name string, arg ...string) (string, int, error) {
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) {
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"
arg := []string{
"install",
Expand All @@ -68,12 +91,13 @@ func helmInstall(t *testing.T, cs *kubernetes.Clientset, release string, values
"--name",
release,
"--set",
"image.repository=" + image,
"image.repository=" + imageName(),
"--set",
"image.tag=" + tag,
"--set",
"image.pullSecret=admin.registrykey",
}
// Add any extra values to the Helm command
for _, value := range values {
arg = append(arg, "--set", value)
}
Expand All @@ -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)
if err != nil {
t.Error(out)
Expand Down Expand Up @@ -184,3 +209,32 @@ func getPodsForHelmRelease(t *testing.T, cs *kubernetes.Clientset, release strin
}
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