You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by ho...@apache.org on 2023/05/15 15:08:24 UTC
[solr-operator] branch main updated: More e2e test improvements
This is an automated email from the ASF dual-hosted git repository.
houston pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr-operator.git
The following commit(s) were added to refs/heads/main by this push:
new 66d6d89 More e2e test improvements
66d6d89 is described below
commit 66d6d89502f6d748f4e74f2dfeb11c5ea4f156b3
Author: Houston Putman <ho...@apache.org>
AuthorDate: Mon May 15 10:55:51 2023 -0400
More e2e test improvements
- Failure information is now provided per-failure.
Currently test namespace is printed.
- Solr-Ready logic has been factored out and improved to fix
race-condition with StatefulSets being deleted and recreated.
---
tests/e2e/backups_test.go | 4 +---
tests/e2e/prometheus_exporter_test.go | 4 +---
tests/e2e/resource_utils_test.go | 15 ++++++++++++++-
tests/e2e/solrcloud_basic_test.go | 4 +---
tests/e2e/solrcloud_rolling_upgrade_test.go | 4 +---
tests/e2e/suite_test.go | 23 +++++++++++++++++++++++
6 files changed, 41 insertions(+), 13 deletions(-)
diff --git a/tests/e2e/backups_test.go b/tests/e2e/backups_test.go
index 1057522..7c3c7e1 100644
--- a/tests/e2e/backups_test.go
+++ b/tests/e2e/backups_test.go
@@ -67,9 +67,7 @@ var _ = FDescribe("E2E - Backups", Ordered, func() {
})
By("Waiting for the SolrCloud to come up healthy")
- solrCloud = expectSolrCloudWithChecks(ctx, solrCloud, func(g Gomega, found *solrv1beta1.SolrCloud) {
- g.Expect(found.Status.ReadyReplicas).To(Equal(*found.Spec.Replicas), "The SolrCloud should have all nodes come up healthy")
- })
+ solrCloud = expectSolrCloudToBeReady(ctx, solrCloud)
By("creating a Solr Collection to backup")
createAndQueryCollection(ctx, solrCloud, solrCollection, 1, 2)
diff --git a/tests/e2e/prometheus_exporter_test.go b/tests/e2e/prometheus_exporter_test.go
index 23ac6a4..003d1ea 100644
--- a/tests/e2e/prometheus_exporter_test.go
+++ b/tests/e2e/prometheus_exporter_test.go
@@ -53,9 +53,7 @@ var _ = FDescribe("E2E - Prometheus Exporter", Ordered, func() {
})
By("waiting for the SolrCloud to come up healthy")
- solrCloud = expectSolrCloudWithChecks(ctx, solrCloud, func(g Gomega, found *solrv1beta1.SolrCloud) {
- g.Expect(found.Status.ReadyReplicas).To(Equal(*found.Spec.Replicas), "The SolrCloud should have all nodes come up healthy")
- })
+ solrCloud = expectSolrCloudToBeReady(ctx, solrCloud)
By("creating a Solr Collection to query metrics for")
createAndQueryCollection(ctx, solrCloud, solrCollection, 1, 2)
diff --git a/tests/e2e/resource_utils_test.go b/tests/e2e/resource_utils_test.go
index 3a9853f..3c6c9fb 100644
--- a/tests/e2e/resource_utils_test.go
+++ b/tests/e2e/resource_utils_test.go
@@ -58,13 +58,26 @@ func deleteAndWait(ctx context.Context, object client.Object, additionalOffset .
Expect(err).ToNot(HaveOccurred(), "Error fetching objectKind")
Expect(kinds).ToNot(BeEmpty(), "No objectKinds found for object")
objKind := kinds[0]
- Expect(k8sClient.Delete(ctx, object)).To(Or(Succeed(), MatchError(HaveSuffix("%q not found", testNamespace()))), "Failed to delete %s %s after test", objKind.Kind, key.Name)
+ Expect(k8sClient.Delete(ctx, object)).To(Or(Succeed(), MatchError(HaveSuffix("%q not found", object.GetName()))), "Failed to delete %s %s after test", objKind.Kind, key.Name)
EventuallyWithOffset(resolveOffset(additionalOffset), func() error {
return k8sClient.Get(ctx, key, object)
}).Within(time.Minute).
Should(MatchError(HaveSuffix("%q not found", key.Name)), objKind.Kind+" exists when it should not")
}
+func expectSolrCloudToBeReady(ctx context.Context, solrCloud *solrv1beta1.SolrCloud, additionalOffset ...int) *solrv1beta1.SolrCloud {
+ return expectSolrCloudWithChecks(ctx, solrCloud, func(g Gomega, found *solrv1beta1.SolrCloud) {
+ g.Expect(found.Status.ReadyReplicas).To(Equal(*found.Spec.Replicas), "The SolrCloud should have all nodes come up healthy")
+ // We have to check the status.replicas, because when a cloud is deleted/recreated, the statefulset can be recreated
+ // before the pods of the previous statefulset are deleted. So those pods will still be matched to the label selector,
+ // but the new statefulset doesn't know about them.
+ // The "Status.ReadyReplicas" value is populated from querying with the label selector
+ // The "Status.Replicas" value is populated from the statefulSet status
+ // So we need both to be equal to the requested number of replicas in order to know the statefulset is ready to go.
+ g.Expect(found.Status.Replicas).To(Equal(*found.Spec.Replicas), "The SolrCloud should have all nodes come up healthy")
+ }, resolveOffset(additionalOffset))
+}
+
func expectSolrCloud(ctx context.Context, solrCloud *solrv1beta1.SolrCloud, additionalOffset ...int) *solrv1beta1.SolrCloud {
return expectSolrCloudWithChecks(ctx, solrCloud, nil, resolveOffset(additionalOffset))
}
diff --git a/tests/e2e/solrcloud_basic_test.go b/tests/e2e/solrcloud_basic_test.go
index c600d72..be3961a 100644
--- a/tests/e2e/solrcloud_basic_test.go
+++ b/tests/e2e/solrcloud_basic_test.go
@@ -43,9 +43,7 @@ var _ = FDescribe("E2E - SolrCloud - Basic", func() {
})
By("Waiting for the SolrCloud to come up healthy")
- solrCloud = expectSolrCloudWithChecks(ctx, solrCloud, func(g Gomega, found *solrv1beta1.SolrCloud) {
- g.Expect(found.Status.ReadyReplicas).To(Equal(*found.Spec.Replicas), "The SolrCloud should have all nodes come up healthy")
- })
+ solrCloud = expectSolrCloudToBeReady(ctx, solrCloud)
By("creating a first Solr Collection")
createAndQueryCollection(ctx, solrCloud, "basic", 1, 1)
diff --git a/tests/e2e/solrcloud_rolling_upgrade_test.go b/tests/e2e/solrcloud_rolling_upgrade_test.go
index 81b730c..567e359 100644
--- a/tests/e2e/solrcloud_rolling_upgrade_test.go
+++ b/tests/e2e/solrcloud_rolling_upgrade_test.go
@@ -48,9 +48,7 @@ var _ = FDescribe("E2E - SolrCloud - Rolling Upgrades", func() {
})
By("Waiting for the SolrCloud to come up healthy")
- solrCloud = expectSolrCloudWithChecks(ctx, solrCloud, func(g Gomega, found *solrv1beta1.SolrCloud) {
- g.Expect(found.Status.ReadyReplicas).To(Equal(*found.Spec.Replicas), "The SolrCloud should have all nodes come up healthy")
- })
+ solrCloud = expectSolrCloudToBeReady(ctx, solrCloud)
By("creating a first Solr Collection")
createAndQueryCollection(ctx, solrCloud, solrCollection1, 1, 2)
diff --git a/tests/e2e/suite_test.go b/tests/e2e/suite_test.go
index c53026c..770965b 100644
--- a/tests/e2e/suite_test.go
+++ b/tests/e2e/suite_test.go
@@ -159,9 +159,32 @@ func (rc RetryCommand) String() string {
)
}
+type FailureInformation struct {
+ namespace string
+}
+
+// ColorableString for ReportEntry to use
+func (fi FailureInformation) ColorableString() string {
+ return fmt.Sprintf("{{yellow}}%s{{/}}", fi)
+}
+
+// non-colorable String() is used by go's string formatting support but ignored by ReportEntry
+func (fi FailureInformation) String() string {
+ return fmt.Sprintf(
+ "Namespace: %s\n",
+ fi.namespace,
+ )
+}
+
var _ = ReportAfterEach(func(report SpecReport) {
if report.Failed() {
ginkgoConfig, _ := GinkgoConfiguration()
+ AddReportEntry(
+ "Failure Information",
+ FailureInformation{
+ namespace: testNamespace(),
+ },
+ )
AddReportEntry(
"Re-Run Failed Test Using Command",
types.CodeLocation{},