mirror of
https://github.com/vmware-tanzu/velero.git
synced 2026-08-21 06:36:06 +00:00
109 lines
3.1 KiB
Go
109 lines
3.1 KiB
Go
/*
|
|
Copyright the Velero contributors.
|
|
|
|
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 podvolume
|
|
|
|
import (
|
|
"strings"
|
|
|
|
corev1api "k8s.io/api/core/v1"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
|
|
velerov1api "github.com/vmware-tanzu/velero/pkg/apis/velero/v1"
|
|
)
|
|
|
|
// GetVolumesByPod returns a list of volume names to backup for the provided pod.
|
|
func GetVolumesByPod(pod *corev1api.Pod, defaultVolumesToFsBackup bool) ([]string, []string) {
|
|
// tracks the volumes that have been explicitly opted out of backup via the annotation in the pod
|
|
optedOutVolumes := make([]string, 0)
|
|
|
|
if !defaultVolumesToFsBackup {
|
|
return GetVolumesToBackup(pod), optedOutVolumes
|
|
}
|
|
|
|
volsToExclude := getVolumesToExclude(pod)
|
|
podVolumes := []string{}
|
|
for _, pv := range pod.Spec.Volumes {
|
|
// cannot backup hostpath volumes as they are not mounted into /var/lib/kubelet/pods
|
|
// and therefore not accessible to the node agent daemon set.
|
|
if pv.HostPath != nil {
|
|
continue
|
|
}
|
|
// don't backup volumes mounting secrets. Secrets will be backed up separately.
|
|
if pv.Secret != nil {
|
|
continue
|
|
}
|
|
// don't backup volumes mounting ConfigMaps. ConfigMaps will be backed up separately.
|
|
if pv.ConfigMap != nil {
|
|
continue
|
|
}
|
|
// don't backup volumes mounted as projected volumes, all data in those come from kube state.
|
|
if pv.Projected != nil {
|
|
continue
|
|
}
|
|
// don't backup DownwardAPI volumes, all data in those come from kube state.
|
|
if pv.DownwardAPI != nil {
|
|
continue
|
|
}
|
|
// don't backup volumes that are included in the exclude list.
|
|
if contains(volsToExclude, pv.Name) {
|
|
optedOutVolumes = append(optedOutVolumes, pv.Name)
|
|
continue
|
|
}
|
|
// don't include volumes that mount the default service account token.
|
|
if strings.HasPrefix(pv.Name, "default-token") {
|
|
continue
|
|
}
|
|
podVolumes = append(podVolumes, pv.Name)
|
|
}
|
|
return podVolumes, optedOutVolumes
|
|
}
|
|
|
|
// GetVolumesToBackup returns a list of volume names to backup for
|
|
// the provided pod.
|
|
// Deprecated: Use GetVolumesByPod instead.
|
|
func GetVolumesToBackup(obj metav1.Object) []string {
|
|
annotations := obj.GetAnnotations()
|
|
if annotations == nil {
|
|
return nil
|
|
}
|
|
|
|
backupsValue := annotations[velerov1api.VolumesToBackupAnnotation]
|
|
if backupsValue == "" {
|
|
return nil
|
|
}
|
|
|
|
return strings.Split(backupsValue, ",")
|
|
}
|
|
|
|
func getVolumesToExclude(obj metav1.Object) []string {
|
|
annotations := obj.GetAnnotations()
|
|
if annotations == nil {
|
|
return nil
|
|
}
|
|
|
|
return strings.Split(annotations[velerov1api.VolumesToExcludeAnnotation], ",")
|
|
}
|
|
|
|
func contains(list []string, k string) bool {
|
|
for _, i := range list {
|
|
if i == k {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|