From 8e91fad31f9c41eebc1170d82512604ccc6f4725 Mon Sep 17 00:00:00 2001 From: weekface Date: Mon, 5 Nov 2018 14:27:43 +0800 Subject: [PATCH 1/3] e2e: meta sync --- tests/e2e/create.go | 116 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 115 insertions(+), 1 deletion(-) diff --git a/tests/e2e/create.go b/tests/e2e/create.go index 087c64a43cb..5e36048c7cc 100644 --- a/tests/e2e/create.go +++ b/tests/e2e/create.go @@ -16,8 +16,11 @@ package e2e import ( "database/sql" "fmt" + "strings" "time" + "strconv" + _ "github.com/go-sql-driver/mysql" // init mysql driver . "github.com/onsi/ginkgo" // revive:disable:dot-imports . "github.com/onsi/gomega" // revive:disable:dot-imports @@ -82,7 +85,10 @@ func allMembersRunning() (bool, error) { return false, nil } - // TODO meta information synced + synced, err = metaSynced(tc) + if err != nil || !synced { + return false, nil + } return true, nil } @@ -328,3 +334,111 @@ func reclaimPolicySynced(tc *v1alpha1.TidbCluster) (bool, error) { return true, nil } + +func metaSynced(tc *v1alpha1.TidbCluster) (bool, error) { + ns := tc.GetNamespace() + tcName := tc.GetName() + + pdControl := controller.NewDefaultPDControl() + pdCli := pdControl.GetPDClient(tc) + cluster, err := pdCli.GetCluster() + if err != nil { + logf(err.Error()) + return false, nil + } + clusterID := strconv.FormatUint(cluster.Id, 10) + + labelSelector := label.New().Cluster(tcName) + podList, err := kubeCli.CoreV1().Pods(ns).List( + metav1.ListOptions{ + LabelSelector: labels.SelectorFromSet( + labelSelector.Labels(), + ).String(), + }, + ) + if err != nil { + logf(err.Error()) + return false, nil + } + +outerLoop: + for _, pod := range podList.Items { + podName := pod.GetName() + Expect(pod.Labels[label.ClusterIDLabelKey]).To(Equal(clusterID)) + + component := pod.Labels[label.ComponentLabelKey] + switch component { + case label.PDLabelVal: + var memberID string + members, err := pdCli.GetMembers() + if err != nil { + logf(err.Error()) + return false, nil + } + for _, member := range members.Members { + if member.Name == podName { + memberID = strconv.FormatUint(member.GetMemberId(), 10) + break + } + } + Expect(pod.Labels[label.MemberIDLabelKey]).To(Equal(memberID)) + case label.TiKVLabelVal: + var storeID string + stores, err := pdCli.GetStores() + if err != nil { + logf(err.Error()) + return false, nil + } + for _, store := range stores.Stores { + addr := store.Store.GetAddress() + if strings.Split(addr, ".")[0] == podName { + storeID = strconv.FormatUint(store.Store.GetId(), 10) + break + } + } + Expect(pod.Labels[label.StoreIDLabelKey]).To(Equal(storeID)) + case label.TiDBLabelVal: + continue outerLoop + } + + var pvcName string + for _, vol := range pod.Spec.Volumes { + if vol.PersistentVolumeClaim != nil { + pvcName = vol.PersistentVolumeClaim.ClaimName + break + } + } + if pvcName == "" { + logf("pod: %s/%s's pvcName is empty", ns, podName) + return false, nil + } + + pvc, err := kubeCli.CoreV1().PersistentVolumeClaims(ns).Get(pvcName, metav1.GetOptions{}) + if err != nil { + logf(err.Error()) + return false, nil + } + Expect(pvc.Labels[label.ClusterIDLabelKey]).To(Equal(clusterID)) + Expect(pvc.Labels[label.MemberIDLabelKey]).To(Equal(pod.Labels[label.MemberIDLabelKey])) + Expect(pvc.Labels[label.StoreIDLabelKey]).To(Equal(pod.Labels[label.StoreIDLabelKey])) + Expect(pvc.Annotations[label.AnnPodNameKey]).To(Equal(podName)) + + pvName := pvc.Spec.VolumeName + pv, err := kubeCli.CoreV1().PersistentVolumes().Get(pvName, metav1.GetOptions{}) + if err != nil { + logf(err.Error()) + return false, nil + } + Expect(pv.Labels[label.NamespaceLabelKey]).To(Equal(ns)) + Expect(pv.Labels[label.ComponentLabelKey]).To(Equal(pod.Labels[label.ComponentLabelKey])) + Expect(pv.Labels[label.NameLabelKey]).To(Equal(pod.Labels[label.NameLabelKey])) + Expect(pv.Labels[label.ManagedByLabelKey]).To(Equal(pod.Labels[label.ManagedByLabelKey])) + Expect(pv.Labels[label.InstanceLabelKey]).To(Equal(pod.Labels[label.InstanceLabelKey])) + Expect(pv.Labels[label.ClusterIDLabelKey]).To(Equal(clusterID)) + Expect(pv.Labels[label.MemberIDLabelKey]).To(Equal(pod.Labels[label.MemberIDLabelKey])) + Expect(pv.Labels[label.StoreIDLabelKey]).To(Equal(pod.Labels[label.StoreIDLabelKey])) + Expect(pv.Annotations[label.AnnPodNameKey]).To(Equal(podName)) + } + + return true, nil +} From a27814c840052d596f51d8f4d9685dce5c856d8c Mon Sep 17 00:00:00 2001 From: weekface Date: Mon, 5 Nov 2018 14:42:07 +0800 Subject: [PATCH 2/3] typo --- tests/e2e/create.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/e2e/create.go b/tests/e2e/create.go index 5e36048c7cc..894bf78984b 100644 --- a/tests/e2e/create.go +++ b/tests/e2e/create.go @@ -16,11 +16,10 @@ package e2e import ( "database/sql" "fmt" + "strconv" "strings" "time" - "strconv" - _ "github.com/go-sql-driver/mysql" // init mysql driver . "github.com/onsi/ginkgo" // revive:disable:dot-imports . "github.com/onsi/gomega" // revive:disable:dot-imports From a978b6c7d366578bb7133da19d173012ba3f32f9 Mon Sep 17 00:00:00 2001 From: weekface Date: Wed, 7 Nov 2018 21:06:55 +0800 Subject: [PATCH 3/3] address comment --- tests/e2e/create.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/e2e/create.go b/tests/e2e/create.go index f8a64a09632..2b15abd034b 100644 --- a/tests/e2e/create.go +++ b/tests/e2e/create.go @@ -399,6 +399,7 @@ outerLoop: break } } + Expect(memberID).NotTo(BeEmpty()) Expect(pod.Labels[label.MemberIDLabelKey]).To(Equal(memberID)) case label.TiKVLabelVal: var storeID string @@ -414,6 +415,7 @@ outerLoop: break } } + Expect(storeID).NotTo(BeEmpty()) Expect(pod.Labels[label.StoreIDLabelKey]).To(Equal(storeID)) case label.TiDBLabelVal: continue outerLoop