diff options
Diffstat (limited to 'vendor/k8s.io/kubernetes/pkg/kubelet/container/helpers.go')
-rw-r--r-- | vendor/k8s.io/kubernetes/pkg/kubelet/container/helpers.go | 359 |
1 files changed, 0 insertions, 359 deletions
diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/container/helpers.go b/vendor/k8s.io/kubernetes/pkg/kubelet/container/helpers.go deleted file mode 100644 index 2320a192b..000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/container/helpers.go +++ /dev/null @@ -1,359 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -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. -*/ - -package container - -import ( - "bytes" - "fmt" - "hash/adler32" - "hash/fnv" - "strings" - "time" - - "github.com/golang/glog" - - "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/types" - "k8s.io/client-go/tools/record" - runtimeapi "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2" - "k8s.io/kubernetes/pkg/kubelet/util/format" - "k8s.io/kubernetes/pkg/kubelet/util/ioutils" - hashutil "k8s.io/kubernetes/pkg/util/hash" - "k8s.io/kubernetes/third_party/forked/golang/expansion" -) - -// HandlerRunner runs a lifecycle handler for a container. -type HandlerRunner interface { - Run(containerID ContainerID, pod *v1.Pod, container *v1.Container, handler *v1.Handler) (string, error) -} - -// RuntimeHelper wraps kubelet to make container runtime -// able to get necessary informations like the RunContainerOptions, DNS settings, Host IP. -type RuntimeHelper interface { - GenerateRunContainerOptions(pod *v1.Pod, container *v1.Container, podIP string) (contOpts *RunContainerOptions, err error) - GetPodDNS(pod *v1.Pod) (dnsConfig *runtimeapi.DNSConfig, err error) - // GetPodCgroupParent returns the CgroupName identifier, and its literal cgroupfs form on the host - // of a pod. - GetPodCgroupParent(pod *v1.Pod) string - GetPodDir(podUID types.UID) string - GeneratePodHostNameAndDomain(pod *v1.Pod) (hostname string, hostDomain string, err error) - // GetExtraSupplementalGroupsForPod returns a list of the extra - // supplemental groups for the Pod. These extra supplemental groups come - // from annotations on persistent volumes that the pod depends on. - GetExtraSupplementalGroupsForPod(pod *v1.Pod) []int64 -} - -// ShouldContainerBeRestarted checks whether a container needs to be restarted. -// TODO(yifan): Think about how to refactor this. -func ShouldContainerBeRestarted(container *v1.Container, pod *v1.Pod, podStatus *PodStatus) bool { - // Get latest container status. - status := podStatus.FindContainerStatusByName(container.Name) - // If the container was never started before, we should start it. - // NOTE(random-liu): If all historical containers were GC'd, we'll also return true here. - if status == nil { - return true - } - // Check whether container is running - if status.State == ContainerStateRunning { - return false - } - // Always restart container in the unknown, or in the created state. - if status.State == ContainerStateUnknown || status.State == ContainerStateCreated { - return true - } - // Check RestartPolicy for dead container - if pod.Spec.RestartPolicy == v1.RestartPolicyNever { - glog.V(4).Infof("Already ran container %q of pod %q, do nothing", container.Name, format.Pod(pod)) - return false - } - if pod.Spec.RestartPolicy == v1.RestartPolicyOnFailure { - // Check the exit code. - if status.ExitCode == 0 { - glog.V(4).Infof("Already successfully ran container %q of pod %q, do nothing", container.Name, format.Pod(pod)) - return false - } - } - return true -} - -// HashContainer returns the hash of the container. It is used to compare -// the running container with its desired spec. -func HashContainer(container *v1.Container) uint64 { - hash := fnv.New32a() - hashutil.DeepHashObject(hash, *container) - return uint64(hash.Sum32()) -} - -// HashContainerLegacy returns the hash of the container. It is used to compare -// the running container with its desired spec. -// This is used by rktnetes and dockershim (for handling <=1.5 containers). -// TODO: Remove this function when kubernetes version is >=1.8 AND rktnetes -// update its hash function. -func HashContainerLegacy(container *v1.Container) uint64 { - hash := adler32.New() - hashutil.DeepHashObject(hash, *container) - return uint64(hash.Sum32()) -} - -// EnvVarsToMap constructs a map of environment name to value from a slice -// of env vars. -func EnvVarsToMap(envs []EnvVar) map[string]string { - result := map[string]string{} - for _, env := range envs { - result[env.Name] = env.Value - } - return result -} - -// V1EnvVarsToMap constructs a map of environment name to value from a slice -// of env vars. -func V1EnvVarsToMap(envs []v1.EnvVar) map[string]string { - result := map[string]string{} - for _, env := range envs { - result[env.Name] = env.Value - } - - return result -} - -// ExpandContainerCommandOnlyStatic substitutes only static environment variable values from the -// container environment definitions. This does *not* include valueFrom substitutions. -// TODO: callers should use ExpandContainerCommandAndArgs with a fully resolved list of environment. -func ExpandContainerCommandOnlyStatic(containerCommand []string, envs []v1.EnvVar) (command []string) { - mapping := expansion.MappingFuncFor(V1EnvVarsToMap(envs)) - if len(containerCommand) != 0 { - for _, cmd := range containerCommand { - command = append(command, expansion.Expand(cmd, mapping)) - } - } - return command -} - -func ExpandContainerCommandAndArgs(container *v1.Container, envs []EnvVar) (command []string, args []string) { - mapping := expansion.MappingFuncFor(EnvVarsToMap(envs)) - - if len(container.Command) != 0 { - for _, cmd := range container.Command { - command = append(command, expansion.Expand(cmd, mapping)) - } - } - - if len(container.Args) != 0 { - for _, arg := range container.Args { - args = append(args, expansion.Expand(arg, mapping)) - } - } - - return command, args -} - -// Create an event recorder to record object's event except implicitly required container's, like infra container. -func FilterEventRecorder(recorder record.EventRecorder) record.EventRecorder { - return &innerEventRecorder{ - recorder: recorder, - } -} - -type innerEventRecorder struct { - recorder record.EventRecorder -} - -func (irecorder *innerEventRecorder) shouldRecordEvent(object runtime.Object) (*v1.ObjectReference, bool) { - if object == nil { - return nil, false - } - if ref, ok := object.(*v1.ObjectReference); ok { - if !strings.HasPrefix(ref.FieldPath, ImplicitContainerPrefix) { - return ref, true - } - } - return nil, false -} - -func (irecorder *innerEventRecorder) Event(object runtime.Object, eventtype, reason, message string) { - if ref, ok := irecorder.shouldRecordEvent(object); ok { - irecorder.recorder.Event(ref, eventtype, reason, message) - } -} - -func (irecorder *innerEventRecorder) Eventf(object runtime.Object, eventtype, reason, messageFmt string, args ...interface{}) { - if ref, ok := irecorder.shouldRecordEvent(object); ok { - irecorder.recorder.Eventf(ref, eventtype, reason, messageFmt, args...) - } - -} - -func (irecorder *innerEventRecorder) PastEventf(object runtime.Object, timestamp metav1.Time, eventtype, reason, messageFmt string, args ...interface{}) { - if ref, ok := irecorder.shouldRecordEvent(object); ok { - irecorder.recorder.PastEventf(ref, timestamp, eventtype, reason, messageFmt, args...) - } -} - -// Pod must not be nil. -func IsHostNetworkPod(pod *v1.Pod) bool { - return pod.Spec.HostNetwork -} - -// TODO(random-liu): Convert PodStatus to running Pod, should be deprecated soon -func ConvertPodStatusToRunningPod(runtimeName string, podStatus *PodStatus) Pod { - runningPod := Pod{ - ID: podStatus.ID, - Name: podStatus.Name, - Namespace: podStatus.Namespace, - } - for _, containerStatus := range podStatus.ContainerStatuses { - if containerStatus.State != ContainerStateRunning { - continue - } - container := &Container{ - ID: containerStatus.ID, - Name: containerStatus.Name, - Image: containerStatus.Image, - ImageID: containerStatus.ImageID, - Hash: containerStatus.Hash, - State: containerStatus.State, - } - runningPod.Containers = append(runningPod.Containers, container) - } - - // Populate sandboxes in kubecontainer.Pod - for _, sandbox := range podStatus.SandboxStatuses { - runningPod.Sandboxes = append(runningPod.Sandboxes, &Container{ - ID: ContainerID{Type: runtimeName, ID: sandbox.Id}, - State: SandboxToContainerState(sandbox.State), - }) - } - return runningPod -} - -// SandboxToContainerState converts runtimeapi.PodSandboxState to -// kubecontainer.ContainerState. -// This is only needed because we need to return sandboxes as if they were -// kubecontainer.Containers to avoid substantial changes to PLEG. -// TODO: Remove this once it becomes obsolete. -func SandboxToContainerState(state runtimeapi.PodSandboxState) ContainerState { - switch state { - case runtimeapi.PodSandboxState_SANDBOX_READY: - return ContainerStateRunning - case runtimeapi.PodSandboxState_SANDBOX_NOTREADY: - return ContainerStateExited - } - return ContainerStateUnknown -} - -// FormatPod returns a string representing a pod in a human readable format, -// with pod UID as part of the string. -func FormatPod(pod *Pod) string { - // Use underscore as the delimiter because it is not allowed in pod name - // (DNS subdomain format), while allowed in the container name format. - return fmt.Sprintf("%s_%s(%s)", pod.Name, pod.Namespace, pod.ID) -} - -type containerCommandRunnerWrapper struct { - DirectStreamingRuntime -} - -var _ ContainerCommandRunner = &containerCommandRunnerWrapper{} - -func DirectStreamingRunner(runtime DirectStreamingRuntime) ContainerCommandRunner { - return &containerCommandRunnerWrapper{runtime} -} - -func (r *containerCommandRunnerWrapper) RunInContainer(id ContainerID, cmd []string, timeout time.Duration) ([]byte, error) { - var buffer bytes.Buffer - output := ioutils.WriteCloserWrapper(&buffer) - err := r.ExecInContainer(id, cmd, nil, output, output, false, nil, timeout) - // Even if err is non-nil, there still may be output (e.g. the exec wrote to stdout or stderr but - // the command returned a nonzero exit code). Therefore, always return the output along with the - // error. - return buffer.Bytes(), err -} - -// GetContainerSpec gets the container spec by containerName. -func GetContainerSpec(pod *v1.Pod, containerName string) *v1.Container { - for i, c := range pod.Spec.Containers { - if containerName == c.Name { - return &pod.Spec.Containers[i] - } - } - for i, c := range pod.Spec.InitContainers { - if containerName == c.Name { - return &pod.Spec.InitContainers[i] - } - } - return nil -} - -// HasPrivilegedContainer returns true if any of the containers in the pod are privileged. -func HasPrivilegedContainer(pod *v1.Pod) bool { - for _, c := range append(pod.Spec.Containers, pod.Spec.InitContainers...) { - if c.SecurityContext != nil && - c.SecurityContext.Privileged != nil && - *c.SecurityContext.Privileged { - return true - } - } - return false -} - -// MakeCapabilities creates string slices from Capability slices -func MakeCapabilities(capAdd []v1.Capability, capDrop []v1.Capability) ([]string, []string) { - var ( - addCaps []string - dropCaps []string - ) - for _, cap := range capAdd { - addCaps = append(addCaps, string(cap)) - } - for _, cap := range capDrop { - dropCaps = append(dropCaps, string(cap)) - } - return addCaps, dropCaps -} - -// MakePortMappings creates internal port mapping from api port mapping. -func MakePortMappings(container *v1.Container) (ports []PortMapping) { - names := make(map[string]struct{}) - for _, p := range container.Ports { - pm := PortMapping{ - HostPort: int(p.HostPort), - ContainerPort: int(p.ContainerPort), - Protocol: p.Protocol, - HostIP: p.HostIP, - } - - // We need to create some default port name if it's not specified, since - // this is necessary for rkt. - // http://issue.k8s.io/7710 - if p.Name == "" { - pm.Name = fmt.Sprintf("%s-%s:%d", container.Name, p.Protocol, p.ContainerPort) - } else { - pm.Name = fmt.Sprintf("%s-%s", container.Name, p.Name) - } - - // Protect against exposing the same protocol-port more than once in a container. - if _, ok := names[pm.Name]; ok { - glog.Warningf("Port name conflicted, %q is defined more than once", pm.Name) - continue - } - ports = append(ports, pm) - names[pm.Name] = struct{}{} - } - return -} |