Skip to content

Commit dbaa66d

Browse files
author
Natalie Arellano
committed
WIP: add integration test for build with extensions
Signed-off-by: Natalie Arellano <narellano@vmware.com>
1 parent 160ce19 commit dbaa66d

3 files changed

Lines changed: 29 additions & 20 deletions

File tree

pkg/apis/build/v1alpha2/build_pod.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -645,6 +645,10 @@ func boolPointer(b bool) *bool {
645645
return &b
646646
}
647647

648+
func intPointer(i int64) *int64 {
649+
return &i
650+
}
651+
648652
func containerSecurityContext(config BuildPodBuilderConfig) *corev1.SecurityContext {
649653
if config.OS == "windows" {
650654
return nil
@@ -739,17 +743,16 @@ func (b *Build) useImageExtensions(pod *corev1.Pod) {
739743
container.VolumeMounts = append(container.VolumeMounts, kanikoMount)
740744
container.Args = append(container.Args, fmt.Sprintf("-build-image=%s", b.Spec.Builder.Image))
741745
case BuildContainerName:
742-
runAsNonRoot := false
743-
rootUser := int64(0)
744746
container.Name = ExtendContainerName
745747
container.Command = []string{"/cnb/lifecycle/extender"}
746748
container.VolumeMounts = append(container.VolumeMounts, kanikoMount)
747-
container.SecurityContext.RunAsNonRoot = &runAsNonRoot
748-
container.SecurityContext.RunAsUser = &rootUser
749+
container.SecurityContext.RunAsUser = intPointer(0)
750+
container.SecurityContext.RunAsGroup = intPointer(0)
751+
container.SecurityContext.RunAsNonRoot = boolPointer(false)
752+
container.SecurityContext.Capabilities = &corev1.Capabilities{Add: []corev1.Capability{"SETGID", "SETUID"}} // TODO: check if this is needed if not using kind
749753
}
750754
pod.Spec.InitContainers[idx] = container
751755
}
752-
753756
}
754757

755758
func (b *Build) useStandardContainers(buildWaiterImage string, pod *corev1.Pod) *corev1.Pod {

pkg/apis/build/v1alpha2/build_pod_test.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2520,15 +2520,22 @@ func testBuildPod(t *testing.T, when spec.G, it spec.S) {
25202520
assert.Equal(t, []string{"/cnb/lifecycle/extender"}, pod.Spec.InitContainers[4].Command)
25212521

25222522
for _, container := range pod.Spec.InitContainers {
2523+
// every phase should be unprivileged
2524+
actualPrivileged := container.SecurityContext.Privileged
2525+
assert.Equal(t, false, *actualPrivileged)
2526+
// extend phase should run as root
25232527
actualRunAsNonRoot := container.SecurityContext.RunAsNonRoot
25242528
actualRunAsUser := container.SecurityContext.RunAsUser
2529+
actualRunAsGroup := container.SecurityContext.RunAsGroup
25252530
switch container.Name {
25262531
case buildapi.ExtendContainerName:
25272532
assert.Equal(t, false, *actualRunAsNonRoot)
25282533
assert.Equal(t, int64(0), *actualRunAsUser)
2534+
assert.Equal(t, int64(0), *actualRunAsGroup)
25292535
default:
25302536
assert.Equal(t, true, *actualRunAsNonRoot)
2531-
assert.NotEqual(t, nil, actualRunAsUser) // in real life this would be the user from the builder
2537+
assert.NotEqual(t, nil, actualRunAsUser) // in real life this would be the uid from the builder
2538+
assert.NotEqual(t, nil, actualRunAsGroup) // in real life this would be the gid from the builder
25322539
}
25332540
}
25342541
})

