func (test getContextsTest) run(t *testing.T) { fakeKubeFile, _ := ioutil.TempFile("", "") defer os.Remove(fakeKubeFile.Name()) err := clientcmd.WriteToFile(test.startingConfig, fakeKubeFile.Name()) if err != nil { t.Fatalf("unexpected error: %v", err) } pathOptions := clientcmd.NewDefaultPathOptions() pathOptions.GlobalFile = fakeKubeFile.Name() pathOptions.EnvVar = "" buf := bytes.NewBuffer([]byte{}) options := GetContextsOptions{ configAccess: pathOptions, } cmd := NewCmdConfigGetContexts(buf, options.configAccess) if test.nameOnly { cmd.Flags().Set("output", "name") } if test.noHeader { cmd.Flags().Set("no-headers", "true") } cmd.Run(cmd, test.names) if len(test.expectedOut) != 0 { if buf.String() != test.expectedOut { t.Errorf("Expected %v, but got %v", test.expectedOut, buf.String()) } return } if err != nil { t.Errorf("Unexpected error: %v", err) } }
func (test currentContextTest) run(t *testing.T) { fakeKubeFile, _ := ioutil.TempFile("", "") defer os.Remove(fakeKubeFile.Name()) err := clientcmd.WriteToFile(test.startingConfig, fakeKubeFile.Name()) if err != nil { t.Fatalf("unexpected error: %v", err) } pathOptions := clientcmd.NewDefaultPathOptions() pathOptions.GlobalFile = fakeKubeFile.Name() pathOptions.EnvVar = "" options := CurrentContextOptions{ ConfigAccess: pathOptions, } buf := bytes.NewBuffer([]byte{}) err = RunCurrentContext(buf, []string{}, &options) if len(test.expectedError) != 0 { if err == nil { t.Errorf("Did not get %v", test.expectedError) } else { if !strings.Contains(err.Error(), test.expectedError) { t.Errorf("Expected %v, but got %v", test.expectedError, err) } } return } if err != nil { t.Errorf("Unexpected error: %v", err) } }
func createKubeconfig(d *schema.ResourceData, meta interface{}) error { configF := meta.(configFunc) cfg, err := configF(d) if err != nil { return fmt.Errorf("failed to initialize the cluster client: %v", err) } if len(cfg.kubeConfig.Clusters) != 1 || len(cfg.kubeConfig.AuthInfos) != 1 || len(cfg.kubeConfig.Contexts) != 1 { return fmt.Errorf("config must supplied for exactly one cluster - number of clusters: %d, number of users: %d, number of contexts: %d", len(cfg.kubeConfig.Clusters), len(cfg.kubeConfig.AuthInfos), len(cfg.kubeConfig.Contexts)) } log.Printf("[DEBUG] checking for cluster components' health") if !poll(cfg.pollInterval, cfg.pollTimeout, allComponentsHealthy(cfg.clientset)) { return fmt.Errorf("cluster components never turned healthy") } po := clientcmd.NewDefaultPathOptions() if path, ok := d.GetOk("path"); ok { po.LoadingRules.ExplicitPath = path.(string) } // Retry until modifyConfig succeeds or times out. log.Printf("[DEBUG] updating kubeconfig") if !poll(cfg.configPollInterval, cfg.ConfigPollTimeout, updateConfig(po, cfg.kubeConfig)) { return fmt.Errorf("couldn't update kubeconfig") } // Store the ID now d.SetId(d.Get("server").(string)) return nil }
func NewFakeAdminConfig(f cmdutil.Factory, kubeconfigGlobal string) (util.AdminConfig, error) { pathOptions := clientcmd.NewDefaultPathOptions() pathOptions.GlobalFile = kubeconfigGlobal pathOptions.EnvVar = "" return &fakeAdminConfig{ pathOptions: pathOptions, hostFactory: f, }, nil }
// NewKubeFedCommand creates the `kubefed` command and its nested children. func NewKubeFedCommand(f cmdutil.Factory, in io.Reader, out, err io.Writer) *cobra.Command { // Parent command to which all subcommands are added. cmds := &cobra.Command{ Use: "kubefed", Short: "kubefed controls a Kubernetes Cluster Federation", Long: templates.LongDesc(` kubefed controls a Kubernetes Cluster Federation. Find more information at https://github.com/kubernetes/kubernetes.`), Run: runHelp, } f.BindFlags(cmds.PersistentFlags()) f.BindExternalFlags(cmds.PersistentFlags()) // From this point and forward we get warnings on flags that contain "_" separators cmds.SetGlobalNormalizationFunc(flag.WarnWordSepNormalizeFunc) groups := templates.CommandGroups{ { Message: "Basic Commands:", Commands: []*cobra.Command{ kubefedinit.NewCmdInit(out, util.NewAdminConfig(clientcmd.NewDefaultPathOptions())), NewCmdJoin(f, out, util.NewAdminConfig(clientcmd.NewDefaultPathOptions())), NewCmdUnjoin(f, out, err, util.NewAdminConfig(clientcmd.NewDefaultPathOptions())), }, }, } groups.Add(cmds) filters := []string{ "options", } templates.ActsAsRootCommand(cmds, filters, groups...) cmds.AddCommand(kubectl.NewCmdVersion(f, out)) cmds.AddCommand(kubectl.NewCmdOptions(out)) return cmds }
func (test deleteContextTest) run(t *testing.T) { fakeKubeFile, _ := ioutil.TempFile("", "") defer os.Remove(fakeKubeFile.Name()) err := clientcmd.WriteToFile(test.config, fakeKubeFile.Name()) if err != nil { t.Fatalf("unexpected error: %v", err) } pathOptions := clientcmd.NewDefaultPathOptions() pathOptions.GlobalFile = fakeKubeFile.Name() pathOptions.EnvVar = "" buf := bytes.NewBuffer([]byte{}) cmd := NewCmdConfigDeleteContext(buf, pathOptions) cmd.SetArgs([]string{test.contextToDelete}) if err := cmd.Execute(); err != nil { t.Fatalf("unexpected error executing command: %v", err) } expectedOutWithFile := fmt.Sprintf(test.expectedOut, fakeKubeFile.Name()) if expectedOutWithFile != buf.String() { t.Errorf("expected output %s, but got %s", expectedOutWithFile, buf.String()) return } // Verify context was removed from kubeconfig file config, err := clientcmd.LoadFromFile(fakeKubeFile.Name()) if err != nil { t.Fatalf("unexpected error loading kubeconfig file: %v", err) } contexts := make([]string, 0, len(config.Contexts)) for k := range config.Contexts { contexts = append(contexts, k) } if !reflect.DeepEqual(test.expectedContexts, contexts) { t.Errorf("expected contexts %v, but found %v in kubeconfig", test.expectedContexts, contexts) } }
func testConfigCommand(args []string, startingConfig clientcmdapi.Config, t *testing.T) (string, clientcmdapi.Config) { fakeKubeFile, _ := ioutil.TempFile("", "") defer os.Remove(fakeKubeFile.Name()) err := clientcmd.WriteToFile(startingConfig, fakeKubeFile.Name()) if err != nil { t.Fatalf("unexpected error: %v", err) } argsToUse := make([]string, 0, 2+len(args)) argsToUse = append(argsToUse, "--kubeconfig="+fakeKubeFile.Name()) argsToUse = append(argsToUse, args...) buf := bytes.NewBuffer([]byte{}) cmd := NewCmdConfig(clientcmd.NewDefaultPathOptions(), buf, buf) cmd.SetArgs(argsToUse) cmd.Execute() // outBytes, _ := ioutil.ReadFile(fakeKubeFile.Name()) config := clientcmd.GetConfigFromFileOrDie(fakeKubeFile.Name()) return buf.String(), *config }
func (test getClustersTest) run(t *testing.T) { fakeKubeFile, _ := ioutil.TempFile("", "") defer os.Remove(fakeKubeFile.Name()) err := clientcmd.WriteToFile(test.config, fakeKubeFile.Name()) if err != nil { t.Fatalf("unexpected error: %v", err) } pathOptions := clientcmd.NewDefaultPathOptions() pathOptions.GlobalFile = fakeKubeFile.Name() pathOptions.EnvVar = "" buf := bytes.NewBuffer([]byte{}) cmd := NewCmdConfigGetClusters(buf, pathOptions) if err := cmd.Execute(); err != nil { t.Fatalf("unexpected error executing command: %v", err) } if len(test.expected) != 0 { if buf.String() != test.expected { t.Errorf("expected %v, but got %v", test.expected, buf.String()) } return } }
// NewKubectlCommand creates the `kubectl` command and its nested children. func NewKubectlCommand(f *cmdutil.Factory, in io.Reader, out, err io.Writer) *cobra.Command { // Parent command to which all subcommands are added. cmds := &cobra.Command{ Use: "kubectl", Short: "kubectl controls the Kubernetes cluster manager", Long: `kubectl controls the Kubernetes cluster manager. Find more information at https://github.com/kubernetes/kubernetes.`, Run: runHelp, BashCompletionFunction: bash_completion_func, } f.BindFlags(cmds.PersistentFlags()) f.BindExternalFlags(cmds.PersistentFlags()) // From this point and forward we get warnings on flags that contain "_" separators cmds.SetGlobalNormalizationFunc(flag.WarnWordSepNormalizeFunc) cmds.AddCommand(NewCmdGet(f, out)) cmds.AddCommand(NewCmdDescribe(f, out)) cmds.AddCommand(NewCmdCreate(f, out)) cmds.AddCommand(NewCmdReplace(f, out)) cmds.AddCommand(NewCmdPatch(f, out)) cmds.AddCommand(NewCmdDelete(f, out)) cmds.AddCommand(NewCmdEdit(f, out, err)) cmds.AddCommand(NewCmdApply(f, out)) cmds.AddCommand(NewCmdNamespace(out)) cmds.AddCommand(NewCmdLogs(f, out)) cmds.AddCommand(NewCmdRollingUpdate(f, out)) cmds.AddCommand(NewCmdScale(f, out)) cmds.AddCommand(NewCmdCordon(f, out)) cmds.AddCommand(NewCmdDrain(f, out)) cmds.AddCommand(NewCmdUncordon(f, out)) cmds.AddCommand(NewCmdAttach(f, in, out, err)) cmds.AddCommand(NewCmdExec(f, in, out, err)) cmds.AddCommand(NewCmdPortForward(f, out, err)) cmds.AddCommand(NewCmdProxy(f, out)) cmds.AddCommand(NewCmdRun(f, in, out, err)) cmds.AddCommand(NewCmdStop(f, out)) cmds.AddCommand(NewCmdExposeService(f, out)) cmds.AddCommand(NewCmdAutoscale(f, out)) cmds.AddCommand(rollout.NewCmdRollout(f, out)) cmds.AddCommand(NewCmdLabel(f, out)) cmds.AddCommand(NewCmdAnnotate(f, out)) cmds.AddCommand(cmdconfig.NewCmdConfig(clientcmd.NewDefaultPathOptions(), out)) cmds.AddCommand(NewCmdClusterInfo(f, out)) cmds.AddCommand(NewCmdApiVersions(f, out)) cmds.AddCommand(NewCmdVersion(f, out)) cmds.AddCommand(NewCmdExplain(f, out)) cmds.AddCommand(NewCmdConvert(f, out)) if cmds.Flag("namespace").Annotations == nil { cmds.Flag("namespace").Annotations = map[string][]string{} } cmds.Flag("namespace").Annotations[cobra.BashCompCustom] = append( cmds.Flag("namespace").Annotations[cobra.BashCompCustom], "__kubectl_get_namespaces", ) return cmds }
// NewKubectlCommand creates the `kubectl` command and its nested children. func NewKubectlCommand(f cmdutil.Factory, in io.Reader, out, err io.Writer) *cobra.Command { // Parent command to which all subcommands are added. cmds := &cobra.Command{ Use: "kubectl", Short: "kubectl controls the Kubernetes cluster manager", Long: templates.LongDesc(` kubectl controls the Kubernetes cluster manager. Find more information at https://github.com/kubernetes/kubernetes.`), Run: runHelp, BashCompletionFunction: bash_completion_func, } f.BindFlags(cmds.PersistentFlags()) f.BindExternalFlags(cmds.PersistentFlags()) // From this point and forward we get warnings on flags that contain "_" separators cmds.SetGlobalNormalizationFunc(flag.WarnWordSepNormalizeFunc) groups := templates.CommandGroups{ { Message: "Basic Commands (Beginner):", Commands: []*cobra.Command{ NewCmdCreate(f, out, err), NewCmdExposeService(f, out), NewCmdRun(f, in, out, err), set.NewCmdSet(f, out, err), }, }, { Message: "Basic Commands (Intermediate):", Commands: []*cobra.Command{ NewCmdGet(f, out, err), NewCmdExplain(f, out, err), NewCmdEdit(f, out, err), NewCmdDelete(f, out), }, }, { Message: "Deploy Commands:", Commands: []*cobra.Command{ rollout.NewCmdRollout(f, out, err), NewCmdRollingUpdate(f, out), NewCmdScale(f, out), NewCmdAutoscale(f, out), }, }, { Message: "Cluster Management Commands:", Commands: []*cobra.Command{ NewCmdCertificate(f, out), NewCmdClusterInfo(f, out), NewCmdTop(f, out, err), NewCmdCordon(f, out), NewCmdUncordon(f, out), NewCmdDrain(f, out, err), NewCmdTaint(f, out), }, }, { Message: "Troubleshooting and Debugging Commands:", Commands: []*cobra.Command{ NewCmdDescribe(f, out, err), NewCmdLogs(f, out), NewCmdAttach(f, in, out, err), NewCmdExec(f, in, out, err), NewCmdPortForward(f, out, err), NewCmdProxy(f, out), NewCmdCp(f, in, out, err), }, }, { Message: "Advanced Commands:", Commands: []*cobra.Command{ NewCmdApply(f, out), NewCmdPatch(f, out), NewCmdReplace(f, out), NewCmdConvert(f, out), }, }, { Message: "Settings Commands:", Commands: []*cobra.Command{ NewCmdLabel(f, out), NewCmdAnnotate(f, out), NewCmdCompletion(f, out), }, }, } groups.Add(cmds) filters := []string{ "options", Deprecated("kubectl", "delete", cmds, NewCmdStop(f, out)), } templates.ActsAsRootCommand(cmds, filters, groups...) if cmds.Flag("namespace") != nil { if cmds.Flag("namespace").Annotations == nil { cmds.Flag("namespace").Annotations = map[string][]string{} } cmds.Flag("namespace").Annotations[cobra.BashCompCustom] = append( cmds.Flag("namespace").Annotations[cobra.BashCompCustom], "__kubectl_get_namespaces", ) } cmds.AddCommand(cmdconfig.NewCmdConfig(clientcmd.NewDefaultPathOptions(), out, err)) cmds.AddCommand(NewCmdVersion(f, out)) cmds.AddCommand(NewCmdApiVersions(f, out)) cmds.AddCommand(NewCmdOptions(out)) return cmds }