Skip to content

Commit f090de5

Browse files
authored
Add reusable Framework features from lighthouse (#32)
* Add reusable Framework features from lighthouse - Framework.ExecWithOptions function - Service-related functions - Deployment-related functions Signed-off-by: Tom Pantelis <[email protected]> * Remove duplicate imports Signed-off-by: Tom Pantelis <[email protected]>
1 parent c36e0bc commit f090de5

File tree

5 files changed

+239
-9
lines changed

5 files changed

+239
-9
lines changed

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module github.com/submariner-io/shipyard
33
go 1.12
44

55
require (
6+
github.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c // indirect
67
github.com/gogo/protobuf v0.0.0-20171007142547-342cbe0a0415 // indirect
78
github.com/google/btree v1.0.0 // indirect
89
github.com/google/gofuzz v1.1.0 // indirect

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
2020
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
2121
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2222
github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
23+
github.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c h1:ZfSZ3P3BedhKGUhzj7BQlPSU4OvT6tfOKe3DVHzOA7s=
24+
github.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
2325
github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
2426
github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
2527
github.com/evanphx/json-patch v0.0.0-20180908160633-36442dbdb585/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=

test/e2e/framework/deployments.go

Lines changed: 98 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55

66
. "github.com/onsi/gomega"
77
appsv1 "k8s.io/api/apps/v1"
8+
corev1 "k8s.io/api/core/v1"
89
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
910
)
1011

@@ -15,7 +16,103 @@ func (f *Framework) FindDeployment(cluster ClusterIndex, appName string, namespa
1516
})
1617
}, NoopCheckResult).(*appsv1.DeploymentList)
1718
Expect(deployments.Items).To(HaveLen(1), fmt.Sprintf("Expected one %q deployment on %q",
18-
appName, TestContext.KubeContexts[cluster]))
19+
appName, TestContext.ClusterIDs[cluster]))
1920

2021
return &deployments.Items[0]
2122
}
23+
24+
func (f *Framework) NewNetShootDeployment(cluster ClusterIndex) *corev1.PodList {
25+
var replicaCount int32 = 1
26+
netShootDeployment := &appsv1.Deployment{
27+
ObjectMeta: metav1.ObjectMeta{
28+
GenerateName: "netshoot",
29+
Labels: map[string]string{
30+
"run": "netshoot",
31+
},
32+
},
33+
Spec: appsv1.DeploymentSpec{
34+
Selector: &metav1.LabelSelector{
35+
MatchLabels: map[string]string{
36+
"app": "netshoot",
37+
},
38+
},
39+
Replicas: &replicaCount,
40+
Template: corev1.PodTemplateSpec{
41+
ObjectMeta: metav1.ObjectMeta{
42+
Labels: map[string]string{
43+
"app": "netshoot",
44+
},
45+
},
46+
Spec: corev1.PodSpec{
47+
Containers: []corev1.Container{
48+
{
49+
Name: "netshoot",
50+
Image: "nicolaka/netshoot",
51+
ImagePullPolicy: corev1.PullAlways,
52+
Command: []string{
53+
"sleep", "600",
54+
},
55+
},
56+
},
57+
RestartPolicy: corev1.RestartPolicyAlways,
58+
},
59+
},
60+
},
61+
}
62+
63+
return create(f, cluster, netShootDeployment)
64+
}
65+
66+
func (f *Framework) NewNginxDeployment(cluster ClusterIndex) *corev1.PodList {
67+
var replicaCount int32 = 1
68+
var port int32 = 80
69+
nginxDeployment := &appsv1.Deployment{
70+
ObjectMeta: metav1.ObjectMeta{
71+
Name: "nginx-demo",
72+
},
73+
Spec: appsv1.DeploymentSpec{
74+
Selector: &metav1.LabelSelector{
75+
MatchLabels: map[string]string{
76+
"app": "nginx-demo",
77+
},
78+
},
79+
Replicas: &replicaCount,
80+
Template: corev1.PodTemplateSpec{
81+
ObjectMeta: metav1.ObjectMeta{
82+
Labels: map[string]string{
83+
"app": "nginx-demo",
84+
},
85+
},
86+
Spec: corev1.PodSpec{
87+
Containers: []corev1.Container{
88+
{
89+
Name: "nginx-demo",
90+
Image: "nginx:alpine",
91+
ImagePullPolicy: corev1.PullAlways,
92+
Ports: []corev1.ContainerPort{
93+
{
94+
ContainerPort: port,
95+
},
96+
},
97+
Command: []string{},
98+
},
99+
},
100+
RestartPolicy: corev1.RestartPolicyAlways,
101+
},
102+
},
103+
},
104+
}
105+
106+
return create(f, cluster, nginxDeployment)
107+
}
108+
109+
func create(f *Framework, cluster ClusterIndex, deployment *appsv1.Deployment) *corev1.PodList {
110+
pc := f.ClusterClients[cluster].AppsV1().Deployments(f.Namespace)
111+
appName := deployment.Spec.Template.ObjectMeta.Labels["app"]
112+
113+
_ = AwaitUntil("create deployment", func() (interface{}, error) {
114+
return pc.Create(deployment)
115+
}, NoopCheckResult).(*appsv1.Deployment)
116+
117+
return f.AwaitPodsByAppLabel(cluster, appName, f.Namespace, 1)
118+
}

