mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	Merge pull request #38445 from brendandburns/configmap2
Automatic merge from submit-queue (batch tested with PRs 38445, 40292) Add the ability to edit fields within a config map. Addresses part of https://github.com/kubernetes/kubernetes/issues/36222 Example command: ```console $ kubectl edit configmap foo --config-map-data=bar ``` Will open the data element named `bar` in the `ConfigMap` named `foo` in `$EDITOR`, the edited contents are then updated back to the config map. @kubernetes/sig-cli ```release-note Add a special purpose tool for editing individual fields in a ConfigMap with kubectl ```
This commit is contained in:
		@@ -58,6 +58,7 @@ docs/man/man1/kubectl-create.1
 | 
				
			|||||||
docs/man/man1/kubectl-delete.1
 | 
					docs/man/man1/kubectl-delete.1
 | 
				
			||||||
docs/man/man1/kubectl-describe.1
 | 
					docs/man/man1/kubectl-describe.1
 | 
				
			||||||
docs/man/man1/kubectl-drain.1
 | 
					docs/man/man1/kubectl-drain.1
 | 
				
			||||||
 | 
					docs/man/man1/kubectl-edit-configmap.1
 | 
				
			||||||
docs/man/man1/kubectl-edit.1
 | 
					docs/man/man1/kubectl-edit.1
 | 
				
			||||||
docs/man/man1/kubectl-exec.1
 | 
					docs/man/man1/kubectl-exec.1
 | 
				
			||||||
docs/man/man1/kubectl-explain.1
 | 
					docs/man/man1/kubectl-explain.1
 | 
				
			||||||
@@ -142,6 +143,7 @@ docs/user-guide/kubectl/kubectl_delete.md
 | 
				
			|||||||
docs/user-guide/kubectl/kubectl_describe.md
 | 
					docs/user-guide/kubectl/kubectl_describe.md
 | 
				
			||||||
docs/user-guide/kubectl/kubectl_drain.md
 | 
					docs/user-guide/kubectl/kubectl_drain.md
 | 
				
			||||||
docs/user-guide/kubectl/kubectl_edit.md
 | 
					docs/user-guide/kubectl/kubectl_edit.md
 | 
				
			||||||
 | 
					docs/user-guide/kubectl/kubectl_edit_configmap.md
 | 
				
			||||||
docs/user-guide/kubectl/kubectl_exec.md
 | 
					docs/user-guide/kubectl/kubectl_exec.md
 | 
				
			||||||
docs/user-guide/kubectl/kubectl_explain.md
 | 
					docs/user-guide/kubectl/kubectl_explain.md
 | 
				
			||||||
docs/user-guide/kubectl/kubectl_expose.md
 | 
					docs/user-guide/kubectl/kubectl_expose.md
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								docs/man/man1/kubectl-edit-configmap.1
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								docs/man/man1/kubectl-edit-configmap.1
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					This file is autogenerated, but we've stopped checking such files into the
 | 
				
			||||||
 | 
					repository to reduce the need for rebases. Please run hack/generate-docs.sh to
 | 
				
			||||||
 | 
					populate this file.
 | 
				
			||||||
							
								
								
									
										7
									
								
								docs/user-guide/kubectl/kubectl_edit_configmap.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								docs/user-guide/kubectl/kubectl_edit_configmap.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					This file is autogenerated, but we've stopped checking such files into the
 | 
				
			||||||
 | 
					repository to reduce the need for rebases. Please run hack/generate-docs.sh to
 | 
				
			||||||
 | 
					populate this file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!-- BEGIN MUNGE: GENERATED_ANALYTICS -->
 | 
				
			||||||
 | 
					[]()
 | 
				
			||||||
 | 
					<!-- END MUNGE: GENERATED_ANALYTICS -->
 | 
				
			||||||
@@ -97,6 +97,7 @@ concurrent-resource-quota-syncs
 | 
				
			|||||||
concurrent-serviceaccount-token-syncs
 | 
					concurrent-serviceaccount-token-syncs
 | 
				
			||||||
concurrent-service-syncs
 | 
					concurrent-service-syncs
 | 
				
			||||||
config-map
 | 
					config-map
 | 
				
			||||||
 | 
					config-map-data
 | 
				
			||||||
config-map-namespace
 | 
					config-map-namespace
 | 
				
			||||||
config-sync-period
 | 
					config-sync-period
 | 
				
			||||||
