snapshots #10

Merged
jandre merged 69 commits from snapshots into master 2023-04-24 06:49:52 +00:00
Showing only changes of commit b67d300db2 - Show all commits

View File

@ -265,16 +265,29 @@ func (r *BackupConfigurationReconciler) addSidecar(backupConf formolv1alpha1.Bac
r.Log.Error(err, "unable to create RBAC for the sidecar container") r.Log.Error(err, "unable to create RBAC for the sidecar container")
return return
} }
switch target.BackupType { for i, container := range targetPodSpec.Containers {
case formolv1alpha1.OnlineKind: for _, targetContainer := range target.Containers {
sidecarPaths, vms := addOnlineSidecarTags(targetPodSpec, target) if targetContainer.Name == container.Name {
sidecar.Env = append(sidecar.Env, corev1.EnvVar{ // Found a target container. Tag it.
Name: formolv1alpha1.BACKUP_PATHS, targetPodSpec.Containers[i].Env = append(container.Env, corev1.EnvVar{
Value: strings.Join(sidecarPaths, string(os.PathListSeparator)), Name: formolv1alpha1.TARGETCONTAINER_TAG,
}) Value: container.Name,
sidecar.VolumeMounts = vms })
case formolv1alpha1.JobKind: switch target.BackupType {
sidecar.VolumeMounts = addJobSidecarTags(targetPodSpec, target) case formolv1alpha1.OnlineKind:
sidecarPaths, vms := addOnlineSidecarTags(container, targetContainer)
sidecar.Env = append(sidecar.Env, corev1.EnvVar{
Name: formolv1alpha1.BACKUP_PATHS,
Value: strings.Join(sidecarPaths, string(os.PathListSeparator)),
})
sidecar.VolumeMounts = vms
case formolv1alpha1.JobKind:
sidecar.VolumeMounts = addJobSidecarTags(targetPodSpec, i, targetContainer)
case formolv1alpha1.SnapshotKind:
}
}
}
} }
if repo.Spec.Backend.Local != nil { if repo.Spec.Backend.Local != nil {
sidecar.VolumeMounts = append(sidecar.VolumeMounts, corev1.VolumeMount{ sidecar.VolumeMounts = append(sidecar.VolumeMounts, corev1.VolumeMount{
@ -414,76 +427,54 @@ func (r *BackupConfigurationReconciler) createRBACSidecar(sa corev1.ServiceAccou
return nil return nil
} }
func addJobSidecarTags(podSpec *corev1.PodSpec, target formolv1alpha1.Target) (vms []corev1.VolumeMount) { func addJobSidecarTags(podSpec *corev1.PodSpec, index int, targetContainer formolv1alpha1.TargetContainer) (vms []corev1.VolumeMount) {
for i, container := range podSpec.Containers { // Create a shared mount between the target and sidecar container
for _, targetContainer := range target.Containers { // the output of the Job will be saved in the shared volume
if targetContainer.Name == container.Name { // and restic will then backup the content of the volume
// Found a target container. Tag it. var addSharedVol bool = true
podSpec.Containers[i].Env = append(container.Env, corev1.EnvVar{ for _, vol := range podSpec.Volumes {
Name: formolv1alpha1.TARGETCONTAINER_TAG, if vol.Name == formolv1alpha1.FORMOL_SHARED_VOLUME {
Value: container.Name, addSharedVol = false
})
// Create a shared mount between the target and sidecar container
// the output of the Job will be saved in the shared volume
// and restic will then backup the content of the volume
var addSharedVol bool = true
for _, vol := range podSpec.Volumes {
if vol.Name == formolv1alpha1.FORMOL_SHARED_VOLUME {
addSharedVol = false
}
}
if addSharedVol {
podSpec.Volumes = append(podSpec.Volumes,
corev1.Volume{
Name: formolv1alpha1.FORMOL_SHARED_VOLUME,
VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{}},
})
}
podSpec.Containers[i].VolumeMounts = append(podSpec.Containers[i].VolumeMounts, corev1.VolumeMount{
Name: formolv1alpha1.FORMOL_SHARED_VOLUME,
MountPath: targetContainer.SharePath,
})
vms = append(vms, corev1.VolumeMount{
Name: formolv1alpha1.FORMOL_SHARED_VOLUME,
MountPath: targetContainer.SharePath,
})
}
} }
} }
if addSharedVol {
podSpec.Volumes = append(podSpec.Volumes,
corev1.Volume{
Name: formolv1alpha1.FORMOL_SHARED_VOLUME,
VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{}},
})
}
podSpec.Containers[index].VolumeMounts = append(podSpec.Containers[index].VolumeMounts, corev1.VolumeMount{
Name: formolv1alpha1.FORMOL_SHARED_VOLUME,
MountPath: targetContainer.SharePath,
})
vms = append(vms, corev1.VolumeMount{
Name: formolv1alpha1.FORMOL_SHARED_VOLUME,
MountPath: targetContainer.SharePath,
})
return return
} }
func addOnlineSidecarTags(podSpec *corev1.PodSpec, target formolv1alpha1.Target) (sidecarPaths []string, vms []corev1.VolumeMount) { func addOnlineSidecarTags(container corev1.Container, targetContainer formolv1alpha1.TargetContainer) (sidecarPaths []string, vms []corev1.VolumeMount) {
for i, container := range podSpec.Containers { // targetContainer.Paths are the paths to backup
for _, targetContainer := range target.Containers { // We have to find what volumes are mounted under those paths
if targetContainer.Name == container.Name { // and mount them under a path that exists in the sidecar container
// Found a target container. Tag it. for i, path := range targetContainer.Paths {
podSpec.Containers[i].Env = append(container.Env, corev1.EnvVar{ vm := corev1.VolumeMount{ReadOnly: true}
Name: formolv1alpha1.TARGETCONTAINER_TAG, var longest int = 0
Value: container.Name, var sidecarPath string
}) for _, volumeMount := range container.VolumeMounts {
// targetContainer.Paths are the paths to backup // if strings.HasPrefix(path, volumeMount.MountPath) && len(volumeMount.MountPath) > longest {
// We have to find what volumes are mounted under those paths if rel, err := filepath.Rel(volumeMount.MountPath, path); err == nil && len(volumeMount.MountPath) > longest {
// and mount them under a path that exists in the sidecar container longest = len(volumeMount.MountPath)
for i, path := range targetContainer.Paths { vm.Name = volumeMount.Name
vm := corev1.VolumeMount{ReadOnly: true} vm.MountPath = fmt.Sprintf("/%s%d", formolv1alpha1.BACKUP_PREFIX_PATH, i)
var longest int = 0 vm.SubPath = volumeMount.SubPath
var sidecarPath string sidecarPath = filepath.Join(vm.MountPath, rel)
for _, volumeMount := range container.VolumeMounts {
// if strings.HasPrefix(path, volumeMount.MountPath) && len(volumeMount.MountPath) > longest {
if rel, err := filepath.Rel(volumeMount.MountPath, path); err == nil && len(volumeMount.MountPath) > longest {
longest = len(volumeMount.MountPath)
vm.Name = volumeMount.Name
vm.MountPath = fmt.Sprintf("/%s%d", formolv1alpha1.BACKUP_PREFIX_PATH, i)
vm.SubPath = volumeMount.SubPath
sidecarPath = filepath.Join(vm.MountPath, rel)
}
}
vms = append(vms, vm)
sidecarPaths = append(sidecarPaths, sidecarPath)
}
} }
} }
vms = append(vms, vm)
sidecarPaths = append(sidecarPaths, sidecarPath)
} }
return return
} }