From 85c19fa91b8cf6f024436c52ecf41218aaf62011 Mon Sep 17 00:00:00 2001 From: Kornchanok Jiravesayakul Date: Mon, 23 Mar 2020 13:43:08 +0700 Subject: [PATCH] :bento: [patch] Move finished reverify queues to the last (#6) * :bento: Move finished reverify queue to the last * :white_check_mark: Update testcase * :wrench: Not required ci to pass --- api/v1beta1/queue_types.go | 19 ++++++ api/v1beta1/queue_types_test.go | 109 ++++++++++++++++++++++++++++++++ codecov.yml | 4 -- 3 files changed, 128 insertions(+), 4 deletions(-) create mode 100644 api/v1beta1/queue_types_test.go diff --git a/api/v1beta1/queue_types.go b/api/v1beta1/queue_types.go index 5a45d35c..6be1911b 100644 --- a/api/v1beta1/queue_types.go +++ b/api/v1beta1/queue_types.go @@ -387,6 +387,8 @@ type ByNoOfOrder []Queue func (q ByNoOfOrder) Len() int { return len(q) } func (q ByNoOfOrder) Less(i, j int) bool { + now := metav1.Now() + if q[i].Spec.NoOfOrder == q[j].Spec.NoOfOrder { if q[i].Spec.NextProcessAt == nil { return true @@ -395,6 +397,23 @@ func (q ByNoOfOrder) Less(i, j int) bool { } return q[i].Spec.NextProcessAt.Time.Before(q[j].Spec.NextProcessAt.Time) } + + // if next process at is after now, means that the reverify process has been finished + // moves to the last of queue + if q[i].Spec.NextProcessAt != nil && q[i].Spec.NextProcessAt.After(now.Time) && + q[j].Spec.NextProcessAt != nil && q[j].Spec.NextProcessAt.After(now.Time) { + return q[i].Spec.NextProcessAt.Time.Before(q[j].Spec.NextProcessAt.Time) + } + + if q[i].Spec.NextProcessAt != nil && q[i].Spec.NextProcessAt.After(now.Time) { + return false + } + + if q[j].Spec.NextProcessAt != nil && q[j].Spec.NextProcessAt.After(now.Time) { + return true + } + + // sort by order return q[i].Spec.NoOfOrder < q[j].Spec.NoOfOrder } diff --git a/api/v1beta1/queue_types_test.go b/api/v1beta1/queue_types_test.go new file mode 100644 index 00000000..5705f734 --- /dev/null +++ b/api/v1beta1/queue_types_test.go @@ -0,0 +1,109 @@ +package v1beta1_test + +import ( + "os" + "testing" + "time" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/controller-runtime/pkg/log/zap" + + s2hv1beta1 "github.com/agoda-com/samsahai/api/v1beta1" + s2hlog "github.com/agoda-com/samsahai/internal/log" + "github.com/agoda-com/samsahai/internal/util/unittest" +) + +func TestQueueList_Sort(t *testing.T) { + unittest.InitGinkgo(t, "Queue List Sort") +} + +var _ = BeforeSuite(func() { + if os.Getenv("DEBUG") != "" { + s2hlog.SetLogger(zap.New(func(o *zap.Options) { + o.Development = true + })) + } +}) + +var _ = Describe("Sort by no of order", func() { + g := NewWithT(GinkgoT()) + + beforeNow := metav1.Time{Time: metav1.Now().Add(-10 * time.Minute)} + afterNow := metav1.Time{Time: metav1.Now().Add(10 * time.Minute)} + + It("should sort queue list by no of order correctly", func() { + queueList := s2hv1beta1.QueueList{ + Items: []s2hv1beta1.Queue{ + {Spec: s2hv1beta1.QueueSpec{Name: "comp1", NoOfOrder: 3}}, + {Spec: s2hv1beta1.QueueSpec{Name: "comp2", NoOfOrder: 1}}, + {Spec: s2hv1beta1.QueueSpec{Name: "comp3", NoOfOrder: 2}}, + }, + } + + expectedQueueList := s2hv1beta1.QueueList{ + Items: []s2hv1beta1.Queue{ + {Spec: s2hv1beta1.QueueSpec{Name: "comp2", NoOfOrder: 1}}, + {Spec: s2hv1beta1.QueueSpec{Name: "comp3", NoOfOrder: 2}}, + {Spec: s2hv1beta1.QueueSpec{Name: "comp1", NoOfOrder: 3}}, + }, + } + + queueList.Sort() + g.Expect(queueList.Items).To(BeEquivalentTo(expectedQueueList.Items)) + }) + + It("should sort queue list correctly in case of orders are the same", func() { + queueList := s2hv1beta1.QueueList{ + Items: []s2hv1beta1.Queue{ + {Spec: s2hv1beta1.QueueSpec{Name: "comp1", NoOfOrder: 1}}, + {Spec: s2hv1beta1.QueueSpec{Name: "comp2-2", NoOfOrder: 2}}, + {Spec: s2hv1beta1.QueueSpec{Name: "comp2-4", NoOfOrder: 2, NextProcessAt: &beforeNow}}, + {Spec: s2hv1beta1.QueueSpec{Name: "comp2-3", NoOfOrder: 2, + NextProcessAt: &metav1.Time{Time: beforeNow.Add(-10 * time.Minute)}}}, + {Spec: s2hv1beta1.QueueSpec{Name: "comp2-1", NoOfOrder: 2}}, + }, + } + + expectedQueueList := s2hv1beta1.QueueList{ + Items: []s2hv1beta1.Queue{ + {Spec: s2hv1beta1.QueueSpec{Name: "comp1", NoOfOrder: 1}}, + {Spec: s2hv1beta1.QueueSpec{Name: "comp2-1", NoOfOrder: 2}}, + {Spec: s2hv1beta1.QueueSpec{Name: "comp2-2", NoOfOrder: 2}}, + {Spec: s2hv1beta1.QueueSpec{Name: "comp2-3", NoOfOrder: 2, + NextProcessAt: &metav1.Time{Time: beforeNow.Add(-10 * time.Minute)}}}, + {Spec: s2hv1beta1.QueueSpec{Name: "comp2-4", NoOfOrder: 2, NextProcessAt: &beforeNow}}, + }, + } + + queueList.Sort() + g.Expect(queueList.Items).To(BeEquivalentTo(expectedQueueList.Items)) + }) + + It("should sort queue list correctly in case of finishing reverify process, "+ + "next process at is after now", func() { + queueList := s2hv1beta1.QueueList{ + Items: []s2hv1beta1.Queue{ + {Spec: s2hv1beta1.QueueSpec{Name: "comp1", NoOfOrder: 2}}, + {Spec: s2hv1beta1.QueueSpec{Name: "comp2", NoOfOrder: 1, + NextProcessAt: &metav1.Time{Time: afterNow.Add(10 * time.Minute)}}}, // finished reverify process + {Spec: s2hv1beta1.QueueSpec{Name: "comp3", NoOfOrder: 4, NextProcessAt: &afterNow}}, // finished reverify process + {Spec: s2hv1beta1.QueueSpec{Name: "comp4", NoOfOrder: 3, NextProcessAt: &beforeNow}}, + }, + } + + expectedQueueList := s2hv1beta1.QueueList{ + Items: []s2hv1beta1.Queue{ + {Spec: s2hv1beta1.QueueSpec{Name: "comp1", NoOfOrder: 2}}, + {Spec: s2hv1beta1.QueueSpec{Name: "comp4", NoOfOrder: 3, NextProcessAt: &beforeNow}}, + {Spec: s2hv1beta1.QueueSpec{Name: "comp3", NoOfOrder: 4, NextProcessAt: &afterNow}}, // finished reverify process + {Spec: s2hv1beta1.QueueSpec{Name: "comp2", NoOfOrder: 1, + NextProcessAt: &metav1.Time{Time: afterNow.Add(10 * time.Minute)}}}, // finished reverify process + }, + } + + queueList.Sort() + g.Expect(queueList.Items).To(BeEquivalentTo(expectedQueueList.Items)) + }) +}) diff --git a/codecov.yml b/codecov.yml index 9c2bea2d..1f736e44 100644 --- a/codecov.yml +++ b/codecov.yml @@ -1,7 +1,3 @@ -codecov: - notify: - require_ci_to_pass: yes - coverage: precision: 2 round: down