Skip to content

Commit 6e755a4

Browse files
Print kpack debug info on e2e test failure
Print kpack pods logs, kpack images and kpack builds on e2e/smoke/crd test failure fixes #4072
1 parent b306353 commit 6e755a4

File tree

5 files changed

+134
-21
lines changed

5 files changed

+134
-21
lines changed

tests/crds/crds_suite_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"github.com/google/uuid"
2222
. "github.com/onsi/ginkgo/v2"
2323
. "github.com/onsi/gomega"
24+
buildv1alpha2 "github.com/pivotal/kpack/pkg/apis/build/v1alpha2"
2425
)
2526

2627
func init() {
@@ -33,6 +34,9 @@ func TestCrds(t *testing.T) {
3334
Hook: func(config *rest.Config, failure fail_handler.TestFailure) {
3435
fail_handler.PrintKorifiLogs(config, "", failure.StartTime)
3536
printBuildLogs(config)
37+
fail_handler.PrintKpackLogs(config, failure.StartTime)
38+
fail_handler.PrintAllObjects(config, testOrg.Name, &buildv1alpha2.BuildList{})
39+
fail_handler.PrintAllObjects(config, testOrg.Name, &buildv1alpha2.ImageList{})
3640
},
3741
})
3842
RegisterFailHandler(failHandler.Fail)

