Skip to content

Commit 5288fa0

Browse files
committed
Use keychain from clusterstack to pull build image in CreateBuild
- fallback to builder keychain if there is no service account on the clusterstack to mimic existing behavior
1 parent 386d7a8 commit 5288fa0

7 files changed

Lines changed: 83 additions & 48 deletions

File tree

pkg/cnb/create_builder.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55

66
"github.com/google/go-containerregistry/pkg/authn"
77
ggcrv1 "github.com/google/go-containerregistry/pkg/v1"
8+
89
buildapi "github.com/pivotal/kpack/pkg/apis/build/v1alpha2"
910
corev1alpha1 "github.com/pivotal/kpack/pkg/apis/core/v1alpha1"
1011
"github.com/pivotal/kpack/pkg/registry"
@@ -26,13 +27,8 @@ type RemoteBuilderCreator struct {
2627
KeychainFactory registry.KeychainFactory
2728
}
2829

29-
func (r *RemoteBuilderCreator) CreateBuilder(
30-
ctx context.Context,
31-
builderKeychain authn.Keychain,
32-
fetcher RemoteBuildpackFetcher,
33-
clusterStack *buildapi.ClusterStack, spec buildapi.BuilderSpec,
34-
) (buildapi.BuilderRecord, error) {
35-
buildImage, _, err := r.RegistryClient.Fetch(builderKeychain, clusterStack.Status.BuildImage.LatestImage)
30+
func (r *RemoteBuilderCreator) CreateBuilder(ctx context.Context, builderKeychain authn.Keychain, stackKeychain authn.Keychain, fetcher RemoteBuildpackFetcher, clusterStack *buildapi.ClusterStack, spec buildapi.BuilderSpec) (buildapi.BuilderRecord, error) {
31+
buildImage, _, err := r.RegistryClient.Fetch(stackKeychain, clusterStack.Status.BuildImage.LatestImage)
3632
if err != nil {
3733
return buildapi.BuilderRecord{}, err
3834
}

pkg/cnb/create_builder_test.go

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ func testCreateBuilderOs(os string, t *testing.T, when spec.G, it spec.S) {
5757
registryClient = registryfakes.NewFakeClient()
5858

5959
keychainFactory = &registryfakes.FakeKeychainFactory{}
60-
keychain = authn.NewMultiKeychain(authn.DefaultKeychain)
60+
builderKeychain = authn.NewMultiKeychain(authn.DefaultKeychain)
61+
stackKeychain = authn.NewMultiKeychain(authn.DefaultKeychain)
6162
secretRef = registry.SecretRef{}
6263

6364
ctx = context.Background()
@@ -190,7 +191,7 @@ func testCreateBuilderOs(os string, t *testing.T, when spec.G, it spec.S) {
190191
)
191192

192193
it.Before(func() {
193-
keychainFactory.AddKeychainForSecretRef(t, secretRef, keychain)
194+
keychainFactory.AddKeychainForSecretRef(t, secretRef, builderKeychain)
194195

195196
buildpack1 := buildpackLayer{
196197
v1Layer: buildpack1Layer,
@@ -267,7 +268,7 @@ func testCreateBuilderOs(os string, t *testing.T, when spec.G, it spec.S) {
267268
fetcher.AddBuildpack(t, "io.buildpack.2", "v2", []buildpackLayer{buildpack3, buildpack2})
268269
})
269270

270-
registryClient.AddSaveKeychain("custom/example", keychain)
271+
registryClient.AddSaveKeychain("custom/example", builderKeychain)
271272

272273
when("CreateBuilder", func() {
273274
var (
@@ -286,7 +287,7 @@ func testCreateBuilderOs(os string, t *testing.T, when spec.G, it spec.S) {
286287
config.OS = os
287288
buildImg, err = mutate.ConfigFile(buildImg, config)
288289

289-
registryClient.AddImage(buildImage, buildImg, keychain)
290+
registryClient.AddImage(buildImage, buildImg, stackKeychain)
290291

291292
lifecycleProvider.metadata = LifecycleMetadata{
292293
LifecycleInfo: LifecycleInfo{
@@ -314,7 +315,7 @@ func testCreateBuilderOs(os string, t *testing.T, when spec.G, it spec.S) {
314315
})
315316

316317
it("creates a custom builder", func() {
317-
builderRecord, err := subject.CreateBuilder(ctx, keychain, fetcher, stack, clusterBuilderSpec)
318+
builderRecord, err := subject.CreateBuilder(ctx, builderKeychain, stackKeychain, fetcher, stack, clusterBuilderSpec)
318319
require.NoError(t, err)
319320

320321
assert.Len(t, builderRecord.Buildpacks, 3)
@@ -576,11 +577,11 @@ func testCreateBuilderOs(os string, t *testing.T, when spec.G, it spec.S) {
576577
})
577578

578579
it("creates images deterministically ", func() {
579-
original, err := subject.CreateBuilder(ctx, keychain, fetcher, stack, clusterBuilderSpec)
580+
original, err := subject.CreateBuilder(ctx, builderKeychain, stackKeychain, fetcher, stack, clusterBuilderSpec)
580581
require.NoError(t, err)
581582

582583
for i := 1; i <= 50; i++ {
583-
other, err := subject.CreateBuilder(ctx, keychain, fetcher, stack, clusterBuilderSpec)
584+
other, err := subject.CreateBuilder(ctx, builderKeychain, stackKeychain, fetcher, stack, clusterBuilderSpec)
584585
require.NoError(t, err)
585586

586587
require.Equal(t, original.Image, other.Image)
@@ -610,7 +611,7 @@ func testCreateBuilderOs(os string, t *testing.T, when spec.G, it spec.S) {
610611
},
611612
}
612613

613-
_, err := subject.CreateBuilder(ctx, keychain, fetcher, stack, clusterBuilderSpec)
614+
_, err := subject.CreateBuilder(ctx, builderKeychain, stackKeychain, fetcher, stack, clusterBuilderSpec)
614615
require.EqualError(t, err, "validating buildpack io.buildpack.unsupported.stack@v4: stack io.buildpacks.stacks.some-stack is not supported")
615616
})
616617

@@ -634,7 +635,7 @@ func testCreateBuilderOs(os string, t *testing.T, when spec.G, it spec.S) {
634635
}},
635636
}}
636637

637-
_, err := subject.CreateBuilder(ctx, keychain, fetcher, stack, clusterBuilderSpec)
638+
_, err := subject.CreateBuilder(ctx, builderKeychain, stackKeychain, fetcher, stack, clusterBuilderSpec)
638639
require.EqualError(t, err, "validating buildpack io.buildpack.unsupported.mixin@v4: stack missing mixin(s): something-missing-mixin, something-missing-mixin2")
639640
})
640641

@@ -679,7 +680,7 @@ func testCreateBuilderOs(os string, t *testing.T, when spec.G, it spec.S) {
679680
}},
680681
}}
681682

682-
_, err := subject.CreateBuilder(ctx, keychain, fetcher, stack, clusterBuilderSpec)
683+
_, err := subject.CreateBuilder(ctx, builderKeychain, stackKeychain, fetcher, stack, clusterBuilderSpec)
683684
require.Nil(t, err)
684685
})
685686

@@ -704,7 +705,7 @@ func testCreateBuilderOs(os string, t *testing.T, when spec.G, it spec.S) {
704705
}},
705706
}}
706707

