more dependencies packages:

pkg/metrics
pkg/credentialprovider
pkg/security
pkg/securitycontext
pkg/serviceaccount
pkg/storage
pkg/fieldpath
This commit is contained in:
Chao Xu
2016-11-18 13:26:53 -08:00
parent f8b36bdd40
commit 4f3d0e3bde
21 changed files with 352 additions and 176 deletions

View File

@@ -25,6 +25,7 @@ import (
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/resource"
"k8s.io/kubernetes/pkg/api/v1"
)
// formatMap formats map[string]string to a string.
@@ -65,9 +66,10 @@ func ExtractFieldPathAsString(obj interface{}, fieldPath string) (string, error)
return "", fmt.Errorf("Unsupported fieldPath: %v", fieldPath)
}
// TODO: move the functions below to pkg/api/util/resources
// ExtractResourceValueByContainerName extracts the value of a resource
// by providing container name
func ExtractResourceValueByContainerName(fs *api.ResourceFieldSelector, pod *api.Pod, containerName string) (string, error) {
func ExtractResourceValueByContainerName(fs *v1.ResourceFieldSelector, pod *v1.Pod, containerName string) (string, error) {
container, err := findContainerInPod(pod, containerName)
if err != nil {
return "", err
@@ -77,7 +79,7 @@ func ExtractResourceValueByContainerName(fs *api.ResourceFieldSelector, pod *api
// ExtractResourceValueByContainerNameAndNodeAllocatable extracts the value of a resource
// by providing container name and node allocatable
func ExtractResourceValueByContainerNameAndNodeAllocatable(fs *api.ResourceFieldSelector, pod *api.Pod, containerName string, nodeAllocatable api.ResourceList) (string, error) {
func ExtractResourceValueByContainerNameAndNodeAllocatable(fs *v1.ResourceFieldSelector, pod *v1.Pod, containerName string, nodeAllocatable v1.ResourceList) (string, error) {
realContainer, err := findContainerInPod(pod, containerName)
if err != nil {
return "", err
@@ -88,7 +90,7 @@ func ExtractResourceValueByContainerNameAndNodeAllocatable(fs *api.ResourceField
return "", fmt.Errorf("failed to perform a deep copy of container object: %v", err)
}
container, ok := containerCopy.(*api.Container)
container, ok := containerCopy.(*v1.Container)
if !ok {
return "", fmt.Errorf("unexpected type returned from deep copy of container object")
}
@@ -100,7 +102,32 @@ func ExtractResourceValueByContainerNameAndNodeAllocatable(fs *api.ResourceField
// ExtractContainerResourceValue extracts the value of a resource
// in an already known container
func ExtractContainerResourceValue(fs *api.ResourceFieldSelector, container *api.Container) (string, error) {
func ExtractContainerResourceValue(fs *v1.ResourceFieldSelector, container *v1.Container) (string, error) {
divisor := resource.Quantity{}
if divisor.Cmp(fs.Divisor) == 0 {
divisor = resource.MustParse("1")
} else {
divisor = fs.Divisor
}
switch fs.Resource {
case "limits.cpu":
return convertResourceCPUToString(container.Resources.Limits.Cpu(), divisor)
case "limits.memory":
return convertResourceMemoryToString(container.Resources.Limits.Memory(), divisor)
case "requests.cpu":
return convertResourceCPUToString(container.Resources.Requests.Cpu(), divisor)
case "requests.memory":
return convertResourceMemoryToString(container.Resources.Requests.Memory(), divisor)
}
return "", fmt.Errorf("Unsupported container resource : %v", fs.Resource)
}
// TODO: remove this duplicate
// InternalExtractContainerResourceValue extracts the value of a resource
// in an already known container
func InternalExtractContainerResourceValue(fs *api.ResourceFieldSelector, container *api.Container) (string, error) {
divisor := resource.Quantity{}
if divisor.Cmp(fs.Divisor) == 0 {
divisor = resource.MustParse("1")
@@ -123,7 +150,7 @@ func ExtractContainerResourceValue(fs *api.ResourceFieldSelector, container *api
}
// findContainerInPod finds a container by its name in the provided pod
func findContainerInPod(pod *api.Pod, containerName string) (*api.Container, error) {
func findContainerInPod(pod *v1.Pod, containerName string) (*v1.Container, error) {
for _, container := range pod.Spec.Containers {
if container.Name == containerName {
return &container, nil
@@ -148,12 +175,12 @@ func convertResourceMemoryToString(memory *resource.Quantity, divisor resource.Q
// MergeContainerResourceLimits checks if a limit is applied for
// the container, and if not, it sets the limit to the passed resource list.
func MergeContainerResourceLimits(container *api.Container,
allocatable api.ResourceList) {
func MergeContainerResourceLimits(container *v1.Container,
allocatable v1.ResourceList) {
if container.Resources.Limits == nil {
container.Resources.Limits = make(api.ResourceList)
container.Resources.Limits = make(v1.ResourceList)
}
for _, resource := range []api.ResourceName{api.ResourceCPU, api.ResourceMemory} {
for _, resource := range []v1.ResourceName{v1.ResourceCPU, v1.ResourceMemory} {
if quantity, exists := container.Resources.Limits[resource]; !exists || quantity.IsZero() {
if cap, exists := allocatable[resource]; exists {
container.Resources.Limits[resource] = *cap.Copy()

View File

@@ -22,8 +22,8 @@ import (
"github.com/stretchr/testify/assert"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/resource"
"k8s.io/kubernetes/pkg/api/v1"
)
func TestExtractFieldPathAsString(t *testing.T) {
@@ -43,8 +43,8 @@ func TestExtractFieldPathAsString(t *testing.T) {
{
name: "ok - namespace",
fieldPath: "metadata.namespace",
obj: &api.Pod{
ObjectMeta: api.ObjectMeta{
obj: &v1.Pod{
ObjectMeta: v1.ObjectMeta{
Namespace: "object-namespace",
},
},
@@ -53,8 +53,8 @@ func TestExtractFieldPathAsString(t *testing.T) {
{
name: "ok - name",
fieldPath: "metadata.name",
obj: &api.Pod{
ObjectMeta: api.ObjectMeta{
obj: &v1.Pod{
ObjectMeta: v1.ObjectMeta{
Name: "object-name",
},
},
@@ -63,8 +63,8 @@ func TestExtractFieldPathAsString(t *testing.T) {
{
name: "ok - labels",
fieldPath: "metadata.labels",
obj: &api.Pod{
ObjectMeta: api.ObjectMeta{
obj: &v1.Pod{
ObjectMeta: v1.ObjectMeta{
Labels: map[string]string{"key": "value"},
},
},
@@ -73,8 +73,8 @@ func TestExtractFieldPathAsString(t *testing.T) {
{
name: "ok - labels bslash n",
fieldPath: "metadata.labels",
obj: &api.Pod{
ObjectMeta: api.ObjectMeta{
obj: &v1.Pod{
ObjectMeta: v1.ObjectMeta{
Labels: map[string]string{"key": "value\n"},
},
},
@@ -83,8 +83,8 @@ func TestExtractFieldPathAsString(t *testing.T) {
{
name: "ok - annotations",
fieldPath: "metadata.annotations",
obj: &api.Pod{
ObjectMeta: api.ObjectMeta{
obj: &v1.Pod{
ObjectMeta: v1.ObjectMeta{
Annotations: map[string]string{"builder": "john-doe"},
},
},
@@ -94,8 +94,8 @@ func TestExtractFieldPathAsString(t *testing.T) {
{
name: "invalid expression",
fieldPath: "metadata.whoops",
obj: &api.Pod{
ObjectMeta: api.ObjectMeta{
obj: &v1.Pod{
ObjectMeta: v1.ObjectMeta{
Namespace: "object-namespace",
},
},
@@ -119,26 +119,26 @@ func TestExtractFieldPathAsString(t *testing.T) {
}
}
func getPod(cname, cpuRequest, cpuLimit, memoryRequest, memoryLimit string) *api.Pod {
resources := api.ResourceRequirements{
Limits: make(api.ResourceList),
Requests: make(api.ResourceList),
func getPod(cname, cpuRequest, cpuLimit, memoryRequest, memoryLimit string) *v1.Pod {
resources := v1.ResourceRequirements{
Limits: make(v1.ResourceList),
Requests: make(v1.ResourceList),
}
if cpuLimit != "" {
resources.Limits[api.ResourceCPU] = resource.MustParse(cpuLimit)
resources.Limits[v1.ResourceCPU] = resource.MustParse(cpuLimit)
}
if memoryLimit != "" {
resources.Limits[api.ResourceMemory] = resource.MustParse(memoryLimit)
resources.Limits[v1.ResourceMemory] = resource.MustParse(memoryLimit)
}
if cpuRequest != "" {
resources.Requests[api.ResourceCPU] = resource.MustParse(cpuRequest)
resources.Requests[v1.ResourceCPU] = resource.MustParse(cpuRequest)
}
if memoryRequest != "" {
resources.Requests[api.ResourceMemory] = resource.MustParse(memoryRequest)
resources.Requests[v1.ResourceMemory] = resource.MustParse(memoryRequest)
}
return &api.Pod{
Spec: api.PodSpec{
Containers: []api.Container{
return &v1.Pod{
Spec: v1.PodSpec{
Containers: []v1.Container{
{
Name: cname,
Resources: resources,
@@ -150,14 +150,14 @@ func getPod(cname, cpuRequest, cpuLimit, memoryRequest, memoryLimit string) *api
func TestExtractResourceValue(t *testing.T) {
cases := []struct {
fs *api.ResourceFieldSelector
pod *api.Pod
fs *v1.ResourceFieldSelector
pod *v1.Pod
cName string
expectedValue string
expectedError error
}{
{
fs: &api.ResourceFieldSelector{
fs: &v1.ResourceFieldSelector{
Resource: "limits.cpu",
},
cName: "foo",
@@ -165,7 +165,7 @@ func TestExtractResourceValue(t *testing.T) {
expectedValue: "9",
},
{
fs: &api.ResourceFieldSelector{
fs: &v1.ResourceFieldSelector{
Resource: "requests.cpu",
},
cName: "foo",
@@ -173,7 +173,7 @@ func TestExtractResourceValue(t *testing.T) {
expectedValue: "0",
},
{
fs: &api.ResourceFieldSelector{
fs: &v1.ResourceFieldSelector{
Resource: "requests.cpu",
},
cName: "foo",
@@ -181,7 +181,7 @@ func TestExtractResourceValue(t *testing.T) {
expectedValue: "8",
},
{
fs: &api.ResourceFieldSelector{
fs: &v1.ResourceFieldSelector{
Resource: "requests.cpu",
},
cName: "foo",
@@ -189,7 +189,7 @@ func TestExtractResourceValue(t *testing.T) {
expectedValue: "1",
},
{
fs: &api.ResourceFieldSelector{
fs: &v1.ResourceFieldSelector{
Resource: "requests.cpu",
Divisor: resource.MustParse("100m"),
},
@@ -198,7 +198,7 @@ func TestExtractResourceValue(t *testing.T) {
expectedValue: "12",
},
{
fs: &api.ResourceFieldSelector{
fs: &v1.ResourceFieldSelector{
Resource: "requests.memory",
},
cName: "foo",
@@ -206,7 +206,7 @@ func TestExtractResourceValue(t *testing.T) {
expectedValue: "104857600",
},
{
fs: &api.ResourceFieldSelector{
fs: &v1.ResourceFieldSelector{
Resource: "requests.memory",
Divisor: resource.MustParse("1Mi"),
},
@@ -215,7 +215,7 @@ func TestExtractResourceValue(t *testing.T) {
expectedValue: "100",
},
{
fs: &api.ResourceFieldSelector{
fs: &v1.ResourceFieldSelector{
Resource: "limits.memory",
},
cName: "foo",