Skip to content

Commit

Permalink
Make work command execution from winrmcli pod
Browse files Browse the repository at this point in the history
Signed-off-by: Lukianov Artyom <alukiano@redhat.com>
  • Loading branch information
Lukianov Artyom committed Mar 26, 2018
1 parent 64af401 commit 39e342e
Show file tree
Hide file tree
Showing 3 changed files with 165 additions and 101 deletions.
13 changes: 11 additions & 2 deletions images/winrmcli/Dockerfile
Expand Up @@ -16,9 +16,18 @@
# Copyright 2018 Red Hat, Inc.
#

FROM golang:1.6
FROM fedora:27

MAINTAINER "The KubeVirt Project" <kubevirt-dev@googlegroups.com>
ENV container docker

RUN go get github.com/masterzen/winrm-cli
RUN dnf -y install make git gcc && dnf -y clean all

ENV GIMME_GO_VERSION=1.9.2
RUN mkdir -p /gimme && curl -sL https://raw.githubusercontent.com/travis-ci/gimme/master/gimme | HOME=/gimme bash >> /etc/profile.d/gimme.sh

ENV GOPATH="/go" GOBIN="/usr/bin"
RUN \
mkdir -p /go && \
source /etc/profile.d/gimme.sh && \
go get github.com/masterzen/winrm-cli
67 changes: 43 additions & 24 deletions tests/utils.go
Expand Up @@ -28,23 +28,23 @@ import (
"reflect"
"time"

"github.com/google/goexpect"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"github.com/google/goexpect"

k8sv1 "k8s.io/api/core/v1"

"k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/meta"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/fields"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/util/rand"
"k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/resource"

"k8s.io/client-go/kubernetes/scheme"
"k8s.io/client-go/tools/remotecommand"


"kubevirt.io/kubevirt/pkg/api/v1"
"kubevirt.io/kubevirt/pkg/kubecli"
"kubevirt.io/kubevirt/pkg/log"
Expand All @@ -69,9 +69,9 @@ const defaultTestGracePeriod int64 = 0

const (
// tests.NamespaceTestDefault is the default namespace, to test non-infrastructure related KubeVirt objects.
NamespaceTestDefault string = "kubevirt-test-default"
NamespaceTestDefault = "kubevirt-test-default"
// NamespaceTestAlternative is used to test controller-namespace independency.
NamespaceTestAlternative string = "kubevirt-test-alternative"
NamespaceTestAlternative = "kubevirt-test-alternative"
)

var testNamespaces = []string{NamespaceTestDefault, NamespaceTestAlternative}
Expand Down Expand Up @@ -110,8 +110,6 @@ const (
defaultWindowsDiskSize = "30Gi"
)

const VmResource = "virtualmachines"

type ProcessFunc func(event *k8sv1.Event) (done bool)

type ObjectEventWatcher struct {
Expand Down Expand Up @@ -271,8 +269,8 @@ func AfterTestSuitCleanup() {
// Make sure that the namespaces exist, to not have to check in the cleanup code for existing namespaces
createNamespaces()
cleanNamespaces()
deletePVC(osWindows, false)

deletePVC(osWindows)

deletePVC(osAlpineISCSI)
deletePV(osAlpineISCSI)
Expand Down Expand Up @@ -867,43 +865,53 @@ func LoggedInCirrosExpecter(vm *v1.VirtualMachine) (expect.Expecter, error) {
return expecter, err
}

func ExecuteCommandOnPod(virtCli kubecli.KubevirtClient, pod *k8sv1.Pod, containerName string, command string) (string, error) {
func ExecuteCommandOnPod(virtCli kubecli.KubevirtClient, pod *k8sv1.Pod, containerName string, command []string) (string, error) {
var (
execOut bytes.Buffer
execErr bytes.Buffer
stdout bytes.Buffer
stderr bytes.Buffer
)

execRequest := virtCli.CoreV1().RESTClient().Post().
req := virtCli.CoreV1().RESTClient().Post().
Resource("pods").
Name(pod.Name).
Namespace(pod.Namespace).
SubResource("exec").
Param("container", containerName).
Param("command", command).
Param("stdout", "true").
Param("stderr", "true")
Param("container", containerName)

req.VersionedParams(&k8sv1.PodExecOptions{
Container: containerName,
Command: command,
Stdin: false,
Stdout: true,
Stderr: true,
TTY: false,
}, scheme.ParameterCodec)

config, err := kubecli.GetKubevirtClientConfig()
if err != nil {
return "", err
}

exec, err := remotecommand.NewSPDYExecutor(config, "POST", execRequest.URL())
exec, err := remotecommand.NewSPDYExecutor(config, "POST", req.URL())
if err != nil {
return "", err
}

err = exec.Stream(remotecommand.StreamOptions{
Stdout: &execOut,
Stderr: &execErr,
Stdout: &stdout,
Stderr: &stderr,
Tty: false,
})

if err != nil {
return "", err
}
if execErr.Len() > 0 {
return "", fmt.Errorf("stderr: %v", execErr.String())

if stderr.Len() > 0 {
return "", fmt.Errorf("stderr: %v", stderr.String())
}
return execOut.String(), nil

return stdout.String(), nil
}

func BeforeAll(fn func()) {
Expand All @@ -915,3 +923,14 @@ func BeforeAll(fn func()) {
}
})
}

func SkipIfNoWindowsImage(virtClient kubecli.KubevirtClient) {
windowsPv, err := virtClient.CoreV1().PersistentVolumes().Get(DiskWindows, metav1.GetOptions{})
if err != nil || (windowsPv.Status.Phase != k8sv1.VolumeAvailable && windowsPv.Status.Phase != k8sv1.VolumeReleased) {
Skip(fmt.Sprintf("Skip Windows tests that requires PVC %s", DiskWindows))
} else if windowsPv.Status.Phase == k8sv1.VolumeReleased {
windowsPv.Spec.ClaimRef = nil
_, err = virtClient.CoreV1().PersistentVolumes().Update(windowsPv)
Expect(err).ToNot(HaveOccurred())
}
}

0 comments on commit 39e342e

Please sign in to comment.