diff --git a/.github/auto-assignees.yml b/.github/auto-assignees.yml index 282591d72..8f5a75a57 100644 --- a/.github/auto-assignees.yml +++ b/.github/auto-assignees.yml @@ -16,6 +16,7 @@ reviewers: - blackpiglet - qiuming-best - shubham-pampattiwar + - Lyndon-Li tech-writer: - a-mccarthy diff --git a/.github/workflows/crds-verify-kind.yaml b/.github/workflows/crds-verify-kind.yaml index 45b6d71a9..398039f38 100644 --- a/.github/workflows/crds-verify-kind.yaml +++ b/.github/workflows/crds-verify-kind.yaml @@ -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: | diff --git a/.github/workflows/opened-issues-triage.yml b/.github/workflows/opened-issues-triage.yml deleted file mode 100644 index f81443a3a..000000000 --- a/.github/workflows/opened-issues-triage.yml +++ /dev/null @@ -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 }} diff --git a/.github/workflows/pr-codespell.yml b/.github/workflows/pr-codespell.yml index 169535a07..22218f1f8 100644 --- a/.github/workflows/pr-codespell.yml +++ b/.github/workflows/pr-codespell.yml @@ -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 diff --git a/MAINTAINERS.md b/MAINTAINERS.md index 2819a77e8..f62eb0f94 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -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)) diff --git a/Makefile b/Makefile index 8dcf6ee50..b3a6a32f2 100644 --- a/Makefile +++ b/Makefile @@ -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) \ diff --git a/changelogs/unreleased/5041-jxun b/changelogs/unreleased/5041-jxun new file mode 100644 index 000000000..eeb5524f7 --- /dev/null +++ b/changelogs/unreleased/5041-jxun @@ -0,0 +1 @@ +Delete opened issues triage action. \ No newline at end of file diff --git a/changelogs/unreleased/5051-niulechuan b/changelogs/unreleased/5051-niulechuan new file mode 100644 index 000000000..1cba2e248 --- /dev/null +++ b/changelogs/unreleased/5051-niulechuan @@ -0,0 +1 @@ +Fix typo in doc, in https://velero.io/docs/main/restore-reference/ "Restore order" section, "Mamespace" should be "Namespace". diff --git a/changelogs/unreleased/5052-jxun b/changelogs/unreleased/5052-jxun new file mode 100644 index 000000000..8df837959 --- /dev/null +++ b/changelogs/unreleased/5052-jxun @@ -0,0 +1 @@ +Modify Github actions. \ No newline at end of file diff --git a/changelogs/unreleased/5053-niulechuan b/changelogs/unreleased/5053-niulechuan new file mode 100644 index 000000000..f44c46a69 --- /dev/null +++ b/changelogs/unreleased/5053-niulechuan @@ -0,0 +1 @@ +Move 'velero.io/exclude-from-backup' label string to const diff --git a/changelogs/unreleased/5101-ywk253100 b/changelogs/unreleased/5101-ywk253100 new file mode 100644 index 000000000..ade00f2a9 --- /dev/null +++ b/changelogs/unreleased/5101-ywk253100 @@ -0,0 +1 @@ + Fix bsl validation bug: the BSL is validated continually and doesn't respect the validation period configured \ No newline at end of file diff --git a/changelogs/unreleased/5110-reasonerjt b/changelogs/unreleased/5110-reasonerjt new file mode 100644 index 000000000..350f91fa1 --- /dev/null +++ b/changelogs/unreleased/5110-reasonerjt @@ -0,0 +1 @@ +Dump stack trace when the plugin server handles panic \ No newline at end of file diff --git a/changelogs/unreleased/5122-sseago b/changelogs/unreleased/5122-sseago new file mode 100644 index 000000000..ec8dc473e --- /dev/null +++ b/changelogs/unreleased/5122-sseago @@ -0,0 +1 @@ +Modify BackupStoreGetter to avoid BSL spec changes diff --git a/changelogs/unreleased/5128-reasonerjt b/changelogs/unreleased/5128-reasonerjt new file mode 100644 index 000000000..3ba53b059 --- /dev/null +++ b/changelogs/unreleased/5128-reasonerjt @@ -0,0 +1 @@ +Let "make shell xxx" respect GOPROXY \ No newline at end of file diff --git a/pkg/backup/item_backupper.go b/pkg/backup/item_backupper.go index fd4b16028..bd40c3bdb 100644 --- a/pkg/backup/item_backupper.go +++ b/pkg/backup/item_backupper.go @@ -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 } diff --git a/pkg/controller/backup_storage_location_controller.go b/pkg/controller/backup_storage_location_controller.go index ec35a8916..1b08da897 100644 --- a/pkg/controller/backup_storage_location_controller.go +++ b/pkg/controller/backup_storage_location_controller.go @@ -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) } diff --git a/pkg/persistence/object_store.go b/pkg/persistence/object_store.go index 1c0b619e1..acda15323 100644 --- a/pkg/persistence/object_store.go +++ b/pkg/persistence/object_store.go @@ -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 } diff --git a/pkg/plugin/framework/handle_panic.go b/pkg/plugin/framework/handle_panic.go index 10eb1d2b9..4ea0ec2b5 100644 --- a/pkg/plugin/framework/handle_panic.go +++ b/pkg/plugin/framework/handle_panic.go @@ -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") } } diff --git a/pkg/util/kube/predicate.go b/pkg/util/kube/predicate.go new file mode 100644 index 000000000..3073ef881 --- /dev/null +++ b/pkg/util/kube/predicate.go @@ -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()) +} diff --git a/pkg/util/kube/predicate_test.go b/pkg/util/kube/predicate_test.go new file mode 100644 index 000000000..d1c3be8df --- /dev/null +++ b/pkg/util/kube/predicate_test.go @@ -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) + }) + } +} diff --git a/site/content/docs/main/restore-reference.md b/site/content/docs/main/restore-reference.md index 0511f6512..a91ef960d 100644 --- a/site/content/docs/main/restore-reference.md +++ b/site/content/docs/main/restore-reference.md @@ -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 diff --git a/site/content/docs/v1.4/resource-filtering.md b/site/content/docs/v1.4/resource-filtering.md index 6c1470e04..0b893c49f 100644 --- a/site/content/docs/v1.4/resource-filtering.md +++ b/site/content/docs/v1.4/resource-filtering.md @@ -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 --include-namespaces , + velero restore create --include-namespaces , --from-backup ``` ### --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 --include-resources deployments,configmaps + velero restore create --include-resources deployments,configmaps --from-backup ``` * 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 --include-cluster-resources=false + velero restore create --include-cluster-resources=false --from-backup ``` * 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 --exclude-namespaces , + velero restore create --exclude-namespaces , --from-backup ``` ### --exclude-resources diff --git a/site/content/docs/v1.5/resource-filtering.md b/site/content/docs/v1.5/resource-filtering.md index 6c1470e04..0b893c49f 100644 --- a/site/content/docs/v1.5/resource-filtering.md +++ b/site/content/docs/v1.5/resource-filtering.md @@ -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 --include-namespaces , + velero restore create --include-namespaces , --from-backup ``` ### --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 --include-resources deployments,configmaps + velero restore create --include-resources deployments,configmaps --from-backup ``` * 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 --include-cluster-resources=false + velero restore create --include-cluster-resources=false --from-backup ``` * 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 --exclude-namespaces , + velero restore create --exclude-namespaces , --from-backup ``` ### --exclude-resources diff --git a/site/content/docs/v1.6/resource-filtering.md b/site/content/docs/v1.6/resource-filtering.md index 6c1470e04..0b893c49f 100644 --- a/site/content/docs/v1.6/resource-filtering.md +++ b/site/content/docs/v1.6/resource-filtering.md @@ -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 --include-namespaces , + velero restore create --include-namespaces , --from-backup ``` ### --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 --include-resources deployments,configmaps + velero restore create --include-resources deployments,configmaps --from-backup ``` * 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 --include-cluster-resources=false + velero restore create --include-cluster-resources=false --from-backup ``` * 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 --exclude-namespaces , + velero restore create --exclude-namespaces , --from-backup ``` ### --exclude-resources diff --git a/site/content/docs/v1.7/resource-filtering.md b/site/content/docs/v1.7/resource-filtering.md index 6c1470e04..0b893c49f 100644 --- a/site/content/docs/v1.7/resource-filtering.md +++ b/site/content/docs/v1.7/resource-filtering.md @@ -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 --include-namespaces , + velero restore create --include-namespaces , --from-backup ``` ### --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 --include-resources deployments,configmaps + velero restore create --include-resources deployments,configmaps --from-backup ``` * 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 --include-cluster-resources=false + velero restore create --include-cluster-resources=false --from-backup ``` * 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 --exclude-namespaces , + velero restore create --exclude-namespaces , --from-backup ``` ### --exclude-resources diff --git a/site/content/docs/v1.8/resource-filtering.md b/site/content/docs/v1.8/resource-filtering.md index ddcd97e4a..1f2d2133d 100644 --- a/site/content/docs/v1.8/resource-filtering.md +++ b/site/content/docs/v1.8/resource-filtering.md @@ -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 --include-namespaces , + velero restore create --include-namespaces , --from-backup ``` ### --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 --include-resources deployments,configmaps + velero restore create --include-resources deployments,configmaps --from-backup ``` * 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 --include-cluster-resources=false + velero restore create --include-cluster-resources=false --from-backup ``` * 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 --exclude-namespaces , + velero restore create --exclude-namespaces , --from-backup ``` ### --exclude-resources diff --git a/site/content/docs/v1.9/resource-filtering.md b/site/content/docs/v1.9/resource-filtering.md index 02ae3d68d..5c0b34c73 100644 --- a/site/content/docs/v1.9/resource-filtering.md +++ b/site/content/docs/v1.9/resource-filtering.md @@ -26,7 +26,7 @@ Namespaces to include. Default is `*`, all namespaces. * Restore two namespaces and their objects. ```bash - velero restore create --include-namespaces , + velero restore create --include-namespaces , --from-backup ``` ### --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 --include-resources deployments,configmaps + velero restore create --include-resources deployments,configmaps --from-backup ``` * 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 --include-cluster-resources=false + velero restore create --include-cluster-resources=false --from-backup ``` * 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 --exclude-namespaces , + velero restore create --exclude-namespaces , --from-backup ``` ### --exclude-resources diff --git a/site/content/docs/v1.9/restore-reference.md b/site/content/docs/v1.9/restore-reference.md index 0511f6512..a91ef960d 100644 --- a/site/content/docs/v1.9/restore-reference.md +++ b/site/content/docs/v1.9/restore-reference.md @@ -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 diff --git a/test/e2e/util/k8s/common.go b/test/e2e/util/k8s/common.go index 43812a74a..d562c75b3 100644 --- a/test/e2e/util/k8s/common.go +++ b/test/e2e/util/k8s/common.go @@ -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 {