Skip to content

Commit

Permalink
Merge pull request #7630 from reasonerjt/restore-vol-info
Browse files Browse the repository at this point in the history
Track and persist restore volume info
  • Loading branch information
ywk253100 committed Apr 12, 2024
2 parents ab57112 + 0a280e5 commit 3c377bc
Show file tree
Hide file tree
Showing 33 changed files with 1,116 additions and 387 deletions.
1 change: 1 addition & 0 deletions changelogs/unreleased/7630-reasonerjt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Track and persist restore volume info
42 changes: 42 additions & 0 deletions internal/volume/utils.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/*
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 volume

import (
"regexp"
)

// it has to have the same value as "github.com/vmware-tanzu/velero/pkg/restore".ItemRestoreResultCreated
const itemRestoreResultCreated = "created"

// RestoredPVCFromRestoredResourceList returns a set of PVCs that were restored from the given restoredResourceList.
func RestoredPVCFromRestoredResourceList(restoredResourceList map[string][]string) map[string]struct{} {
pvcKey := "v1/PersistentVolumeClaim"
pvcList := make(map[string]struct{})

for _, pvc := range restoredResourceList[pvcKey] {
// the format of pvc string in restoredResourceList is like: "namespace/pvcName(status)"
// extract the substring before "(created)" if the status in rightmost Parenthesis is "created"
r := regexp.MustCompile(`\(([^)]+)\)`)
matches := r.FindAllStringSubmatch(pvc, -1)
if len(matches) > 0 && matches[len(matches)-1][1] == itemRestoreResultCreated {
pvcList[pvc[:len(pvc)-len("(created)")]] = struct{}{}
}
}

return pvcList
}
57 changes: 57 additions & 0 deletions internal/volume/utils_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
/*
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 volume

import (
"testing"

"github.com/stretchr/testify/assert"
)

func TestGetRestoredPVCFromRestoredResourceList(t *testing.T) {
// test empty list
restoredResourceList := map[string][]string{}
actual := RestoredPVCFromRestoredResourceList(restoredResourceList)
assert.Empty(t, actual)

// test no match
restoredResourceList = map[string][]string{
"v1/PersistentVolumeClaim": {
"namespace1/pvc1(updated)",
},
"v1/PersistentVolume": {
"namespace1/pv(created)",
},
}
actual = RestoredPVCFromRestoredResourceList(restoredResourceList)
assert.Empty(t, actual)

// test matches
restoredResourceList = map[string][]string{
"v1/PersistentVolumeClaim": {
"namespace1/pvc1(created)",
"namespace2/pvc2(updated)",
"namespace3/pvc(3)(created)",
},
}
expected := map[string]struct{}{
"namespace1/pvc1": {},
"namespace3/pvc(3)": {},
}
actual = RestoredPVCFromRestoredResourceList(restoredResourceList)
assert.Equal(t, expected, actual)
}
Loading

0 comments on commit 3c377bc

Please sign in to comment.