mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-03 17:30:00 +00:00
Merge pull request #17886 from fabianofranz/pod_logs_validate_container
Auto commit by PR queue bot
This commit is contained in:
commit
63dc126739
@ -240,13 +240,18 @@ func LogLocation(getter ResourceGetter, connInfo client.ConnectionInfoGetter, ct
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Try to figure out a container
|
// Try to figure out a container
|
||||||
|
// If a container was provided, it must be valid
|
||||||
container := opts.Container
|
container := opts.Container
|
||||||
if container == "" {
|
if len(container) == 0 {
|
||||||
if len(pod.Spec.Containers) == 1 {
|
if len(pod.Spec.Containers) == 1 {
|
||||||
container = pod.Spec.Containers[0].Name
|
container = pod.Spec.Containers[0].Name
|
||||||
} else {
|
} else {
|
||||||
return nil, nil, errors.NewBadRequest(fmt.Sprintf("a container name must be specified for pod %s", name))
|
return nil, nil, errors.NewBadRequest(fmt.Sprintf("a container name must be specified for pod %s", name))
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if !podHasContainerWithName(pod, container) {
|
||||||
|
return nil, nil, errors.NewBadRequest(fmt.Sprintf("container %s is not valid for pod %s", container, name))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
nodeHost := pod.Spec.NodeName
|
nodeHost := pod.Spec.NodeName
|
||||||
if len(nodeHost) == 0 {
|
if len(nodeHost) == 0 {
|
||||||
@ -282,12 +287,21 @@ func LogLocation(getter ResourceGetter, connInfo client.ConnectionInfoGetter, ct
|
|||||||
loc := &url.URL{
|
loc := &url.URL{
|
||||||
Scheme: nodeScheme,
|
Scheme: nodeScheme,
|
||||||
Host: fmt.Sprintf("%s:%d", nodeHost, nodePort),
|
Host: fmt.Sprintf("%s:%d", nodeHost, nodePort),
|
||||||
Path: fmt.Sprintf("/containerLogs/%s/%s/%s", pod.Namespace, name, container),
|
Path: fmt.Sprintf("/containerLogs/%s/%s/%s", pod.Namespace, pod.Name, container),
|
||||||
RawQuery: params.Encode(),
|
RawQuery: params.Encode(),
|
||||||
}
|
}
|
||||||
return loc, nodeTransport, nil
|
return loc, nodeTransport, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func podHasContainerWithName(pod *api.Pod, containerName string) bool {
|
||||||
|
for _, c := range pod.Spec.Containers {
|
||||||
|
if c.Name == containerName {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func streamParams(params url.Values, opts runtime.Object) error {
|
func streamParams(params url.Values, opts runtime.Object) error {
|
||||||
switch opts := opts.(type) {
|
switch opts := opts.(type) {
|
||||||
case *api.PodExecOptions:
|
case *api.PodExecOptions:
|
||||||
@ -344,12 +358,17 @@ func streamLocation(getter ResourceGetter, connInfo client.ConnectionInfoGetter,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Try to figure out a container
|
// Try to figure out a container
|
||||||
|
// If a container was provided, it must be valid
|
||||||
if container == "" {
|
if container == "" {
|
||||||
if len(pod.Spec.Containers) == 1 {
|
if len(pod.Spec.Containers) == 1 {
|
||||||
container = pod.Spec.Containers[0].Name
|
container = pod.Spec.Containers[0].Name
|
||||||
} else {
|
} else {
|
||||||
return nil, nil, errors.NewBadRequest(fmt.Sprintf("a container name must be specified for pod %s", name))
|
return nil, nil, errors.NewBadRequest(fmt.Sprintf("a container name must be specified for pod %s", name))
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if !podHasContainerWithName(pod, container) {
|
||||||
|
return nil, nil, errors.NewBadRequest(fmt.Sprintf("container %s is not valid for pod %s", container, name))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
nodeHost := pod.Spec.NodeName
|
nodeHost := pod.Spec.NodeName
|
||||||
if len(nodeHost) == 0 {
|
if len(nodeHost) == 0 {
|
||||||
@ -367,7 +386,7 @@ func streamLocation(getter ResourceGetter, connInfo client.ConnectionInfoGetter,
|
|||||||
loc := &url.URL{
|
loc := &url.URL{
|
||||||
Scheme: nodeScheme,
|
Scheme: nodeScheme,
|
||||||
Host: fmt.Sprintf("%s:%d", nodeHost, nodePort),
|
Host: fmt.Sprintf("%s:%d", nodeHost, nodePort),
|
||||||
Path: fmt.Sprintf("/%s/%s/%s/%s", path, pod.Namespace, name, container),
|
Path: fmt.Sprintf("/%s/%s/%s/%s", path, pod.Namespace, pod.Name, container),
|
||||||
RawQuery: params.Encode(),
|
RawQuery: params.Encode(),
|
||||||
}
|
}
|
||||||
return loc, nodeTransport, nil
|
return loc, nodeTransport, nil
|
||||||
@ -392,7 +411,7 @@ func PortForwardLocation(getter ResourceGetter, connInfo client.ConnectionInfoGe
|
|||||||
loc := &url.URL{
|
loc := &url.URL{
|
||||||
Scheme: nodeScheme,
|
Scheme: nodeScheme,
|
||||||
Host: fmt.Sprintf("%s:%d", nodeHost, nodePort),
|
Host: fmt.Sprintf("%s:%d", nodeHost, nodePort),
|
||||||
Path: fmt.Sprintf("/portForward/%s/%s", pod.Namespace, name),
|
Path: fmt.Sprintf("/portForward/%s/%s", pod.Namespace, pod.Name),
|
||||||
}
|
}
|
||||||
return loc, nodeTransport, nil
|
return loc, nodeTransport, nil
|
||||||
}
|
}
|
||||||
|
@ -17,9 +17,12 @@ limitations under the License.
|
|||||||
package pod
|
package pod
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"k8s.io/kubernetes/pkg/api"
|
"k8s.io/kubernetes/pkg/api"
|
||||||
|
"k8s.io/kubernetes/pkg/api/errors"
|
||||||
|
"k8s.io/kubernetes/pkg/runtime"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCheckGracefulDelete(t *testing.T) {
|
func TestCheckGracefulDelete(t *testing.T) {
|
||||||
@ -76,3 +79,91 @@ func TestCheckGracefulDelete(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type mockPodGetter struct {
|
||||||
|
pod *api.Pod
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g mockPodGetter) Get(api.Context, string) (runtime.Object, error) {
|
||||||
|
return g.pod, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCheckLogLocation(t *testing.T) {
|
||||||
|
ctx := api.NewDefaultContext()
|
||||||
|
tcs := []struct {
|
||||||
|
in *api.Pod
|
||||||
|
opts *api.PodLogOptions
|
||||||
|
expectedErr error
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
in: &api.Pod{
|
||||||
|
Spec: api.PodSpec{},
|
||||||
|
Status: api.PodStatus{},
|
||||||
|
},
|
||||||
|
opts: &api.PodLogOptions{},
|
||||||
|
expectedErr: errors.NewBadRequest("a container name must be specified for pod test"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
in: &api.Pod{
|
||||||
|
Spec: api.PodSpec{
|
||||||
|
Containers: []api.Container{
|
||||||
|
{Name: "mycontainer"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Status: api.PodStatus{},
|
||||||
|
},
|
||||||
|
opts: &api.PodLogOptions{},
|
||||||
|
expectedErr: nil,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
in: &api.Pod{
|
||||||
|
Spec: api.PodSpec{
|
||||||
|
Containers: []api.Container{
|
||||||
|
{Name: "container1"},
|
||||||
|
{Name: "container2"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Status: api.PodStatus{},
|
||||||
|
},
|
||||||
|
opts: &api.PodLogOptions{},
|
||||||
|
expectedErr: errors.NewBadRequest("a container name must be specified for pod test"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
in: &api.Pod{
|
||||||
|
Spec: api.PodSpec{
|
||||||
|
Containers: []api.Container{
|
||||||
|
{Name: "container1"},
|
||||||
|
{Name: "container2"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Status: api.PodStatus{},
|
||||||
|
},
|
||||||
|
opts: &api.PodLogOptions{
|
||||||
|
Container: "unknown",
|
||||||
|
},
|
||||||
|
expectedErr: errors.NewBadRequest("container unknown is not valid for pod test"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
in: &api.Pod{
|
||||||
|
Spec: api.PodSpec{
|
||||||
|
Containers: []api.Container{
|
||||||
|
{Name: "container1"},
|
||||||
|
{Name: "container2"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Status: api.PodStatus{},
|
||||||
|
},
|
||||||
|
opts: &api.PodLogOptions{
|
||||||
|
Container: "container2",
|
||||||
|
},
|
||||||
|
expectedErr: nil,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tc := range tcs {
|
||||||
|
getter := &mockPodGetter{tc.in}
|
||||||
|
_, _, err := LogLocation(getter, nil, ctx, "test", tc.opts)
|
||||||
|
if !reflect.DeepEqual(err, tc.expectedErr) {
|
||||||
|
t.Errorf("expected %v, got %v", tc.expectedErr, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user