Add retrying to audit logging e2e tests

Signed-off-by: Mik Vyatskov <vmik@google.com>
This commit is contained in:
Mik Vyatskov 2018-03-05 15:49:11 +01:00
parent a81787052c
commit f327a2a4c0

View File

@ -21,6 +21,7 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"strings" "strings"
"time"
apiv1 "k8s.io/api/core/v1" apiv1 "k8s.io/api/core/v1"
extensions "k8s.io/api/extensions/v1beta1" extensions "k8s.io/api/extensions/v1beta1"
@ -29,13 +30,13 @@ import (
"k8s.io/apiextensions-apiserver/test/integration/testserver" "k8s.io/apiextensions-apiserver/test/integration/testserver"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/apiserver/pkg/apis/audit/v1beta1" "k8s.io/apiserver/pkg/apis/audit/v1beta1"
"k8s.io/kubernetes/test/e2e/framework" "k8s.io/kubernetes/test/e2e/framework"
imageutils "k8s.io/kubernetes/test/utils/image" imageutils "k8s.io/kubernetes/test/utils/image"
"github.com/evanphx/json-patch" "github.com/evanphx/json-patch"
. "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
) )
var ( var (
@ -630,7 +631,18 @@ var _ = SIGDescribe("Advanced Audit", func() {
expectedEvents = append(expectedEvents, t.events...) expectedEvents = append(expectedEvents, t.events...)
} }
expectAuditLines(f, expectedEvents) // The default flush timeout is 30 seconds, therefore it should be enough to retry once
// to find all expected events. However, we're waiting for 5 minutes to avoid flakes.
pollingInterval := 30 * time.Second
pollingTimeout := 5 * time.Minute
err = wait.Poll(pollingInterval, pollingTimeout, func() (bool, error) {
ok, err := checkAuditLines(f, expectedEvents)
if err != nil {
framework.Logf("Failed to observe audit events: %v", err)
}
return ok, nil
})
framework.ExpectNoError(err, "after %v failed to observe audit events", pollingTimeout)
}) })
}) })
@ -648,7 +660,7 @@ type auditEvent struct {
} }
// Search the audit log for the expected audit lines. // Search the audit log for the expected audit lines.
func expectAuditLines(f *framework.Framework, expected []auditEvent) { func checkAuditLines(f *framework.Framework, expected []auditEvent) (bool, error) {
expectations := map[auditEvent]bool{} expectations := map[auditEvent]bool{}
for _, event := range expected { for _, event := range expected {
expectations[event] = false expectations[event] = false
@ -656,25 +668,36 @@ func expectAuditLines(f *framework.Framework, expected []auditEvent) {
// Fetch the log stream. // Fetch the log stream.
stream, err := f.ClientSet.CoreV1().RESTClient().Get().AbsPath("/logs/kube-apiserver-audit.log").Stream() stream, err := f.ClientSet.CoreV1().RESTClient().Get().AbsPath("/logs/kube-apiserver-audit.log").Stream()
framework.ExpectNoError(err, "could not read audit log") if err != nil {
return false, err
}
defer stream.Close() defer stream.Close()
scanner := bufio.NewScanner(stream) scanner := bufio.NewScanner(stream)
for scanner.Scan() { for scanner.Scan() {
line := scanner.Text() line := scanner.Text()
event, err := parseAuditLine(line) event, err := parseAuditLine(line)
framework.ExpectNoError(err) if err != nil {
return false, err
}
// If the event was expected, mark it as found. // If the event was expected, mark it as found.
if _, found := expectations[event]; found { if _, found := expectations[event]; found {
expectations[event] = true expectations[event] = true
} }
} }
framework.ExpectNoError(scanner.Err(), "error reading audit log") if err := scanner.Err(); err != nil {
return false, err
for event, found := range expectations {
Expect(found).To(BeTrue(), "Event %#v not found!", event)
} }
noneMissing := true
for event, found := range expectations {
if !found {
framework.Logf("Event %#v not found!", event)
}
noneMissing = noneMissing && found
}
return noneMissing, nil
} }
func parseAuditLine(line string) (auditEvent, error) { func parseAuditLine(line string) (auditEvent, error) {