test/e2e/framework/exec.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package framework
2+
3+
import (
4+
"bytes"
5+
"fmt"
6+
"io"
7+
"net/url"
8+
"strings"
9+
"time"
10+
11+
. "github.com/onsi/gomega"
12+
v1 "k8s.io/api/core/v1"
13+
"k8s.io/client-go/kubernetes/scheme"
14+
restclient "k8s.io/client-go/rest"
15+
"k8s.io/client-go/tools/remotecommand"
16+
)
17+
18+
// ExecOptions passed to ExecWithOptions
19+
type ExecOptions struct {
20+
Command []string
21+
22+
Namespace string
23+
PodName string
24+
ContainerName string
25+
26+
Stdin io.Reader
27+
CaptureStdout bool
28+
CaptureStderr bool
29+
// If false, whitespace in std{err,out} will be removed.
30+
PreserveWhitespace bool
31+
}
32+
33+
// ExecWithOptions executes a command in the specified container,
34+
// returning stdout, stderr and error. `options` allowed for
35+
// additional parameters to be passed.
36+
func (f *Framework) ExecWithOptions(options ExecOptions, index ClusterIndex) (string, string, error) {
37+
Logf("ExecWithOptions %+v", options)
38+
39+
config, _, err := loadConfig(TestContext.KubeConfig, TestContext.KubeContexts[index])
40+
Expect(err).To(Succeed(), fmt.Sprintf("ExecWithOptions %#v", options))
41+
42+
const tty = false
43+
req := f.ClusterClients[index].CoreV1().RESTClient().Post().
44+
Resource("pods").
45+
Name(options.PodName).
46+
Namespace(options.Namespace).
47+
SubResource("exec").
48+
Param("container", options.ContainerName)
49+
50+
req.VersionedParams(&v1.PodExecOptions{
51+
Container: options.ContainerName,
52+
Command: options.Command,
53+
Stdin: options.Stdin != nil,
54+
Stdout: options.CaptureStdout,
55+
Stderr: options.CaptureStderr,
56+
TTY: tty,
57+
}, scheme.ParameterCodec)
58+
59+
var stdout, stderr bytes.Buffer
60+
attempts := 5
61+
for ; attempts > 0; attempts-- {
62+
err = execute("POST", req.URL(), config, options.Stdin, &stdout, &stderr, tty)
63+
if err == nil {
64+
break
65+
}
66+
time.Sleep(time.Millisecond * 5000)
67+
Logf("Retrying due to error %+v", err)
68+
}
69+
70+
if options.PreserveWhitespace {
71+
return stdout.String(), stderr.String(), err
72+
}
73+
74+
return strings.TrimSpace(stdout.String()), strings.TrimSpace(stderr.String()), err
75+
}
76+
77+
func execute(method string, url *url.URL, config *restclient.Config, stdin io.Reader, stdout, stderr io.Writer, tty bool) error {
78+
exec, err := remotecommand.NewSPDYExecutor(config, method, url)
79+
if err != nil {
80+
return err
81+
}
82+
return exec.Stream(remotecommand.StreamOptions{
83+
Stdin: stdin,
84+
Stdout: stdout,
85+
Stderr: stderr,
86+
Tty: tty,
87+
})
88+
}

