// generateEvents is a helper function that generates some container // life cycle events for containers in a pod. func (r *runtime) generateEvents(runtimePod *kubecontainer.Pod, reason string, failure error) { // Set up container references. for _, c := range runtimePod.Containers { containerID := string(c.ID) id, err := parseContainerID(containerID) if err != nil { glog.Warningf("Invalid container ID %q", containerID) continue } ref, ok := r.containerRefManager.GetRef(containerID) if !ok { glog.Warningf("No ref for container %q", containerID) continue } // Note that 'rkt id' is the pod id. uuid := util.ShortenString(id.uuid, 8) switch reason { case "Created": r.recorder.Eventf(ref, "Created", "Created with rkt id %v", uuid) case "Started": r.recorder.Eventf(ref, "Started", "Started with rkt id %v", uuid) case "Failed": r.recorder.Eventf(ref, "Failed", "Failed to start with rkt id %v with error %v", uuid, failure) case "Killing": r.recorder.Eventf(ref, "Killing", "Killing with rkt id %v", uuid) default: glog.Errorf("rkt: Unexpected event %q", reason) } } return }
// Recycler provides methods to reclaim the volume resource. // A NFS volume is recycled by scheduling a pod to run "rm -rf" on the contents of the volume. // Recycle blocks until the pod has completed or any error occurs. // The scrubber pod's is expected to succeed within 5 minutes else an error will be returned func (r *nfsRecycler) Recycle() error { timeout := int64(300) // 5 minutes pod := &api.Pod{ ObjectMeta: api.ObjectMeta{ GenerateName: "pv-scrubber-" + util.ShortenString(r.name, 44) + "-", Namespace: api.NamespaceDefault, }, Spec: api.PodSpec{ ActiveDeadlineSeconds: &timeout, RestartPolicy: api.RestartPolicyNever, Volumes: []api.Volume{ { Name: "vol", VolumeSource: api.VolumeSource{ NFS: &api.NFSVolumeSource{ Server: r.server, Path: r.path, }, }, }, }, Containers: []api.Container{ { Name: "scrubber", Image: "gcr.io/google_containers/busybox", // delete the contents of the volume, but not the directory itself Command: []string{"/bin/sh"}, // the scrubber: // 1. validates the /scrub directory exists // 2. creates a text file to be scrubbed // 3. performs rm -rf on the directory // 4. tests to see if the directory is empty // the pod fails if the error code is returned Args: []string{"-c", "test -e /scrub && echo $(date) > /scrub/trash.txt && rm -rf /scrub/* && test -z \"$(ls -A /scrub)\" || exit 1"}, VolumeMounts: []api.VolumeMount{ { Name: "vol", MountPath: "/scrub", }, }, }, }, }, } return volume.ScrubPodVolumeAndWatchUntilCompletion(pod, r.host.GetKubeClient()) }
// Recycler provides methods to reclaim the volume resource. // A NFS volume is recycled by scheduling a pod to run "rm -rf" on the contents of the volume. // Recycle blocks until the pod has completed or any error occurs. // The scrubber pod's is expected to succeed within 5 minutes else an error will be returned. func (r *nfsRecycler) Recycle() error { // TODO: remove the duplication between this Recycle func and the one in host_path.go pod := &api.Pod{ ObjectMeta: api.ObjectMeta{ GenerateName: "pv-scrubber-" + util.ShortenString(r.name, 44) + "-", Namespace: api.NamespaceDefault, }, Spec: api.PodSpec{ ActiveDeadlineSeconds: &r.recyclableConfig.Timeout, RestartPolicy: api.RestartPolicyNever, Volumes: []api.Volume{ { Name: "vol", VolumeSource: api.VolumeSource{ NFS: &api.NFSVolumeSource{ Server: r.server, Path: r.path, }, }, }, }, Containers: []api.Container{ { Name: "scrubber", Image: r.recyclableConfig.ImageName, Command: r.recyclableConfig.Command, Args: r.recyclableConfig.Args, VolumeMounts: []api.VolumeMount{ { Name: "vol", MountPath: "/scrub", }, }, }, }, }, } return volume.ScrubPodVolumeAndWatchUntilCompletion(pod, r.host.GetKubeClient()) }