mirror of
https://github.com/vmware-tanzu/velero.git
synced 2026-09-20 15:04:17 +00:00
Pass Velero server command args to the plugins
Pass Velero server command args to the plugins Fixes #7806 Signed-off-by: Wenkai Yin(尹文开) <yinw@vmware.com>
This commit is contained in:
@@ -1,92 +0,0 @@
|
||||
/*
|
||||
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 restore
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
prioritySeparator = "-"
|
||||
)
|
||||
|
||||
// Priorities defines the desired order of resource operations:
|
||||
// Resources in the HighPriorities list will be handled first
|
||||
// Resources in the LowPriorities list will be handled last
|
||||
// Other resources will be handled alphabetically after the high prioritized resources and before the low prioritized resources
|
||||
type Priorities struct {
|
||||
HighPriorities []string
|
||||
LowPriorities []string
|
||||
}
|
||||
|
||||
// String returns a string representation of Priority.
|
||||
func (p *Priorities) String() string {
|
||||
priorities := p.HighPriorities
|
||||
if len(p.LowPriorities) > 0 {
|
||||
priorities = append(priorities, prioritySeparator)
|
||||
priorities = append(priorities, p.LowPriorities...)
|
||||
}
|
||||
return strings.Join(priorities, ",")
|
||||
}
|
||||
|
||||
// Set parses the provided string to the priority object
|
||||
func (p *Priorities) Set(s string) error {
|
||||
if len(s) == 0 {
|
||||
return nil
|
||||
}
|
||||
strs := strings.Split(s, ",")
|
||||
separatorIndex := -1
|
||||
for i, str := range strs {
|
||||
if str == prioritySeparator {
|
||||
if separatorIndex > -1 {
|
||||
return fmt.Errorf("multiple priority separator %q found", prioritySeparator)
|
||||
}
|
||||
separatorIndex = i
|
||||
}
|
||||
}
|
||||
// has no separator
|
||||
if separatorIndex == -1 {
|
||||
p.HighPriorities = strs
|
||||
return nil
|
||||
}
|
||||
// start with separator
|
||||
if separatorIndex == 0 {
|
||||
// contain only separator
|
||||
if len(strs) == 1 {
|
||||
return nil
|
||||
}
|
||||
p.LowPriorities = strs[1:]
|
||||
return nil
|
||||
}
|
||||
// end with separator
|
||||
if separatorIndex == len(strs)-1 {
|
||||
p.HighPriorities = strs[:len(strs)-1]
|
||||
return nil
|
||||
}
|
||||
|
||||
// separator in the middle
|
||||
p.HighPriorities = strs[:separatorIndex]
|
||||
p.LowPriorities = strs[separatorIndex+1:]
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Type specifies the flag type
|
||||
func (p *Priorities) Type() string {
|
||||
return "stringArray"
|
||||
}
|
||||
@@ -1,110 +0,0 @@
|
||||
/*
|
||||
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 restore
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestStringOfPriorities(t *testing.T) {
|
||||
priority := Priorities{
|
||||
HighPriorities: []string{"high"},
|
||||
}
|
||||
assert.Equal(t, "high", priority.String())
|
||||
|
||||
priority = Priorities{
|
||||
HighPriorities: []string{"high"},
|
||||
LowPriorities: []string{"low"},
|
||||
}
|
||||
assert.Equal(t, "high,-,low", priority.String())
|
||||
}
|
||||
|
||||
func TestSetOfPriority(t *testing.T) {
|
||||
cases := []struct {
|
||||
name string
|
||||
input string
|
||||
priorities Priorities
|
||||
hasErr bool
|
||||
}{
|
||||
{
|
||||
name: "empty input",
|
||||
input: "",
|
||||
priorities: Priorities{},
|
||||
hasErr: false,
|
||||
},
|
||||
{
|
||||
name: "only high priorities",
|
||||
input: "p0",
|
||||
priorities: Priorities{
|
||||
HighPriorities: []string{"p0"},
|
||||
},
|
||||
hasErr: false,
|
||||
},
|
||||
{
|
||||
name: "only low priorities",
|
||||
input: "-,p9",
|
||||
priorities: Priorities{
|
||||
LowPriorities: []string{"p9"},
|
||||
},
|
||||
hasErr: false,
|
||||
},
|
||||
{
|
||||
name: "only separator",
|
||||
input: "-",
|
||||
priorities: Priorities{},
|
||||
hasErr: false,
|
||||
},
|
||||
{
|
||||
name: "multiple separators",
|
||||
input: "-,-",
|
||||
priorities: Priorities{},
|
||||
hasErr: true,
|
||||
},
|
||||
{
|
||||
name: "contain both high and low priorities",
|
||||
input: "p0,p1,p2,-,p9",
|
||||
priorities: Priorities{
|
||||
HighPriorities: []string{"p0", "p1", "p2"},
|
||||
LowPriorities: []string{"p9"},
|
||||
},
|
||||
hasErr: false,
|
||||
},
|
||||
{
|
||||
name: "end with separator",
|
||||
input: "p0,-",
|
||||
priorities: Priorities{
|
||||
HighPriorities: []string{"p0"},
|
||||
},
|
||||
hasErr: false,
|
||||
},
|
||||
}
|
||||
for _, c := range cases {
|
||||
t.Run(c.name, func(t *testing.T) {
|
||||
p := Priorities{}
|
||||
err := p.Set(c.input)
|
||||
if c.hasErr {
|
||||
require.Error(t, err)
|
||||
} else {
|
||||
require.NoError(t, err)
|
||||
}
|
||||
assert.Equal(t, c.priorities, p)
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -67,6 +67,7 @@ import (
|
||||
vsv1 "github.com/vmware-tanzu/velero/pkg/plugin/velero/volumesnapshotter/v1"
|
||||
"github.com/vmware-tanzu/velero/pkg/podexec"
|
||||
"github.com/vmware-tanzu/velero/pkg/podvolume"
|
||||
"github.com/vmware-tanzu/velero/pkg/types"
|
||||
"github.com/vmware-tanzu/velero/pkg/util/boolptr"
|
||||
"github.com/vmware-tanzu/velero/pkg/util/collections"
|
||||
csiutil "github.com/vmware-tanzu/velero/pkg/util/csi"
|
||||
@@ -106,7 +107,7 @@ type kubernetesRestorer struct {
|
||||
podVolumeTimeout time.Duration
|
||||
resourceTerminatingTimeout time.Duration
|
||||
resourceTimeout time.Duration
|
||||
resourcePriorities Priorities
|
||||
resourcePriorities types.Priorities
|
||||
fileSystem filesystem.Interface
|
||||
pvRenamer func(string) (string, error)
|
||||
logger logrus.FieldLogger
|
||||
@@ -121,7 +122,7 @@ type kubernetesRestorer struct {
|
||||
func NewKubernetesRestorer(
|
||||
discoveryHelper discovery.Helper,
|
||||
dynamicFactory client.DynamicFactory,
|
||||
resourcePriorities Priorities,
|
||||
resourcePriorities types.Priorities,
|
||||
namespaceClient corev1.NamespaceInterface,
|
||||
podVolumeRestorerFactory podvolume.RestorerFactory,
|
||||
podVolumeTimeout time.Duration,
|
||||
@@ -359,7 +360,7 @@ type restoreContext struct {
|
||||
renamedPVs map[string]string
|
||||
pvRenamer func(string) (string, error)
|
||||
discoveryHelper discovery.Helper
|
||||
resourcePriorities Priorities
|
||||
resourcePriorities types.Priorities
|
||||
kbClient crclient.Client
|
||||
itemOperationsList *[]*itemoperation.RestoreOperation
|
||||
resourceModifiers *resourcemodifiers.ResourceModifiers
|
||||
@@ -386,7 +387,7 @@ type informerFactoryWithContext struct {
|
||||
// begins with all of the high prioritized resources (in order), ends with all of
|
||||
// the low prioritized resources(in order), and an alphabetized list of resources
|
||||
// in the backup(pick out the prioritized resources) is put in the middle.
|
||||
func getOrderedResources(resourcePriorities Priorities, backupResources map[string]*archive.ResourceItems) []string {
|
||||
func getOrderedResources(resourcePriorities types.Priorities, backupResources map[string]*archive.ResourceItems) []string {
|
||||
priorities := map[string]struct{}{}
|
||||
for _, priority := range resourcePriorities.HighPriorities {
|
||||
priorities[priority] = struct{}{}
|
||||
@@ -515,7 +516,7 @@ func (ctx *restoreContext) execute() (results.Result, results.Result) {
|
||||
backupResources,
|
||||
make([]restoreableResource, 0),
|
||||
sets.New[string](),
|
||||
Priorities{HighPriorities: []string{"customresourcedefinitions"}},
|
||||
types.Priorities{HighPriorities: []string{"customresourcedefinitions"}},
|
||||
false,
|
||||
)
|
||||
warnings.Merge(&w)
|
||||
@@ -2156,7 +2157,7 @@ func (ctx *restoreContext) getOrderedResourceCollection(
|
||||
backupResources map[string]*archive.ResourceItems,
|
||||
restoreResourceCollection []restoreableResource,
|
||||
processedResources sets.Set[string],
|
||||
resourcePriorities Priorities,
|
||||
resourcePriorities types.Priorities,
|
||||
includeAllResources bool,
|
||||
) ([]restoreableResource, sets.Set[string], results.Result, results.Result) {
|
||||
var warnings, errs results.Result
|
||||
|
||||
@@ -57,6 +57,7 @@ import (
|
||||
"github.com/vmware-tanzu/velero/pkg/podvolume"
|
||||
uploadermocks "github.com/vmware-tanzu/velero/pkg/podvolume/mocks"
|
||||
"github.com/vmware-tanzu/velero/pkg/test"
|
||||
"github.com/vmware-tanzu/velero/pkg/types"
|
||||
kubeutil "github.com/vmware-tanzu/velero/pkg/util/kube"
|
||||
. "github.com/vmware-tanzu/velero/pkg/util/results"
|
||||
)
|
||||
@@ -870,7 +871,7 @@ func TestRestoreResourcePriorities(t *testing.T) {
|
||||
backup *velerov1api.Backup
|
||||
apiResources []*test.APIResource
|
||||
tarball io.Reader
|
||||
resourcePriorities Priorities
|
||||
resourcePriorities types.Priorities
|
||||
}{
|
||||
{
|
||||
name: "resources are restored according to the specified resource priorities",
|
||||
@@ -904,7 +905,7 @@ func TestRestoreResourcePriorities(t *testing.T) {
|
||||
test.Deployments(),
|
||||
test.ServiceAccounts(),
|
||||
},
|
||||
resourcePriorities: Priorities{
|
||||
resourcePriorities: types.Priorities{
|
||||
HighPriorities: []string{"persistentvolumes", "persistentvolumeclaims", "serviceaccounts"},
|
||||
LowPriorities: []string{"deployments.apps"},
|
||||
},
|
||||
@@ -3192,7 +3193,7 @@ func TestRestorePersistentVolumes(t *testing.T) {
|
||||
for _, tc := range tests {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
h := newHarness(t)
|
||||
h.restorer.resourcePriorities = Priorities{HighPriorities: []string{"persistentvolumes", "persistentvolumeclaims"}}
|
||||
h.restorer.resourcePriorities = types.Priorities{HighPriorities: []string{"persistentvolumes", "persistentvolumeclaims"}}
|
||||
h.restorer.pvRenamer = func(oldName string) (string, error) {
|
||||
renamed := "renamed-" + oldName
|
||||
return renamed, nil
|
||||
@@ -3519,19 +3520,19 @@ func TestIsCompleted(t *testing.T) {
|
||||
func Test_getOrderedResources(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
resourcePriorities Priorities
|
||||
resourcePriorities types.Priorities
|
||||
backupResources map[string]*archive.ResourceItems
|
||||
want []string
|
||||
}{
|
||||
{
|
||||
name: "when only priorities are specified, they're returned in order",
|
||||
resourcePriorities: Priorities{HighPriorities: []string{"prio-3", "prio-2", "prio-1"}},
|
||||
resourcePriorities: types.Priorities{HighPriorities: []string{"prio-3", "prio-2", "prio-1"}},
|
||||
backupResources: nil,
|
||||
want: []string{"prio-3", "prio-2", "prio-1"},
|
||||
},
|
||||
{
|
||||
name: "when only backup resources are specified, they're returned in alphabetical order",
|
||||
resourcePriorities: Priorities{},
|
||||
resourcePriorities: types.Priorities{},
|
||||
backupResources: map[string]*archive.ResourceItems{
|
||||
"backup-resource-3": nil,
|
||||
"backup-resource-2": nil,
|
||||
@@ -3541,7 +3542,7 @@ func Test_getOrderedResources(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "when priorities and backup resources are specified, they're returned in the correct order",
|
||||
resourcePriorities: Priorities{HighPriorities: []string{"prio-3", "prio-2", "prio-1"}},
|
||||
resourcePriorities: types.Priorities{HighPriorities: []string{"prio-3", "prio-2", "prio-1"}},
|
||||
backupResources: map[string]*archive.ResourceItems{
|
||||
"prio-3": nil,
|
||||
"backup-resource-3": nil,
|
||||
@@ -3552,7 +3553,7 @@ func Test_getOrderedResources(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "when priorities and backup resources are specified, they're returned in the correct order",
|
||||
resourcePriorities: Priorities{HighPriorities: []string{"prio-3", "prio-2", "prio-1"}, LowPriorities: []string{"prio-0"}},
|
||||
resourcePriorities: types.Priorities{HighPriorities: []string{"prio-3", "prio-2", "prio-1"}, LowPriorities: []string{"prio-0"}},
|
||||
backupResources: map[string]*archive.ResourceItems{
|
||||
"prio-3": nil,
|
||||
"prio-0": nil,
|
||||
|
||||
Reference in New Issue
Block a user