mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	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`.
This commit is contained in:
		@@ -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) {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user