mirror of
https://github.com/rancher/steve.git
synced 2025-06-24 22:12:02 +00:00
* changing permission for kubeconfig file inside the shell pod * creating unit tests for the changes done
92 lines
3.2 KiB
Go
92 lines
3.2 KiB
Go
package podimpersonation
|
|
|
|
import (
|
|
"github.com/stretchr/testify/assert"
|
|
v1 "k8s.io/api/core/v1"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestAugmentPod(t *testing.T) {
|
|
var (
|
|
zero = int64(0)
|
|
)
|
|
testCases := []struct {
|
|
name string
|
|
imageOverride string
|
|
envVars []v1.EnvVar
|
|
}{
|
|
{
|
|
name: "Should mount volume to container, create an init container and use regular image",
|
|
imageOverride: "",
|
|
envVars: []v1.EnvVar{{Name: "KUBECONFIG", Value: ".kube/config"}},
|
|
},
|
|
{
|
|
name: "Should mount volume to container, create an init container and use overridden image",
|
|
imageOverride: "rancher/notShell:v1.0.0",
|
|
envVars: []v1.EnvVar{{Name: "KUBECONFIG", Value: ".kube/config"}},
|
|
},
|
|
{
|
|
name: "Should not create init container if there's no KUBECONFIG envVar",
|
|
imageOverride: "",
|
|
envVars: []v1.EnvVar{},
|
|
},
|
|
}
|
|
|
|
for _, tc := range testCases {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
p := newPod(tc.envVars)
|
|
impersonator := New("", nil, time.Minute, func() string { return "rancher/shell:v0.1.22" })
|
|
pod := impersonator.augmentPod(p, nil, &v1.Secret{ObjectMeta: metav1.ObjectMeta{Name: "s"}}, tc.imageOverride)
|
|
|
|
assert.Len(t, pod.Spec.Volumes, len(p.Spec.Volumes)+4, "expected four new volumes")
|
|
if len(tc.envVars) != 0 {
|
|
assert.Len(t, pod.Spec.Containers[0].VolumeMounts, len(p.Spec.Containers[0].VolumeMounts)+1, "expected kubeconfig volume to be mounted")
|
|
assert.Len(t, pod.Spec.InitContainers, len(p.Spec.InitContainers)+1, "expected an init container to be created")
|
|
if tc.imageOverride != "" {
|
|
assert.Equal(t, pod.Spec.InitContainers[len(pod.Spec.InitContainers)-1].Image, tc.imageOverride, "expected image to be the one received as parameter")
|
|
} else {
|
|
assert.Equal(t, pod.Spec.InitContainers[len(pod.Spec.InitContainers)-1].Image, impersonator.imageName(), "expected image to be the impersonator image")
|
|
}
|
|
assert.Equal(t, pod.Spec.InitContainers[len(pod.Spec.InitContainers)-1].SecurityContext.RunAsUser, &zero, "expected init container to run as user zero")
|
|
assert.Equal(t, pod.Spec.InitContainers[len(pod.Spec.InitContainers)-1].SecurityContext.RunAsGroup, &zero, "expected init container to run as group zero")
|
|
} else {
|
|
assert.Len(t, pod.Spec.InitContainers, len(p.Spec.InitContainers), "expected no init container to be created")
|
|
}
|
|
assert.Equal(t, pod.Spec.Containers[len(pod.Spec.Containers)-1].Name, "proxy", "expected the container proxy to be created")
|
|
})
|
|
}
|
|
}
|
|
|
|
func newPod(env []v1.EnvVar) *v1.Pod {
|
|
return &v1.Pod{
|
|
Spec: v1.PodSpec{
|
|
Volumes: []v1.Volume{{
|
|
Name: "volume1",
|
|
VolumeSource: v1.VolumeSource{
|
|
ConfigMap: &v1.ConfigMapVolumeSource{
|
|
LocalObjectReference: v1.LocalObjectReference{
|
|
Name: "cfgMap",
|
|
},
|
|
},
|
|
},
|
|
}},
|
|
Containers: []v1.Container{
|
|
{
|
|
Name: "shell",
|
|
Image: "rancher/shell:v0.1.22",
|
|
Env: env,
|
|
VolumeMounts: []v1.VolumeMount{{
|
|
Name: "volume1",
|
|
MountPath: "/home/vol",
|
|
}},
|
|
},
|
|
},
|
|
ServiceAccountName: "svc-account-1",
|
|
AutomountServiceAccountToken: nil,
|
|
SecurityContext: nil,
|
|
},
|
|
}
|
|
}
|