Skip to content

Commit 286792a

Browse files
suaas21tamalsaha
authored andcommitted
Stash v1beta1 E2E test for DaemonSet (#741)
xref: #707 Tasks: [x] Workload backup and restore for DaemonSet
1 parent 62960e5 commit 286792a

File tree

12 files changed

+376
-33
lines changed

12 files changed

+376
-33
lines changed

hack/deploy/rbac-list.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ rules:
2727
- "*"
2828
verbs: ["*"]
2929
- apiGroups:
30-
- appcatalog.appscode.com
30+
- appcatalog.appscode.com
3131
resources:
32-
- "*"
32+
- "*"
3333
verbs: ["*"]
3434
- apiGroups:
3535
- apps

pkg/controller/sidecar.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ func (c *StashController) ensureBackupSidecarDeleted(w *wapi.Workload, bc *api_v
250250
func (c *StashController) ensureWorkloadLatestState(w *wapi.Workload) (bool, error) {
251251
stateChanged := false
252252

253-
err := wait.PollImmediateInfinite(3*time.Second, func() (done bool, err error) {
253+
err := wait.PollImmediate(3*time.Second, 5*time.Minute, func() (done bool, err error) {
254254
r, err := metav1.LabelSelectorAsSelector(w.Spec.Selector)
255255
if err != nil {
256256
return false, err
@@ -274,6 +274,9 @@ func (c *StashController) ensureWorkloadLatestState(w *wapi.Workload) (bool, err
274274
// we have to restart these pods so that it starts with latest update
275275
var podsToRestart []core.Pod
276276
for _, pod := range pods.Items {
277+
if !isPodOwnedByWorkload(w, pod) {
278+
continue
279+
}
277280
podSidecarState := hasStashSidecar(pod.Spec.Containers)
278281
podInitContainerState := hasStashInitContainer(pod.Spec.InitContainers)
279282
podBackupResourceHash := util.GetString(pod.Annotations, api_v1beta1.AppliedBackupConfigurationSpecHash)
@@ -305,3 +308,12 @@ func (c *StashController) ensureWorkloadLatestState(w *wapi.Workload) (bool, err
305308

306309
return stateChanged, nil
307310
}
311+
312+
func isPodOwnedByWorkload(w *wapi.Workload, pod core.Pod) bool {
313+
for _, ref := range pod.OwnerReferences {
314+
if ref.Kind == w.Kind && ref.Name == w.Name {
315+
return true
316+
}
317+
}
318+
return false
319+
}

pkg/util/util.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ func GetHostName(target *api_v1beta1.Target) (string, error) {
4444
podOrdinal := podInfo[len(podInfo)-1]
4545
return "host-" + podOrdinal, nil
4646
case apis.KindDaemonSet:
47-
nodeName := os.Getenv("POD_NAME")
47+
nodeName := os.Getenv("NODE_NAME")
4848
if nodeName == "" {
4949
return "", fmt.Errorf("missing nodeName for %s", apis.KindDaemonSet)
5050
}

test/e2e/framework/backup_configuration.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"github.com/appscode/stash/apis/stash/v1alpha1"
66
"github.com/appscode/stash/apis/stash/v1beta1"
77
core "k8s.io/api/core/v1"
8-
"k8s.io/apimachinery/pkg/apis/meta/v1"
98
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
109
)
1110

@@ -47,5 +46,5 @@ func (f *Invocation) CreateBackupConfiguration(backupCfg v1beta1.BackupConfigura
4746
}
4847

4948
func (f *Invocation) DeleteBackupConfiguration(backupCfg v1beta1.BackupConfiguration) error {
50-
return f.StashClient.StashV1beta1().BackupConfigurations(backupCfg.Namespace).Delete(backupCfg.Name, &v1.DeleteOptions{})
49+
return f.StashClient.StashV1beta1().BackupConfigurations(backupCfg.Namespace).Delete(backupCfg.Name, &metav1.DeleteOptions{})
5150
}

test/e2e/framework/backup_session.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ func (f *Framework) EventuallyBackupSessionPhase(meta metav1.ObjectMeta) GomegaA
2121

2222
func (f *Framework) EventuallyBackupSessionCreated(meta metav1.ObjectMeta) GomegaAsyncAssertion {
2323
return Eventually(
24-
func() bool {
24+
func() bool {
2525
backupsnlist, err := f.StashClient.StashV1beta1().BackupSessions(meta.Namespace).List(metav1.ListOptions{})
2626
Expect(err).NotTo(HaveOccurred())
2727
if len(backupsnlist.Items) > 0 {
@@ -34,15 +34,15 @@ func (f *Framework) EventuallyBackupSessionCreated(meta metav1.ObjectMeta) Gomeg
3434
)
3535
}
3636

37-
func (f *Framework) GetBackupSession(meta metav1.ObjectMeta) (*v1beta1.BackupSession, error){
37+
func (f *Framework) GetBackupSession(meta metav1.ObjectMeta) (*v1beta1.BackupSession, error) {
3838
backupsnlist, err := f.StashClient.StashV1beta1().BackupSessions(meta.Namespace).List(metav1.ListOptions{})
39-
if err != nil{
40-
return nil,err
39+
if err != nil {
40+
return nil, err
4141
}
42-
if len(backupsnlist.Items)>0{
43-
return &backupsnlist.Items[0],nil
42+
if len(backupsnlist.Items) > 0 {
43+
return &backupsnlist.Items[0], nil
4444
}
45-
return nil,fmt.Errorf("no BackupSession found")
45+
return nil, fmt.Errorf("no BackupSession found")
4646
}
4747

4848
func (f *Framework) EventuallyBackupSessionTotalHost(meta metav1.ObjectMeta) GomegaAsyncAssertion {

test/e2e/framework/daemonset.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package framework
22

33
import (
4+
"time"
5+
46
"github.com/appscode/go/crypto/rand"
57
. "github.com/onsi/gomega"
68
apps "k8s.io/api/apps/v1"
79
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10+
"k8s.io/apimachinery/pkg/fields"
811
"k8s.io/apimachinery/pkg/util/intstr"
912
)
1013

@@ -54,3 +57,23 @@ func (f *Framework) EventuallyDaemonSet(meta metav1.ObjectMeta) GomegaAsyncAsser
5457
return obj
5558
})
5659
}
60+
61+
func (f *Framework) EventuallyPodAccessible(meta metav1.ObjectMeta) GomegaAsyncAssertion {
62+
return Eventually(func() bool {
63+
labelSelector := fields.SelectorFromSet(meta.Labels)
64+
podList, err := f.KubeClient.CoreV1().Pods(meta.Namespace).List(metav1.ListOptions{LabelSelector: labelSelector.String()})
65+
Expect(err).NotTo(HaveOccurred())
66+
67+
for _, pod := range podList.Items {
68+
_, err := f.ExecOnPod(&pod, "ls", "-R")
69+
if err == nil {
70+
return true
71+
}
72+
}
73+
return false
74+
},
75+
time.Minute*2,
76+
time.Second*2,
77+
)
78+
79+
}

test/e2e/framework/pod.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,7 @@ func (fi *Invocation) PodTemplate(labels map[string]string, pvcName string) core
5656
}
5757

5858
func (f *Framework) GetPod(meta metav1.ObjectMeta) (*core.Pod, error) {
59-
labelSelector := fields.SelectorFromSet(meta.Labels)
60-
podList, err := f.KubeClient.CoreV1().Pods(meta.Namespace).List(metav1.ListOptions{LabelSelector: labelSelector.String()})
59+
podList, err := f.KubeClient.CoreV1().Pods(meta.Namespace).List(metav1.ListOptions{})
6160
if err != nil {
6261
return nil, err
6362
}

test/e2e/framework/repository.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@ func (f *Framework) DeleteRepositories(repositories []*api.Repository) {
7070
Expect(err).NotTo(HaveOccurred())
7171
}
7272
}
73+
74+
func (f *Framework) DeleteRepository(repository *api.Repository) error {
75+
err := f.StashClient.StashV1alpha1().Repositories(repository.Namespace).Delete(repository.Name, deleteInBackground())
76+
return err
77+
}
7378
func (f *Framework) BrowseResticRepository(repository *api.Repository) ([]stow.Item, error) {
7479
cfg, err := osm.NewOSMContext(f.KubeClient, repository)
7580
if err != nil {

test/e2e/framework/restore_session.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ func (f *Invocation) CreateRestoreSession(restoreSession v1beta1.RestoreSession)
3939
return err
4040
}
4141

42-
func (f Invocation) DeleteRestoreSession(meta metav1.ObjectMeta) error{
43-
_,err := f.StashClient.StashV1beta1().RestoreSessions(meta.Namespace).Get(meta.Name, metav1.GetOptions{})
42+
func (f Invocation) DeleteRestoreSession(meta metav1.ObjectMeta) error {
43+
err := f.StashClient.StashV1beta1().RestoreSessions(meta.Namespace).Delete(meta.Name, &metav1.DeleteOptions{})
4444
return err
4545
}
4646

test/e2e/framework/service.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package framework
33
import (
44
core "k8s.io/api/core/v1"
55
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
6+
core_util "kmodules.xyz/client-go/core/v1"
67
)
78

89
const (
@@ -38,3 +39,11 @@ func (f *Framework) CreateService(obj core.Service) error {
3839
func (f *Framework) DeleteService(meta metav1.ObjectMeta) error {
3940
return f.KubeClient.CoreV1().Services(meta.Namespace).Delete(meta.Name, deleteInForeground())
4041
}
42+
43+
func (f *Framework) CreateOrPatchService(obj core.Service) error {
44+
_, _, err := core_util.CreateOrPatchService(f.KubeClient, obj.ObjectMeta, func(in *core.Service) *core.Service {
45+
in.Spec = obj.Spec
46+
return in
47+
})
48+
return err
49+
}

test/e2e/framework/util.go

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"k8s.io/apimachinery/pkg/util/wait"
2424
"k8s.io/client-go/kubernetes"
2525
)
26+
2627
var (
2728
files = []string{"test-data1.txt", "test-data2.txt", "test-data3.txt", "test-data4.txt", "test-data5.txt"}
2829
)
@@ -340,7 +341,7 @@ func GetPathsFromResticFileGroups(restic *api.Restic) []string {
340341

341342
func GetPathsFromRestoreSession(restoreSession *v1beta1.RestoreSession) []string {
342343
paths := make([]string, 0)
343-
for i, _ := range restoreSession.Spec.Rules {
344+
for i := range restoreSession.Spec.Rules {
344345
for _, p := range restoreSession.Spec.Rules[i].Paths {
345346
paths = append(paths, p)
346347
}
@@ -353,13 +354,13 @@ func removeDuplicates(elements []string) []string {
353354
encountered := map[string]bool{}
354355

355356
// Create a map of all unique elements.
356-
for v:= range elements {
357+
for v := range elements {
357358
encountered[elements[v]] = true
358359
}
359360

360361
// Place all keys from the map into a slice.
361362
result := []string{}
362-
for key, _ := range encountered {
363+
for key := range encountered {
363364
result = append(result, key)
364365
}
365366
return result
@@ -521,6 +522,19 @@ func WaitUntilBackupConfigurationDeleted(sc cs.Interface, meta metav1.ObjectMeta
521522
})
522523
}
523524

525+
func WaitUntilRestoreSessionDeleted(sc cs.Interface, meta metav1.ObjectMeta) error {
526+
return wait.PollImmediate(PullInterval, WaitTimeOut, func() (done bool, err error) {
527+
if _, err := sc.StashV1beta1().RestoreSessions(meta.Namespace).Get(meta.Name, metav1.GetOptions{}); err != nil {
528+
if kerr.IsNotFound(err) {
529+
return true, nil
530+
} else {
531+
return true, err
532+
}
533+
}
534+
return false, nil
535+
})
536+
}
537+
524538
func WaitUntilRecoveryDeleted(sc cs.Interface, meta metav1.ObjectMeta) error {
525539

526540
return wait.PollImmediate(PullInterval, WaitTimeOut, func() (done bool, err error) {
@@ -555,6 +569,19 @@ func WaitUntilRepositoriesDeleted(sc cs.Interface, repositories []*api.Repositor
555569
return false, nil
556570
})
557571
}
572+
func WaitUntilRepositoryDeleted(sc cs.Interface, repository *api.Repository) error {
573+
574+
return wait.PollImmediate(PullInterval, WaitTimeOut, func() (done bool, err error) {
575+
if _, err := sc.StashV1alpha1().Repositories(repository.Namespace).Get(repository.Name, metav1.GetOptions{}); err != nil {
576+
if kerr.IsNotFound(err) {
577+
return true, nil
578+
} else {
579+
return true, err
580+
}
581+
}
582+
return false, nil
583+
})
584+
}
558585

559586
func (f *Framework) WaitUntilDaemonPodReady(meta metav1.ObjectMeta) error {
560587

@@ -563,10 +590,11 @@ func (f *Framework) WaitUntilDaemonPodReady(meta metav1.ObjectMeta) error {
563590
if err != nil {
564591
return false, nil
565592
}
566-
if pod.Status.Phase == core.PodPhase(core.PodReady) {
593+
if pod.Status.Phase == core.PodPhase(core.PodRunning) {
567594
return true, nil
568595
}
569596
return false, nil
597+
570598
})
571599
}
572600

0 commit comments

Comments
 (0)