Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
0d4e0dc1
Commit
0d4e0dc1
authored
Nov 24, 2015
by
k8s-merge-robot
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #15502 from sdminonne/downwardapi_volume
Auto commit by PR queue bot
parents
981b5a6a
a922e504
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
126 additions
and
31 deletions
+126
-31
downwardapi_volume.go
test/e2e/downwardapi_volume.go
+124
-29
host_path.go
test/e2e/host_path.go
+2
-2
No files found.
test/e2e/downwardapi_volume.go
View file @
0d4e0dc1
...
...
@@ -18,57 +18,145 @@ package e2e
import
(
"fmt"
"strings"
"time"
"k8s.io/kubernetes/pkg/api"
client
"k8s.io/kubernetes/pkg/client/unversioned"
"k8s.io/kubernetes/pkg/util"
.
"github.com/onsi/ginkgo"
.
"github.com/onsi/gomega"
)
// How long to wait for a log pod to be displayed
const
podLogTimeout
=
15
*
time
.
Second
// utility function for gomega Eventually
func
getPodLogs
(
c
*
client
.
Client
,
namespace
,
podName
,
containerName
string
)
(
string
,
error
)
{
logs
,
err
:=
c
.
Get
()
.
Resource
(
"pods"
)
.
Namespace
(
namespace
)
.
Name
(
podName
)
.
SubResource
(
"log"
)
.
Param
(
"container"
,
containerName
)
.
Do
()
.
Raw
()
if
err
!=
nil
{
return
""
,
err
}
if
err
==
nil
&&
strings
.
Contains
(
string
(
logs
),
"Internal Error"
)
{
return
""
,
fmt
.
Errorf
(
"Internal Error"
)
}
return
string
(
logs
),
err
}
var
_
=
Describe
(
"Downward API volume"
,
func
()
{
f
:=
NewFramework
(
"downward-api"
)
It
(
"should provide labels and annotations files [Conformance]"
,
func
()
{
It
(
"should provide podname only [Conformance]"
,
func
()
{
podName
:=
"downwardapi-volume-"
+
string
(
util
.
NewUUID
())
pod
:=
downwardAPIVolumePod
(
podName
)
pod
:=
downwardAPIVolumePod
(
podName
,
map
[
string
]
string
{},
map
[
string
]
string
{},
"/etc/podname"
)
testContainerOutput
(
"downward API volume plugin"
,
f
.
Client
,
pod
,
0
,
[]
string
{
fmt
.
Sprintf
(
"cluster=
\"
rack10
\"\n
"
),
fmt
.
Sprintf
(
"builder=
\"
john-doe
\"\n
"
),
fmt
.
Sprintf
(
"%s
\n
"
,
podName
),
},
f
.
Namespace
.
Name
)
})
It
(
"should provide
labels and annotations files
as non-root with fsgroup [Conformance] [Skipped]"
,
func
()
{
It
(
"should provide
podname
as non-root with fsgroup [Conformance] [Skipped]"
,
func
()
{
podName
:=
"metadata-volume-"
+
string
(
util
.
NewUUID
())
uid
:=
int64
(
1001
)
gid
:=
int64
(
1234
)
pod
:=
downwardAPIVolumePod
(
podName
)
pod
:=
downwardAPIVolumePod
(
podName
,
map
[
string
]
string
{},
map
[
string
]
string
{},
"/etc/podname"
)
pod
.
Spec
.
SecurityContext
=
&
api
.
PodSecurityContext
{
RunAsUser
:
&
uid
,
FSGroup
:
&
gid
,
}
testContainerOutput
(
"downward API volume plugin"
,
f
.
Client
,
pod
,
0
,
[]
string
{
fmt
.
Sprintf
(
"cluster=
\"
rack10
\"\n
"
),
fmt
.
Sprintf
(
"builder=
\"
john-doe
\"\n
"
),
fmt
.
Sprintf
(
"%s
\n
"
,
podName
),
},
f
.
Namespace
.
Name
)
})
It
(
"should update labels on modification [Conformance]"
,
func
()
{
labels
:=
map
[
string
]
string
{}
labels
[
"key1"
]
=
"value1"
labels
[
"key2"
]
=
"value2"
podName
:=
"labelsupdate"
+
string
(
util
.
NewUUID
())
pod
:=
downwardAPIVolumePod
(
podName
,
labels
,
map
[
string
]
string
{},
"/etc/labels"
)
containerName
:=
"client-container"
defer
func
()
{
By
(
"Deleting the pod"
)
f
.
Client
.
Pods
(
f
.
Namespace
.
Name
)
.
Delete
(
pod
.
Name
,
api
.
NewDeleteOptions
(
0
))
}()
By
(
"Creating the pod"
)
_
,
err
:=
f
.
Client
.
Pods
(
f
.
Namespace
.
Name
)
.
Create
(
pod
)
Expect
(
err
)
.
NotTo
(
HaveOccurred
())
expectNoError
(
waitForPodRunningInNamespace
(
f
.
Client
,
pod
.
Name
,
f
.
Namespace
.
Name
))
pod
,
err
=
f
.
Client
.
Pods
(
f
.
Namespace
.
Name
)
.
Get
(
pod
.
Name
)
Expect
(
err
)
.
NotTo
(
HaveOccurred
())
Eventually
(
func
()
(
string
,
error
)
{
return
getPodLogs
(
f
.
Client
,
f
.
Namespace
.
Name
,
pod
.
Name
,
containerName
)
},
podLogTimeout
,
poll
)
.
Should
(
ContainSubstring
(
"key1=
\"
value1
\"\n
"
))
//modify labels
pod
.
Labels
[
"key3"
]
=
"value3"
_
,
err
=
f
.
Client
.
Pods
(
f
.
Namespace
.
Name
)
.
Update
(
pod
)
Expect
(
err
)
.
NotTo
(
HaveOccurred
())
Eventually
(
func
()
(
string
,
error
)
{
return
getPodLogs
(
f
.
Client
,
f
.
Namespace
.
Name
,
pod
.
Name
,
containerName
)
},
podLogTimeout
,
poll
)
.
Should
(
ContainSubstring
(
"key3=
\"
value3
\"\n
"
))
})
It
(
"should update annotations on modification [Conformance]"
,
func
()
{
annotations
:=
map
[
string
]
string
{}
annotations
[
"builder"
]
=
"bar"
podName
:=
"annotationupdate"
+
string
(
util
.
NewUUID
())
pod
:=
downwardAPIVolumePod
(
podName
,
map
[
string
]
string
{},
annotations
,
"/etc/annotations"
)
containerName
:=
"client-container"
defer
func
()
{
By
(
"Deleting the pod"
)
f
.
Client
.
Pods
(
f
.
Namespace
.
Name
)
.
Delete
(
pod
.
Name
,
api
.
NewDeleteOptions
(
0
))
}()
By
(
"Creating the pod"
)
_
,
err
:=
f
.
Client
.
Pods
(
f
.
Namespace
.
Name
)
.
Create
(
pod
)
Expect
(
err
)
.
NotTo
(
HaveOccurred
())
expectNoError
(
waitForPodRunningInNamespace
(
f
.
Client
,
pod
.
Name
,
f
.
Namespace
.
Name
))
pod
,
err
=
f
.
Client
.
Pods
(
f
.
Namespace
.
Name
)
.
Get
(
pod
.
Name
)
Expect
(
err
)
.
NotTo
(
HaveOccurred
())
Eventually
(
func
()
(
string
,
error
)
{
return
getPodLogs
(
f
.
Client
,
f
.
Namespace
.
Name
,
pod
.
Name
,
containerName
)
},
podLogTimeout
,
poll
)
.
Should
(
ContainSubstring
(
"builder=
\"
bar
\"\n
"
))
//modify annotations
pod
.
Annotations
[
"builder"
]
=
"foo"
_
,
err
=
f
.
Client
.
Pods
(
f
.
Namespace
.
Name
)
.
Update
(
pod
)
Expect
(
err
)
.
NotTo
(
HaveOccurred
())
Eventually
(
func
()
(
string
,
error
)
{
return
getPodLogs
(
f
.
Client
,
f
.
Namespace
.
Name
,
pod
.
Name
,
containerName
)
},
podLogTimeout
,
poll
)
.
Should
(
ContainSubstring
(
"builder=
\"
foo
\"\n
"
))
})
})
func
downwardAPIVolumePod
(
name
string
)
*
api
.
Pod
{
return
&
api
.
Pod
{
func
downwardAPIVolumePod
(
name
string
,
labels
,
annotations
map
[
string
]
string
,
filePath
string
)
*
api
.
Pod
{
pod
:=
&
api
.
Pod
{
ObjectMeta
:
api
.
ObjectMeta
{
Name
:
name
,
Labels
:
map
[
string
]
string
{
"cluster"
:
"rack10"
}
,
Annotations
:
map
[
string
]
string
{
"builder"
:
"john-doe"
}
,
Labels
:
labels
,
Annotations
:
annotations
,
},
Spec
:
api
.
PodSpec
{
Containers
:
[]
api
.
Container
{
{
Name
:
"client-container"
,
Image
:
"gcr.io/google_containers/
busybox
"
,
Command
:
[]
string
{
"
sh"
,
"-c"
,
"cat /etc/labels /etc/annotations /etc/podname"
},
Image
:
"gcr.io/google_containers/
mounttest:0.6
"
,
Command
:
[]
string
{
"
/mt"
,
"--break_on_expected_content=false"
,
"--retry_time=10"
,
"--file_content_in_loop="
+
filePath
},
VolumeMounts
:
[]
api
.
VolumeMount
{
{
Name
:
"podinfo"
,
...
...
@@ -85,20 +173,6 @@ func downwardAPIVolumePod(name string) *api.Pod {
DownwardAPI
:
&
api
.
DownwardAPIVolumeSource
{
Items
:
[]
api
.
DownwardAPIVolumeFile
{
{
Path
:
"labels"
,
FieldRef
:
api
.
ObjectFieldSelector
{
APIVersion
:
"v1"
,
FieldPath
:
"metadata.labels"
,
},
},
{
Path
:
"annotations"
,
FieldRef
:
api
.
ObjectFieldSelector
{
APIVersion
:
"v1"
,
FieldPath
:
"metadata.annotations"
,
},
},
{
Path
:
"podname"
,
FieldRef
:
api
.
ObjectFieldSelector
{
APIVersion
:
"v1"
,
...
...
@@ -113,6 +187,27 @@ func downwardAPIVolumePod(name string) *api.Pod {
RestartPolicy
:
api
.
RestartPolicyNever
,
},
}
if
len
(
labels
)
>
0
{
pod
.
Spec
.
Volumes
[
0
]
.
DownwardAPI
.
Items
=
append
(
pod
.
Spec
.
Volumes
[
0
]
.
DownwardAPI
.
Items
,
api
.
DownwardAPIVolumeFile
{
Path
:
"labels"
,
FieldRef
:
api
.
ObjectFieldSelector
{
APIVersion
:
"v1"
,
FieldPath
:
"metadata.labels"
,
},
})
}
if
len
(
annotations
)
>
0
{
pod
.
Spec
.
Volumes
[
0
]
.
DownwardAPI
.
Items
=
append
(
pod
.
Spec
.
Volumes
[
0
]
.
DownwardAPI
.
Items
,
api
.
DownwardAPIVolumeFile
{
Path
:
"annotations"
,
FieldRef
:
api
.
ObjectFieldSelector
{
APIVersion
:
"v1"
,
FieldPath
:
"metadata.annotations"
,
},
})
}
return
pod
}
// TODO: add test-webserver example as pointed out in https://github.com/kubernetes/kubernetes/pull/5093#discussion-diff-37606771
test/e2e/host_path.go
View file @
0d4e0dc1
...
...
@@ -120,7 +120,7 @@ func testPodWithHostVol(path string, source *api.HostPathVolumeSource) *api.Pod
Containers
:
[]
api
.
Container
{
{
Name
:
containerName1
,
Image
:
"gcr.io/google_containers/mounttest:0.
4
"
,
Image
:
"gcr.io/google_containers/mounttest:0.
6
"
,
VolumeMounts
:
[]
api
.
VolumeMount
{
{
Name
:
volumeName
,
...
...
@@ -130,7 +130,7 @@ func testPodWithHostVol(path string, source *api.HostPathVolumeSource) *api.Pod
},
{
Name
:
containerName2
,
Image
:
"gcr.io/google_containers/mounttest:0.
4
"
,
Image
:
"gcr.io/google_containers/mounttest:0.
6
"
,
VolumeMounts
:
[]
api
.
VolumeMount
{
{
Name
:
volumeName
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment