Skip to content

Commit 60eb690

Browse files
author
Pieter-Jan Pintens
committed
Switch to pod template file
1 parent 1af1fdf commit 60eb690

File tree

4 files changed

+68
-79
lines changed

4 files changed

+68
-79
lines changed

cmd/container-structure-test/app/cmd/test.go

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -96,17 +96,13 @@ func NewCmdTest(out io.Writer) *cobra.Command {
9696

9797
func run(out io.Writer) error {
9898
args = &drivers.DriverConfig{
99-
Image: opts.ImagePath,
100-
Save: opts.Save,
101-
Metadata: opts.Metadata,
102-
Runtime: opts.Runtime,
103-
Platform: opts.Platform,
104-
Namespace: opts.Namespace,
105-
PodnamePrefix: opts.PodnamePrefix,
106-
AllowReuse: opts.AllowReuse,
107-
Labels: opts.Labels,
108-
Annotations: opts.Annotations,
109-
NodeSelector: opts.NodeSelector,
99+
Image: opts.ImagePath,
100+
Save: opts.Save,
101+
Metadata: opts.Metadata,
102+
Runtime: opts.Runtime,
103+
Platform: opts.Platform,
104+
PodTemplate: opts.PodTemplate,
105+
AllowReuse: opts.AllowReuse,
110106
}
111107

112108
var err error
@@ -253,12 +249,8 @@ func AddTestFlags(cmd *cobra.Command) {
253249
cmd.Flags().VarP(&opts.Output, "output", "o", "output format for the test report (available format: text, json, junit)")
254250
cmd.Flags().BoolVar(&opts.NoColor, "no-color", false, "no color in the output")
255251
cmd.Flags().StringVar(&opts.JunitSuiteName, "junit-suite-name", "", fmt.Sprintf("name to use for the junit test suite (defaults to '%s')", output.DefaultJunitSuiteName))
256-
cmd.Flags().StringVar(&opts.Namespace, "namespace", "", "namespace to use with kubernetes driver")
257-
cmd.Flags().StringVar(&opts.PodnamePrefix, "podname-prefix", "", "podname prefix to use with kubernetes driver")
252+
cmd.Flags().StringVar(&opts.PodTemplate, "pod-template", "", "pod template to instantiate pods from with kubernetes driver")
258253
cmd.Flags().BoolVar(&opts.AllowReuse, "allow-reuse", false, "if set, reuse the running pod for multiple tests, this is a lot faster but test can interfere with each other. Use with kubernetes driver")
259-
cmd.Flags().StringArrayVarP(&opts.Labels, "labels", "", []string{}, "labels for k8es resources")
260-
cmd.Flags().StringArrayVarP(&opts.Annotations, "annotations", "", []string{}, "annotations for k8es resources")
261-
cmd.Flags().StringArrayVarP(&opts.NodeSelector, "node-selector", "", []string{}, "node selector for k8es resources")
262254
cmd.Flags().StringArrayVarP(&opts.ConfigFiles, "config", "c", []string{}, "test config files")
263255
cmd.MarkFlagRequired("config")
264256
cmd.Flags().StringVar(&opts.TestReport, "test-report", "", "generate test report and write it to specified file (supported format: json, junit; default: json)")

pkg/config/options.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,7 @@ type StructureTestOptions struct {
3636
Quiet bool
3737
Force bool
3838
NoColor bool
39+
AllowReuse bool
3940

40-
Namespace string
41-
PodnamePrefix string
42-
AllowReuse bool
43-
Labels []string
44-
Annotations []string
45-
NodeSelector []string
41+
PodTemplate string
4642
}

pkg/drivers/driver.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,7 @@ type DriverConfig struct {
3939
Namespace string
4040
PodnamePrefix string
4141
AllowReuse bool
42-
Labels []string
43-
Annotations []string
44-
NodeSelector []string
42+
PodTemplate string
4543
}
4644

4745
type Driver interface {

pkg/drivers/k8s_driver.go

Lines changed: 57 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -40,19 +40,33 @@ import (
4040
kexec "k8s.io/client-go/util/exec"
4141
)
4242

43+
// PodFromFile will read a given file with pod definition and returns a corev1.Pod
44+
// accordingly.
45+
func PodFromFile(file string) (*corev1.Pod, error) {
46+
decode := scheme.Codecs.UniversalDeserializer().Decode
47+
stream, err := os.ReadFile(file)
48+
if err != nil {
49+
return nil, err
50+
}
51+
obj, gvk, err := decode(stream, nil, nil)
52+
if err != nil {
53+
return nil, err
54+
}
55+
if gvk.Kind == "Pod" {
56+
return obj.(*corev1.Pod), nil
57+
}
58+
return nil, fmt.Errorf("invalid podtemplate: %s", file)
59+
}
60+
4361
type K8sDriver struct {
44-
Image string
45-
Client kubernetes.Interface
46-
runOpts unversioned.ContainerRunOptions
47-
KubeConfig *rest.Config
48-
Namespace string
49-
Labels map[string]string
50-
Annotations map[string]string
51-
NodeSelector map[string]string
52-
PodnamePrefix string
53-
podName string
54-
AllowReuse bool
55-
env []unversioned.EnvVar
62+
Image string
63+
Client kubernetes.Interface
64+
runOpts unversioned.ContainerRunOptions
65+
KubeConfig *rest.Config
66+
PodTemplate *corev1.Pod
67+
podName string
68+
AllowReuse bool
69+
env []unversioned.EnvVar
5670
}
5771

5872
func NewK8sDriver(args DriverConfig) (Driver, error) {
@@ -82,18 +96,19 @@ func NewK8sDriver(args DriverConfig) (Driver, error) {
8296
return nil, err
8397
}
8498

99+
template, err := PodFromFile(args.PodTemplate)
100+
if err != nil {
101+
return nil, err
102+
}
103+
85104
return &K8sDriver{
86-
Client: clientset,
87-
Image: args.Image,
88-
runOpts: args.RunOpts,
89-
PodnamePrefix: args.PodnamePrefix,
90-
Namespace: args.Namespace,
91-
Labels: convertSliceToMap(args.Labels),
92-
Annotations: convertSliceToMap(args.Annotations),
93-
NodeSelector: convertSliceToMap(args.NodeSelector),
94-
KubeConfig: k8sConfig,
95-
AllowReuse: args.AllowReuse,
96-
podName: "",
105+
Client: clientset,
106+
Image: args.Image,
107+
runOpts: args.RunOpts,
108+
PodTemplate: template,
109+
KubeConfig: k8sConfig,
110+
AllowReuse: args.AllowReuse,
111+
podName: "",
97112
}, nil
98113
}
99114

@@ -293,22 +308,15 @@ func (d *K8sDriver) Destroy() {
293308
if d.podName == "" {
294309
return
295310
}
296-
err := d.Client.CoreV1().Pods(d.Namespace).Delete(context.Background(), d.podName, metav1.DeleteOptions{})
311+
err := d.Client.CoreV1().Pods(d.PodTemplate.Namespace).Delete(context.Background(), d.podName, metav1.DeleteOptions{})
297312
if err != nil {
298313
logrus.Warnf("Error when removing pod %s: %s", d.podName, err.Error())
299314
}
300315
d.podName = ""
301316
}
302317

303318
func (d *K8sDriver) createPod(envVars []unversioned.EnvVar, command []string) (*corev1.Pod, error) {
304-
podName := d.PodnamePrefix
305-
if podName == "" {
306-
podName = "cst"
307-
}
308-
// store the name for later reference
309-
d.podName = podName + "-" + rand.String(5)
310-
image := d.Image
311-
319+
// create env vars
312320
var env []corev1.EnvVar
313321
for _, envVar := range envVars {
314322
env = append(env, corev1.EnvVar{
@@ -317,33 +325,28 @@ func (d *K8sDriver) createPod(envVars []unversioned.EnvVar, command []string) (*
317325
})
318326
}
319327

320-
pod := &corev1.Pod{
321-
ObjectMeta: metav1.ObjectMeta{
322-
Name: d.podName,
323-
Namespace: d.Namespace,
324-
Labels: d.Labels,
325-
Annotations: d.Annotations,
326-
},
327-
Spec: corev1.PodSpec{
328-
Containers: []corev1.Container{
329-
{
330-
Name: "main",
331-
Image: image,
332-
Command: command,
333-
Env: env,
334-
ImagePullPolicy: corev1.PullAlways,
335-
},
336-
},
337-
RestartPolicy: corev1.RestartPolicyNever,
338-
NodeSelector: d.NodeSelector,
328+
// take the template, make a copy and overwrite some fields
329+
pod := d.PodTemplate.DeepCopy()
330+
pod.ObjectMeta.Name = d.podName + "-" + rand.String(5)
331+
pod.Spec.Containers = []corev1.Container{
332+
{
333+
Name: "main",
334+
Image: d.Image,
335+
Command: command,
336+
Env: env,
337+
ImagePullPolicy: corev1.PullAlways,
339338
},
340339
}
340+
pod.Spec.RestartPolicy = corev1.RestartPolicyNever
341+
342+
// store the name for later reference
343+
d.podName = pod.ObjectMeta.Name
341344

342-
return d.Client.CoreV1().Pods(d.Namespace).Create(context.Background(), pod, metav1.CreateOptions{})
345+
return d.Client.CoreV1().Pods(pod.Namespace).Create(context.Background(), pod, metav1.CreateOptions{})
343346
}
344347

345348
func (d *K8sDriver) waitForPod() error {
346-
watcher, err := d.Client.CoreV1().Pods(d.Namespace).Watch(context.Background(), metav1.ListOptions{
349+
watcher, err := d.Client.CoreV1().Pods(d.PodTemplate.Namespace).Watch(context.Background(), metav1.ListOptions{
347350
FieldSelector: "metadata.name=" + d.podName,
348351
})
349352
if err != nil {
@@ -370,7 +373,7 @@ func (d *K8sDriver) execInPod(command []string) (string, string, int, error) {
370373
req := d.Client.CoreV1().RESTClient().Post().
371374
Resource("pods").
372375
Name(d.podName).
373-
Namespace(d.Namespace).
376+
Namespace(d.PodTemplate.Namespace).
374377
SubResource("exec").
375378
VersionedParams(&corev1.PodExecOptions{
376379
Command: command,

0 commit comments

Comments
 (0)