2015-06-13 03:02:29 +00:00
/ *
2016-07-22 07:02:27 +00:00
Copyright 2016 The Kubernetes Authors .
2015-06-13 03:02:29 +00:00
Licensed under the Apache License , Version 2.0 ( the "License" ) ;
you may not use this file except in compliance with the License .
You may obtain a copy of the License at
http : //www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing , software
distributed under the License is distributed on an "AS IS" BASIS ,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
See the License for the specific language governing permissions and
limitations under the License .
* /
2016-07-22 07:02:27 +00:00
package common
2015-06-13 03:02:29 +00:00
import (
2017-06-22 18:24:23 +00:00
"k8s.io/api/core/v1"
2017-01-17 03:38:19 +00:00
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2017-07-21 14:42:03 +00:00
"k8s.io/apimachinery/pkg/fields"
2017-01-24 14:35:22 +00:00
"k8s.io/apimachinery/pkg/util/uuid"
2016-04-07 17:21:31 +00:00
"k8s.io/kubernetes/test/e2e/framework"
2017-07-21 14:42:03 +00:00
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
2015-06-13 03:02:29 +00:00
)
2016-02-09 07:30:32 +00:00
// These tests exercise the Kubernetes expansion syntax $(VAR).
2017-09-29 20:24:33 +00:00
// For more information, see:
// https://github.com/kubernetes/community/blob/master/contributors/design-proposals/node/expansion.md
2016-04-07 17:21:31 +00:00
var _ = framework . KubeDescribe ( "Variable Expansion" , func ( ) {
f := framework . NewDefaultFramework ( "var-expansion" )
2015-06-13 03:02:29 +00:00
2017-10-20 20:29:25 +00:00
/ *
Testname : var - expansion - env
Description : Make sure environment variables can be set using an
expansion of previously defined environment variables
* /
2018-05-22 01:09:33 +00:00
framework . ConformanceIt ( "should allow composing env vars into new env vars [NodeConformance]" , func ( ) {
2016-07-26 15:13:18 +00:00
podName := "var-expansion-" + string ( uuid . NewUUID ( ) )
2016-11-18 20:55:17 +00:00
pod := & v1 . Pod {
2017-01-17 03:38:19 +00:00
ObjectMeta : metav1 . ObjectMeta {
2015-06-13 03:02:29 +00:00
Name : podName ,
Labels : map [ string ] string { "name" : podName } ,
} ,
2016-11-18 20:55:17 +00:00
Spec : v1 . PodSpec {
Containers : [ ] v1 . Container {
2015-06-13 03:02:29 +00:00
{
Name : "dapi-container" ,
2017-08-29 08:32:08 +00:00
Image : busyboxImage ,
2015-06-13 03:02:29 +00:00
Command : [ ] string { "sh" , "-c" , "env" } ,
2016-11-18 20:55:17 +00:00
Env : [ ] v1 . EnvVar {
2015-06-13 03:02:29 +00:00
{
Name : "FOO" ,
Value : "foo-value" ,
} ,
{
Name : "BAR" ,
Value : "bar-value" ,
} ,
{
Name : "FOOBAR" ,
Value : "$(FOO);;$(BAR)" ,
} ,
} ,
} ,
} ,
2016-11-18 20:55:17 +00:00
RestartPolicy : v1 . RestartPolicyNever ,
2015-06-13 03:02:29 +00:00
} ,
}
2016-04-07 17:21:31 +00:00
f . TestContainerOutput ( "env composition" , pod , 0 , [ ] string {
2015-06-13 03:02:29 +00:00
"FOO=foo-value" ,
"BAR=bar-value" ,
"FOOBAR=foo-value;;bar-value" ,
2015-07-09 11:56:19 +00:00
} )
2015-06-13 03:02:29 +00:00
} )
2017-10-20 20:29:25 +00:00
/ *
Testname : var - expansion - command
Description : Make sure a container ' s commands can be set using an
expansion of environment variables .
* /
2018-05-22 01:09:33 +00:00
framework . ConformanceIt ( "should allow substituting values in a container's command [NodeConformance]" , func ( ) {
2016-07-26 15:13:18 +00:00
podName := "var-expansion-" + string ( uuid . NewUUID ( ) )
2016-11-18 20:55:17 +00:00
pod := & v1 . Pod {
2017-01-17 03:38:19 +00:00
ObjectMeta : metav1 . ObjectMeta {
2015-06-13 03:02:29 +00:00
Name : podName ,
Labels : map [ string ] string { "name" : podName } ,
} ,
2016-11-18 20:55:17 +00:00
Spec : v1 . PodSpec {
Containers : [ ] v1 . Container {
2015-06-13 03:02:29 +00:00
{
Name : "dapi-container" ,
2017-08-29 08:32:08 +00:00
Image : busyboxImage ,
2015-06-13 03:02:29 +00:00
Command : [ ] string { "sh" , "-c" , "TEST_VAR=wrong echo \"$(TEST_VAR)\"" } ,
2016-11-18 20:55:17 +00:00
Env : [ ] v1 . EnvVar {
2015-06-13 03:02:29 +00:00
{
Name : "TEST_VAR" ,
Value : "test-value" ,
} ,
} ,
} ,
} ,
2016-11-18 20:55:17 +00:00
RestartPolicy : v1 . RestartPolicyNever ,
2015-06-13 03:02:29 +00:00
} ,
}
2016-04-07 17:21:31 +00:00
f . TestContainerOutput ( "substitution in container's command" , pod , 0 , [ ] string {
2015-06-13 03:02:29 +00:00
"test-value" ,
2015-07-09 11:56:19 +00:00
} )
2015-06-13 03:02:29 +00:00
} )
2017-10-20 20:29:25 +00:00
/ *
Testname : var - expansion - arg
Description : Make sure a container ' s args can be set using an
expansion of environment variables .
* /
2018-05-22 01:09:33 +00:00
framework . ConformanceIt ( "should allow substituting values in a container's args [NodeConformance]" , func ( ) {
2016-07-26 15:13:18 +00:00
podName := "var-expansion-" + string ( uuid . NewUUID ( ) )
2016-11-18 20:55:17 +00:00
pod := & v1 . Pod {
2017-01-17 03:38:19 +00:00
ObjectMeta : metav1 . ObjectMeta {
2015-06-13 03:02:29 +00:00
Name : podName ,
Labels : map [ string ] string { "name" : podName } ,
} ,
2016-11-18 20:55:17 +00:00
Spec : v1 . PodSpec {
Containers : [ ] v1 . Container {
2015-06-13 03:02:29 +00:00
{
Name : "dapi-container" ,
2017-08-29 08:32:08 +00:00
Image : busyboxImage ,
2015-06-13 03:02:29 +00:00
Command : [ ] string { "sh" , "-c" } ,
Args : [ ] string { "TEST_VAR=wrong echo \"$(TEST_VAR)\"" } ,
2016-11-18 20:55:17 +00:00
Env : [ ] v1 . EnvVar {
2015-06-13 03:02:29 +00:00
{
Name : "TEST_VAR" ,
Value : "test-value" ,
} ,
} ,
} ,
} ,
2016-11-18 20:55:17 +00:00
RestartPolicy : v1 . RestartPolicyNever ,
2015-06-13 03:02:29 +00:00
} ,
}
2016-04-07 17:21:31 +00:00
f . TestContainerOutput ( "substitution in container's args" , pod , 0 , [ ] string {
2015-06-13 03:02:29 +00:00
"test-value" ,
2015-07-09 11:56:19 +00:00
} )
2015-06-13 03:02:29 +00:00
} )
2017-07-21 14:42:03 +00:00
/ *
Testname : var - expansion - subpath
Description : Make sure a container ' s subpath can be set using an
expansion of environment variables .
* /
It ( "should allow substituting values in a volume subpath [Feature:VolumeSubpathEnvExpansion][NodeAlphaFeature:VolumeSubpathEnvExpansion]" , func ( ) {
podName := "var-expansion-" + string ( uuid . NewUUID ( ) )
pod := & v1 . Pod {
ObjectMeta : metav1 . ObjectMeta {
Name : podName ,
Labels : map [ string ] string { "name" : podName } ,
} ,
Spec : v1 . PodSpec {
Containers : [ ] v1 . Container {
{
Name : "dapi-container" ,
Image : busyboxImage ,
Command : [ ] string { "sh" , "-c" , "test -d /testcontainer/" + podName + ";echo $?" } ,
Env : [ ] v1 . EnvVar {
{
Name : "POD_NAME" ,
Value : podName ,
} ,
} ,
VolumeMounts : [ ] v1 . VolumeMount {
{
Name : "workdir1" ,
MountPath : "/logscontainer" ,
SubPath : "$(POD_NAME)" ,
} ,
{
Name : "workdir2" ,
MountPath : "/testcontainer" ,
} ,
} ,
} ,
} ,
RestartPolicy : v1 . RestartPolicyNever ,
Volumes : [ ] v1 . Volume {
{
Name : "workdir1" ,
VolumeSource : v1 . VolumeSource {
HostPath : & v1 . HostPathVolumeSource { Path : "/tmp" } ,
} ,
} ,
{
Name : "workdir2" ,
VolumeSource : v1 . VolumeSource {
HostPath : & v1 . HostPathVolumeSource { Path : "/tmp" } ,
} ,
} ,
} ,
} ,
}
f . TestContainerOutput ( "substitution in volume subpath" , pod , 0 , [ ] string {
"0" ,
} )
} )
/ *
Testname : var - expansion - subpath - with - backticks
Description : Make sure a container ' s subpath can not be set using an
expansion of environment variables when backticks are supplied .
* /
It ( "should fail substituting values in a volume subpath with backticks [Feature:VolumeSubpathEnvExpansion][NodeAlphaFeature:VolumeSubpathEnvExpansion][Slow]" , func ( ) {
podName := "var-expansion-" + string ( uuid . NewUUID ( ) )
pod := & v1 . Pod {
ObjectMeta : metav1 . ObjectMeta {
Name : podName ,
Labels : map [ string ] string { "name" : podName } ,
} ,
Spec : v1 . PodSpec {
Containers : [ ] v1 . Container {
{
Name : "dapi-container" ,
Image : busyboxImage ,
Env : [ ] v1 . EnvVar {
{
Name : "POD_NAME" ,
Value : ".." ,
} ,
} ,
VolumeMounts : [ ] v1 . VolumeMount {
{
Name : "workdir1" ,
MountPath : "/logscontainer" ,
SubPath : "$(POD_NAME)" ,
} ,
} ,
} ,
} ,
RestartPolicy : v1 . RestartPolicyNever ,
Volumes : [ ] v1 . Volume {
{
Name : "workdir1" ,
VolumeSource : v1 . VolumeSource {
EmptyDir : & v1 . EmptyDirVolumeSource { } ,
} ,
} ,
} ,
} ,
}
// Pod should fail
testPodFailSubpath ( f , pod , "SubPath `..`: must not contain '..'" )
} )
/ *
Testname : var - expansion - subpath - with - absolute - path
Description : Make sure a container ' s subpath can not be set using an
expansion of environment variables when absoluete path is supplied .
* /
It ( "should fail substituting values in a volume subpath with absolute path [Feature:VolumeSubpathEnvExpansion][NodeAlphaFeature:VolumeSubpathEnvExpansion][Slow]" , func ( ) {
podName := "var-expansion-" + string ( uuid . NewUUID ( ) )
pod := & v1 . Pod {
ObjectMeta : metav1 . ObjectMeta {
Name : podName ,
Labels : map [ string ] string { "name" : podName } ,
} ,
Spec : v1 . PodSpec {
Containers : [ ] v1 . Container {
{
Name : "dapi-container" ,
Image : busyboxImage ,
Env : [ ] v1 . EnvVar {
{
Name : "POD_NAME" ,
Value : "/tmp" ,
} ,
} ,
VolumeMounts : [ ] v1 . VolumeMount {
{
Name : "workdir1" ,
MountPath : "/logscontainer" ,
SubPath : "$(POD_NAME)" ,
} ,
} ,
} ,
} ,
RestartPolicy : v1 . RestartPolicyNever ,
Volumes : [ ] v1 . Volume {
{
Name : "workdir1" ,
VolumeSource : v1 . VolumeSource {
EmptyDir : & v1 . EmptyDirVolumeSource { } ,
} ,
} ,
} ,
} ,
}
// Pod should fail
testPodFailSubpath ( f , pod , "SubPath `/tmp` must not be an absolute path" )
} )
2015-06-13 03:02:29 +00:00
} )
2017-07-21 14:42:03 +00:00
func testPodFailSubpath ( f * framework . Framework , pod * v1 . Pod , errorText string ) {
pod , err := f . ClientSet . CoreV1 ( ) . Pods ( f . Namespace . Name ) . Create ( pod )
Expect ( err ) . ToNot ( HaveOccurred ( ) , "while creating pod" )
defer func ( ) {
framework . DeletePodWithWait ( f , f . ClientSet , pod )
} ( )
2018-06-01 11:34:14 +00:00
err = framework . WaitTimeoutForPodRunningInNamespace ( f . ClientSet , pod . Name , pod . Namespace , framework . PodStartShortTimeout )
2017-07-21 14:42:03 +00:00
Expect ( err ) . To ( HaveOccurred ( ) , "while waiting for pod to be running" )
selector := fields . Set {
"involvedObject.kind" : "Pod" ,
"involvedObject.name" : pod . Name ,
"involvedObject.namespace" : f . Namespace . Name ,
"reason" : "Failed" ,
} . AsSelector ( ) . String ( )
options := metav1 . ListOptions { FieldSelector : selector }
events , err := f . ClientSet . CoreV1 ( ) . Events ( f . Namespace . Name ) . List ( options )
Expect ( err ) . NotTo ( HaveOccurred ( ) , "while getting pod events" )
Expect ( len ( events . Items ) ) . NotTo ( Equal ( 0 ) , "no events found" )
Expect ( events . Items [ 0 ] . Message ) . To ( ContainSubstring ( errorText ) , "subpath error not found" )
}