mirror of
https://github.com/vmware-tanzu/velero.git
synced 2026-08-15 11:46:06 +00:00
Merge branch 'vmware-tanzu:main' into main
This commit is contained in:
@@ -16,6 +16,7 @@ reviewers:
|
||||
- blackpiglet
|
||||
- qiuming-best
|
||||
- shubham-pampattiwar
|
||||
- Lyndon-Li
|
||||
|
||||
tech-writer:
|
||||
- a-mccarthy
|
||||
|
||||
@@ -14,7 +14,7 @@ jobs:
|
||||
- name: Set up Go
|
||||
uses: actions/setup-go@v2
|
||||
with:
|
||||
go-version: 1.16
|
||||
go-version: 1.17
|
||||
id: go
|
||||
# Look for a CLI that's made for this PR
|
||||
- name: Fetch built CLI
|
||||
@@ -64,6 +64,8 @@ jobs:
|
||||
- 1.20.2
|
||||
- 1.21.1
|
||||
- 1.22.0
|
||||
- 1.23.6
|
||||
- 1.24.2
|
||||
# All steps run in parallel unless otherwise specified.
|
||||
# See https://docs.github.com/en/actions/learn-github-actions/managing-complex-workflows#creating-dependent-jobs
|
||||
steps:
|
||||
@@ -81,7 +83,7 @@ jobs:
|
||||
velero-${{ github.event.pull_request.number }}-
|
||||
- uses: engineerd/setup-kind@v0.5.0
|
||||
with:
|
||||
version: "v0.11.1"
|
||||
version: "v0.14.0"
|
||||
image: "kindest/node:v${{ matrix.k8s }}"
|
||||
- name: Install CRDs
|
||||
run: |
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
name: Move new issues into Triage
|
||||
|
||||
on:
|
||||
issues:
|
||||
types: [opened]
|
||||
|
||||
jobs:
|
||||
automate-project-columns:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: alex-page/github-project-automation-plus@v0.3.0
|
||||
with:
|
||||
project: "Velero Support Board"
|
||||
column: "New"
|
||||
repo-token: ${{ secrets.GH_TOKEN }}
|
||||
@@ -14,7 +14,7 @@ jobs:
|
||||
uses: codespell-project/actions-codespell@master
|
||||
with:
|
||||
# ignore the config/.../crd.go file as it's generated binary data that is edited elswhere.
|
||||
skip: .git,*.png,*.jpg,*.woff,*.ttf,*.gif,*.ico,./config/crd/v1beta1/crds/crds.go,./config/crd/v1/crds/crds.go
|
||||
skip: .git,*.png,*.jpg,*.woff,*.ttf,*.gif,*.ico,./config/crd/v1beta1/crds/crds.go,./config/crd/v1/crds/crds.go,./go.sum
|
||||
ignore_words_list: iam,aks,ist,bridget,ue
|
||||
check_filenames: true
|
||||
check_hidden: true
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
| Xun Jiang | [blackpiglet](https://github.com/blackpiglet) | [VMware](https://www.github.com/vmware/) |
|
||||
| Ming Qiu | [qiuming-best](https://github.com/qiuming-best) | [VMware](https://www.github.com/vmware/) |
|
||||
| Shubham Pampattiwar | [shubham-pampattiwar](https://github.com/shubham-pampattiwar) | [OpenShift](https://github.com/openshift)
|
||||
| Yonghui Li | [Lyndon-Li](https://github.com/Lyndon-Li) | [VMware](https://www.github.com/vmware/) |
|
||||
|
||||
## Emeritus Maintainers
|
||||
* Adnan Abdulhussein ([prydonius](https://github.com/prydonius))
|
||||
|
||||
@@ -163,6 +163,7 @@ shell: build-dirs build-env
|
||||
@# under $GOPATH).
|
||||
@docker run \
|
||||
-e GOFLAGS \
|
||||
-e GOPROXY \
|
||||
-i $(TTY) \
|
||||
--rm \
|
||||
-u $$(id -u):$$(id -g) \
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
Delete opened issues triage action.
|
||||
@@ -0,0 +1 @@
|
||||
Fix typo in doc, in https://velero.io/docs/main/restore-reference/ "Restore order" section, "Mamespace" should be "Namespace".
|
||||
@@ -0,0 +1 @@
|
||||
Modify Github actions.
|
||||
@@ -0,0 +1 @@
|
||||
Move 'velero.io/exclude-from-backup' label string to const
|
||||
@@ -0,0 +1 @@
|
||||
Fix bsl validation bug: the BSL is validated continually and doesn't respect the validation period configured
|
||||
@@ -0,0 +1 @@
|
||||
Dump stack trace when the plugin server handles panic
|
||||
@@ -0,0 +1 @@
|
||||
Modify BackupStoreGetter to avoid BSL spec changes
|
||||
@@ -0,0 +1 @@
|
||||
Let "make shell xxx" respect GOPROXY
|
||||
@@ -61,6 +61,11 @@ type itemBackupper struct {
|
||||
snapshotLocationVolumeSnapshotters map[string]velero.VolumeSnapshotter
|
||||
}
|
||||
|
||||
const (
|
||||
// veleroExcludeFromBackupLabel labeled item should be exclude by velero in backup job.
|
||||
veleroExcludeFromBackupLabel = "velero.io/exclude-from-backup"
|
||||
)
|
||||
|
||||
// backupItem backs up an individual item to tarWriter. The item may be excluded based on the
|
||||
// namespaces IncludesExcludes list.
|
||||
// In addition to the error return, backupItem also returns a bool indicating whether the item
|
||||
@@ -78,8 +83,8 @@ func (ib *itemBackupper) backupItem(logger logrus.FieldLogger, obj runtime.Unstr
|
||||
log = log.WithField("resource", groupResource.String())
|
||||
log = log.WithField("namespace", namespace)
|
||||
|
||||
if metadata.GetLabels()["velero.io/exclude-from-backup"] == "true" {
|
||||
log.Info("Excluding item because it has label velero.io/exclude-from-backup=true")
|
||||
if metadata.GetLabels()[veleroExcludeFromBackupLabel] == "true" {
|
||||
log.Infof("Excluding item because it has label %s=true", veleroExcludeFromBackupLabel)
|
||||
return false, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -24,12 +24,10 @@ import (
|
||||
"github.com/pkg/errors"
|
||||
"github.com/sirupsen/logrus"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
ctrl "sigs.k8s.io/controller-runtime"
|
||||
"sigs.k8s.io/controller-runtime/pkg/builder"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||
"sigs.k8s.io/controller-runtime/pkg/event"
|
||||
"sigs.k8s.io/controller-runtime/pkg/predicate"
|
||||
|
||||
"github.com/vmware-tanzu/velero/internal/storage"
|
||||
velerov1api "github.com/vmware-tanzu/velero/pkg/apis/velero/v1"
|
||||
@@ -39,7 +37,10 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
backupStorageLocationSyncPeriod = 1 * time.Minute
|
||||
// keep the enqueue period a smaller value to make sure the BSL can be validated as expected.
|
||||
// The BSL validation frequency is 1 minute by default, if we set the enqueue period as 1 minute,
|
||||
// this will cause the actual validation interval for each BSL to be 2 minutes
|
||||
bslValidationEnqueuePeriod = 10 * time.Second
|
||||
)
|
||||
|
||||
// BackupStorageLocationReconciler reconciles a BackupStorageLocation object
|
||||
@@ -185,7 +186,7 @@ func (r *BackupStorageLocationReconciler) SetupWithManager(mgr ctrl.Manager) err
|
||||
r.Log,
|
||||
mgr.GetClient(),
|
||||
&velerov1api.BackupStorageLocationList{},
|
||||
backupStorageLocationSyncPeriod,
|
||||
bslValidationEnqueuePeriod,
|
||||
// Add filter function to enqueue BSL per ValidationFrequency setting.
|
||||
func(object client.Object) bool {
|
||||
location := object.(*velerov1api.BackupStorageLocation)
|
||||
@@ -193,22 +194,8 @@ func (r *BackupStorageLocationReconciler) SetupWithManager(mgr ctrl.Manager) err
|
||||
},
|
||||
)
|
||||
return ctrl.NewControllerManagedBy(mgr).
|
||||
For(&velerov1api.BackupStorageLocation{}).
|
||||
// Handle BSL's creation event and spec update event to let changed BSL got validation immediately.
|
||||
WithEventFilter(predicate.Funcs{
|
||||
CreateFunc: func(ce event.CreateEvent) bool {
|
||||
return true
|
||||
},
|
||||
UpdateFunc: func(ue event.UpdateEvent) bool {
|
||||
return ue.ObjectNew.GetGeneration() != ue.ObjectOld.GetGeneration()
|
||||
},
|
||||
DeleteFunc: func(de event.DeleteEvent) bool {
|
||||
return false
|
||||
},
|
||||
GenericFunc: func(ge event.GenericEvent) bool {
|
||||
return false
|
||||
},
|
||||
}).
|
||||
// As the "status.LastValidationTime" field is always updated, this triggers new reconciling process, skip the update event that include no spec change to avoid the reconcile loop
|
||||
For(&velerov1api.BackupStorageLocation{}, builder.WithPredicates(kube.SpecChangePredicate{})).
|
||||
Watches(g, nil).
|
||||
Complete(r)
|
||||
}
|
||||
|
||||
@@ -131,19 +131,25 @@ func (b *objectBackupStoreGetter) Get(location *velerov1api.BackupStorageLocatio
|
||||
return nil, errors.Errorf("backup storage location's bucket name %q must not contain a '/' (if using a prefix, put it in the 'Prefix' field instead)", location.Spec.ObjectStorage.Bucket)
|
||||
}
|
||||
|
||||
// Pass a new map into the object store rather than modifying the passed-in
|
||||
// location. This prevents Velero controllers from accidentally modifying
|
||||
// the in-cluster BSL with data which doesn't belong in Spec.Config
|
||||
objectStoreConfig := make(map[string]string)
|
||||
if location.Spec.Config != nil {
|
||||
for key, val := range location.Spec.Config {
|
||||
objectStoreConfig[key] = val
|
||||
}
|
||||
}
|
||||
|
||||
// add the bucket name and prefix to the config map so that object stores
|
||||
// can use them when initializing. The AWS object store uses the bucket
|
||||
// name to determine the bucket's region when setting up its client.
|
||||
if location.Spec.Config == nil {
|
||||
location.Spec.Config = make(map[string]string)
|
||||
}
|
||||
|
||||
location.Spec.Config["bucket"] = bucket
|
||||
location.Spec.Config["prefix"] = prefix
|
||||
objectStoreConfig["bucket"] = bucket
|
||||
objectStoreConfig["prefix"] = prefix
|
||||
|
||||
// Only include a CACert if it's specified in order to maintain compatibility with plugins that don't expect it.
|
||||
if location.Spec.ObjectStorage.CACert != nil {
|
||||
location.Spec.Config["caCert"] = string(location.Spec.ObjectStorage.CACert)
|
||||
objectStoreConfig["caCert"] = string(location.Spec.ObjectStorage.CACert)
|
||||
}
|
||||
|
||||
// If the BSL specifies a credential, fetch its path on disk and pass to
|
||||
@@ -154,7 +160,7 @@ func (b *objectBackupStoreGetter) Get(location *velerov1api.BackupStorageLocatio
|
||||
return nil, errors.Wrap(err, "unable to get credentials")
|
||||
}
|
||||
|
||||
location.Spec.Config["credentialsFile"] = credsFile
|
||||
objectStoreConfig["credentialsFile"] = credsFile
|
||||
}
|
||||
|
||||
objectStore, err := objectStoreGetter.GetObjectStore(location.Spec.Provider)
|
||||
@@ -162,7 +168,7 @@ func (b *objectBackupStoreGetter) Get(location *velerov1api.BackupStorageLocatio
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if err := objectStore.Init(location.Spec.Config); err != nil {
|
||||
if err := objectStore.Init(objectStoreConfig); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -17,6 +17,8 @@ limitations under the License.
|
||||
package framework
|
||||
|
||||
import (
|
||||
"runtime/debug"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
"google.golang.org/grpc/codes"
|
||||
)
|
||||
@@ -38,7 +40,8 @@ func handlePanic(p interface{}) error {
|
||||
if _, ok := panicErr.(stackTracer); ok {
|
||||
err = panicErr
|
||||
} else {
|
||||
err = errors.Wrap(panicErr, "plugin panicked")
|
||||
errWithStacktrace := errors.Errorf("%v, stack trace: %s", panicErr, debug.Stack())
|
||||
err = errors.Wrap(errWithStacktrace, "plugin panicked")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
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 kube
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
|
||||
"sigs.k8s.io/controller-runtime/pkg/event"
|
||||
"sigs.k8s.io/controller-runtime/pkg/predicate"
|
||||
)
|
||||
|
||||
// SpecChangePredicate implements a default update predicate function on Spec change
|
||||
// As Velero doesn't enable subresource in CRDs, we cannot use the object's metadata.generation field to check the spec change
|
||||
// More details about the generation field refer to https://github.com/kubernetes-sigs/controller-runtime/blob/v0.12.2/pkg/predicate/predicate.go#L156
|
||||
type SpecChangePredicate struct {
|
||||
predicate.Funcs
|
||||
}
|
||||
|
||||
func (SpecChangePredicate) Update(e event.UpdateEvent) bool {
|
||||
if e.ObjectOld == nil {
|
||||
return false
|
||||
}
|
||||
if e.ObjectNew == nil {
|
||||
return false
|
||||
}
|
||||
oldSpec := reflect.ValueOf(e.ObjectOld).Elem().FieldByName("Spec")
|
||||
// contains no field named "Spec", return false directly
|
||||
if oldSpec.IsZero() {
|
||||
return false
|
||||
}
|
||||
newSpec := reflect.ValueOf(e.ObjectNew).Elem().FieldByName("Spec")
|
||||
return !reflect.DeepEqual(oldSpec.Interface(), newSpec.Interface())
|
||||
}
|
||||
@@ -0,0 +1,180 @@
|
||||
/*
|
||||
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 kube
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
corev1api "k8s.io/api/core/v1"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||
"sigs.k8s.io/controller-runtime/pkg/event"
|
||||
|
||||
velerov1 "github.com/vmware-tanzu/velero/pkg/apis/velero/v1"
|
||||
)
|
||||
|
||||
func TestSpecChangePredicate(t *testing.T) {
|
||||
cases := []struct {
|
||||
name string
|
||||
oldObj client.Object
|
||||
newObj client.Object
|
||||
changed bool
|
||||
}{
|
||||
{
|
||||
name: "Contains no spec field",
|
||||
oldObj: &velerov1.BackupStorageLocation{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: "bsl01",
|
||||
},
|
||||
},
|
||||
newObj: &velerov1.BackupStorageLocation{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: "bsl01",
|
||||
},
|
||||
},
|
||||
changed: false,
|
||||
},
|
||||
{
|
||||
name: "ObjectMetas are different, Specs are same",
|
||||
oldObj: &velerov1.BackupStorageLocation{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: "bsl01",
|
||||
Annotations: map[string]string{"key1": "value1"},
|
||||
},
|
||||
Spec: velerov1.BackupStorageLocationSpec{
|
||||
Provider: "azure",
|
||||
},
|
||||
},
|
||||
newObj: &velerov1.BackupStorageLocation{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: "bsl01",
|
||||
Annotations: map[string]string{"key2": "value2"},
|
||||
},
|
||||
Spec: velerov1.BackupStorageLocationSpec{
|
||||
Provider: "azure",
|
||||
},
|
||||
},
|
||||
changed: false,
|
||||
},
|
||||
{
|
||||
name: "Statuses are different, Specs are same",
|
||||
oldObj: &velerov1.BackupStorageLocation{
|
||||
Spec: velerov1.BackupStorageLocationSpec{
|
||||
Provider: "azure",
|
||||
},
|
||||
Status: velerov1.BackupStorageLocationStatus{
|
||||
Phase: velerov1.BackupStorageLocationPhaseAvailable,
|
||||
},
|
||||
},
|
||||
newObj: &velerov1.BackupStorageLocation{
|
||||
Spec: velerov1.BackupStorageLocationSpec{
|
||||
Provider: "azure",
|
||||
},
|
||||
Status: velerov1.BackupStorageLocationStatus{
|
||||
Phase: velerov1.BackupStorageLocationPhaseUnavailable,
|
||||
},
|
||||
},
|
||||
changed: false,
|
||||
},
|
||||
{
|
||||
name: "Specs are different",
|
||||
oldObj: &velerov1.BackupStorageLocation{
|
||||
Spec: velerov1.BackupStorageLocationSpec{
|
||||
Provider: "azure",
|
||||
},
|
||||
},
|
||||
newObj: &velerov1.BackupStorageLocation{
|
||||
Spec: velerov1.BackupStorageLocationSpec{
|
||||
Provider: "aws",
|
||||
},
|
||||
},
|
||||
changed: true,
|
||||
},
|
||||
{
|
||||
name: "Specs are same",
|
||||
oldObj: &velerov1.BackupStorageLocation{
|
||||
Spec: velerov1.BackupStorageLocationSpec{
|
||||
Provider: "azure",
|
||||
Config: map[string]string{"key": "value"},
|
||||
Credential: &corev1api.SecretKeySelector{
|
||||
LocalObjectReference: corev1api.LocalObjectReference{
|
||||
Name: "secret",
|
||||
},
|
||||
Key: "credential",
|
||||
},
|
||||
StorageType: velerov1.StorageType{
|
||||
ObjectStorage: &velerov1.ObjectStorageLocation{
|
||||
Bucket: "bucket1",
|
||||
Prefix: "prefix",
|
||||
CACert: []byte{'a'},
|
||||
},
|
||||
},
|
||||
Default: true,
|
||||
AccessMode: velerov1.BackupStorageLocationAccessModeReadWrite,
|
||||
BackupSyncPeriod: &metav1.Duration{
|
||||
Duration: 1 * time.Minute,
|
||||
},
|
||||
ValidationFrequency: &metav1.Duration{
|
||||
Duration: 1 * time.Minute,
|
||||
},
|
||||
},
|
||||
},
|
||||
newObj: &velerov1.BackupStorageLocation{
|
||||
Spec: velerov1.BackupStorageLocationSpec{
|
||||
Provider: "azure",
|
||||
Config: map[string]string{"key": "value"},
|
||||
Credential: &corev1api.SecretKeySelector{
|
||||
LocalObjectReference: corev1api.LocalObjectReference{
|
||||
Name: "secret",
|
||||
},
|
||||
Key: "credential",
|
||||
},
|
||||
StorageType: velerov1.StorageType{
|
||||
ObjectStorage: &velerov1.ObjectStorageLocation{
|
||||
Bucket: "bucket1",
|
||||
Prefix: "prefix",
|
||||
CACert: []byte{'a'},
|
||||
},
|
||||
},
|
||||
Default: true,
|
||||
AccessMode: velerov1.BackupStorageLocationAccessModeReadWrite,
|
||||
BackupSyncPeriod: &metav1.Duration{
|
||||
Duration: 1 * time.Minute,
|
||||
},
|
||||
ValidationFrequency: &metav1.Duration{
|
||||
Duration: 1 * time.Minute,
|
||||
},
|
||||
},
|
||||
},
|
||||
changed: false,
|
||||
},
|
||||
}
|
||||
|
||||
predicate := SpecChangePredicate{}
|
||||
|
||||
for _, c := range cases {
|
||||
t.Run(c.name, func(t *testing.T) {
|
||||
changed := predicate.Update(event.UpdateEvent{
|
||||
ObjectOld: c.oldObj,
|
||||
ObjectNew: c.newObj,
|
||||
})
|
||||
assert.Equal(t, c.changed, changed)
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -73,7 +73,7 @@ The following is an overview of Velero's restore process that starts after you r
|
||||
By default, Velero will restore resources in the following order:
|
||||
|
||||
* Custom Resource Definitions
|
||||
* Mamespaces
|
||||
* Namespaces
|
||||
* StorageClasses
|
||||
* VolumeSnapshotClass
|
||||
* VolumeSnapshotContents
|
||||
|
||||
@@ -24,7 +24,7 @@ Wildcard takes precedence when both a wildcard and specific resource are include
|
||||
* Restore two namespaces and their objects.
|
||||
|
||||
```bash
|
||||
velero restore create <backup-name> --include-namespaces <namespace1>,<namespace2>
|
||||
velero restore create <restore-name> --include-namespaces <namespace1>,<namespace2> --from-backup <backup-name>
|
||||
```
|
||||
|
||||
### --include-resources
|
||||
@@ -38,7 +38,7 @@ Wildcard takes precedence when both a wildcard and specific resource are include
|
||||
* Restore all deployments and configmaps in the cluster.
|
||||
|
||||
```bash
|
||||
velero restore create <backup-name> --include-resources deployments,configmaps
|
||||
velero restore create <restore-name> --include-resources deployments,configmaps --from-backup <backup-name>
|
||||
```
|
||||
|
||||
* Backup the deployments in a namespace.
|
||||
@@ -72,7 +72,7 @@ Wildcard takes precedence when both a wildcard and specific resource are include
|
||||
* Restore only namespaced resources in the cluster.
|
||||
|
||||
```bash
|
||||
velero restore create <backup-name> --include-cluster-resources=false
|
||||
velero restore create <restore-name> --include-cluster-resources=false --from-backup <backup-name>
|
||||
```
|
||||
|
||||
* Backup a namespace and include cluster-scoped resources.
|
||||
@@ -107,7 +107,7 @@ Wildcard excludes are ignored.
|
||||
* Exclude two namespaces during a restore.
|
||||
|
||||
```bash
|
||||
velero restore create <backup-name> --exclude-namespaces <namespace1>,<namespace2>
|
||||
velero restore create <restore-name> --exclude-namespaces <namespace1>,<namespace2> --from-backup <backup-name>
|
||||
```
|
||||
|
||||
### --exclude-resources
|
||||
|
||||
@@ -24,7 +24,7 @@ Wildcard takes precedence when both a wildcard and specific resource are include
|
||||
* Restore two namespaces and their objects.
|
||||
|
||||
```bash
|
||||
velero restore create <backup-name> --include-namespaces <namespace1>,<namespace2>
|
||||
velero restore create <restore-name> --include-namespaces <namespace1>,<namespace2> --from-backup <backup-name>
|
||||
```
|
||||
|
||||
### --include-resources
|
||||
@@ -38,7 +38,7 @@ Wildcard takes precedence when both a wildcard and specific resource are include
|
||||
* Restore all deployments and configmaps in the cluster.
|
||||
|
||||
```bash
|
||||
velero restore create <backup-name> --include-resources deployments,configmaps
|
||||
velero restore create <restore-name> --include-resources deployments,configmaps --from-backup <backup-name>
|
||||
```
|
||||
|
||||
* Backup the deployments in a namespace.
|
||||
@@ -72,7 +72,7 @@ Wildcard takes precedence when both a wildcard and specific resource are include
|
||||
* Restore only namespaced resources in the cluster.
|
||||
|
||||
```bash
|
||||
velero restore create <backup-name> --include-cluster-resources=false
|
||||
velero restore create <restore-name> --include-cluster-resources=false --from-backup <backup-name>
|
||||
```
|
||||
|
||||
* Backup a namespace and include cluster-scoped resources.
|
||||
@@ -107,7 +107,7 @@ Wildcard excludes are ignored.
|
||||
* Exclude two namespaces during a restore.
|
||||
|
||||
```bash
|
||||
velero restore create <backup-name> --exclude-namespaces <namespace1>,<namespace2>
|
||||
velero restore create <restore-name> --exclude-namespaces <namespace1>,<namespace2> --from-backup <backup-name>
|
||||
```
|
||||
|
||||
### --exclude-resources
|
||||
|
||||
@@ -24,7 +24,7 @@ Wildcard takes precedence when both a wildcard and specific resource are include
|
||||
* Restore two namespaces and their objects.
|
||||
|
||||
```bash
|
||||
velero restore create <backup-name> --include-namespaces <namespace1>,<namespace2>
|
||||
velero restore create <restore-name> --include-namespaces <namespace1>,<namespace2> --from-backup <backup-name>
|
||||
```
|
||||
|
||||
### --include-resources
|
||||
@@ -38,7 +38,7 @@ Wildcard takes precedence when both a wildcard and specific resource are include
|
||||
* Restore all deployments and configmaps in the cluster.
|
||||
|
||||
```bash
|
||||
velero restore create <backup-name> --include-resources deployments,configmaps
|
||||
velero restore create <restore-name> --include-resources deployments,configmaps --from-backup <backup-name>
|
||||
```
|
||||
|
||||
* Backup the deployments in a namespace.
|
||||
@@ -72,7 +72,7 @@ Wildcard takes precedence when both a wildcard and specific resource are include
|
||||
* Restore only namespaced resources in the cluster.
|
||||
|
||||
```bash
|
||||
velero restore create <backup-name> --include-cluster-resources=false
|
||||
velero restore create <restore-name> --include-cluster-resources=false --from-backup <backup-name>
|
||||
```
|
||||
|
||||
* Backup a namespace and include cluster-scoped resources.
|
||||
@@ -107,7 +107,7 @@ Wildcard excludes are ignored.
|
||||
* Exclude two namespaces during a restore.
|
||||
|
||||
```bash
|
||||
velero restore create <backup-name> --exclude-namespaces <namespace1>,<namespace2>
|
||||
velero restore create <restore-name> --exclude-namespaces <namespace1>,<namespace2> --from-backup <backup-name>
|
||||
```
|
||||
|
||||
### --exclude-resources
|
||||
|
||||
@@ -24,7 +24,7 @@ Wildcard takes precedence when both a wildcard and specific resource are include
|
||||
* Restore two namespaces and their objects.
|
||||
|
||||
```bash
|
||||
velero restore create <backup-name> --include-namespaces <namespace1>,<namespace2>
|
||||
velero restore create <restore-name> --include-namespaces <namespace1>,<namespace2> --from-backup <backup-name>
|
||||
```
|
||||
|
||||
### --include-resources
|
||||
@@ -38,7 +38,7 @@ Wildcard takes precedence when both a wildcard and specific resource are include
|
||||
* Restore all deployments and configmaps in the cluster.
|
||||
|
||||
```bash
|
||||
velero restore create <backup-name> --include-resources deployments,configmaps
|
||||
velero restore create <restore-name> --include-resources deployments,configmaps --from-backup <backup-name>
|
||||
```
|
||||
|
||||
* Backup the deployments in a namespace.
|
||||
@@ -72,7 +72,7 @@ Wildcard takes precedence when both a wildcard and specific resource are include
|
||||
* Restore only namespaced resources in the cluster.
|
||||
|
||||
```bash
|
||||
velero restore create <backup-name> --include-cluster-resources=false
|
||||
velero restore create <restore-name> --include-cluster-resources=false --from-backup <backup-name>
|
||||
```
|
||||
|
||||
* Backup a namespace and include cluster-scoped resources.
|
||||
@@ -107,7 +107,7 @@ Wildcard excludes are ignored.
|
||||
* Exclude two namespaces during a restore.
|
||||
|
||||
```bash
|
||||
velero restore create <backup-name> --exclude-namespaces <namespace1>,<namespace2>
|
||||
velero restore create <restore-name> --exclude-namespaces <namespace1>,<namespace2> --from-backup <backup-name>
|
||||
```
|
||||
|
||||
### --exclude-resources
|
||||
|
||||
@@ -24,7 +24,7 @@ Wildcard takes precedence when both a wildcard and specific resource are include
|
||||
* Restore two namespaces and their objects.
|
||||
|
||||
```bash
|
||||
velero restore create <backup-name> --include-namespaces <namespace1>,<namespace2>
|
||||
velero restore create <restore-name> --include-namespaces <namespace1>,<namespace2> --from-backup <backup-name>
|
||||
```
|
||||
|
||||
### --include-resources
|
||||
@@ -38,7 +38,7 @@ Wildcard takes precedence when both a wildcard and specific resource are include
|
||||
* Restore all deployments and configmaps in the cluster.
|
||||
|
||||
```bash
|
||||
velero restore create <backup-name> --include-resources deployments,configmaps
|
||||
velero restore create <restore-name> --include-resources deployments,configmaps --from-backup <backup-name>
|
||||
```
|
||||
|
||||
* Backup the deployments in a namespace.
|
||||
@@ -72,7 +72,7 @@ Wildcard takes precedence when both a wildcard and specific resource are include
|
||||
* Restore only namespaced resources in the cluster.
|
||||
|
||||
```bash
|
||||
velero restore create <backup-name> --include-cluster-resources=false
|
||||
velero restore create <restore-name> --include-cluster-resources=false --from-backup <backup-name>
|
||||
```
|
||||
|
||||
* Backup a namespace and include cluster-scoped resources.
|
||||
@@ -113,7 +113,7 @@ Wildcard excludes are ignored.
|
||||
* Exclude two namespaces during a restore.
|
||||
|
||||
```bash
|
||||
velero restore create <backup-name> --exclude-namespaces <namespace1>,<namespace2>
|
||||
velero restore create <restore-name> --exclude-namespaces <namespace1>,<namespace2> --from-backup <backup-name>
|
||||
```
|
||||
|
||||
### --exclude-resources
|
||||
|
||||
@@ -26,7 +26,7 @@ Namespaces to include. Default is `*`, all namespaces.
|
||||
* Restore two namespaces and their objects.
|
||||
|
||||
```bash
|
||||
velero restore create <backup-name> --include-namespaces <namespace1>,<namespace2>
|
||||
velero restore create <restore-name> --include-namespaces <namespace1>,<namespace2> --from-backup <backup-name>
|
||||
```
|
||||
|
||||
### --include-resources
|
||||
@@ -42,7 +42,7 @@ Kubernetes resources to include in the backup, formatted as resource.group, such
|
||||
* Restore all deployments and configmaps in the cluster.
|
||||
|
||||
```bash
|
||||
velero restore create <backup-name> --include-resources deployments,configmaps
|
||||
velero restore create <restore-name> --include-resources deployments,configmaps --from-backup <backup-name>
|
||||
```
|
||||
|
||||
* Backup the deployments in a namespace.
|
||||
@@ -76,7 +76,7 @@ Includes cluster-scoped resources. This option can have three possible values:
|
||||
* Restore only namespaced resources in the cluster.
|
||||
|
||||
```bash
|
||||
velero restore create <backup-name> --include-cluster-resources=false
|
||||
velero restore create <restore-name> --include-cluster-resources=false --from-backup <backup-name>
|
||||
```
|
||||
|
||||
* Backup a namespace and include cluster-scoped resources.
|
||||
@@ -119,7 +119,7 @@ Namespaces to exclude.
|
||||
* Exclude two namespaces during a restore.
|
||||
|
||||
```bash
|
||||
velero restore create <backup-name> --exclude-namespaces <namespace1>,<namespace2>
|
||||
velero restore create <restore-name> --exclude-namespaces <namespace1>,<namespace2> --from-backup <backup-name>
|
||||
```
|
||||
|
||||
### --exclude-resources
|
||||
|
||||
@@ -73,7 +73,7 @@ The following is an overview of Velero's restore process that starts after you r
|
||||
By default, Velero will restore resources in the following order:
|
||||
|
||||
* Custom Resource Definitions
|
||||
* Mamespaces
|
||||
* Namespaces
|
||||
* StorageClasses
|
||||
* VolumeSnapshotClass
|
||||
* VolumeSnapshotContents
|
||||
|
||||
@@ -62,7 +62,9 @@ func WaitForPods(ctx context.Context, client TestClient, namespace string, pods
|
||||
for _, podName := range pods {
|
||||
checkPod, err := client.ClientGo.CoreV1().Pods(namespace).Get(ctx, podName, metav1.GetOptions{})
|
||||
if err != nil {
|
||||
return false, errors.WithMessage(err, fmt.Sprintf("Failed to verify pod %s/%s is %s", namespace, podName, corev1api.PodRunning))
|
||||
//Should ignore "etcdserver: request timed out" kind of errors, try to get pod status again before timeout.
|
||||
fmt.Println(errors.Wrap(err, fmt.Sprintf("Failed to verify pod %s/%s is %s, try again...", namespace, podName, corev1api.PodRunning)))
|
||||
return false, nil
|
||||
}
|
||||
// If any pod is still waiting we don't need to check any more so return and wait for next poll interval
|
||||
if checkPod.Status.Phase != corev1api.PodRunning {
|
||||
|
||||
Reference in New Issue
Block a user