test/e2e/framework/services.go

Lines changed: 50 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ package framework
33
import (
44
"fmt"
55

6-
v1 "k8s.io/api/core/v1"
6+
"github.com/onsi/ginkgo"
7+
corev1 "k8s.io/api/core/v1"
78
"k8s.io/apimachinery/pkg/api/errors"
89
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
910
"k8s.io/apimachinery/pkg/util/intstr"
@@ -13,17 +14,16 @@ const (
1314
TestAppLabel = "test-app"
1415
)
1516

16-
func (f *Framework) CreateTCPService(cluster ClusterIndex, selectorName string, port int) *v1.Service {
17-
18-
tcpService := v1.Service{
17+
func (f *Framework) CreateTCPService(cluster ClusterIndex, selectorName string, port int) *corev1.Service {
18+
tcpService := corev1.Service{
1919
ObjectMeta: metav1.ObjectMeta{
2020
Name: fmt.Sprintf("test-svc-%s", selectorName),
2121
},
22-
Spec: v1.ServiceSpec{
23-
Ports: []v1.ServicePort{{
22+
Spec: corev1.ServiceSpec{
23+
Ports: []corev1.ServicePort{{
2424
Port: int32(port),
2525
TargetPort: intstr.FromInt(port),
26-
Protocol: v1.ProtocolTCP,
26+
Protocol: corev1.ProtocolTCP,
2727
}},
2828
Selector: map[string]string{
2929
TestAppLabel: selectorName,
@@ -45,5 +45,47 @@ func (f *Framework) CreateTCPService(cluster ClusterIndex, selectorName string,
4545
}
4646

4747
return service, err
48-
}, NoopCheckResult).(*v1.Service)
48+
}, NoopCheckResult).(*corev1.Service)
49+
}
50+
51+
func (f *Framework) NewNginxService(cluster ClusterIndex) *corev1.Service {
52+
var port int32 = 80
53+
nginxService := corev1.Service{
54+
ObjectMeta: metav1.ObjectMeta{
55+
Name: "nginx-demo",
56+
Labels: map[string]string{
57+
"app": "nginx-demo",
58+
},
59+
},
60+
Spec: corev1.ServiceSpec{
61+
Type: "ClusterIP",
62+
Ports: []corev1.ServicePort{
63+
{
64+
Port: port,
65+
Protocol: corev1.ProtocolTCP,
66+
TargetPort: intstr.IntOrString{
67+
Type: intstr.Int,
68+
IntVal: 80,
69+
},
70+
},
71+
},
72+
Selector: map[string]string{
73+
"app": "nginx-demo",
74+
},
75+
},
76+
}
77+
78+
sc := f.ClusterClients[cluster].CoreV1().Services(f.Namespace)
79+
service := AwaitUntil("create service", func() (interface{}, error) {
80+
return sc.Create(&nginxService)
81+
82+
}, NoopCheckResult).(*corev1.Service)
83+
return service
84+
}
85+
86+
func (f *Framework) DeleteService(cluster ClusterIndex, serviceName string) {
87+
ginkgo.By(fmt.Sprintf("Deleting service %q on %q", serviceName, TestContext.ClusterIDs[cluster]))
88+
AwaitUntil("delete service", func() (interface{}, error) {
89+
return nil, f.ClusterClients[cluster].CoreV1().Services(f.Namespace).Delete(serviceName, &metav1.DeleteOptions{})
90+
}, NoopCheckResult)
4991
}

0 commit comments

Comments
 (0)