Merge branch 'vmware-tanzu:main' into main

This commit is contained in:
lyndon
2022-07-21 09:07:21 +08:00
committed by GitHub
29 changed files with 306 additions and 78 deletions
+1
View File
@@ -16,6 +16,7 @@ reviewers:
- blackpiglet
- qiuming-best
- shubham-pampattiwar
- Lyndon-Li
tech-writer:
- a-mccarthy
+4 -2
View File
@@ -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 }}
+1 -1
View File
@@ -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
+1
View File
@@ -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))
+1
View File
@@ -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) \
+1
View File
@@ -0,0 +1 @@
Delete opened issues triage action.
+1
View File
@@ -0,0 +1 @@
Fix typo in doc, in https://velero.io/docs/main/restore-reference/ "Restore order" section, "Mamespace" should be "Namespace".
+1
View File
@@ -0,0 +1 @@
Modify Github actions.
+1
View File
@@ -0,0 +1 @@
Move 'velero.io/exclude-from-backup' label string to const
+1
View File
@@ -0,0 +1 @@
Fix bsl validation bug: the BSL is validated continually and doesn't respect the validation period configured
+1
View File
@@ -0,0 +1 @@
Dump stack trace when the plugin server handles panic
+1
View File
@@ -0,0 +1 @@
Modify BackupStoreGetter to avoid BSL spec changes
+1
View File
@@ -0,0 +1 @@
Let "make shell xxx" respect GOPROXY
+7 -2
View File
@@ -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)
}
+15 -9
View File
@@ -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
}
+4 -1
View File
@@ -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")
}
}
+47
View File
@@ -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())
}
+180
View File
@@ -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)
})
}
}
+1 -1
View File
@@ -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
+4 -4
View File
@@ -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
+4 -4
View File
@@ -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
+4 -4
View File
@@ -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
+4 -4
View File
@@ -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
+4 -4
View File
@@ -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
+4 -4
View File
@@ -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
+1 -1
View File
@@ -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
+3 -1
View File
@@ -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 {