mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-28 05:57:25 +00:00
add -k flag to FilenameFlags in cli-runtime
This commit is contained in:
parent
34699f3ff0
commit
46f4378bd9
@ -0,0 +1,7 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: the-map
|
||||||
|
data:
|
||||||
|
altGreeting: "Good Morning!"
|
||||||
|
enableRisky: "false"
|
@ -0,0 +1,30 @@
|
|||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: the-deployment
|
||||||
|
spec:
|
||||||
|
replicas: 3
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
deployment: hello
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: the-container
|
||||||
|
image: monopole/hello:1
|
||||||
|
command: ["/hello",
|
||||||
|
"--port=8080",
|
||||||
|
"--enableRiskyFeature=$(ENABLE_RISKY)"]
|
||||||
|
ports:
|
||||||
|
- containerPort: 8080
|
||||||
|
env:
|
||||||
|
- name: ALT_GREETING
|
||||||
|
valueFrom:
|
||||||
|
configMapKeyRef:
|
||||||
|
name: the-map
|
||||||
|
key: altGreeting
|
||||||
|
- name: ENABLE_RISKY
|
||||||
|
valueFrom:
|
||||||
|
configMapKeyRef:
|
||||||
|
name: the-map
|
||||||
|
key: enableRisky
|
@ -0,0 +1,5 @@
|
|||||||
|
nameprefix: test-
|
||||||
|
resources:
|
||||||
|
- deployment.yaml
|
||||||
|
- service.yaml
|
||||||
|
- configMap.yaml
|
@ -0,0 +1,12 @@
|
|||||||
|
kind: Service
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: the-service
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
deployment: hello
|
||||||
|
type: LoadBalancer
|
||||||
|
ports:
|
||||||
|
- protocol: TCP
|
||||||
|
port: 8666
|
||||||
|
targetPort: 8080
|
@ -0,0 +1,7 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: should-not-create-map
|
||||||
|
data:
|
||||||
|
altGreeting: "Good Morning!"
|
||||||
|
enableRisky: "false"
|
@ -0,0 +1,8 @@
|
|||||||
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
|
kind: Kustomization
|
||||||
|
|
||||||
|
nameprefix: test-
|
||||||
|
resources:
|
||||||
|
- deployment.yaml
|
||||||
|
- service.yaml
|
||||||
|
- configMap.yaml
|
@ -32,6 +32,7 @@ type FileNameFlags struct {
|
|||||||
Usage string
|
Usage string
|
||||||
|
|
||||||
Filenames *[]string
|
Filenames *[]string
|
||||||
|
Kustomize *string
|
||||||
Recursive *bool
|
Recursive *bool
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -48,6 +49,9 @@ func (o *FileNameFlags) ToOptions() resource.FilenameOptions {
|
|||||||
if o.Filenames != nil {
|
if o.Filenames != nil {
|
||||||
options.Filenames = *o.Filenames
|
options.Filenames = *o.Filenames
|
||||||
}
|
}
|
||||||
|
if o.Kustomize != nil {
|
||||||
|
options.Kustomize = *o.Kustomize
|
||||||
|
}
|
||||||
|
|
||||||
return options
|
return options
|
||||||
}
|
}
|
||||||
@ -68,4 +72,8 @@ func (o *FileNameFlags) AddFlags(flags *pflag.FlagSet) {
|
|||||||
}
|
}
|
||||||
flags.SetAnnotation("filename", cobra.BashCompFilenameExt, annotations)
|
flags.SetAnnotation("filename", cobra.BashCompFilenameExt, annotations)
|
||||||
}
|
}
|
||||||
|
if o.Kustomize != nil {
|
||||||
|
flags.StringVarP(o.Kustomize, "kustomize", "k", *o.Kustomize,
|
||||||
|
"Process a kustomization directory. This flag can't be used together with -f or -R.")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -130,9 +130,28 @@ func IsUsageError(err error) bool {
|
|||||||
|
|
||||||
type FilenameOptions struct {
|
type FilenameOptions struct {
|
||||||
Filenames []string
|
Filenames []string
|
||||||
|
Kustomize string
|
||||||
Recursive bool
|
Recursive bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (o *FilenameOptions) validate() []error {
|
||||||
|
var errs []error
|
||||||
|
if len(o.Filenames) > 0 && len(o.Kustomize) > 0 {
|
||||||
|
errs = append(errs, fmt.Errorf("only one of -f or -k can be specified"))
|
||||||
|
}
|
||||||
|
if len(o.Kustomize) > 0 && o.Recursive {
|
||||||
|
errs = append(errs, fmt.Errorf("-R is not allowed to work with -k"))
|
||||||
|
}
|
||||||
|
return errs
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *FilenameOptions) RequireFilenameOrKustomize() error {
|
||||||
|
if len(o.Filenames) == 0 && len(o.Kustomize) == 0 {
|
||||||
|
return fmt.Errorf("must specify one of -f and -k")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
type resourceTuple struct {
|
type resourceTuple struct {
|
||||||
Resource string
|
Resource string
|
||||||
Name string
|
Name string
|
||||||
@ -195,6 +214,10 @@ func (b *Builder) AddError(err error) *Builder {
|
|||||||
// If ContinueOnError() is set prior to this method, objects on the path that are not
|
// If ContinueOnError() is set prior to this method, objects on the path that are not
|
||||||
// recognized will be ignored (but logged at V(2)).
|
// recognized will be ignored (but logged at V(2)).
|
||||||
func (b *Builder) FilenameParam(enforceNamespace bool, filenameOptions *FilenameOptions) *Builder {
|
func (b *Builder) FilenameParam(enforceNamespace bool, filenameOptions *FilenameOptions) *Builder {
|
||||||
|
if errs := filenameOptions.validate(); len(errs) > 0 {
|
||||||
|
b.errs = append(b.errs, errs...)
|
||||||
|
return b
|
||||||
|
}
|
||||||
recursive := filenameOptions.Recursive
|
recursive := filenameOptions.Recursive
|
||||||
paths := filenameOptions.Filenames
|
paths := filenameOptions.Filenames
|
||||||
for _, s := range paths {
|
for _, s := range paths {
|
||||||
@ -215,6 +238,10 @@ func (b *Builder) FilenameParam(enforceNamespace bool, filenameOptions *Filename
|
|||||||
b.Path(recursive, s)
|
b.Path(recursive, s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if filenameOptions.Kustomize != "" {
|
||||||
|
b.paths = append(b.paths, &KustomizeVisitor{filenameOptions.Kustomize,
|
||||||
|
NewStreamVisitor(nil, b.mapper, filenameOptions.Kustomize, b.schema)})
|
||||||
|
}
|
||||||
|
|
||||||
if enforceNamespace {
|
if enforceNamespace {
|
||||||
b.RequireNamespace()
|
b.RequireNamespace()
|
||||||
|
@ -374,6 +374,62 @@ func writeTestFile(t *testing.T, path string, contents string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestFilenameOptionsValidate(t *testing.T) {
|
||||||
|
testcases := []struct {
|
||||||
|
filenames []string
|
||||||
|
kustomize string
|
||||||
|
recursive bool
|
||||||
|
errExp bool
|
||||||
|
msgExp string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
filenames: []string{"file"},
|
||||||
|
kustomize: "dir",
|
||||||
|
errExp: true,
|
||||||
|
msgExp: "only one of -f or -k can be specified",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
kustomize: "dir",
|
||||||
|
recursive: true,
|
||||||
|
errExp: true,
|
||||||
|
msgExp: "-R is not allowed to work with -k",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
filenames: []string{"file"},
|
||||||
|
errExp: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
filenames: []string{"dir"},
|
||||||
|
recursive: true,
|
||||||
|
errExp: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
kustomize: "dir",
|
||||||
|
errExp: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, testcase := range testcases {
|
||||||
|
o := &FilenameOptions{
|
||||||
|
Kustomize: testcase.kustomize,
|
||||||
|
Filenames: testcase.filenames,
|
||||||
|
Recursive: testcase.recursive,
|
||||||
|
}
|
||||||
|
errs := o.validate()
|
||||||
|
if testcase.errExp {
|
||||||
|
if len(errs) == 0 {
|
||||||
|
t.Fatalf("expected error not happened")
|
||||||
|
}
|
||||||
|
if errs[0].Error() != testcase.msgExp {
|
||||||
|
t.Fatalf("expected %s, but got %#v", testcase.msgExp, errs[0])
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if len(errs) > 0 {
|
||||||
|
t.Fatalf("Unexpected error %#v", errs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestPathBuilderWithMultiple(t *testing.T) {
|
func TestPathBuilderWithMultiple(t *testing.T) {
|
||||||
// create test dirs
|
// create test dirs
|
||||||
tmpDir, err := utiltesting.MkTmpdir("recursive_test_multiple")
|
tmpDir, err := utiltesting.MkTmpdir("recursive_test_multiple")
|
||||||
@ -513,6 +569,70 @@ func TestDirectoryBuilder(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestKustomizeDirectoryBuilder(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
directory string
|
||||||
|
expectErr bool
|
||||||
|
errMsg string
|
||||||
|
number int
|
||||||
|
expectedNames []string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
directory: "../../../artifacts/guestbook",
|
||||||
|
expectErr: true,
|
||||||
|
errMsg: "No kustomization file found",
|
||||||
|
},
|
||||||
|
// TODO(Liujingfang1): Fix this test in bazel test
|
||||||
|
//{
|
||||||
|
// directory: "../../../artifacts/kustomization",
|
||||||
|
// expectErr: false,
|
||||||
|
// expectedNames: []string{"test-the-map", "test-the-deployment", "test-the-service"},
|
||||||
|
//},
|
||||||
|
{
|
||||||
|
directory: "../../../artifacts/kustomization/should-not-load.yaml",
|
||||||
|
expectErr: true,
|
||||||
|
errMsg: "must be a directory to be a root",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
b := newDefaultBuilder().
|
||||||
|
FilenameParam(false, &FilenameOptions{Kustomize: tt.directory}).
|
||||||
|
NamespaceParam("test").DefaultNamespace()
|
||||||
|
test := &testVisitor{}
|
||||||
|
err := b.Do().Visit(test.Handle)
|
||||||
|
if tt.expectErr {
|
||||||
|
if err == nil {
|
||||||
|
t.Fatalf("expected error unhappened")
|
||||||
|
}
|
||||||
|
if !strings.Contains(err.Error(), tt.errMsg) {
|
||||||
|
t.Fatalf("expected %s but got %s", tt.errMsg, err.Error())
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if err != nil || len(test.Infos) < tt.number {
|
||||||
|
t.Fatalf("unexpected response: %v %#v", err, test.Infos)
|
||||||
|
}
|
||||||
|
contained := func(name string) bool {
|
||||||
|
for _, info := range test.Infos {
|
||||||
|
if info.Name == name && info.Namespace == "test" && info.Object != nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
allFound := true
|
||||||
|
for _, name := range tt.expectedNames {
|
||||||
|
if !contained(name) {
|
||||||
|
allFound = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !allFound {
|
||||||
|
t.Errorf("unexpected responses: %#v", test.Infos)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestNamespaceOverride(t *testing.T) {
|
func TestNamespaceOverride(t *testing.T) {
|
||||||
s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
|
s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
|
||||||
w.WriteHeader(http.StatusOK)
|
w.WriteHeader(http.StatusOK)
|
||||||
|
Loading…
Reference in New Issue
Block a user