Skip to content

Commit

Permalink
Add wrapper binary for conformance tests
Browse files Browse the repository at this point in the history
Put the wrapper binary and the functest binary both inside a conformance
container and push the resulting container as
`kubevirt/conformance:<tag>`

The wrapper will do all the necessary work and calls the functest binary
the way which sonobuoy expects.

To generate a sonobuoy plugin for a released conformance test suite, run

```
sonobuoy gen plugin --name kubevirt-conformance --cmd /usr/bin/conformance --image kubevirt/conformance:<tag> -f junit > kubevirt.yaml
```

Then luanch the suite:

```
sonobuoy run --plugin kubevirt.yaml
```

Signed-off-by: rmohr <[email protected]>
  • Loading branch information
rmohr committed Aug 28, 2020
1 parent ea49c8c commit f8c9c4a
Show file tree
Hide file tree
Showing 9 changed files with 260 additions and 5 deletions.
10 changes: 10 additions & 0 deletions BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,16 @@ container_push(
tag = "$(container_tag)",
)

container_push(
name = "push-conformance",
testonly = True,
format = "Docker",
image = "//tests:conformance_image",
registry = "$(container_prefix)",
repository = "$(image_prefix)conformance",
tag = "$(container_tag)",
)

go_library(
name = "go_default_library",
srcs = [
Expand Down
2 changes: 1 addition & 1 deletion hack/bazel-build-images.sh
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,4 @@ bazel build \
--define image_prefix= \
--define container_tag= \
//:build-other-images //cmd/virt-operator:virt-operator-image //cmd/virt-api:virt-api-image \
//cmd/virt-controller:virt-controller-image //cmd/virt-handler:virt-handler-image //cmd/virt-launcher:virt-launcher-image
//cmd/virt-controller:virt-controller-image //cmd/virt-handler:virt-handler-image //cmd/virt-launcher:virt-launcher-image //tests:conformance_image
2 changes: 1 addition & 1 deletion hack/bazel-push-images.sh
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ set -e
source hack/common.sh
source hack/config.sh

PUSH_TARGETS=(${PUSH_TARGETS:-other-images virt-operator virt-api virt-controller virt-handler virt-launcher})
PUSH_TARGETS=(${PUSH_TARGETS:-other-images virt-operator virt-api virt-controller virt-handler virt-launcher conformance})

for tag in ${docker_tag} ${docker_tag_alt}; do
for target in ${PUSH_TARGETS[@]}; do
Expand Down
2 changes: 1 addition & 1 deletion hack/config-default.sh
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
binaries="cmd/virt-operator cmd/virt-controller cmd/virt-launcher cmd/virt-handler cmd/virtctl cmd/fake-qemu-process cmd/virt-api cmd/subresource-access-test cmd/example-hook-sidecar cmd/example-cloudinit-hook-sidecar"
docker_images="cmd/virt-operator cmd/virt-controller cmd/virt-launcher cmd/virt-handler cmd/virt-api images/disks-images-provider images/vm-killer images/nfs-server cmd/subresource-access-test images/winrmcli cmd/example-hook-sidecar cmd/example-cloudinit-hook-sidecar images/cdi-http-import-server"
docker_images="cmd/virt-operator cmd/virt-controller cmd/virt-launcher cmd/virt-handler cmd/virt-api images/disks-images-provider images/vm-killer images/nfs-server cmd/subresource-access-test images/winrmcli cmd/example-hook-sidecar cmd/example-cloudinit-hook-sidecar images/cdi-http-import-server tests/conformance"
docker_tag=${DOCKER_TAG:-latest}
docker_tag_alt=${DOCKER_TAG_ALT}
image_prefix=${IMAGE_PREFIX}
Expand Down
165 changes: 165 additions & 0 deletions tests/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,171 @@ go_library(
],
)

go_test(
name = "functest",
srcs = [
"access_test.go",
"config_test.go",
"console_test.go",
"container_disk_test.go",
"datavolume_test.go",
"expose_test.go",
"imageupload_test.go",
"infra_test.go",
"kubectl_test.go",
"migration_test.go",
"networkpolicy_test.go",
"operator_test.go",
"pausing_test.go",
"probes_test.go",
"replicaset_test.go",
"security_features_test.go",
"snapshot_test.go",
"stability_test.go",
"storage_test.go",
"subresource_api_test.go",
"template_test.go",
"tests_suite_test.go",
"version_test.go",
"virt_control_plane_test.go",
"vm_test.go",
"vm_watch_test.go",
"vmi_cloudinit_hook_sidecar_test.go",
"vmi_cloudinit_test.go",
"vmi_configuration_test.go",
"vmi_gpu_test.go",
"vmi_headless_test.go",
"vmi_hook_sidecar_test.go",
"vmi_ignition_test.go",
"vmi_iothreads_test.go",
"vmi_lifecycle_test.go",
"vmi_monitoring_test.go",
"vmi_multiqueue_test.go",
"vmi_multus_test.go",
"vmi_networking_test.go",
"vmi_slirp_interface_test.go",
"vmidefaults_test.go",
"vmipreset_test.go",
"vnc_test.go",
"windows_test.go",
],
embed = [":go_default_library"],
deps = [
"//pkg/certificates/triple:go_default_library",
"//pkg/certificates/triple/cert:go_default_library",
"//pkg/cloud-init:go_default_library",
"//pkg/config:go_default_library",
"//pkg/controller:go_default_library",
"//pkg/handler-launcher-com/cmd/v1:go_default_library",
"//pkg/hooks:go_default_library",
"//pkg/hooks/v1alpha1:go_default_library",
"//pkg/hooks/v1alpha2:go_default_library",
"//pkg/host-disk:go_default_library",
"//pkg/testutils:go_default_library",
"//pkg/util:go_default_library",
"//pkg/util/cluster:go_default_library",
"//pkg/util/hardware:go_default_library",
"//pkg/util/migrations:go_default_library",
"//pkg/util/net/dns:go_default_library",
"//pkg/virt-config:go_default_library",
"//pkg/virt-controller/leaderelectionconfig:go_default_library",
"//pkg/virt-controller/services:go_default_library",
"//pkg/virt-controller/watch:go_default_library",
"//pkg/virt-handler/device-manager:go_default_library",
"//pkg/virt-launcher/virtwrap/api:go_default_library",
"//pkg/virt-operator/creation/components:go_default_library",
"//pkg/virt-operator/util:go_default_library",
"//pkg/virtctl/expose:go_default_library",
"//pkg/virtctl/vm:go_default_library",
"//staging/src/kubevirt.io/client-go/api/v1:go_default_library",
"//staging/src/kubevirt.io/client-go/apis/snapshot/v1alpha1:go_default_library",
"//staging/src/kubevirt.io/client-go/kubecli:go_default_library",
"//staging/src/kubevirt.io/client-go/log:go_default_library",
"//staging/src/kubevirt.io/client-go/subresources:go_default_library",
"//tests/containerdisk:go_default_library",
"//tests/flags:go_default_library",
"//tests/network:go_default_library",
"//tests/reporter:go_default_library",
"//tools/vms-generator/utils:go_default_library",
"//vendor/github.com/evanphx/json-patch:go_default_library",
"//vendor/github.com/google/goexpect:go_default_library",
"//vendor/github.com/gorilla/websocket:go_default_library",
"//vendor/github.com/onsi/ginkgo:go_default_library",
"//vendor/github.com/onsi/ginkgo/config:go_default_library",
"//vendor/github.com/onsi/ginkgo/extensions/table:go_default_library",
"//vendor/github.com/onsi/gomega:go_default_library",
"//vendor/github.com/onsi/gomega/gstruct:go_default_library",
"//vendor/github.com/onsi/gomega/types:go_default_library",
"//vendor/github.com/pborman/uuid:go_default_library",
"//vendor/k8s.io/api/apps/v1:go_default_library",
"//vendor/k8s.io/api/authorization/v1:go_default_library",
"//vendor/k8s.io/api/autoscaling/v1:go_default_library",
"//vendor/k8s.io/api/batch/v1:go_default_library",
"//vendor/k8s.io/api/core/v1:go_default_library",
"//vendor/k8s.io/api/networking/v1:go_default_library",
"//vendor/k8s.io/api/policy/v1beta1:go_default_library",
"//vendor/k8s.io/api/rbac/v1:go_default_library",
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library",
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/fields:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/labels:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/rand:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/watch:go_default_library",
"//vendor/k8s.io/client-go/kubernetes/typed/authorization/v1:go_default_library",
"//vendor/k8s.io/client-go/rest:go_default_library",
"//vendor/k8s.io/client-go/tools/leaderelection/resourcelock:go_default_library",
"//vendor/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset:go_default_library",
"//vendor/k8s.io/utils/net:go_default_library",
"//vendor/k8s.io/utils/pointer:go_default_library",
"//vendor/kubevirt.io/containerized-data-importer/pkg/apis/core/v1alpha1:go_default_library",
"//vendor/kubevirt.io/qe-tools/pkg/ginkgo-reporters:go_default_library",
],
)

load(
"@io_bazel_rules_docker//container:container.bzl",
"container_image",
)

container_image(
name = "conformance_image_base",
testonly = True,
architecture = select({
"@io_bazel_rules_go//go/platform:linux_ppc64le": "ppc64le",
"//conditions:default": "amd64",
}),
base = select({
"@io_bazel_rules_go//go/platform:linux_ppc64le": "@fedora_ppc64le//image",
"//conditions:default": "@fedora//image",
}),
directory = "/",
files = [
":conformance-config.json",
],
visibility = ["//visibility:public"],
)

container_image(
name = "conformance_image",
testonly = True,
base = ":conformance_image_base",
directory = "/usr/bin",
entrypoint = ["/usr/bin/conformance"],
files = [
":functest",
"//tests/conformance",
],
visibility = ["//visibility:public"],
)

go_test(
name = "go_default_test",
srcs = [
Expand Down
9 changes: 9 additions & 0 deletions tests/conformance-config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"storageClassLocal": "local",
"storageClassHostPath": "host-path",
"storageClassBlockVolume": "block-volume",
"storageClassRhel": "rhel",
"storageClassWindows": "windows",
"manageStorageClasses": false
}

15 changes: 15 additions & 0 deletions tests/conformance/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")

go_library(
name = "go_default_library",
srcs = ["conformance.go"],
importpath = "kubevirt.io/kubevirt/tests/conformance",
visibility = ["//visibility:private"],
)

go_binary(
name = "conformance",
testonly = True,
embed = [":go_default_library"],
visibility = ["//visibility:public"],
)
56 changes: 56 additions & 0 deletions tests/conformance/conformance.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package main

import (
"fmt"
"io/ioutil"
"os"
"os/exec"
"strings"
)

func done(files []string) {
err := ioutil.WriteFile("/tmp/results/done", []byte(strings.Join(files, "\n")), 0666)
if err != nil {
fmt.Printf("Failed to notify sonobuoy that I am done: %v\n", err)
}
}

func main() {
err := execute()
done([]string{
"/tmp/results/junit.xml",
})
if err != nil {
os.Exit(1)
}
}

func execute() error {
args := []string{}
args = append(args, "--junit-output", "/tmp/results/junit.xml")
// additional conformance test overrides
if value, exists := os.LookupEnv("E2E_SKIP"); exists {
args = append(args, "--ginkgo.skip", value)
} else {
args = append(args, "--ginkgo.skip", "\\[Disruptive\\]")
}
if value, exists := os.LookupEnv("E2E_FOCUS"); exists {
args = append(args, "--ginkgo.focus", value)
} else {
args = append(args, "--ginkgo.focus", "\\[Conformance\\]")
}
args = append(args, "--config", "/conformance-config.json")

cmd := exec.Command("/usr/bin/functest", args...)
cmd.Env = os.Environ()
cmd.Env = append(cmd.Env, "ARTIFACTS=/tmp/results/")
cmd.Stderr = os.Stderr
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
err := cmd.Run()
if err != nil {
fmt.Printf("command failed with %v\n", err)
return err
}
return nil
}
4 changes: 2 additions & 2 deletions tests/infra_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -665,7 +665,7 @@ var _ = Describe("Infrastructure", func() {

errors := make(chan error)
for ix := 0; ix < concurrency; ix++ {
go func() {
go func(ix int) {
req, _ := http.NewRequest("GET", metricsURL, nil)
resp, err := client.Do(req)
if err != nil {
Expand All @@ -674,7 +674,7 @@ var _ = Describe("Infrastructure", func() {
resp.Body.Close()
}
errors <- err
}()
}(ix)
}

errorCount := 0
Expand Down

0 comments on commit f8c9c4a

Please sign in to comment.