/
volumesnapshotclass_action.go
77 lines (61 loc) · 3.12 KB
/
volumesnapshotclass_action.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/*
Copyright 2020 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 backup
import (
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
snapshotv1api "github.com/kubernetes-csi/external-snapshotter/client/v4/apis/volumesnapshot/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"github.com/vmware-tanzu/velero-plugin-for-csi/internal/util"
velerov1api "github.com/vmware-tanzu/velero/pkg/apis/velero/v1"
"github.com/vmware-tanzu/velero/pkg/plugin/velero"
)
// VolumeSnapshotClassBackupItemAction is a backup item action plugin to backup
// CSI VolumeSnapshotclass objects using Velero
type VolumeSnapshotClassBackupItemAction struct {
Log logrus.FieldLogger
}
// AppliesTo returns information indicating that the VolumeSnapshotClassBackupItemAction action should be invoked to backup volumesnapshotclass.
func (p *VolumeSnapshotClassBackupItemAction) AppliesTo() (velero.ResourceSelector, error) {
p.Log.Debug("VolumeSnapshotClassBackupItemAction AppliesTo")
return velero.ResourceSelector{
IncludedResources: []string{"volumesnapshotclass.snapshot.storage.k8s.io"},
}, nil
}
// Execute backs up a VolumeSnapshotClass object and returns as additional items any snapshot lister secret that may be referenced in its annotations.
func (p *VolumeSnapshotClassBackupItemAction) Execute(item runtime.Unstructured, backup *velerov1api.Backup) (runtime.Unstructured, []velero.ResourceIdentifier, error) {
p.Log.Infof("Executing VolumeSnapshotClassBackupItemAction")
var snapClass snapshotv1api.VolumeSnapshotClass
if err := runtime.DefaultUnstructuredConverter.FromUnstructured(item.UnstructuredContent(), &snapClass); err != nil {
return nil, nil, errors.WithStack(err)
}
additionalItems := []velero.ResourceIdentifier{}
if util.IsVolumeSnapshotClassHasListerSecret(&snapClass) {
additionalItems = append(additionalItems, velero.ResourceIdentifier{
GroupResource: schema.GroupResource{Group: "", Resource: "secrets"},
Name: snapClass.Annotations[util.PrefixedSnapshotterListSecretNameKey],
Namespace: snapClass.Annotations[util.PrefixedSnapshotterListSecretNamespaceKey],
})
util.AddAnnotations(&snapClass.ObjectMeta, map[string]string{
util.MustIncludeAdditionalItemAnnotation: "true",
})
}
snapClassMap, err := runtime.DefaultUnstructuredConverter.ToUnstructured(&snapClass)
if err != nil {
return nil, nil, errors.WithStack(err)
}
p.Log.Infof("Returning from VolumeSnapshotClassBackupItemAction with %d additionalItems to backup", len(additionalItems))
return &unstructured.Unstructured{Object: snapClassMap}, additionalItems, nil
}