707-
_, err := subject.CreateBuilder(ctx, keychain, fetcher, stack, clusterBuilderSpec)
708+
_, err := subject.CreateBuilder(ctx, builderKeychain, nil, fetcher, stack, clusterBuilderSpec)
708709
require.Error(t, err, "validating buildpack io.buildpack.relaxed.old.mixin@v4: stack missing mixin(s): build:common-mixin, run:common-mixin, another-common-mixin")
709710
})
710711

@@ -727,7 +728,7 @@ func testCreateBuilderOs(os string, t *testing.T, when spec.G, it spec.S) {
727728
}},
728729
}}
729730

730-
_, err := subject.CreateBuilder(ctx, keychain, fetcher, stack, clusterBuilderSpec)
731+
_, err := subject.CreateBuilder(ctx, builderKeychain, stackKeychain, fetcher, stack, clusterBuilderSpec)
731732
require.EqualError(t, err, "validating buildpack io.buildpack.unsupported.buildpack.api@v4: unsupported buildpack api: 0.1, expecting: 0.2, 0.3")
732733
})
733734

@@ -770,7 +771,7 @@ func testCreateBuilderOs(os string, t *testing.T, when spec.G, it spec.S) {
770771
}},
771772
}}
772773

773-
_, err := subject.CreateBuilder(ctx, keychain, fetcher, stack, clusterBuilderSpec)
774+
_, err := subject.CreateBuilder(ctx, builderKeychain, stackKeychain, fetcher, stack, clusterBuilderSpec)
774775
require.NoError(t, err)
775776
})
776777
})
@@ -797,7 +798,7 @@ func testCreateBuilderOs(os string, t *testing.T, when spec.G, it spec.S) {
797798
},
798799
}
799800