configure-cloud-routes
 | 
					configure-cloud-routes
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -38,6 +38,7 @@ go_library(
 | 
				
			|||||||
        "describe.go",
 | 
					        "describe.go",
 | 
				
			||||||
        "drain.go",
 | 
					        "drain.go",
 | 
				
			||||||
        "edit.go",
 | 
					        "edit.go",
 | 
				
			||||||
 | 
					        "edit_configmap.go",
 | 
				
			||||||
        "exec.go",
 | 
					        "exec.go",
 | 
				
			||||||
        "explain.go",
 | 
					        "explain.go",
 | 
				
			||||||
        "expose.go",
 | 
					        "expose.go",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -101,12 +101,20 @@ func NewCmdEdit(f cmdutil.Factory, out, errOut io.Writer) *cobra.Command {
 | 
				
			|||||||
		Long:    editLong,
 | 
							Long:    editLong,
 | 
				
			||||||
		Example: fmt.Sprintf(editExample),
 | 
							Example: fmt.Sprintf(editExample),
 | 
				
			||||||
		Run: func(cmd *cobra.Command, args []string) {
 | 
							Run: func(cmd *cobra.Command, args []string) {
 | 
				
			||||||
 | 
								args = append([]string{"configmap"}, args...)
 | 
				
			||||||
			err := RunEdit(f, out, errOut, cmd, args, options)
 | 
								err := RunEdit(f, out, errOut, cmd, args, options)
 | 
				
			||||||
			cmdutil.CheckErr(err)
 | 
								cmdutil.CheckErr(err)
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		ValidArgs:  validArgs,
 | 
							ValidArgs:  validArgs,
 | 
				
			||||||
		ArgAliases: argAliases,
 | 
							ArgAliases: argAliases,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						addEditFlags(cmd, options)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cmd.AddCommand(NewCmdEditConfigMap(f, out, errOut))
 | 
				
			||||||
 | 
						return cmd
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func addEditFlags(cmd *cobra.Command, options *resource.FilenameOptions) {
 | 
				
			||||||
	usage := "to use to edit the resource"
 | 
						usage := "to use to edit the resource"
 | 
				
			||||||
	cmdutil.AddFilenameOptionFlags(cmd, options, usage)
 | 
						cmdutil.AddFilenameOptionFlags(cmd, options, usage)
 | 
				
			||||||
	cmdutil.AddValidateFlags(cmd)
 | 
						cmdutil.AddValidateFlags(cmd)
 | 
				
			||||||
@@ -116,7 +124,6 @@ func NewCmdEdit(f cmdutil.Factory, out, errOut io.Writer) *cobra.Command {
 | 
				
			|||||||
	cmdutil.AddApplyAnnotationFlags(cmd)
 | 
						cmdutil.AddApplyAnnotationFlags(cmd)
 | 
				
			||||||
	cmdutil.AddRecordFlag(cmd)
 | 
						cmdutil.AddRecordFlag(cmd)
 | 
				
			||||||
	cmdutil.AddInclude3rdPartyFlags(cmd)
 | 
						cmdutil.AddInclude3rdPartyFlags(cmd)
 | 
				
			||||||
	return cmd
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func RunEdit(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args []string, options *resource.FilenameOptions) error {
 | 
					func RunEdit(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args []string, options *resource.FilenameOptions) error {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										96
									
								
								pkg/kubectl/cmd/edit_configmap.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								pkg/kubectl/cmd/edit_configmap.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,96 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2016 The Kubernetes Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package cmd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"bytes"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"io"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/spf13/cobra"
 | 
				
			||||||
 | 
						"k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
				
			||||||
 | 
						cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/kubectl/cmd/util/editor"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/kubectl/resource"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewCmdEditConfigMap is a macro command to edit config maps
 | 
				
			||||||
 | 
					func NewCmdEditConfigMap(f cmdutil.Factory, cmdOut, errOut io.Writer) *cobra.Command {
 | 
				
			||||||
 | 
						options := &resource.FilenameOptions{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cmd := &cobra.Command{
 | 
				
			||||||
 | 
							Use:     "configmap",
 | 
				
			||||||
 | 
							Aliases: []string{"cm"},
 | 
				
			||||||
 | 
							Short:   "Edit a config map object.",
 | 
				
			||||||
 | 
							Long:    "Edit and update a config map object",
 | 
				
			||||||
 | 
							Run: func(cmd *cobra.Command, args []string) {
 | 
				
			||||||
 | 
								RunEditConfigMap(cmd, f, args, cmdOut, errOut, options)
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						addEditFlags(cmd, options)
 | 
				
			||||||
 | 
						cmd.Flags().String("config-map-data", "", "If non-empty, specify the name of a data slot in a config map to edit.")
 | 
				
			||||||
 | 
						return cmd
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// RunEditConfigMap runs the edit command for config maps. It either edits the complete map
 | 
				
			||||||
 | 
					// or it edits individual files inside the config map.
 | 
				
			||||||
 | 
					func RunEditConfigMap(cmd *cobra.Command, f cmdutil.Factory, args []string, cmdOut, errOut io.Writer, options *resource.FilenameOptions) error {
 | 
				
			||||||
 | 
						dataFile := cmdutil.GetFlagString(cmd, "config-map-data")
 | 
				
			||||||
 | 
						if len(dataFile) == 0 {
 | 
				
			||||||
 | 
							// We need to add the resource type back on to the front
 | 
				
			||||||
 | 
							args = append([]string{"configmap"}, args...)
 | 
				
			||||||
 | 
							return RunEdit(f, cmdOut, errOut, cmd, args, options)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						cmdNamespace, _, err := f.DefaultNamespace()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cs, err := f.ClientSet()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						configMap, err := cs.Core().ConfigMaps(cmdNamespace).Get(args[0], v1.GetOptions{})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						value, found := configMap.Data[dataFile]
 | 
				
			||||||
 | 
						if !found {
 | 
				
			||||||
 | 
							keys := []string{}
 | 
				
			||||||
 | 
							for key := range configMap.Data {
 | 
				
			||||||
 | 
								keys = append(keys, key)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return fmt.Errorf("No such data file (%s), filenames are: %v\n", dataFile, keys)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						edit := editor.NewDefaultEditor(os.Environ())
 | 
				
			||||||
 | 
						data, file, err := edit.LaunchTempFile(fmt.Sprintf("%s-edit-", dataFile), "", bytes.NewBuffer([]byte(value)))
 | 
				
			||||||
 | 
						defer func() {
 | 
				
			||||||
 | 
							os.Remove(file)
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						configMap.Data[dataFile] = string(data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if _, err := cs.Core().ConfigMaps(cmdNamespace).Update(configMap); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user