tests/e2e/e2e_suite_test.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,16 @@ import (
1616
"testing"
1717
"time"
1818

19+
"code.cloudfoundry.org/go-loggregator/v8/rpc/loggregator_v2"
1920
"code.cloudfoundry.org/korifi/api/payloads"
21+
korifiv1alpha1 "code.cloudfoundry.org/korifi/controllers/api/v1alpha1"
2022
"code.cloudfoundry.org/korifi/tests/helpers"
2123
"code.cloudfoundry.org/korifi/tests/helpers/fail_handler"
22-
23-
"code.cloudfoundry.org/go-loggregator/v8/rpc/loggregator_v2"
24-
korifiv1alpha1 "code.cloudfoundry.org/korifi/controllers/api/v1alpha1"
2524
"github.com/go-resty/resty/v2"
2625
"github.com/google/uuid"
2726
. "github.com/onsi/ginkgo/v2"
2827
. "github.com/onsi/gomega"
28+
buildv1alpha2 "github.com/pivotal/kpack/pkg/apis/build/v1alpha2"
2929
"go.yaml.in/yaml/v3"
3030
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3131
"k8s.io/client-go/kubernetes"
@@ -325,6 +325,9 @@ func TestE2E(t *testing.T) {
325325
Matcher: fail_handler.Always,
326326
Hook: func(config *rest.Config, failure fail_handler.TestFailure) {
327327
fail_handler.PrintKorifiLogs(config, correlationId, failure.StartTime)
328+
fail_handler.PrintKpackLogs(config, failure.StartTime)
329+
fail_handler.PrintAllObjects(config, commonTestOrgGUID, &buildv1alpha2.BuildList{})
330+
fail_handler.PrintAllObjects(config, commonTestOrgGUID, &buildv1alpha2.ImageList{})
328331
},
329332
},
330333
fail_handler.Hook{
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package fail_handler
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"reflect"
7+
8+
"github.com/onsi/ginkgo/v2"
9+
buildv1alpha2 "github.com/pivotal/kpack/pkg/apis/build/v1alpha2"
10+
"go.yaml.in/yaml/v2"
11+
corev1 "k8s.io/api/core/v1"
12+
"k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme"
13+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14+
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
15+
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
16+
rest "k8s.io/client-go/rest"
17+
"sigs.k8s.io/controller-runtime/pkg/client"
18+
)
19+
20+
func init() {
21+
utilruntime.Must(clientgoscheme.AddToScheme(scheme.Scheme))
22+
utilruntime.Must(corev1.AddToScheme(scheme.Scheme))
23+
utilruntime.Must(buildv1alpha2.AddToScheme(scheme.Scheme))
24+
}
25+
26+
func PrintObject(k8sClient client.Client, obj client.Object) error {
27+
if err := k8sClient.Get(context.Background(), client.ObjectKeyFromObject(obj), obj); err != nil {
28+
return fmt.Errorf("failed to get object %q: %v", client.ObjectKeyFromObject(obj), err)
29+
}
30+
31+
fmt.Fprintf(ginkgo.GinkgoWriter, "\n\n========== %T %s/%s (skipping managed fields) ==========\n", obj, obj.GetNamespace(), obj.GetName())
32+
obj.SetManagedFields([]metav1.ManagedFieldsEntry{})
33+
objBytes, err := yaml.Marshal(obj)
34+
if err != nil {
35+
return fmt.Errorf("failed marshalling object %v: %v", obj, err)
36+
}
37+
fmt.Fprintln(ginkgo.GinkgoWriter, string(objBytes))
38+
return nil
39+
}
40+
41+
func PrintAllObjects(config *rest.Config, orgGUID string, objs client.ObjectList) {
42+
k8sClient, err := createK8sClient(config)
43+
if err != nil {
44+
fmt.Fprintf(ginkgo.GinkgoWriter, "failed to create k8s client: %v\n", err)
45+
return
46+
47+
}
48+
49+
objects, err := collectObjects(k8sClient, orgGUID, objs)
50+
if err != nil {
51+
fmt.Fprintf(ginkgo.GinkgoWriter, "failed to list objects %T: %v\n", objs, err)
52+
return
53+
}
54+
55+
if len(objects) == 0 {
56+
fmt.Fprintf(ginkgo.GinkgoWriter, "no objects found of type %T\n", objs)
57+
return
58+
}
59+
60+
for _, o := range objects {
61+
if err := PrintObject(k8sClient, o); err != nil {
62+
fmt.Fprintf(ginkgo.GinkgoWriter, "failed to print object %s/%s: %v\n", o.GetNamespace(), o.GetName(), err)
63+
}
64+
}
65+
}
66+
67+
func collectObjects(k8sClient client.Client, orgGUID string, objectList client.ObjectList) ([]client.Object, error) {
68+
spaceNamespaces := &corev1.NamespaceList{}
69+
if err := k8sClient.List(context.Background(), spaceNamespaces, client.MatchingLabels{
70+
"korifi.cloudfoundry.org/org-guid": orgGUID,
71+
}); err != nil {
72+
return nil, fmt.Errorf("failed to list %T: %v", objectList, err)
73+
}
74+
75+
objects := []client.Object{}
76+
for _, ns := range spaceNamespaces.Items {
77+
if err := k8sClient.List(context.Background(), objectList, client.InNamespace(ns.Name)); err != nil {
78+
return nil, fmt.Errorf("failed to list %T: %v", objectList, err)
79+
}
80+
81+
s := reflect.ValueOf(objectList).Elem().FieldByName("Items")
82+
for i := 0; i < s.Len(); i++ {
83+
objects = append(objects, s.Index(i).Addr().Interface().(client.Object))
84+
}
85+
}
86+
87+
return objects, nil
88+
}
89+
90+
func createK8sClient(config *rest.Config) (client.Client, error) {
91+
k8sClient, err := client.New(config, client.Options{Scheme: scheme.Scheme})
92+
if err != nil {
93+
return nil, fmt.Errorf("failed to create k8s client: %v", err)
94+
}
95+
96+
return k8sClient, nil
97+
}

tests/helpers/fail_handler/pods.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,23 @@ func PrintKorifiLogs(config *rest.Config, correlationId string, since time.Time)
218218
})
219219
}
220220

