mirror of
https://github.com/vmware-tanzu/velero.git
synced 2025-12-23 06:15:21 +00:00
Merge pull request #9215 from blackpiglet/9135_e2e
Add E2E test cases for repository maintenance job configuration.
This commit is contained in:
52
pkg/builder/priority_class_builder.go
Normal file
52
pkg/builder/priority_class_builder.go
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2019 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 builder
|
||||||
|
|
||||||
|
import (
|
||||||
|
corev1api "k8s.io/api/core/v1"
|
||||||
|
schedulingv1api "k8s.io/api/scheduling/v1"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
type PriorityClassBuilder struct {
|
||||||
|
object *schedulingv1api.PriorityClass
|
||||||
|
}
|
||||||
|
|
||||||
|
func ForPriorityClass(name string) *PriorityClassBuilder {
|
||||||
|
return &PriorityClassBuilder{
|
||||||
|
object: &schedulingv1api.PriorityClass{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: name,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *PriorityClassBuilder) Value(value int) *PriorityClassBuilder {
|
||||||
|
p.object.Value = int32(value)
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *PriorityClassBuilder) PreemptionPolicy(policy string) *PriorityClassBuilder {
|
||||||
|
preemptionPolicy := corev1api.PreemptionPolicy(policy)
|
||||||
|
p.object.PreemptionPolicy = &preemptionPolicy
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *PriorityClassBuilder) Result() *schedulingv1api.PriorityClass {
|
||||||
|
return p.object
|
||||||
|
}
|
||||||
@@ -43,6 +43,7 @@ import (
|
|||||||
. "github.com/vmware-tanzu/velero/test/e2e/parallelfilesupload"
|
. "github.com/vmware-tanzu/velero/test/e2e/parallelfilesupload"
|
||||||
. "github.com/vmware-tanzu/velero/test/e2e/privilegesmgmt"
|
. "github.com/vmware-tanzu/velero/test/e2e/privilegesmgmt"
|
||||||
. "github.com/vmware-tanzu/velero/test/e2e/pv-backup"
|
. "github.com/vmware-tanzu/velero/test/e2e/pv-backup"
|
||||||
|
. "github.com/vmware-tanzu/velero/test/e2e/repomaintenance"
|
||||||
. "github.com/vmware-tanzu/velero/test/e2e/resource-filtering"
|
. "github.com/vmware-tanzu/velero/test/e2e/resource-filtering"
|
||||||
. "github.com/vmware-tanzu/velero/test/e2e/resourcemodifiers"
|
. "github.com/vmware-tanzu/velero/test/e2e/resourcemodifiers"
|
||||||
. "github.com/vmware-tanzu/velero/test/e2e/resourcepolicies"
|
. "github.com/vmware-tanzu/velero/test/e2e/resourcepolicies"
|
||||||
@@ -660,6 +661,18 @@ var _ = Describe(
|
|||||||
ParallelFilesDownloadTest,
|
ParallelFilesDownloadTest,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var _ = Describe(
|
||||||
|
"Test Repository Maintenance Job Configuration's global part",
|
||||||
|
Label("RepoMaintenance", "LongTime"),
|
||||||
|
GlobalRepoMaintenanceTest,
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ = Describe(
|
||||||
|
"Test Repository Maintenance Job Configuration's specific part",
|
||||||
|
Label("RepoMaintenance", "LongTime"),
|
||||||
|
SpecificRepoMaintenanceTest,
|
||||||
|
)
|
||||||
|
|
||||||
func GetKubeConfigContext() error {
|
func GetKubeConfigContext() error {
|
||||||
var err error
|
var err error
|
||||||
var tcDefault, tcStandby k8s.TestClient
|
var tcDefault, tcStandby k8s.TestClient
|
||||||
@@ -740,6 +753,12 @@ var _ = BeforeSuite(func() {
|
|||||||
).To(Succeed())
|
).To(Succeed())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create the needed PriorityClasses
|
||||||
|
Expect(veleroutil.CreatePriorityClasses(
|
||||||
|
context.Background(),
|
||||||
|
test.VeleroCfg.ClientToInstallVelero.Kubebuilder,
|
||||||
|
)).To(Succeed())
|
||||||
|
|
||||||
if test.InstallVelero {
|
if test.InstallVelero {
|
||||||
By("Install test resources before testing")
|
By("Install test resources before testing")
|
||||||
Expect(
|
Expect(
|
||||||
@@ -783,6 +802,11 @@ var _ = AfterSuite(func() {
|
|||||||
).To(Succeed())
|
).To(Succeed())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Expect(veleroutil.DeletePriorityClasses(
|
||||||
|
ctx,
|
||||||
|
test.VeleroCfg.ClientToInstallVelero.Kubebuilder,
|
||||||
|
)).To(Succeed())
|
||||||
|
|
||||||
// If the Velero is installed during test, and the FailFast is not enabled,
|
// If the Velero is installed during test, and the FailFast is not enabled,
|
||||||
// uninstall Velero. If not, either Velero is not installed, or kept it for debug on failure.
|
// uninstall Velero. If not, either Velero is not installed, or kept it for debug on failure.
|
||||||
if test.InstallVelero && (testSuitePassed || !test.VeleroCfg.FailFast) {
|
if test.InstallVelero && (testSuitePassed || !test.VeleroCfg.FailFast) {
|
||||||
|
|||||||
@@ -342,6 +342,12 @@ func (m *migrationE2E) Restore() error {
|
|||||||
Expect(veleroutil.InstallStorageClasses(
|
Expect(veleroutil.InstallStorageClasses(
|
||||||
m.VeleroCfg.StandbyClusterCloudProvider)).To(Succeed())
|
m.VeleroCfg.StandbyClusterCloudProvider)).To(Succeed())
|
||||||
|
|
||||||
|
// Create the needed PriorityClasses
|
||||||
|
Expect(veleroutil.CreatePriorityClasses(
|
||||||
|
context.Background(),
|
||||||
|
test.VeleroCfg.StandbyClient.Kubebuilder,
|
||||||
|
)).To(Succeed())
|
||||||
|
|
||||||
if strings.EqualFold(m.VeleroCfg.Features, test.FeatureCSI) &&
|
if strings.EqualFold(m.VeleroCfg.Features, test.FeatureCSI) &&
|
||||||
m.VeleroCfg.UseVolumeSnapshots {
|
m.VeleroCfg.UseVolumeSnapshots {
|
||||||
By("Install VolumeSnapshotClass for E2E.")
|
By("Install VolumeSnapshotClass for E2E.")
|
||||||
|
|||||||
247
test/e2e/repomaintenance/repo_maintenance_config.go
Normal file
247
test/e2e/repomaintenance/repo_maintenance_config.go
Normal file
@@ -0,0 +1,247 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2021 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 repomaintenance
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
. "github.com/onsi/gomega"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
batchv1api "k8s.io/api/batch/v1"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
"k8s.io/apimachinery/pkg/labels"
|
||||||
|
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||||
|
|
||||||
|
velerov1api "github.com/vmware-tanzu/velero/pkg/apis/velero/v1"
|
||||||
|
"github.com/vmware-tanzu/velero/pkg/builder"
|
||||||
|
velerotypes "github.com/vmware-tanzu/velero/pkg/types"
|
||||||
|
"github.com/vmware-tanzu/velero/pkg/util/kube"
|
||||||
|
velerokubeutil "github.com/vmware-tanzu/velero/pkg/util/kube"
|
||||||
|
"github.com/vmware-tanzu/velero/test"
|
||||||
|
. "github.com/vmware-tanzu/velero/test/e2e/test"
|
||||||
|
k8sutil "github.com/vmware-tanzu/velero/test/util/k8s"
|
||||||
|
veleroutil "github.com/vmware-tanzu/velero/test/util/velero"
|
||||||
|
)
|
||||||
|
|
||||||
|
type RepoMaintenanceTestCase struct {
|
||||||
|
TestCase
|
||||||
|
repoMaintenanceConfigMapName string
|
||||||
|
repoMaintenanceConfigKey string
|
||||||
|
jobConfigs velerotypes.JobConfigs
|
||||||
|
}
|
||||||
|
|
||||||
|
var keepJobNum = 1
|
||||||
|
|
||||||
|
var GlobalRepoMaintenanceTest func() = TestFunc(&RepoMaintenanceTestCase{
|
||||||
|
repoMaintenanceConfigKey: "global",
|
||||||
|
repoMaintenanceConfigMapName: "global",
|
||||||
|
jobConfigs: velerotypes.JobConfigs{
|
||||||
|
KeepLatestMaintenanceJobs: &keepJobNum,
|
||||||
|
PodResources: &velerokubeutil.PodResources{
|
||||||
|
CPURequest: "100m",
|
||||||
|
MemoryRequest: "100Mi",
|
||||||
|
CPULimit: "200m",
|
||||||
|
MemoryLimit: "200Mi",
|
||||||
|
},
|
||||||
|
PriorityClassName: test.PriorityClassNameForRepoMaintenance,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
var SpecificRepoMaintenanceTest func() = TestFunc(&RepoMaintenanceTestCase{
|
||||||
|
repoMaintenanceConfigKey: "",
|
||||||
|
repoMaintenanceConfigMapName: "specific",
|
||||||
|
jobConfigs: velerotypes.JobConfigs{
|
||||||
|
KeepLatestMaintenanceJobs: &keepJobNum,
|
||||||
|
PodResources: &velerokubeutil.PodResources{
|
||||||
|
CPURequest: "100m",
|
||||||
|
MemoryRequest: "100Mi",
|
||||||
|
CPULimit: "200m",
|
||||||
|
MemoryLimit: "200Mi",
|
||||||
|
},
|
||||||
|
PriorityClassName: test.PriorityClassNameForRepoMaintenance,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
func (r *RepoMaintenanceTestCase) Init() error {
|
||||||
|
// generate random number as UUIDgen and set one default timeout duration
|
||||||
|
r.TestCase.Init()
|
||||||
|
|
||||||
|
// generate variable names based on CaseBaseName + UUIDgen
|
||||||
|
r.CaseBaseName = "repo-maintenance-" + r.UUIDgen
|
||||||
|
r.BackupName = "backup-" + r.CaseBaseName
|
||||||
|
r.RestoreName = "restore-" + r.CaseBaseName
|
||||||
|
|
||||||
|
// generate namespaces by NamespacesTotal
|
||||||
|
r.NamespacesTotal = 1
|
||||||
|
r.NSIncluded = &[]string{}
|
||||||
|
for nsNum := 0; nsNum < r.NamespacesTotal; nsNum++ {
|
||||||
|
createNSName := fmt.Sprintf("%s-%00000d", r.CaseBaseName, nsNum)
|
||||||
|
*r.NSIncluded = append(*r.NSIncluded, createNSName)
|
||||||
|
}
|
||||||
|
|
||||||
|
// If repoMaintenanceConfigKey is not set, it means testing the specific repo case.
|
||||||
|
// Need to assemble the BackupRepository name. The format is "volumeNamespace-bslName-uploaderName"
|
||||||
|
if r.repoMaintenanceConfigKey == "" {
|
||||||
|
r.repoMaintenanceConfigKey = (*r.NSIncluded)[0] + "-" + "default" + "-" + test.UploaderTypeKopia
|
||||||
|
}
|
||||||
|
|
||||||
|
// assign values to the inner variable for specific case
|
||||||
|
r.VeleroCfg.UseNodeAgent = true
|
||||||
|
r.VeleroCfg.UseNodeAgentWindows = true
|
||||||
|
|
||||||
|
r.BackupArgs = []string{
|
||||||
|
"create", "--namespace", r.VeleroCfg.VeleroNamespace, "backup", r.BackupName,
|
||||||
|
"--include-namespaces", strings.Join(*r.NSIncluded, ","),
|
||||||
|
"--snapshot-volumes=true", "--snapshot-move-data", "--wait",
|
||||||
|
}
|
||||||
|
|
||||||
|
// Message output by ginkgo
|
||||||
|
r.TestMsg = &TestMSG{
|
||||||
|
Desc: "Validate Repository Maintenance Job configuration",
|
||||||
|
FailedMSG: "Failed to apply and / or validate configuration in repository maintenance jobs.",
|
||||||
|
Text: "Should be able to apply and validate configuration in repository maintenance jobs.",
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *RepoMaintenanceTestCase) InstallVelero() error {
|
||||||
|
// Because this test needs to use customized repository maintenance ConfigMap,
|
||||||
|
// need to uninstall and reinstall Velero.
|
||||||
|
|
||||||
|
fmt.Println("Start to uninstall Velero")
|
||||||
|
if err := veleroutil.VeleroUninstall(r.Ctx, r.VeleroCfg); err != nil {
|
||||||
|
fmt.Printf("Fail to uninstall Velero: %s\n", err.Error())
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err := json.Marshal(r.jobConfigs)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
repoMaintenanceConfig := builder.ForConfigMap(r.VeleroCfg.VeleroNamespace, r.repoMaintenanceConfigMapName).
|
||||||
|
Data(r.repoMaintenanceConfigKey, string(result)).Result()
|
||||||
|
|
||||||
|
r.VeleroCfg.RepoMaintenanceJobConfigMap = r.repoMaintenanceConfigMapName
|
||||||
|
|
||||||
|
return veleroutil.PrepareVelero(
|
||||||
|
r.Ctx,
|
||||||
|
r.CaseBaseName,
|
||||||
|
r.VeleroCfg,
|
||||||
|
repoMaintenanceConfig,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *RepoMaintenanceTestCase) CreateResources() error {
|
||||||
|
for _, ns := range *r.NSIncluded {
|
||||||
|
if err := k8sutil.CreateNamespace(r.Ctx, r.Client, ns); err != nil {
|
||||||
|
fmt.Printf("Fail to create ns %s: %s\n", ns, err.Error())
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
pvc, err := k8sutil.CreatePVC(r.Client, ns, "volume-1", test.StorageClassName, nil)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Fail to create PVC %s: %s\n", "volume-1", err.Error())
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
vols := k8sutil.CreateVolumes(pvc.Name, []string{"volume-1"})
|
||||||
|
|
||||||
|
deployment := k8sutil.NewDeployment(
|
||||||
|
r.CaseBaseName,
|
||||||
|
(*r.NSIncluded)[0],
|
||||||
|
1,
|
||||||
|
map[string]string{"app": "test"},
|
||||||
|
r.VeleroCfg.ImageRegistryProxy,
|
||||||
|
r.VeleroCfg.WorkerOS,
|
||||||
|
).WithVolume(vols).Result()
|
||||||
|
|
||||||
|
deployment, err = k8sutil.CreateDeployment(r.Client.ClientGo, ns, deployment)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Fail to create deployment %s: %s \n", deployment.Name, err.Error())
|
||||||
|
return errors.Wrap(err, fmt.Sprintf("failed to create deployment: %s", err.Error()))
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := k8sutil.WaitForReadyDeployment(r.Client.ClientGo, deployment.Namespace, deployment.Name); err != nil {
|
||||||
|
fmt.Printf("Fail to create deployment %s: %s\n", r.CaseBaseName, err.Error())
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *RepoMaintenanceTestCase) Verify() error {
|
||||||
|
// Reduce the MaintenanceFrequency to 1 minute.
|
||||||
|
backupRepositoryList := new(velerov1api.BackupRepositoryList)
|
||||||
|
if err := r.VeleroCfg.ClientToInstallVelero.Kubebuilder.List(
|
||||||
|
r.Ctx,
|
||||||
|
backupRepositoryList,
|
||||||
|
&client.ListOptions{
|
||||||
|
Namespace: r.VeleroCfg.Namespace,
|
||||||
|
LabelSelector: labels.SelectorFromSet(map[string]string{velerov1api.VolumeNamespaceLabel: (*r.NSIncluded)[0]}),
|
||||||
|
},
|
||||||
|
); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(backupRepositoryList.Items) <= 0 {
|
||||||
|
return fmt.Errorf("fail list BackupRepository. no item is returned")
|
||||||
|
}
|
||||||
|
|
||||||
|
backupRepository := backupRepositoryList.Items[0]
|
||||||
|
|
||||||
|
updated := backupRepository.DeepCopy()
|
||||||
|
updated.Spec.MaintenanceFrequency = metav1.Duration{Duration: time.Minute}
|
||||||
|
if err := r.VeleroCfg.ClientToInstallVelero.Kubebuilder.Patch(r.Ctx, updated, client.MergeFrom(&backupRepository)); err != nil {
|
||||||
|
fmt.Printf("failed to patch BackupRepository %q: %s", backupRepository.GetName(), err.Error())
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// The minimal time unit of Repository Maintenance is 5 minutes.
|
||||||
|
// Wait for more than one cycles to make sure the result is valid.
|
||||||
|
time.Sleep(6 * time.Minute)
|
||||||
|
|
||||||
|
jobList := new(batchv1api.JobList)
|
||||||
|
if err := r.VeleroCfg.ClientToInstallVelero.Kubebuilder.List(r.Ctx, jobList, &client.ListOptions{
|
||||||
|
Namespace: r.VeleroCfg.Namespace,
|
||||||
|
LabelSelector: labels.SelectorFromSet(map[string]string{"velero.io/repo-name": backupRepository.Name}),
|
||||||
|
}); err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
resources, err := kube.ParseResourceRequirements(
|
||||||
|
r.jobConfigs.PodResources.CPURequest,
|
||||||
|
r.jobConfigs.PodResources.MemoryRequest,
|
||||||
|
r.jobConfigs.PodResources.CPULimit,
|
||||||
|
r.jobConfigs.PodResources.MemoryLimit,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "failed to parse resource requirements for maintenance job")
|
||||||
|
}
|
||||||
|
|
||||||
|
Expect(jobList.Items[0].Spec.Template.Spec.Containers[0].Resources).To(Equal(resources))
|
||||||
|
|
||||||
|
Expect(jobList.Items).To(HaveLen(*r.jobConfigs.KeepLatestMaintenanceJobs))
|
||||||
|
|
||||||
|
Expect(jobList.Items[0].Spec.Template.Spec.PriorityClassName).To(Equal(r.jobConfigs.PriorityClassName))
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -41,6 +41,7 @@ depends on your test patterns.
|
|||||||
*/
|
*/
|
||||||
type VeleroBackupRestoreTest interface {
|
type VeleroBackupRestoreTest interface {
|
||||||
Init() error
|
Init() error
|
||||||
|
InstallVelero() error
|
||||||
CreateResources() error
|
CreateResources() error
|
||||||
Backup() error
|
Backup() error
|
||||||
Destroy() error
|
Destroy() error
|
||||||
@@ -109,6 +110,10 @@ func (t *TestCase) GenerateUUID() string {
|
|||||||
return fmt.Sprintf("%08d", rand.IntN(100000000))
|
return fmt.Sprintf("%08d", rand.IntN(100000000))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *TestCase) InstallVelero() error {
|
||||||
|
return PrepareVelero(context.Background(), t.GetTestCase().CaseBaseName, t.GetTestCase().VeleroCfg)
|
||||||
|
}
|
||||||
|
|
||||||
func (t *TestCase) CreateResources() error {
|
func (t *TestCase) CreateResources() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -221,7 +226,8 @@ func RunTestCase(test VeleroBackupRestoreTest) error {
|
|||||||
fmt.Printf("Running test case %s %s\n", test.GetTestMsg().Desc, time.Now().Format("2006-01-02 15:04:05"))
|
fmt.Printf("Running test case %s %s\n", test.GetTestMsg().Desc, time.Now().Format("2006-01-02 15:04:05"))
|
||||||
|
|
||||||
if InstallVelero {
|
if InstallVelero {
|
||||||
Expect(PrepareVelero(context.Background(), test.GetTestCase().CaseBaseName, test.GetTestCase().VeleroCfg)).To(Succeed())
|
fmt.Printf("Install Velero for test case %s: %s", test.GetTestCase().CaseBaseName, time.Now().Format("2006-01-02 15:04:05"))
|
||||||
|
Expect(test.InstallVelero()).To(Succeed())
|
||||||
}
|
}
|
||||||
|
|
||||||
defer test.Clean()
|
defer test.Clean()
|
||||||
|
|||||||
@@ -57,6 +57,11 @@ const (
|
|||||||
BackupRepositoryConfigName = "backup-repository-config"
|
BackupRepositoryConfigName = "backup-repository-config"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
PriorityClassNameForDataMover = "data-mover"
|
||||||
|
PriorityClassNameForRepoMaintenance = "repo-maintenance"
|
||||||
|
)
|
||||||
|
|
||||||
var PublicCloudProviders = []string{AWS, Azure, GCP, Vsphere}
|
var PublicCloudProviders = []string{AWS, Azure, GCP, Vsphere}
|
||||||
var LocalCloudProviders = []string{Kind, VanillaZFS}
|
var LocalCloudProviders = []string{Kind, VanillaZFS}
|
||||||
var CloudProviders = append(PublicCloudProviders, LocalCloudProviders...)
|
var CloudProviders = append(PublicCloudProviders, LocalCloudProviders...)
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
|
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||||
|
|
||||||
velerov1api "github.com/vmware-tanzu/velero/pkg/apis/velero/v1"
|
velerov1api "github.com/vmware-tanzu/velero/pkg/apis/velero/v1"
|
||||||
"github.com/vmware-tanzu/velero/pkg/cmd/cli/install"
|
"github.com/vmware-tanzu/velero/pkg/cmd/cli/install"
|
||||||
@@ -56,7 +57,17 @@ type installOptions struct {
|
|||||||
WorkerOS string
|
WorkerOS string
|
||||||
}
|
}
|
||||||
|
|
||||||
func VeleroInstall(ctx context.Context, veleroCfg *test.VeleroConfig, isStandbyCluster bool) error {
|
/*
|
||||||
|
VeleroInstall is used to install Velero for E2E test
|
||||||
|
|
||||||
|
params:
|
||||||
|
|
||||||
|
ctx: The context
|
||||||
|
veleroCfg: Velero E2E case configuration
|
||||||
|
isStandbyCluster: Whether Velero is installed on standby cluster
|
||||||
|
objects: The objects are installed in Velero installed namespace, e.g. the ConfigMaps.
|
||||||
|
*/
|
||||||
|
func VeleroInstall(ctx context.Context, veleroCfg *test.VeleroConfig, isStandbyCluster bool, objects ...client.Object) error {
|
||||||
fmt.Printf("Velero install %s\n", time.Now().Format("2006-01-02 15:04:05"))
|
fmt.Printf("Velero install %s\n", time.Now().Format("2006-01-02 15:04:05"))
|
||||||
|
|
||||||
// veleroCfg struct including a set of BSL params and a set of additional BSL params,
|
// veleroCfg struct including a set of BSL params and a set of additional BSL params,
|
||||||
@@ -153,6 +164,14 @@ func VeleroInstall(ctx context.Context, veleroCfg *test.VeleroConfig, isStandbyC
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Install the passed-in objects in Velero installed namespace
|
||||||
|
for _, obj := range objects {
|
||||||
|
if err := veleroCfg.ClientToInstallVelero.Kubebuilder.Create(ctx, obj); err != nil {
|
||||||
|
fmt.Printf("fail to create object %s in namespace %s: %s\n", obj.GetName(), obj.GetNamespace(), err.Error())
|
||||||
|
return fmt.Errorf("fail to create object %s in namespace %s: %w", obj.GetName(), obj.GetNamespace(), err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// For AWS IRSA credential test, AWS IAM service account is required, so if ServiceAccountName and EKSPolicyARN
|
// For AWS IRSA credential test, AWS IAM service account is required, so if ServiceAccountName and EKSPolicyARN
|
||||||
// are both provided, we assume IRSA test is running, otherwise skip this IAM service account creation part.
|
// are both provided, we assume IRSA test is running, otherwise skip this IAM service account creation part.
|
||||||
if veleroCfg.CloudProvider == test.AWS && veleroInstallOptions.ServiceAccountName != "" {
|
if veleroCfg.CloudProvider == test.AWS && veleroInstallOptions.ServiceAccountName != "" {
|
||||||
@@ -790,7 +809,7 @@ func CheckBSL(ctx context.Context, ns string, bslName string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func PrepareVelero(ctx context.Context, caseName string, veleroCfg test.VeleroConfig) error {
|
func PrepareVelero(ctx context.Context, caseName string, veleroCfg test.VeleroConfig, objects ...client.Object) error {
|
||||||
ready, err := IsVeleroReady(context.Background(), &veleroCfg)
|
ready, err := IsVeleroReady(context.Background(), &veleroCfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("error in checking velero status with %v", err)
|
fmt.Printf("error in checking velero status with %v", err)
|
||||||
@@ -804,7 +823,7 @@ func PrepareVelero(ctx context.Context, caseName string, veleroCfg test.VeleroCo
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
fmt.Printf("need to install velero for case %s \n", caseName)
|
fmt.Printf("need to install velero for case %s \n", caseName)
|
||||||
return VeleroInstall(context.Background(), &veleroCfg, false)
|
return VeleroInstall(context.Background(), &veleroCfg, false, objects...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func VeleroUninstall(ctx context.Context, veleroCfg test.VeleroConfig) error {
|
func VeleroUninstall(ctx context.Context, veleroCfg test.VeleroConfig) error {
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ import (
|
|||||||
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"golang.org/x/mod/semver"
|
"golang.org/x/mod/semver"
|
||||||
|
schedulingv1api "k8s.io/api/scheduling/v1"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/labels"
|
"k8s.io/apimachinery/pkg/labels"
|
||||||
ver "k8s.io/apimachinery/pkg/util/version"
|
ver "k8s.io/apimachinery/pkg/util/version"
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
@@ -45,9 +47,11 @@ import (
|
|||||||
|
|
||||||
"github.com/vmware-tanzu/velero/internal/volume"
|
"github.com/vmware-tanzu/velero/internal/volume"
|
||||||
velerov1api "github.com/vmware-tanzu/velero/pkg/apis/velero/v1"
|
velerov1api "github.com/vmware-tanzu/velero/pkg/apis/velero/v1"
|
||||||
|
"github.com/vmware-tanzu/velero/pkg/builder"
|
||||||
cliinstall "github.com/vmware-tanzu/velero/pkg/cmd/cli/install"
|
cliinstall "github.com/vmware-tanzu/velero/pkg/cmd/cli/install"
|
||||||
"github.com/vmware-tanzu/velero/pkg/cmd/util/flag"
|
"github.com/vmware-tanzu/velero/pkg/cmd/util/flag"
|
||||||
veleroexec "github.com/vmware-tanzu/velero/pkg/util/exec"
|
veleroexec "github.com/vmware-tanzu/velero/pkg/util/exec"
|
||||||
|
"github.com/vmware-tanzu/velero/test"
|
||||||
. "github.com/vmware-tanzu/velero/test"
|
. "github.com/vmware-tanzu/velero/test"
|
||||||
common "github.com/vmware-tanzu/velero/test/util/common"
|
common "github.com/vmware-tanzu/velero/test/util/common"
|
||||||
. "github.com/vmware-tanzu/velero/test/util/k8s"
|
. "github.com/vmware-tanzu/velero/test/util/k8s"
|
||||||
@@ -274,6 +278,9 @@ func getProviderVeleroInstallOptions(veleroCfg *VeleroConfig,
|
|||||||
io.ItemBlockWorkerCount = veleroCfg.ItemBlockWorkerCount
|
io.ItemBlockWorkerCount = veleroCfg.ItemBlockWorkerCount
|
||||||
io.ServerPriorityClassName = veleroCfg.ServerPriorityClassName
|
io.ServerPriorityClassName = veleroCfg.ServerPriorityClassName
|
||||||
io.NodeAgentPriorityClassName = veleroCfg.NodeAgentPriorityClassName
|
io.NodeAgentPriorityClassName = veleroCfg.NodeAgentPriorityClassName
|
||||||
|
io.RepoMaintenanceJobConfigMap = veleroCfg.RepoMaintenanceJobConfigMap
|
||||||
|
io.BackupRepoConfigMap = veleroCfg.BackupRepoConfigMap
|
||||||
|
io.NodeAgentConfigMap = veleroCfg.NodeAgentConfigMap
|
||||||
|
|
||||||
return io, nil
|
return io, nil
|
||||||
}
|
}
|
||||||
@@ -1812,3 +1819,43 @@ func KubectlGetAllDeleteBackupRequest(ctx context.Context, backupName, veleroNam
|
|||||||
|
|
||||||
return common.GetListByCmdPipes(ctx, cmds)
|
return common.GetListByCmdPipes(ctx, cmds)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func CreatePriorityClasses(ctx context.Context, client kbclient.Client) error {
|
||||||
|
dataMoverPriorityClass := builder.ForPriorityClass(test.PriorityClassNameForDataMover).
|
||||||
|
Value(90000).PreemptionPolicy("Never").Result()
|
||||||
|
if err := client.Create(ctx, dataMoverPriorityClass); err != nil {
|
||||||
|
fmt.Printf("Fail to create PriorityClass %s: %s\n", test.PriorityClassNameForDataMover, err.Error())
|
||||||
|
return fmt.Errorf("fail to create PriorityClass %s: %w", test.PriorityClassNameForDataMover, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
repoMaintenancePriorityClass := builder.ForPriorityClass(test.PriorityClassNameForRepoMaintenance).
|
||||||
|
Value(80000).PreemptionPolicy("Never").Result()
|
||||||
|
if err := client.Create(ctx, repoMaintenancePriorityClass); err != nil {
|
||||||
|
fmt.Printf("Fail to create PriorityClass %s: %s\n", test.PriorityClassNameForRepoMaintenance, err.Error())
|
||||||
|
return fmt.Errorf("fail to create PriorityClass %s: %w", test.PriorityClassNameForRepoMaintenance, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func DeletePriorityClasses(ctx context.Context, client kbclient.Client) error {
|
||||||
|
priorityClassDataMover := &schedulingv1api.PriorityClass{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: test.PriorityClassNameForDataMover,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
if err := client.Delete(ctx, priorityClassDataMover); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
priorityClassRepoMaintenance := &schedulingv1api.PriorityClass{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: test.PriorityClassNameForRepoMaintenance,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
if err := client.Delete(ctx, priorityClassRepoMaintenance); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user