800-
_, err := subject.CreateBuilder(ctx, keychain, fetcher, stack, clusterBuilderSpec)
801+
_, err := subject.CreateBuilder(ctx, builderKeychain, stackKeychain, fetcher, stack, clusterBuilderSpec)
801802
require.EqualError(t, err, "unsupported platform apis in kpack lifecycle: 0.1, 0.2, 0.999, expecting one of: 0.3, 0.4, 0.5, 0.6, 0.7, 0.8")
802803
})
803804
})

pkg/reconciler/builder/builder.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ const (
3333
)
3434

3535
type BuilderCreator interface {
36-
CreateBuilder(ctx context.Context, keychain authn.Keychain, fetcher cnb.RemoteBuildpackFetcher, clusterStack *buildapi.ClusterStack, spec buildapi.BuilderSpec) (buildapi.BuilderRecord, error)
36+
CreateBuilder(ctx context.Context, builderKeychain authn.Keychain, keychain authn.Keychain, fetcher cnb.RemoteBuildpackFetcher, clusterStack *buildapi.ClusterStack, spec buildapi.BuilderSpec) (buildapi.BuilderRecord, error)
3737
}
3838

3939
func NewController(
@@ -203,17 +203,28 @@ func (c *Reconciler) reconcileBuilder(ctx context.Context, builder *buildapi.Bui
203203
return buildapi.BuilderRecord{}, errors.Errorf("stack %s is not ready", clusterStack.Name)
204204
}
205205

206-
keychain, err := c.KeychainFactory.KeychainForSecretRef(ctx, registry.SecretRef{
206+
builderKeychain, err := c.KeychainFactory.KeychainForSecretRef(ctx, registry.SecretRef{
207207
ServiceAccount: builder.Spec.ServiceAccount(),
208208
Namespace: builder.Namespace,
209209
})
210210
if err != nil {
211211
return buildapi.BuilderRecord{}, err
212212
}
213213

214+
stackKeychain := builderKeychain
215+
if clusterStack.Spec.ServiceAccountRef != nil {
216+
stackKeychain, err = c.KeychainFactory.KeychainForSecretRef(ctx, registry.SecretRef{
217+
ServiceAccount: clusterStack.Spec.ServiceAccountRef.Name,
218+
Namespace: clusterStack.Spec.ServiceAccountRef.Namespace,
219+
})
220+
if err != nil {
221+
return buildapi.BuilderRecord{}, err
222+
}
223+
}
224+
214225
fetcher := cnb.NewRemoteBuildpackFetcher(c.KeychainFactory, clusterStore, buildpacks, clusterBuildpacks)
215226

216-
buildRecord, err := c.BuilderCreator.CreateBuilder(ctx, keychain, fetcher, clusterStack, builder.Spec.BuilderSpec)
227+
buildRecord, err := c.BuilderCreator.CreateBuilder(ctx, builderKeychain, stackKeychain, fetcher, clusterStack, builder.Spec.BuilderSpec)
217228
if err != nil {
218229
return buildapi.BuilderRecord{}, err
219230
}

pkg/reconciler/builder/builder_test.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,12 @@ func testBuilderReconciler(t *testing.T, when spec.G, it spec.S) {
8585
Kind: "ClusterStack",
8686
APIVersion: "kpack.io/v1alpha2",
8787
},
88+
Spec: buildapi.ClusterStackSpec{
89+
ServiceAccountRef: &corev1.ObjectReference{
90+
Name: "some-service-account",
91+
Namespace: testNamespace,
92+
},
93+
},
8894
Status: buildapi.ClusterStackStatus{
8995
Status: corev1alpha1.Status{
9096
ObservedGeneration: 0,
@@ -247,11 +253,12 @@ func testBuilderReconciler(t *testing.T, when spec.G, it spec.S) {
247253
})
248254

249255
assert.Equal(t, []testhelpers.CreateBuilderArgs{{
250-
Context: context.Background(),
251-
Keychain: &registryfakes.FakeKeychain{},
252-
Fetcher: expectedFetcher,
253-
ClusterStack: clusterStack,
254-
BuilderSpec: builder.Spec.BuilderSpec,
256+
Context: context.Background(),
257+
BuilderKeychain: &registryfakes.FakeKeychain{},
258+
StackKeychain: &registryfakes.FakeKeychain{},
259+
Fetcher: expectedFetcher,
260+
ClusterStack: clusterStack,
261+
BuilderSpec: builder.Spec.BuilderSpec,
255262
}}, builderCreator.CreateBuilderCalls)
256263
})
257264

pkg/reconciler/clusterbuilder/clusterbuilder.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ const (
3434
)
3535

3636
type BuilderCreator interface {
37-
CreateBuilder(ctx context.Context, keychain authn.Keychain, fetcher cnb.RemoteBuildpackFetcher, clusterStack *buildapi.ClusterStack, spec buildapi.BuilderSpec) (buildapi.BuilderRecord, error)
37+
CreateBuilder(ctx context.Context, builderKeychain authn.Keychain, stackKeychain authn.Keychain, fetcher cnb.RemoteBuildpackFetcher, clusterStack *buildapi.ClusterStack, spec buildapi.BuilderSpec) (buildapi.BuilderRecord, error)
3838
}
3939

4040
func NewController(
@@ -188,17 +188,28 @@ func (c *Reconciler) reconcileBuilder(ctx context.Context, builder *buildapi.Clu
188188
return buildapi.BuilderRecord{}, errors.Errorf("stack %s is not ready", clusterStack.Name)
189189
}
190190

191-
keychain, err := c.KeychainFactory.KeychainForSecretRef(ctx, registry.SecretRef{
191+
builderKeychain, err := c.KeychainFactory.KeychainForSecretRef(ctx, registry.SecretRef{
192192
ServiceAccount: builder.Spec.ServiceAccountRef.Name,
193193
Namespace: builder.Spec.ServiceAccountRef.Namespace,
194194
})
195195
if err != nil {
196196
return buildapi.BuilderRecord{}, err
197197
}
198198

199+
stackKeychain := builderKeychain
200+
if clusterStack.Spec.ServiceAccountRef != nil {
201+
stackKeychain, err = c.KeychainFactory.KeychainForSecretRef(ctx, registry.SecretRef{
202+
ServiceAccount: clusterStack.Spec.ServiceAccountRef.Name,
203+
Namespace: clusterStack.Spec.ServiceAccountRef.Namespace,
204+
})
205+
if err != nil {
206+
return buildapi.BuilderRecord{}, err
207+
}
208+
}
209+
199210
fetcher := cnb.NewRemoteBuildpackFetcher(c.KeychainFactory, clusterStore, nil, clusterBuildpacks)
200211

201-
buildRecord, err := c.BuilderCreator.CreateBuilder(ctx, keychain, fetcher, clusterStack, builder.Spec.BuilderSpec)
212+
buildRecord, err := c.BuilderCreator.CreateBuilder(ctx, builderKeychain, stackKeychain, fetcher, clusterStack, builder.Spec.BuilderSpec)
202213
if err != nil {
203214
return buildapi.BuilderRecord{}, err
204215
}

pkg/reconciler/clusterbuilder/clusterbuilder_test.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,12 @@ func testClusterBuilderReconciler(t *testing.T, when spec.G, it spec.S) {
8383
Kind: "ClusterStack",
8484
APIVersion: "kpack.io/v1alpha2",
8585
},
86+
Spec: buildapi.ClusterStackSpec{
87+
ServiceAccountRef: &corev1.ObjectReference{
88+
Namespace: "some-sa-namespace",
89+
Name: "some-sa-name",
90+
},
91+
},
8692
Status: buildapi.ClusterStackStatus{
8793
Status: corev1alpha1.Status{
8894
ObservedGeneration: 0,
@@ -243,11 +249,12 @@ func testClusterBuilderReconciler(t *testing.T, when spec.G, it spec.S) {
243249
})
244250

245251
assert.Equal(t, []testhelpers.CreateBuilderArgs{{
246-
Context: context.Background(),
247-
Keychain: &registryfakes.FakeKeychain{},
248-
Fetcher: expectedFetcher,
249-
ClusterStack: clusterStack,
250-
BuilderSpec: builder.Spec.BuilderSpec,
252+
Context: context.Background(),
253+
BuilderKeychain: &registryfakes.FakeKeychain{},
254+
StackKeychain: &registryfakes.FakeKeychain{},
255+
Fetcher: expectedFetcher,
256+
ClusterStack: clusterStack,
257+
BuilderSpec: builder.Spec.BuilderSpec,
251258
}}, builderCreator.CreateBuilderCalls)
252259
})
253260

pkg/reconciler/testhelpers/fake_builder_creator.go

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,22 @@ type FakeBuilderCreator struct {
1919
}
2020

2121
type CreateBuilderArgs struct {
22-
Context context.Context
23-
Keychain authn.Keychain
24-
Fetcher cnb.RemoteBuildpackFetcher
25-
ClusterStack *buildapi.ClusterStack
26-
BuilderSpec buildapi.BuilderSpec
22+
Context context.Context
23+
BuilderKeychain authn.Keychain
24+
StackKeychain authn.Keychain
25+
Fetcher cnb.RemoteBuildpackFetcher
26+
ClusterStack *buildapi.ClusterStack
27+
BuilderSpec buildapi.BuilderSpec
2728
}
2829

29-
func (f *FakeBuilderCreator) CreateBuilder(ctx context.Context, keychain authn.Keychain, fetcher cnb.RemoteBuildpackFetcher, clusterStack *buildapi.ClusterStack, builder buildapi.BuilderSpec) (buildapi.BuilderRecord, error) {
30+
func (f *FakeBuilderCreator) CreateBuilder(ctx context.Context, builderKeychain authn.Keychain, stackKeychain authn.Keychain, fetcher cnb.RemoteBuildpackFetcher, clusterStack *buildapi.ClusterStack, spec buildapi.BuilderSpec) (buildapi.BuilderRecord, error) {
3031
f.CreateBuilderCalls = append(f.CreateBuilderCalls, CreateBuilderArgs{
31-
Context: ctx,
32-
Keychain: keychain,
33-
Fetcher: fetcher,
34-
ClusterStack: clusterStack,
35-
BuilderSpec: builder,
32+
Context: ctx,
33+
BuilderKeychain: builderKeychain,
34+
StackKeychain: stackKeychain,
35+
Fetcher: fetcher,
36+
ClusterStack: clusterStack,
37+
BuilderSpec: spec,
3638
})
3739

3840
return f.Record, f.CreateErr

0 commit comments

Comments
 (0)