test/execute_build_test.go

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ func testCreateImage(t *testing.T, when spec.G, it spec.S) {
135135
require.NoError(t, err)
136136

137137
expectImage := func(t *testing.T, image v1.Image) {}
138+
expectLogs := func(t *testing.T, logs string) {}
138139
if builderHasExtensions {
139140
expectImage = func(t *testing.T, image v1.Image) {
140141
cfg, err := image.ConfigFile()
@@ -143,11 +144,15 @@ func testCreateImage(t *testing.T, when spec.G, it spec.S) {
143144
require.True(t, ok)
144145
var lifecycleMD files.LayersMetadata
145146
require.NoError(t, json.Unmarshal([]byte(lifecycleMDLabel), &lifecycleMD))
146-
require.Equal(t, "gcr.io/paketo-buildpacks/run-jammy-tiny", lifecycleMD.Stack.RunImage.Image)
147+
runImageReference := lifecycleMD.RunImage.Reference
148+
require.Contains(t, runImageReference, "gcr.io/paketo-buildpacks/run-jammy-tiny")
149+
}
150+
expectLogs = func(t *testing.T, logs string) {
151+
require.Contains(t, logs, "Setting up curl")
147152
}
148153
}
149154

150-
builtImages[validateImageCreate(t, clients, image, expectedResources, expectImage)] = struct{}{}
155+
builtImages[validateImageCreate(t, clients, image, expectedResources, expectImage, expectLogs)] = struct{}{}
151156
validateRebase(t, ctx, clients, image.Name, testNamespace)
152157
})
153158
}
@@ -881,7 +886,7 @@ func generateRebuild(ctx *context.Context, t *testing.T, cfg config, clients *cl
881886
}, metav1.CreateOptions{})
882887
require.NoError(t, err)
883888

884-
originalImageTag := validateImageCreate(t, clients, image, expectedResources, func(t *testing.T, image v1.Image) {})
889+
originalImageTag := validateImageCreate(t, clients, image, expectedResources, func(t *testing.T, image v1.Image) {}, func(t *testing.T, logs string) {})
885890

886891
list, err := clients.client.KpackV1alpha2().Builds(testNamespace).List(*ctx, metav1.ListOptions{
887892
LabelSelector: fmt.Sprintf("image.kpack.io/image=%s", imageName),
@@ -902,7 +907,7 @@ func generateRebuild(ctx *context.Context, t *testing.T, cfg config, clients *cl
902907
return len(list.Items) == 2
903908
}, 5*time.Second, 1*time.Minute)
904909

905-
rebuiltImageTag := validateImageCreate(t, clients, image, expectedResources, func(t *testing.T, image v1.Image) {})
910+
rebuiltImageTag := validateImageCreate(t, clients, image, expectedResources, func(t *testing.T, image v1.Image) {}, func(t *testing.T, logs string) {})
906911
require.Equal(t, originalImageTag, rebuiltImageTag)
907912

908913
return originalImageTag
@@ -928,11 +933,11 @@ func readNamespaceLabelsFromEnv() map[string]string {
928933
func waitUntilReady(t *testing.T, ctx context.Context, clients *clients, objects ...kmeta.OwnerRefable) {
929934
for _, ob := range objects {
930935
namespace := ob.GetObjectMeta().GetNamespace()
931-
name := ob.GetObjectMeta().GetName()
936+
imageName := ob.GetObjectMeta().GetName()
932937
gvr, _ := meta.UnsafeGuessKindToResource(ob.GetGroupVersionKind())
933938

934939
eventually(t, func() bool {
935-
unstructured, err := clients.dynamicClient.Resource(gvr).Namespace(namespace).Get(ctx, name, metav1.GetOptions{})
940+
unstructured, err := clients.dynamicClient.Resource(gvr).Namespace(namespace).Get(ctx, imageName, metav1.GetOptions{})
936941
require.NoError(t, err)
937942

938943
kResource := &duckv1.KResource{}
@@ -944,13 +949,7 @@ func waitUntilReady(t *testing.T, ctx context.Context, clients *clients, objects
944949
}
945950
}
946951

947-
func validateImageCreate(
948-
t *testing.T,
949-
clients *clients,
950-
image *buildapi.Image,
951-
expectedResources corev1.ResourceRequirements, // TODO: this seems to no longer be used?
952-
expectImage func(*testing.T, v1.Image),
953-
) string {
952+
func validateImageCreate(t *testing.T, clients *clients, image *buildapi.Image, expectedResources corev1.ResourceRequirements, expectImage func(*testing.T, v1.Image), expectLogs func(*testing.T, string)) string {
954953
ctx, cancel := context.WithCancel(context.Background())
955954
defer cancel()
956955

@@ -971,8 +970,8 @@ func validateImageCreate(
971970
return strings.Contains(logTail.String(), "Build successful")
972971
}, 1*time.Second, 10*time.Second)
973972

974-
// TODO: expect extend build image with kaniko
975973
expectImage(t, builtImage)
974+
expectLogs(t, logTail.String())
976975

977976
buildList, err := clients.client.KpackV1alpha2().Builds(image.Namespace).List(ctx, metav1.ListOptions{
978977
LabelSelector: fmt.Sprintf("image.kpack.io/image=%s", image.Name),

0 commit comments

Comments
 (0)