|
1 | 1 | package snapshot |
2 | 2 |
|
3 | 3 | import ( |
4 | | - ebsv1alpha1 "ebs-snapshot-provision.operators.infra/api/v1alpha1" |
| 4 | + "fmt" |
| 5 | + "regexp" |
| 6 | + "time" |
| 7 | + |
5 | 8 | snapv1 "github.com/kubernetes-csi/external-snapshotter/client/v6/apis/volumesnapshot/v1" |
6 | 9 | core_v1 "k8s.io/api/core/v1" |
7 | 10 | metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" |
8 | 11 |
|
| 12 | + ebsv1alpha1 "ebs-snapshot-provision.operators.infra/api/v1alpha1" |
9 | 13 | "ebs-snapshot-provision.operators.infra/internal/aws" |
10 | 14 | ) |
11 | 15 |
|
| 16 | +const ( |
| 17 | + snapshotTimeLayout = "200601021504" |
| 18 | +) |
| 19 | + |
12 | 20 | var ( |
13 | 21 | volumeSnapshotMeta = metav1.TypeMeta{ |
14 | 22 | APIVersion: "snapshot.storage.k8s.io/v1", |
|
21 | 29 | } |
22 | 30 |
|
23 | 31 | volumeSnapshotContentSourceVolumeMode = core_v1.PersistentVolumeFilesystem |
| 32 | + snapshotTimeRe = regexp.MustCompile(`(\d{12})$`) |
24 | 33 | ) |
25 | 34 |
|
26 | 35 | type InputFromCRD struct { |
@@ -71,11 +80,20 @@ func (sg *DefaultSnapshotCreator) CreateVolumeSnapshots(input *InputFromCRD) ([] |
71 | 80 |
|
72 | 81 | } |
73 | 82 |
|
| 83 | + labels := make(map[string]string) |
| 84 | + snapshotTime, err := extractTimeFromName(name) |
| 85 | + if err != nil { |
| 86 | + return nil, nil, err |
| 87 | + } |
| 88 | + |
| 89 | + labels["snapscheduler.backube/when"] = snapshotTime |
| 90 | + |
74 | 91 | volumeSnapshots = append(volumeSnapshots, snapv1.VolumeSnapshot{ |
75 | 92 | TypeMeta: volumeSnapshotMeta, |
76 | 93 | ObjectMeta: metav1.ObjectMeta{ |
77 | 94 | Namespace: namespace, |
78 | 95 | Name: name, |
| 96 | + Labels: labels, |
79 | 97 | }, |
80 | 98 | Spec: snapv1.VolumeSnapshotSpec{ |
81 | 99 | VolumeSnapshotClassName: &input.CRD.Spec.VolumeSnapshotClassName, |
@@ -112,3 +130,17 @@ func (sg *DefaultSnapshotCreator) CreateVolumeSnapshots(input *InputFromCRD) ([] |
112 | 130 |
|
113 | 131 | return volumeSnapshots, volumeSnapshotContents, nil |
114 | 132 | } |
| 133 | + |
| 134 | +func extractTimeFromName(name string) (string, error) { |
| 135 | + match := snapshotTimeRe.FindString(name) |
| 136 | + if match == "" { |
| 137 | + return "", fmt.Errorf("timestamp not found in snapshot name %q", name) |
| 138 | + } |
| 139 | + |
| 140 | + t, err := time.Parse(snapshotTimeLayout, match) |
| 141 | + if err != nil { |
| 142 | + return "", fmt.Errorf("failed to parse timestamp %q from snapshot name %q: %w", match, name, err) |
| 143 | + } |
| 144 | + |
| 145 | + return t.Format(snapshotTimeLayout), nil |
| 146 | +} |
0 commit comments