mirror of https://github.com/k3s-io/k3s
Merge pull request #36764 from ymqytw/make_edit_before_create_iterate
Automatic merge from submit-queue make kubectl create --edit iterate `kubectl create --edit` is broken after #36148 merged. `kubectl create --edit` will fail when a manifest that contains multiple resources. I guess the root cause is that dynamic typer doesn't support a list of resources currently. This PR makes `kubectl create --edit` iterate again as `kubectl create`.pull/6/head
commit
424286996a
|
@ -728,21 +728,34 @@ runTests() {
|
|||
kubectl delete -f hack/testdata/pod.yaml "${kube_flags[@]}"
|
||||
|
||||
### Create valid-pod POD
|
||||
# Pre-condition: no POD exists
|
||||
create_and_use_new_namespace
|
||||
kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" ''
|
||||
## kubectl create --edit can update the image field of a POD. tmp-editor.sh is a fake editor
|
||||
# Pre-condition: no services and no rcs exist
|
||||
kube::test::get_object_assert service "{{range.items}}{{$id_field}}:{{end}}" ''
|
||||
kube::test::get_object_assert rc "{{range.items}}{{$id_field}}:{{end}}" ''
|
||||
## kubectl create --edit can update the label filed of multiple resources. tmp-editor.sh is a fake editor
|
||||
TEMP=$(mktemp /tmp/tmp-editor-XXXXXXXX.sh)
|
||||
echo -e "#!/bin/bash\n$SED -i \"s/gcr.io\/google_containers\/serve_hostname/nginx/g\" \$1" > ${TEMP}
|
||||
echo -e "#!/bin/bash\n$SED -i \"s/mock/modified/g\" \$1" > ${TEMP}
|
||||
chmod +x ${TEMP}
|
||||
# Command
|
||||
EDITOR=${TEMP} kubectl create --edit -f test/fixtures/doc-yaml/admin/limitrange/valid-pod.yaml "${kube_flags[@]}"
|
||||
# Post-condition: valid-pod POD is created and has image gcr.io/google_containers/serve_hostname
|
||||
kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" 'valid-pod:'
|
||||
kube::test::get_object_assert pods "{{range.items}}{{$image_field}}:{{end}}" 'nginx:'
|
||||
EDITOR=${TEMP} kubectl create --edit -f hack/testdata/multi-resource-json.json "${kube_flags[@]}"
|
||||
# Post-condition: service named modified and rc named modified are created
|
||||
kube::test::get_object_assert service "{{range.items}}{{$id_field}}:{{end}}" 'modified:'
|
||||
kube::test::get_object_assert rc "{{range.items}}{{$id_field}}:{{end}}" 'modified:'
|
||||
# Clean up
|
||||
kubectl delete service/modified "${kube_flags[@]}"
|
||||
kubectl delete rc/modified "${kube_flags[@]}"
|
||||
|
||||
# Pre-condition: no services and no rcs exist
|
||||
kube::test::get_object_assert service "{{range.items}}{{$id_field}}:{{end}}" ''
|
||||
kube::test::get_object_assert rc "{{range.items}}{{$id_field}}:{{end}}" ''
|
||||
# Command
|
||||
EDITOR=${TEMP} kubectl create --edit -f hack/testdata/multi-resource-list.json "${kube_flags[@]}"
|
||||
# Post-condition: service named modified and rc named modified are created
|
||||
kube::test::get_object_assert service "{{range.items}}{{$id_field}}:{{end}}" 'modified:'
|
||||
kube::test::get_object_assert rc "{{range.items}}{{$id_field}}:{{end}}" 'modified:'
|
||||
# Clean up
|
||||
rm ${TEMP}
|
||||
kubectl delete pods/valid-pod "${kube_flags[@]}"
|
||||
kubectl delete service/modified "${kube_flags[@]}"
|
||||
kubectl delete rc/modified "${kube_flags[@]}"
|
||||
|
||||
## kubectl create --edit won't create anything if user makes no changes
|
||||
[ "$(EDITOR=cat kubectl create --edit -f test/fixtures/doc-yaml/admin/limitrange/valid-pod.yaml -o json 2>&1 | grep 'Edit cancelled')" ]
|
||||
|
|
|
@ -143,7 +143,7 @@ func runEdit(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args
|
|||
return err
|
||||
}
|
||||
|
||||
infos, err := r.Infos()
|
||||
normalEditInfos, err := r.Infos()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -153,6 +153,7 @@ func runEdit(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args
|
|||
edit = editor.NewDefaultEditor(f.EditorEnvs())
|
||||
)
|
||||
|
||||
editFn := func(info *resource.Info, err error) error {
|
||||
var (
|
||||
results = editResults{}
|
||||
original = []byte{}
|
||||
|
@ -161,7 +162,16 @@ func runEdit(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args
|
|||
)
|
||||
|
||||
containsError := false
|
||||
var infos []*resource.Info
|
||||
for {
|
||||
switch editMode {
|
||||
case NormalEditMode:
|
||||
infos = normalEditInfos
|
||||
case EditBeforeCreateMode:
|
||||
infos = []*resource.Info{info}
|
||||
default:
|
||||
err = fmt.Errorf("Not supported edit mode %q", editMode)
|
||||
}
|
||||
originalObj, err := resource.AsVersionedObject(infos, false, defaultVersion, encoder)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -318,6 +328,18 @@ func runEdit(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args
|
|||
containsError = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
switch editMode {
|
||||
// If doing normal edit we cannot use Visit because we need to edit a list for convenience. Ref: #20519
|
||||
case NormalEditMode:
|
||||
return editFn(nil, nil)
|
||||
// If doing an edit before created, we don't want a list and instead want the normal behavior as kubectl create.
|
||||
case EditBeforeCreateMode:
|
||||
return r.Visit(editFn)
|
||||
default:
|
||||
return fmt.Errorf("Not supported edit mode %q", editMode)
|
||||
}
|
||||
}
|
||||
|
||||
func getPrinter(cmd *cobra.Command) (*editPrinterOptions, error) {
|
||||
|
|
Loading…
Reference in New Issue