221+
func PrintKpackLogs(config *rest.Config, since time.Time) {
222+
PrintPodsLogs(config, []PodDescriptor{
223+
{
224+
Namespace: "kpack",
225+
LabelKey: "app",
226+
LabelValue: "kpack-controller",
227+
Since: tools.PtrTo(metav1.NewTime(since)),
228+
},
229+
{
230+
Namespace: "kpack",
231+
LabelKey: "app",
232+
LabelValue: "kpack-webhook",
233+
Since: tools.PtrTo(metav1.NewTime(since)),
234+
},
235+
})
236+
}
237+
221238
func PrintAllBuildLogs(config *rest.Config, namespace string) {
222239
PrintPodsLogs(config, []PodDescriptor{
223240
{

tests/smoke/suite_test.go

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package smoke_test
22

33
import (
4-
"context"
54
"crypto/tls"
65
"encoding/json"
76
"fmt"
@@ -20,7 +19,7 @@ import (
2019
. "github.com/onsi/gomega"
2120
. "github.com/onsi/gomega/gexec"
2221
"github.com/onsi/gomega/types"
23-
"gopkg.in/yaml.v2"
22+
buildv1alpha2 "github.com/pivotal/kpack/pkg/apis/build/v1alpha2"
2423
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2524
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
2625
"k8s.io/client-go/kubernetes/scheme"
@@ -34,6 +33,7 @@ type SmokeTestSharedData struct {
3433
CfAdmin string `json:"cf_admin"`
3534
RootNamespace string `json:"root_namespace"`
3635
OrgName string `json:"org_name"`
36+
OrgGUID string `json:"org_guid"`
3737
BrokerOrgName string `json:"broker_org_name"`
3838
SpaceName string `json:"space_name"`
3939
AppsDomain string `json:"apps_domain"`
@@ -53,6 +53,9 @@ func TestSmoke(t *testing.T) {
5353
printCfApp(config)
5454
fail_handler.PrintKorifiLogs(config, "", failure.StartTime)
5555
printBuildLogs(config)
56+
fail_handler.PrintKpackLogs(config, failure.StartTime)
57+
fail_handler.PrintAllObjects(config, sharedData.OrgGUID, &buildv1alpha2.BuildList{})
58+
fail_handler.PrintAllObjects(config, sharedData.OrgGUID, &buildv1alpha2.ImageList{})
5659
},
5760
}).Fail)
5861

@@ -95,6 +98,9 @@ var _ = SynchronizedBeforeSuite(func() []byte {
9598
sharedData.BrokerURL = helpers.GetInClusterURL(getAppGUID(brokerAppName))
9699

97100
Expect(helpers.Cf("create-org", sharedData.OrgName)).To(Exit(0))
101+
sharedData.OrgGUID, err = sessionOutput(helpers.Cf("org", sharedData.OrgName, "--guid"))
102+
Expect(err).NotTo(HaveOccurred())
103+
98104
Expect(helpers.Cf("create-space", "-o", sharedData.OrgName, sharedData.SpaceName)).To(Exit(0))
99105
Expect(helpers.Cf("target", "-o", sharedData.OrgName, "-s", sharedData.SpaceName)).To(Exit(0))
100106

@@ -110,6 +116,7 @@ var _ = SynchronizedBeforeSuite(func() []byte {
110116
logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true)))
111117

112118
Expect(korifiv1alpha1.AddToScheme(scheme.Scheme)).To(Succeed())
119+
Expect(buildv1alpha2.AddToScheme(scheme.Scheme)).To(Succeed())
113120
})
114121

115122
var _ = SynchronizedAfterSuite(func() {
@@ -192,7 +199,7 @@ func printCfApp(config *rest.Config) {
192199
return
193200
}
194201

195-
if err := printObject(k8sClient, &korifiv1alpha1.CFApp{
202+
if err := fail_handler.PrintObject(k8sClient, &korifiv1alpha1.CFApp{
196203
ObjectMeta: metav1.ObjectMeta{
197204
Name: cfAppGUID,
198205
Namespace: cfAppNamespace,
@@ -203,21 +210,6 @@ func printCfApp(config *rest.Config) {
203210
}
204211
}
205212

206-
func printObject(k8sClient client.Client, obj client.Object) error {
207-
if err := k8sClient.Get(context.Background(), client.ObjectKeyFromObject(obj), obj); err != nil {
208-
return fmt.Errorf("failed to get object %q: %v\n", client.ObjectKeyFromObject(obj), err)
209-
}
210-
211-
fmt.Fprintf(GinkgoWriter, "\n\n========== %T %s/%s (skipping managed fields) ==========\n", obj, obj.GetNamespace(), obj.GetName())
212-
obj.SetManagedFields([]metav1.ManagedFieldsEntry{})
213-
objBytes, err := yaml.Marshal(obj)
214-
if err != nil {
215-
return fmt.Errorf("failed marshalling object %v: %v\n", obj, err)
216-
}
217-
fmt.Fprintln(GinkgoWriter, string(objBytes))
218-
return nil
219-
}
220-
221213
func printBuildLogs(config *rest.Config) {
222214
spaceGUID, err := sessionOutput(helpers.Cf("space", sharedData.SpaceName, "--guid").Wait())
223215
if err != nil {

0 commit comments

Comments
 (0)