Skip to content

Commit 35d4aae

Browse files
authored
Include files in subdirs for pull command (#3609)
1 parent 0d9c6f9 commit 35d4aae

File tree

2 files changed

+191
-1
lines changed

2 files changed

+191
-1
lines changed

commands/alpha/rpkg/pull/command.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,10 @@ var matchResourceContents = append(kio.MatchAll, kptfilev1.KptFileName)
199199

200200
func includeFile(path string) bool {
201201
for _, m := range matchResourceContents {
202-
if matched, err := filepath.Match(m, path); err == nil && matched {
202+
// Only use the filename for the check for whether we should
203+
// include the file.
204+
f := filepath.Base(path)
205+
if matched, err := filepath.Match(m, f); err == nil && matched {
203206
return true
204207
}
205208
}
Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
// Copyright 2022 Google LLC
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package pull
16+
17+
import (
18+
"bytes"
19+
"strings"
20+
"testing"
21+
22+
"github.com/GoogleContainerTools/kpt/internal/printer"
23+
fakeprint "github.com/GoogleContainerTools/kpt/internal/printer/fake"
24+
porchapi "github.com/GoogleContainerTools/kpt/porch/api/porch/v1alpha1"
25+
"github.com/google/go-cmp/cmp"
26+
"github.com/spf13/cobra"
27+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
28+
"k8s.io/cli-runtime/pkg/genericclioptions"
29+
"sigs.k8s.io/controller-runtime/pkg/client/fake"
30+
)
31+
32+
func TestCmd(t *testing.T) {
33+
pkgRevName := "repo-fjdos9u2nfe2f32"
34+
ns := "ns"
35+
36+
scheme, err := createScheme()
37+
if err != nil {
38+
t.Fatalf("error creating scheme: %v", err)
39+
}
40+
41+
testCases := map[string]struct {
42+
resources map[string]string
43+
output string
44+
}{
45+
"simple package": {
46+
resources: map[string]string{
47+
"Kptfile": strings.TrimSpace(`
48+
apiVersion: kpt.dev/v1
49+
kind: Kptfile
50+
metadata:
51+
name: bar
52+
annotations:
53+
config.kubernetes.io/local-config: "true"
54+
info:
55+
description: sample description
56+
`),
57+
"cm.yaml": strings.TrimSpace(`
58+
apiVersion: v1
59+
kind: ConfigMap
60+
metadata:
61+
name: game-config
62+
namespace: default
63+
data:
64+
foo: bar
65+
`),
66+
},
67+
output: `
68+
apiVersion: config.kubernetes.io/v1
69+
kind: ResourceList
70+
items:
71+
- apiVersion: kpt.dev/v1
72+
kind: Kptfile
73+
metadata:
74+
name: bar
75+
annotations:
76+
config.kubernetes.io/local-config: "true"
77+
config.kubernetes.io/index: '0'
78+
internal.config.kubernetes.io/index: '0'
79+
internal.config.kubernetes.io/path: 'Kptfile'
80+
config.kubernetes.io/path: 'Kptfile'
81+
info:
82+
description: sample description
83+
- apiVersion: v1
84+
kind: ConfigMap
85+
metadata:
86+
name: game-config
87+
namespace: default
88+
annotations:
89+
config.kubernetes.io/index: '0'
90+
internal.config.kubernetes.io/index: '0'
91+
internal.config.kubernetes.io/path: 'cm.yaml'
92+
config.kubernetes.io/path: 'cm.yaml'
93+
data:
94+
foo: bar
95+
`,
96+
},
97+
"package with subdirectory": {
98+
resources: map[string]string{
99+
"Kptfile": strings.TrimSpace(`
100+
apiVersion: kpt.dev/v1
101+
kind: Kptfile
102+
metadata:
103+
name: bar
104+
annotations:
105+
config.kubernetes.io/local-config: "true"
106+
info:
107+
description: sample description
108+
`),
109+
"sub/cm.yaml": strings.TrimSpace(`
110+
apiVersion: v1
111+
kind: ConfigMap
112+
metadata:
113+
name: game-config
114+
namespace: default
115+
data:
116+
foo: bar
117+
`),
118+
},
119+
output: `
120+
apiVersion: config.kubernetes.io/v1
121+
kind: ResourceList
122+
items:
123+
- apiVersion: kpt.dev/v1
124+
kind: Kptfile
125+
metadata:
126+
name: bar
127+
annotations:
128+
config.kubernetes.io/local-config: "true"
129+
config.kubernetes.io/index: '0'
130+
internal.config.kubernetes.io/index: '0'
131+
internal.config.kubernetes.io/path: 'Kptfile'
132+
config.kubernetes.io/path: 'Kptfile'
133+
info:
134+
description: sample description
135+
- apiVersion: v1
136+
kind: ConfigMap
137+
metadata:
138+
name: game-config
139+
namespace: default
140+
annotations:
141+
config.kubernetes.io/index: '0'
142+
internal.config.kubernetes.io/index: '0'
143+
internal.config.kubernetes.io/path: 'sub/cm.yaml'
144+
config.kubernetes.io/path: 'sub/cm.yaml'
145+
data:
146+
foo: bar
147+
`,
148+
},
149+
}
150+
151+
for tn := range testCases {
152+
tc := testCases[tn]
153+
t.Run(tn, func(t *testing.T) {
154+
c := fake.NewClientBuilder().
155+
WithScheme(scheme).
156+
WithObjects(&porchapi.PackageRevisionResources{
157+
ObjectMeta: metav1.ObjectMeta{
158+
Name: pkgRevName,
159+
Namespace: "ns",
160+
},
161+
Spec: porchapi.PackageRevisionResourcesSpec{
162+
PackageName: "foo",
163+
Resources: tc.resources,
164+
},
165+
}).
166+
Build()
167+
output := &bytes.Buffer{}
168+
ctx := fakeprint.CtxWithPrinter(output, output)
169+
r := &runner{
170+
ctx: ctx,
171+
cfg: &genericclioptions.ConfigFlags{
172+
Namespace: &ns,
173+
},
174+
client: c,
175+
printer: printer.FromContextOrDie(ctx),
176+
}
177+
cmd := &cobra.Command{}
178+
err = r.runE(cmd, []string{pkgRevName})
179+
if err != nil {
180+
t.Errorf("unexpected error: %v", err)
181+
}
182+
if diff := cmp.Diff(strings.TrimSpace(tc.output), strings.TrimSpace(output.String())); diff != "" {
183+
t.Errorf("Unexpected result (-want, +got): %s", diff)
184+
}
185+
})
186+
}
187+
}

0 commit comments

Comments
 (0)