// 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()) }