Skip to content

Commit 6a5a7cc

Browse files
committed
Support GVK style package dependencies in crank beta trace
Signed-off-by: Nic Cope <[email protected]>
1 parent b107efe commit 6a5a7cc

File tree

2 files changed

+100
-93
lines changed

2 files changed

+100
-93
lines changed

cmd/crank/beta/trace/internal/resource/xpkg/client.go

Lines changed: 41 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -221,29 +221,15 @@ func (kc *Client) getRevisions(ctx context.Context, xpkg *resource.Resource) ([]
221221
return resources, nil
222222
}
223223

224-
// getPackageDetails returns the package details for the given package type.
225-
func getPackageDetails(t pkgv1beta1.PackageType) (string, string, pkgv1.PackageRevision, error) {
226-
switch t {
227-
case pkgv1beta1.ProviderPackageType:
228-
return pkgv1.ProviderKind, pkgv1.ProviderGroupVersionKind.GroupVersion().String(), &pkgv1.ProviderRevision{}, nil
229-
case pkgv1beta1.ConfigurationPackageType:
230-
return pkgv1.ConfigurationKind, pkgv1.ConfigurationGroupVersionKind.GroupVersion().String(), &pkgv1.ConfigurationRevision{}, nil
231-
case pkgv1beta1.FunctionPackageType:
232-
return pkgv1.FunctionKind, pkgv1.FunctionGroupVersionKind.GroupVersion().String(), &pkgv1.FunctionRevision{}, nil
233-
default:
234-
return "", "", nil, errors.Errorf("unknown package dependency type %s", t)
235-
}
236-
}
237-
238224
// getDependencyRef returns the dependency reference for the given package,
239225
// based on the lock file.
240-
func (kc *Client) getDependencyRef(ctx context.Context, lock *pkgv1beta1.Lock, pkgType pkgv1beta1.PackageType, pkg string) (*v1.ObjectReference, error) {
226+
func (kc *Client) getDependencyRef(ctx context.Context, d pkgv1beta1.Dependency, pkgs []pkgv1beta1.LockPackage) (*v1.ObjectReference, error) {
241227
// if we don't find a package to match the current dependency, which
242228
// can happen during initial installation when dependencies are
243229
// being discovered and fetched. We'd still like to show something
244230
// though, so try to make the package name pretty
245-
name := xpkg.ToDNSLabel(pkg)
246-
if pkgref, err := pkgname.ParseReference(pkg); err == nil {
231+
name := xpkg.ToDNSLabel(d.Package)
232+
if pkgref, err := pkgname.ParseReference(d.Package); err == nil {
247233
name = xpkg.ToDNSLabel(pkgref.Context().RepositoryStr())
248234
}
249235

@@ -254,32 +240,51 @@ func (kc *Client) getDependencyRef(ctx context.Context, lock *pkgv1beta1.Lock, p
254240
// - pkgrev B
255241
// - pkgrev C
256242

257-
// find the current dependency from all the packages in the lock file
258-
pkgKind, apiVersion, revision, err := getPackageDetails(pkgType)
259-
if err != nil {
260-
return nil, errors.Wrapf(err, "failed to get package details for dependency %s", pkg)
243+
rev := &unstructured.Unstructured{}
244+
var pkgKind string
245+
switch {
246+
case d.APIVersion != nil && d.Kind != nil:
247+
rev.SetAPIVersion(*d.APIVersion)
248+
rev.SetKind(*d.Kind + "Revision")
249+
pkgKind = *d.Kind
250+
case ptr.Deref(d.Type, "") == pkgv1beta1.ConfigurationPackageType:
251+
rev.SetAPIVersion(pkgv1.ConfigurationRevisionGroupVersionKind.GroupVersion().String())
252+
rev.SetKind(pkgv1.ConfigurationRevisionKind)
253+
pkgKind = pkgv1.ConfigurationKind
254+
case ptr.Deref(d.Type, "") == pkgv1beta1.ProviderPackageType:
255+
rev.SetAPIVersion(pkgv1.ProviderRevisionGroupVersionKind.GroupVersion().String())
256+
rev.SetKind(pkgv1.ProviderRevisionKind)
257+
pkgKind = pkgv1.ProviderKind
258+
case ptr.Deref(d.Type, "") == pkgv1beta1.FunctionPackageType:
259+
rev.SetAPIVersion(pkgv1.FunctionRevisionGroupVersionKind.GroupVersion().String())
260+
rev.SetKind(pkgv1.FunctionRevisionKind)
261+
pkgKind = pkgv1.FunctionKind
262+
default:
263+
return nil, errors.Errorf("cannot determine dependency type - you must specify either a valid type, or an explicit apiVersion and kind")
261264
}
262265

263-
for _, p := range lock.Packages {
264-
if p.Source == pkg {
265-
// current package source matches the package of the dependency, let's get the full object
266-
if err = kc.client.Get(ctx, types.NamespacedName{Name: p.Name}, revision); xpresource.IgnoreNotFound(err) != nil {
267-
return nil, err
268-
}
266+
for _, p := range pkgs {
267+
if p.Source != d.Package {
268+
continue
269+
}
269270

270-
// look for the owner of this package revision, that's its parent package
271-
for _, or := range revision.GetOwnerReferences() {
272-
if or.Kind == pkgKind && or.Controller != nil && *or.Controller {
273-
name = or.Name
274-
break
275-
}
271+
// current package source matches the package of the dependency, let's get the full object
272+
if err := kc.client.Get(ctx, types.NamespacedName{Name: p.Name}, rev); xpresource.IgnoreNotFound(err) != nil {
273+
return nil, err
274+
}
275+
276+
// look for the owner of this package revision, that's its parent package
277+
for _, or := range rev.GetOwnerReferences() {
278+
if or.Kind == pkgKind && or.Controller != nil && *or.Controller {
279+
name = or.Name
280+
break
276281
}
277-
break
278282
}
283+
break
279284
}
280285

281286
return &v1.ObjectReference{
282-
APIVersion: apiVersion,
287+
APIVersion: rev.GetAPIVersion(),
283288
Kind: pkgKind,
284289
Name: name,
285290
}, nil
@@ -317,8 +322,7 @@ func (kc *Client) getPackageDeps(ctx context.Context, node *resource.Resource, l
317322
}
318323
}
319324

320-
// TODO(negz): Handle apiVersion and kind
321-
dep, err := kc.getDependencyRef(ctx, lock, ptr.Deref(d.Type, pkgv1beta1.ConfigurationPackageType), d.Package)
325+
dep, err := kc.getDependencyRef(ctx, d, lock.Packages)
322326
if err != nil {
323327
return nil, errors.Wrapf(err, "failed to get dependency ref %s", d.Package)
324328
}

cmd/crank/beta/trace/internal/resource/xpkg/client_test.go

Lines changed: 59 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,8 @@ import (
2727
// Consider testing getPackageDeps instead to cover more.
2828
func TestGetDependencyRef(t *testing.T) {
2929
type args struct {
30-
pkgType v1beta1.PackageType
31-
pkg string
32-
client client.Client
33-
lock *v1beta1.Lock
30+
d v1beta1.Dependency
31+
pkgs []v1beta1.LockPackage
3432
}
3533
type want struct {
3634
ref *v1.ObjectReference
@@ -39,23 +37,26 @@ func TestGetDependencyRef(t *testing.T) {
3937
cases := map[string]struct {
4038
reason string
4139

42-
args args
43-
want want
40+
client client.Client
41+
args args
42+
want want
4443
}{
4544
"PkgNotInLock": {
4645
reason: "Should return the provider ref for a provider dependency, even when the dep is not found.",
46+
client: &test.MockClient{},
4747
args: args{
48-
pkgType: v1beta1.ProviderPackageType,
49-
pkg: "example.com/provider-1:v1.0.0",
50-
client: &test.MockClient{},
51-
lock: buildLock("lock-1", withLockPackages([]v1beta1.LockPackage{
48+
d: v1beta1.Dependency{
49+
Type: ptr.To(v1beta1.ProviderPackageType),
50+
Package: "example.com/provider-1:v1.0.0",
51+
},
52+
pkgs: []v1beta1.LockPackage{
5253
*buildLockPkg("configuration-1",
5354
withDependencies(newDependency("provider-2"), newDependency("provider-1")),
5455
withSource("example.com/configuration-1:v1.0.0")),
5556
*buildLockPkg("function-1",
5657
withDependencies(newDependency("provider-3"), newDependency("provider-4")),
5758
withSource("example.com/function-1:v1.0.0")),
58-
}...)),
59+
},
5960
},
6061
want: want{
6162
ref: &v1.ObjectReference{
@@ -67,36 +68,33 @@ func TestGetDependencyRef(t *testing.T) {
6768
},
6869
"PKGInLock": {
6970
reason: "Should return the provider ref for a provider dependency.",
71+
client: &test.MockClient{
72+
MockGet: test.NewMockGetFn(nil, func(obj client.Object) error {
73+
obj.SetName("provider-1")
74+
obj.SetOwnerReferences([]xpv1.OwnerReference{
75+
{
76+
APIVersion: "pkg.crossplane.io/v1",
77+
Kind: "Provider",
78+
Name: "my-awesome-provider",
79+
Controller: ptr.To(true),
80+
},
81+
})
82+
return nil
83+
}),
84+
},
7085
args: args{
71-
pkgType: v1beta1.ProviderPackageType,
72-
pkg: "example.com/provider-1:v1.0.0",
73-
client: &test.MockClient{
74-
MockGet: test.NewMockGetFn(nil, func(obj client.Object) error {
75-
pr, ok := obj.(*xpkgv1.ProviderRevision)
76-
if ok {
77-
pr.SetName("provider-1")
78-
pr.SetOwnerReferences([]xpv1.OwnerReference{
79-
{
80-
APIVersion: "pkg.crossplane.io/v1",
81-
Kind: "Provider",
82-
Name: "my-awesome-provider",
83-
Controller: ptr.To(true),
84-
},
85-
})
86-
return nil
87-
}
88-
89-
return errors.New("boom")
90-
}),
86+
d: v1beta1.Dependency{
87+
Type: ptr.To(v1beta1.ProviderPackageType),
88+
Package: "example.com/provider-1:v1.0.0",
9189
},
92-
lock: buildLock("lock-1", withLockPackages([]v1beta1.LockPackage{
90+
pkgs: []v1beta1.LockPackage{
9391
*buildLockPkg("provider-3",
9492
withDependencies(newDependency("provider-2"), newDependency("provider-1")),
9593
withSource("example.com/provider-1:v1.0.0")),
9694
*buildLockPkg("function-1",
9795
withDependencies(newDependency("provider-3"), newDependency("provider-4")),
9896
withSource("example.com/function-1:v1.0.0")),
99-
}...)),
97+
},
10098
},
10199
want: want{
102100
ref: &v1.ObjectReference{
@@ -108,55 +106,60 @@ func TestGetDependencyRef(t *testing.T) {
108106
},
109107
"PKGTypeWrong": {
110108
reason: "Should return an error for a provider dependency when the package type is wrong.",
109+
client: test.NewMockClient(),
111110
args: args{
112-
pkgType: v1beta1.PackageType("wrong"),
113-
pkg: "example.com/provider-1:v1.0.0",
114-
client: test.NewMockClient(),
115-
lock: buildLock("lock-1"),
111+
d: v1beta1.Dependency{
112+
Type: ptr.To(v1beta1.PackageType("wrong")),
113+
Package: "example.com/provider-1:v1.0.0",
114+
},
116115
},
117116
want: want{
118117
err: cmpopts.AnyError,
119118
},
120119
},
121120
"ErrorGettingPKGRevision": {
122121
reason: "Should return an error for a provider dependency when the package revision cannot be retrieved.",
122+
client: &test.MockClient{
123+
MockGet: test.NewMockGetFn(errors.New("boom")),
124+
},
123125
args: args{
124-
pkgType: v1beta1.ConfigurationPackageType,
125-
pkg: "example.com/configuration-1:v1.0.0",
126-
client: &test.MockClient{
127-
MockGet: test.NewMockGetFn(errors.New("boom")),
126+
d: v1beta1.Dependency{
127+
Type: ptr.To(v1beta1.ConfigurationPackageType),
128+
Package: "example.com/configuration-1:v1.0.0",
128129
},
129-
lock: buildLock("lock-1", withLockPackages([]v1beta1.LockPackage{
130+
pkgs: []v1beta1.LockPackage{
130131
*buildLockPkg("configuration-1",
131132
withDependencies(newDependency("provider-2"), newDependency("provider-1")),
132133
withSource("example.com/configuration-1:v1.0.0")),
133134
*buildLockPkg("function-1",
134135
withDependencies(newDependency("provider-3"), newDependency("provider-4")),
135136
withSource("example.com/function-1:v1.0.0")),
136-
}...)),
137+
},
137138
},
138139
want: want{
139140
err: cmpopts.AnyError,
140141
},
141142
},
142143
"PKGRevisionNotFound": {
143144
reason: "Should return no error for a provider dependency when the package revision is not found.",
145+
client: &test.MockClient{
146+
MockGet: test.NewMockGetFn(nil, func(_ client.Object) error {
147+
return kerrors.NewNotFound(schema.GroupResource{}, "whatever")
148+
}),
149+
},
144150
args: args{
145-
pkgType: v1beta1.FunctionPackageType,
146-
pkg: "example.com/function-1:v1.0.0",
147-
client: &test.MockClient{
148-
MockGet: test.NewMockGetFn(nil, func(_ client.Object) error {
149-
return kerrors.NewNotFound(schema.GroupResource{}, "whatever")
150-
}),
151+
d: v1beta1.Dependency{
152+
Type: ptr.To(v1beta1.FunctionPackageType),
153+
Package: "example.com/function-1:v1.0.0",
151154
},
152-
lock: buildLock("lock-1", withLockPackages([]v1beta1.LockPackage{
155+
pkgs: []v1beta1.LockPackage{
153156
*buildLockPkg("configuration-1",
154157
withDependencies(newDependency("provider-2"), newDependency("provider-1")),
155158
withSource("example.com/configuration-1:v1.0.0")),
156159
*buildLockPkg("function-1",
157160
withDependencies(newDependency("provider-3"), newDependency("provider-4")),
158161
withSource("example.com/function-1:v1.0.0")),
159-
}...)),
162+
},
160163
},
161164
want: want{
162165
err: nil,
@@ -171,9 +174,9 @@ func TestGetDependencyRef(t *testing.T) {
171174
for name, tc := range cases {
172175
t.Run(name, func(t *testing.T) {
173176
kc := &Client{
174-
client: tc.args.client,
177+
client: tc.client,
175178
}
176-
got, err := kc.getDependencyRef(context.Background(), tc.args.lock, tc.args.pkgType, tc.args.pkg)
179+
got, err := kc.getDependencyRef(context.Background(), tc.args.d, tc.args.pkgs)
177180
if diff := cmp.Diff(tc.want.err, err, cmpopts.EquateErrors()); diff != "" {
178181
t.Errorf("getDependencyRef(...) error = %v, wantErr %v", err, tc.want.err)
179182
}
@@ -274,9 +277,9 @@ func TestGetPackageDeps(t *testing.T) {
274277
args: args{
275278
client: &test.MockClient{
276279
MockGet: test.NewMockGetFn(nil, func(obj client.Object) error {
277-
pr, ok := obj.(*xpkgv1.ProviderRevision)
278-
if ok {
279-
pr.SetOwnerReferences([]xpv1.OwnerReference{
280+
u, ok := obj.(*unstructured.Unstructured)
281+
if ok && u.GetKind() == "ProviderRevision" {
282+
u.SetOwnerReferences([]xpv1.OwnerReference{
280283
{
281284
APIVersion: xpkgv1.ProviderGroupVersionKind.GroupVersion().String(),
282285
Kind: xpkgv1.ProviderKind,

0 commit comments

Comments
 (0)