From 0237d5a4c2fb104baa1c5e5a0ac94fd30e6feac1 Mon Sep 17 00:00:00 2001 From: James Munnelly Date: Mon, 7 Jan 2019 11:31:15 +0000 Subject: [PATCH] Write log files to artifacts directory instead of stdout Signed-off-by: James Munnelly --- test/e2e/e2e.go | 23 ++++++++++++-- test/e2e/e2e_test.go | 7 +---- test/e2e/framework/addon/certmanager/addon.go | 2 +- test/e2e/framework/addon/chart/addon.go | 26 +++++++--------- test/e2e/framework/addon/globals.go | 31 ++++++++++--------- .../e2e/framework/addon/nginxingress/nginx.go | 2 +- test/e2e/framework/addon/pebble/pebble.go | 2 +- test/e2e/framework/addon/vault/vault.go | 2 +- 8 files changed, 54 insertions(+), 41 deletions(-) diff --git a/test/e2e/e2e.go b/test/e2e/e2e.go index 5db55fb85..4cf113381 100644 --- a/test/e2e/e2e.go +++ b/test/e2e/e2e.go @@ -17,6 +17,11 @@ limitations under the License. package e2e import ( + "fmt" + "io/ioutil" + "os" + "path" + "github.com/onsi/ginkgo" "github.com/jetstack/cert-manager/test/e2e/framework" @@ -49,7 +54,7 @@ var _ = ginkgo.SynchronizedBeforeSuite(func() []byte { } }) -var globalLogs string +var globalLogs map[string]string var _ = ginkgo.SynchronizedAfterSuite(func() {}, func() { @@ -60,7 +65,21 @@ var _ = ginkgo.SynchronizedAfterSuite(func() {}, ginkgo.GinkgoWriter.Write([]byte("Failed to retrieve global addon logs: " + err.Error())) } - ginkgo.GinkgoWriter.Write([]byte(globalLogs)) + for k, v := range globalLogs { + outPath := path.Join(framework.DefaultConfig.Ginkgo.ReportDirectory, k) + // Create a directory for the file if needed + err := os.MkdirAll(path.Dir(outPath), 0755) + if err != nil { + ginkgo.GinkgoWriter.Write([]byte(fmt.Sprintf("Failed to create directory for logs: %v", err))) + continue + } + + err = ioutil.WriteFile(outPath, []byte(v), 0644) + if err != nil { + ginkgo.GinkgoWriter.Write([]byte(fmt.Sprintf("Failed to write log file: %v", err))) + continue + } + } ginkgo.By("Cleaning up the provisioned globals") err = addon.DeprovisionGlobals(cfg) diff --git a/test/e2e/e2e_test.go b/test/e2e/e2e_test.go index e9ee29446..eb8128a4d 100644 --- a/test/e2e/e2e_test.go +++ b/test/e2e/e2e_test.go @@ -19,7 +19,6 @@ package e2e import ( "flag" "fmt" - "log" "path" "testing" "time" @@ -74,9 +73,5 @@ func TestE2E(t *testing.T) { ginkgoconfig.GinkgoConfig.ParallelNode)))) } - if !ginkgo.RunSpecsWithDefaultAndCustomReporters(t, "cert-manager e2e suite", r) { - if len(globalLogs) > 0 { - log.Printf("Test suite failed, global addon logs: \n%v", globalLogs) - } - } + ginkgo.RunSpecsWithDefaultAndCustomReporters(t, "cert-manager e2e suite", r) } diff --git a/test/e2e/framework/addon/certmanager/addon.go b/test/e2e/framework/addon/certmanager/addon.go index 9f7490ee8..2cae5e344 100644 --- a/test/e2e/framework/addon/certmanager/addon.go +++ b/test/e2e/framework/addon/certmanager/addon.go @@ -113,6 +113,6 @@ func (p *Certmanager) SupportsGlobal() bool { return true } -func (p *Certmanager) Logs() (string, error) { +func (p *Certmanager) Logs() (map[string]string, error) { return p.chart.Logs() } diff --git a/test/e2e/framework/addon/chart/addon.go b/test/e2e/framework/addon/chart/addon.go index 40cdeed9d..e60359290 100644 --- a/test/e2e/framework/addon/chart/addon.go +++ b/test/e2e/framework/addon/chart/addon.go @@ -21,7 +21,7 @@ import ( "io/ioutil" "os" "os/exec" - "strings" + "path" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -247,15 +247,17 @@ func (c *Chart) SupportsGlobal() bool { return true } -func (c *Chart) Logs() (string, error) { +func (c *Chart) Logs() (map[string]string, error) { kc := c.Tiller.Base.Details().KubeClient pods, err := kc.CoreV1().Pods(c.Namespace).List(metav1.ListOptions{LabelSelector: "release=" + c.ReleaseName}) if err != nil { - return "", err + return nil, err } - builder := strings.Builder{} + out := make(map[string]string) for _, pod := range pods.Items { + // Only grab logs from the first container in the pod + // TODO: grab logs from all containers containerName := pod.Spec.Containers[0].Name resp := kc.CoreV1().Pods(pod.Namespace).GetLogs(pod.Name, &corev1.PodLogOptions{ Container: containerName, @@ -263,22 +265,16 @@ func (c *Chart) Logs() (string, error) { err := resp.Error() if err != nil { - return "", err + return nil, err } logs, err := resp.Raw() if err != nil { - return "", err + return nil, err } - _, err = builder.WriteString(fmt.Sprintf("Pod logs for %s:\n", pod.Name)) - if err != nil { - return "", err - } - _, err = builder.Write(logs) - if err != nil { - return "", err - } + outPath := path.Join(c.Namespace, pod.Name) + out[outPath] = string(logs) } - return builder.String(), nil + return out, nil } diff --git a/test/e2e/framework/addon/globals.go b/test/e2e/framework/addon/globals.go index 2df399dd4..853d79973 100644 --- a/test/e2e/framework/addon/globals.go +++ b/test/e2e/framework/addon/globals.go @@ -18,7 +18,6 @@ package addon import ( "fmt" - "strings" "github.com/golang/glog" utilerrors "k8s.io/apimachinery/pkg/util/errors" @@ -120,26 +119,30 @@ func SetupGlobals(cfg *config.Config) error { } type loggableAddon interface { - Logs() (string, error) + Logs() (map[string]string, error) } -func GlobalLogs() (string, error) { - b := &strings.Builder{} +func GlobalLogs() (map[string]string, error) { + out := make(map[string]string) for _, p := range provisioned { - if p, ok := p.(loggableAddon); ok { - l, err := p.Logs() + p, ok := p.(loggableAddon) + if !ok { + continue + } - if err != nil { - return "", err - } + l, err := p.Logs() + if err != nil { + return nil, err + } - _, err = b.WriteString(fmt.Sprintf("Got pods logs for addon: \n%s\n\n", l)) - if err != nil { - return "", err - } + // TODO: namespace logs from each addon to their addon type to avoid + // conflicts. Realistically, it's unlikely a conflict will occur though + // so this will probably be fine for now. + for k, v := range l { + out[k] = v } } - return b.String(), nil + return out, nil } // DeprovisionGlobals deprovisions all of the global addons. diff --git a/test/e2e/framework/addon/nginxingress/nginx.go b/test/e2e/framework/addon/nginxingress/nginx.go index bae17b3db..525476937 100644 --- a/test/e2e/framework/addon/nginxingress/nginx.go +++ b/test/e2e/framework/addon/nginxingress/nginx.go @@ -144,7 +144,7 @@ func (n *Nginx) SupportsGlobal() bool { return true } -func (n *Nginx) Logs() (string, error) { +func (n *Nginx) Logs() (map[string]string, error) { return n.chart.Logs() } diff --git a/test/e2e/framework/addon/pebble/pebble.go b/test/e2e/framework/addon/pebble/pebble.go index 7438fb121..7f384844a 100644 --- a/test/e2e/framework/addon/pebble/pebble.go +++ b/test/e2e/framework/addon/pebble/pebble.go @@ -102,6 +102,6 @@ func (p *Pebble) SupportsGlobal() bool { return true } -func (p *Pebble) Logs() (string, error) { +func (p *Pebble) Logs() (map[string]string, error) { return p.chart.Logs() } diff --git a/test/e2e/framework/addon/vault/vault.go b/test/e2e/framework/addon/vault/vault.go index c27b4398d..325335894 100644 --- a/test/e2e/framework/addon/vault/vault.go +++ b/test/e2e/framework/addon/vault/vault.go @@ -188,7 +188,7 @@ func (v *Vault) SupportsGlobal() bool { return false } -func (v *Vault) Logs() (string, error) { +func (v *Vault) Logs() (map[string]string, error) { return v.chart.Logs() }