Skip to content

Commit b7174fd

Browse files
authored
Add KptFileGVK to expose typed GVK information for Kptfile (#3584)
More ergonomic than a set of strings. Also do the same for ResultList and FunctionResultList
1 parent 3eb9918 commit b7174fd

File tree

12 files changed

+120
-59
lines changed

12 files changed

+120
-59
lines changed

commands/live/migrate/migratecmd.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ func (mr *Runner) retrieveConfigMapInv(reader io.Reader, args []string) (invento
205205

206206
// cli-utils treats any resource that contains the inventory-id label as an inventory object. We should
207207
// ignore any inventories that are stored as ResourceGroup resources since they do not need migration.
208-
if cmInvObj.GetKind() == rgfilev1alpha1.RGFileKind {
208+
if cmInvObj.GetKind() == rgfilev1alpha1.ResourceGroupGVK().Kind {
209209
// No ConfigMap inventory means the migration has already run before.
210210
fmt.Fprintln(mr.ioStreams.Out, "no ConfigMap inventory...completed")
211211
return nil, &inventory.NoInventoryObjError{}

commands/pkg/get/cmdget_test.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,9 @@ func TestCmd_execute(t *testing.T) {
6666
},
6767
},
6868
TypeMeta: yaml.TypeMeta{
69-
APIVersion: kptfilev1.KptFileAPIVersion,
70-
Kind: kptfilev1.KptFileKind},
69+
APIVersion: kptfilev1.KptFileGVK().GroupVersion().String(),
70+
Kind: kptfilev1.KptFileGVK().Kind,
71+
},
7172
},
7273
Upstream: &kptfilev1.Upstream{
7374
Type: kptfilev1.GitOrigin,
@@ -126,8 +127,9 @@ func TestCmdMainBranch_execute(t *testing.T) {
126127
},
127128
},
128129
TypeMeta: yaml.TypeMeta{
129-
APIVersion: kptfilev1.KptFileAPIVersion,
130-
Kind: kptfilev1.KptFileKind},
130+
APIVersion: kptfilev1.KptFileGVK().GroupVersion().String(),
131+
Kind: kptfilev1.KptFileGVK().Kind,
132+
},
131133
},
132134
Upstream: &kptfilev1.Upstream{
133135
Type: kptfilev1.GitOrigin,

internal/builtins/pkg_context.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ const (
3535

3636
var (
3737
configMapGVK = resid.NewGvk("", "v1", "ConfigMap")
38-
kptfileGVK = resid.NewGvk(kptfilev1.KptFileGroup, kptfilev1.KptFileVersion, kptfilev1.KptFileKind)
38+
kptfileGVK = resid.NewGvk(kptfilev1.KptFileGVK().Group, kptfilev1.KptFileGVK().Version, kptfilev1.KptFileGVK().Kind)
3939
)
4040

4141
// PackageContextGenerator is a built-in KRM function that generates

internal/errors/resolver/pkg.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ func resolveNestedErr(err error, tmplArgs map[string]interface{}) (ResolvedResul
9999

100100
var deprecatedv1alpha1KptfileError *pkg.DeprecatedKptfileError
101101
if errors.As(err, &deprecatedv1alpha1KptfileError) &&
102-
deprecatedv1alpha1KptfileError.Version == pkg.DeprecatedKptfileVersions[0] {
102+
deprecatedv1alpha1KptfileError.Version == "v1alpha1" {
103103
tmplArgs["version"] = deprecatedv1alpha1KptfileError.Version
104104
errMsg := deprecatedv1Alpha1KptfileMsg
105105
return ResolvedResult{
@@ -109,7 +109,7 @@ func resolveNestedErr(err error, tmplArgs map[string]interface{}) (ResolvedResul
109109

110110
var deprecatedv1alpha2KptfileError *pkg.DeprecatedKptfileError
111111
if errors.As(err, &deprecatedv1alpha2KptfileError) &&
112-
deprecatedv1alpha1KptfileError.Version == pkg.DeprecatedKptfileVersions[1] {
112+
deprecatedv1alpha1KptfileError.Version == "v1alpha2" {
113113
tmplArgs["version"] = deprecatedv1alpha2KptfileError.Version
114114
errMsg := deprecatedv1Alpha2KptfileMsg
115115
return ResolvedResult{

internal/pkg/pkg.go

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import (
3030
kptfilev1 "github.com/GoogleContainerTools/kpt/pkg/api/kptfile/v1"
3131
rgfilev1alpha1 "github.com/GoogleContainerTools/kpt/pkg/api/resourcegroup/v1alpha1"
3232
"k8s.io/apimachinery/pkg/runtime/schema"
33-
"k8s.io/kubectl/pkg/util/slice"
3433
"sigs.k8s.io/kustomize/kyaml/filesys"
3534
"sigs.k8s.io/kustomize/kyaml/kio"
3635
"sigs.k8s.io/kustomize/kyaml/kio/kioutil"
@@ -45,17 +44,17 @@ const (
4544
pkgPathAnnotation = "internal.config.kubernetes.io/package-path"
4645
)
4746

48-
var DeprecatedKptfileVersions = []string{
49-
"v1alpha1",
50-
"v1alpha2",
47+
var DeprecatedKptfileVersions = []schema.GroupVersionKind{
48+
kptfilev1.KptFileGVK().GroupKind().WithVersion("v1alpha1"),
49+
kptfilev1.KptFileGVK().GroupKind().WithVersion("v1alpha2"),
5150
}
5251

5352
// MatchAllKRM represents set of glob pattern to match all KRM
5453
// resources including Kptfile.
5554
var MatchAllKRM = append([]string{kptfilev1.KptFileName}, kio.MatchAll...)
5655

57-
var SupportedKptfileVersions = []string{
58-
kptfilev1.KptFileVersion,
56+
var SupportedKptfileVersions = []schema.GroupVersionKind{
57+
kptfilev1.KptFileGVK(),
5958
}
6059

6160
// KptfileError records errors regarding reading or parsing of a Kptfile.
@@ -286,18 +285,15 @@ func CheckKptfileVersion(content []byte) error {
286285
if err != nil {
287286
return err
288287
}
288+
gvk := gv.WithKind(kind)
289289

290290
switch {
291291
// If the resource type matches what we are looking for, just return nil.
292-
case gv.Group == kptfilev1.KptFileGroup &&
293-
kind == kptfilev1.KptFileKind &&
294-
isSupportedKptfileVersion(gv.Version):
292+
case isSupportedKptfileVersion(gvk):
295293
return nil
296294
// If the kind and group is correct and the version is a known deprecated
297295
// schema for the Kptfile, return DeprecatedKptfileError.
298-
case gv.Group == kptfilev1.KptFileGroup &&
299-
kind == kptfilev1.KptFileKind &&
300-
isDeprecatedKptfileVersion(gv.Version):
296+
case isDeprecatedKptfileVersion(gvk):
301297
return &DeprecatedKptfileError{
302298
Version: gv.Version,
303299
}
@@ -310,12 +306,22 @@ func CheckKptfileVersion(content []byte) error {
310306
}
311307
}
312308

313-
func isDeprecatedKptfileVersion(version string) bool {
314-
return slice.ContainsString(DeprecatedKptfileVersions, version, nil)
309+
func isDeprecatedKptfileVersion(gvk schema.GroupVersionKind) bool {
310+
for _, v := range DeprecatedKptfileVersions {
311+
if v == gvk {
312+
return true
313+
}
314+
}
315+
return false
315316
}
316317

317-
func isSupportedKptfileVersion(version string) bool {
318-
return slice.ContainsString(SupportedKptfileVersions, version, nil)
318+
func isSupportedKptfileVersion(gvk schema.GroupVersionKind) bool {
319+
for _, v := range SupportedKptfileVersions {
320+
if v == gvk {
321+
return true
322+
}
323+
}
324+
return false
319325
}
320326

321327
// Pipeline returns the Pipeline section of the pkg's Kptfile.
@@ -777,7 +783,7 @@ func filterResourceGroups(input []*yaml.RNode) (output []*yaml.RNode, err error)
777783
return nil, fmt.Errorf("failed to read metadata for resource %w", err)
778784
}
779785
// Filter out any non-ResourceGroup files.
780-
if !(meta.APIVersion == rgfilev1alpha1.RGFileAPIVersion && meta.Kind == rgfilev1alpha1.RGFileKind) {
786+
if !(meta.APIVersion == rgfilev1alpha1.ResourceGroupGVK().GroupVersion().String() && meta.Kind == rgfilev1alpha1.ResourceGroupGVK().Kind) {
781787
continue
782788
}
783789

internal/util/fetch/fetch_test.go

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -196,8 +196,9 @@ func TestCommand_Run(t *testing.T) {
196196
},
197197
},
198198
TypeMeta: yaml.TypeMeta{
199-
APIVersion: kptfilev1.KptFileAPIVersion,
200-
Kind: kptfilev1.KptFileKind},
199+
APIVersion: kptfilev1.KptFileGVK().GroupVersion().String(),
200+
Kind: kptfilev1.KptFileGVK().Kind,
201+
},
201202
},
202203
Upstream: &kptfilev1.Upstream{
203204
Type: "git",
@@ -258,8 +259,8 @@ func TestCommand_Run_subdir(t *testing.T) {
258259
},
259260
},
260261
TypeMeta: yaml.TypeMeta{
261-
APIVersion: kptfilev1.KptFileAPIVersion,
262-
Kind: kptfilev1.KptFileKind},
262+
APIVersion: kptfilev1.KptFileGVK().GroupVersion().String(),
263+
Kind: kptfilev1.KptFileGVK().Kind},
263264
},
264265
Upstream: &kptfilev1.Upstream{
265266
Type: kptfilev1.GitOrigin,
@@ -334,8 +335,9 @@ func TestCommand_Run_branch(t *testing.T) {
334335
},
335336
},
336337
TypeMeta: yaml.TypeMeta{
337-
APIVersion: kptfilev1.KptFileAPIVersion,
338-
Kind: kptfilev1.KptFileKind},
338+
APIVersion: kptfilev1.KptFileGVK().GroupVersion().String(),
339+
Kind: kptfilev1.KptFileGVK().Kind,
340+
},
339341
},
340342
Upstream: &kptfilev1.Upstream{
341343
Type: kptfilev1.GitOrigin,
@@ -415,8 +417,9 @@ func TestCommand_Run_tag(t *testing.T) {
415417
},
416418
},
417419
TypeMeta: yaml.TypeMeta{
418-
APIVersion: kptfilev1.KptFileAPIVersion,
419-
Kind: kptfilev1.KptFileKind},
420+
APIVersion: kptfilev1.KptFileGVK().GroupVersion().String(),
421+
Kind: kptfilev1.KptFileGVK().Kind,
422+
},
420423
},
421424
Upstream: &kptfilev1.Upstream{
422425
Type: "git",

pkg/api/fnresult/v1/types.go

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
package v1
1616

1717
import (
18-
kptfilev1 "github.com/GoogleContainerTools/kpt/pkg/api/kptfile/v1"
18+
"k8s.io/apimachinery/pkg/runtime/schema"
1919
"sigs.k8s.io/kustomize/kyaml/fn/framework"
2020
"sigs.k8s.io/kustomize/kyaml/yaml"
2121
)
@@ -42,12 +42,25 @@ type Result struct {
4242
}
4343

4444
const (
45-
ResultListKind = "FunctionResultList"
46-
ResultListGroup = kptfilev1.KptFileGroup
47-
ResultListVersion = kptfilev1.KptFileVersion
45+
// Deprecated: prefer ResultListGVK
46+
ResultListKind = "FunctionResultList"
47+
// Deprecated: prefer ResultListGVK
48+
ResultListGroup = "kpt.dev"
49+
// Deprecated: prefer ResultListGVK
50+
ResultListVersion = "v1"
51+
// Deprecated: prefer ResultListGVK
4852
ResultListAPIVersion = ResultListGroup + "/" + ResultListVersion
4953
)
5054

55+
// KptFileGVK is the GroupVersionKind of FunctionResultList objects
56+
func ResultListGVK() schema.GroupVersionKind {
57+
return schema.GroupVersionKind{
58+
Group: "kpt.dev",
59+
Version: "v1",
60+
Kind: "FunctionResultList",
61+
}
62+
}
63+
5164
// ResultList contains aggregated results from multiple functions
5265
type ResultList struct {
5366
yaml.ResourceMeta `yaml:",inline"`

pkg/api/kptfile/v1/types.go

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,35 @@ package v1
2020
import (
2121
"fmt"
2222

23+
"k8s.io/apimachinery/pkg/runtime/schema"
2324
"sigs.k8s.io/kustomize/kyaml/yaml"
2425
)
2526

2627
const (
27-
KptFileName = "Kptfile"
28-
KptFileKind = "Kptfile"
29-
KptFileGroup = "kpt.dev"
30-
KptFileVersion = "v1"
28+
KptFileName = "Kptfile"
29+
30+
// Deprecated: prefer KptFileGVK
31+
KptFileKind = "Kptfile"
32+
33+
// Deprecated: prefer KptFileGVK
34+
KptFileGroup = "kpt.dev"
35+
36+
// Deprecated: prefer KptFileGVK
37+
KptFileVersion = "v1"
38+
39+
// Deprecated: prefer KptFileGVK
3140
KptFileAPIVersion = KptFileGroup + "/" + KptFileVersion
3241
)
3342

43+
// KptFileGVK is the GroupVersionKind of Kptfile objects
44+
func KptFileGVK() schema.GroupVersionKind {
45+
return schema.GroupVersionKind{
46+
Group: "kpt.dev",
47+
Version: "v1",
48+
Kind: "Kptfile",
49+
}
50+
}
51+
3452
// TypeMeta is the TypeMeta for KptFile instances.
3553
var TypeMeta = yaml.ResourceMeta{
3654
TypeMeta: yaml.TypeMeta{

pkg/api/resourcegroup/v1alpha1/types.go

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,35 @@
1818
package v1alpha1
1919

2020
import (
21+
"k8s.io/apimachinery/pkg/runtime/schema"
2122
"sigs.k8s.io/cli-utils/pkg/common"
2223
"sigs.k8s.io/kustomize/kyaml/yaml"
2324
)
2425

2526
const (
26-
RGFileName = "resourcegroup.yaml"
27-
RGFileKind = "ResourceGroup"
28-
RGFileGroup = "kpt.dev"
29-
RGFileVersion = "v1alpha1"
30-
RGFileAPIVersion = RGFileGroup + "/" + RGFileVersion
27+
RGFileName = "resourcegroup.yaml"
3128
// RGInventoryIDLabel is the label name used for storing an inventory ID.
3229
RGInventoryIDLabel = common.InventoryLabel
30+
31+
// Deprecated: prefer ResourceGroupGVK
32+
RGFileKind = "ResourceGroup"
33+
// Deprecated: prefer ResourceGroupGVK
34+
RGFileGroup = "kpt.dev"
35+
// Deprecated: prefer ResourceGroupGVK
36+
RGFileVersion = "v1alpha1"
37+
// Deprecated: prefer ResourceGroupGVK
38+
RGFileAPIVersion = RGFileGroup + "/" + RGFileVersion
3339
)
3440

41+
// ResourceGroupGVK is the GroupVersionKind of ResourceGroup objects
42+
func ResourceGroupGVK() schema.GroupVersionKind {
43+
return schema.GroupVersionKind{
44+
Group: "kpt.dev",
45+
Version: "v1alpha1",
46+
Kind: "ResourceGroup",
47+
}
48+
}
49+
3550
// DefaultMeta is the ResourceMeta for ResourceGroup instances.
3651
var DefaultMeta = yaml.ResourceMeta{
3752
TypeMeta: yaml.TypeMeta{

pkg/live/load.go

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import (
2626
kptfilev1 "github.com/GoogleContainerTools/kpt/pkg/api/kptfile/v1"
2727
rgfilev1alpha1 "github.com/GoogleContainerTools/kpt/pkg/api/resourcegroup/v1alpha1"
2828
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
29+
"k8s.io/apimachinery/pkg/runtime/schema"
30+
"k8s.io/klog/v2"
2931
"k8s.io/kubectl/pkg/cmd/util"
3032
"sigs.k8s.io/cli-utils/pkg/common"
3133
"sigs.k8s.io/cli-utils/pkg/inventory"
@@ -195,8 +197,7 @@ type InventoryFilter struct {
195197
}
196198

197199
func (i *InventoryFilter) Filter(object *yaml.RNode) (*yaml.RNode, error) {
198-
if object.GetApiVersion() != kptfilev1.KptFileAPIVersion ||
199-
object.GetKind() != kptfilev1.KptFileKind {
200+
if GroupVersionKindForObject(object) != kptfilev1.KptFileGVK() {
200201
return object, nil
201202
}
202203

@@ -220,9 +221,18 @@ type RGFilter struct {
220221
Inventories []*rgfilev1alpha1.ResourceGroup
221222
}
222223

224+
// GroupVersionKindForObject extracts the group/version/kind from an RNode holding a kubernetes object.
225+
func GroupVersionKindForObject(object *yaml.RNode) schema.GroupVersionKind {
226+
apiVersion := object.GetApiVersion()
227+
gv, err := schema.ParseGroupVersion(apiVersion)
228+
if err != nil {
229+
klog.Warningf("error parsing apiVersion=%q", apiVersion)
230+
}
231+
return gv.WithKind(object.GetKind())
232+
}
233+
223234
func (r *RGFilter) Filter(object *yaml.RNode) (*yaml.RNode, error) {
224-
if object.GetApiVersion() != rgfilev1alpha1.RGFileAPIVersion ||
225-
object.GetKind() != rgfilev1alpha1.RGFileKind {
235+
if GroupVersionKindForObject(object) != rgfilev1alpha1.ResourceGroupGVK() {
226236
return object, nil
227237
}
228238

0 commit comments

Comments
 (0)