// NewCmdIdle implements the OpenShift cli idle command func NewCmdIdle(fullName string, f *clientcmd.Factory, out, errOut io.Writer) *cobra.Command { o := &IdleOptions{ out: out, errOut: errOut, cmdFullName: fullName, } cmd := &cobra.Command{ Use: "idle (SERVICE_ENDPOINTS... | -l label | --all | --resource-names-file FILENAME)", Short: "Idle scalable resources", Long: idleLong, Example: fmt.Sprintf(idleExample, fullName), Run: func(cmd *cobra.Command, args []string) { kcmdutil.CheckErr(o.Complete(f, cmd, args)) err := o.RunIdle(f) if err == cmdutil.ErrExit { os.Exit(1) } kcmdutil.CheckErr(err) }, } cmd.Flags().BoolVar(&o.dryRun, "dry-run", false, "If true, only print the annotations that would be written, without annotating or idling the relevant objects") cmd.Flags().StringVar(&o.filename, "resource-names-file", o.filename, "file containing list of services whose scalable resources to idle") cmd.Flags().StringVarP(&o.selector, "selector", "l", o.selector, "Selector (label query) to use to select services") cmd.Flags().BoolVar(&o.all, "all", o.all, "Select all services in the namespace") cmd.Flags().BoolVar(&o.allNamespaces, "all-namespaces", o.allNamespaces, "Select services across all namespaces") cmd.MarkFlagFilename("resource-names-file") // TODO: take the `-o name` argument, and only print out names instead of the summary return cmd }
func NewCmdPortForward(f cmdutil.Factory, cmdOut, cmdErr io.Writer) *cobra.Command { opts := &PortForwardOptions{ PortForwarder: &defaultPortForwarder{ cmdOut: cmdOut, cmdErr: cmdErr, }, } cmd := &cobra.Command{ Use: "port-forward POD [LOCAL_PORT:]REMOTE_PORT [...[LOCAL_PORT_N:]REMOTE_PORT_N]", Short: "Forward one or more local ports to a pod", Long: "Forward one or more local ports to a pod.", Example: portforward_example, Run: func(cmd *cobra.Command, args []string) { if err := opts.Complete(f, cmd, args, cmdOut, cmdErr); err != nil { cmdutil.CheckErr(err) } if err := opts.Validate(); err != nil { cmdutil.CheckErr(cmdutil.UsageError(cmd, err.Error())) } if err := opts.RunPortForward(); err != nil { cmdutil.CheckErr(err) } }, } cmd.Flags().StringP("pod", "p", "", "Pod name") // TODO support UID return cmd }
// NewCmdStartBuild implements the OpenShift cli start-build command func NewCmdStartBuild(fullName string, f *clientcmd.Factory, in io.Reader, out io.Writer) *cobra.Command { o := &StartBuildOptions{} cmd := &cobra.Command{ Use: "start-build (BUILDCONFIG | --from-build=BUILD)", Short: "Start a new build", Long: startBuildLong, Example: fmt.Sprintf(startBuildExample, fullName), SuggestFor: []string{"build", "builds"}, Run: func(cmd *cobra.Command, args []string) { kcmdutil.CheckErr(o.Complete(f, in, out, cmd, fullName, args)) kcmdutil.CheckErr(o.Run()) }, } cmd.Flags().StringVar(&o.LogLevel, "build-loglevel", o.LogLevel, "Specify the log level for the build log output") cmd.Flags().StringSliceVarP(&o.Env, "env", "e", o.Env, "Specify key value pairs of environment variables to set for the build container.") cmd.Flags().StringVar(&o.FromBuild, "from-build", o.FromBuild, "Specify the name of a build which should be re-run") cmd.Flags().BoolVarP(&o.Follow, "follow", "F", o.Follow, "Start a build and watch its logs until it completes or fails") cmd.Flags().BoolVarP(&o.WaitForComplete, "wait", "w", o.WaitForComplete, "Wait for a build to complete and exit with a non-zero return code if the build fails") cmd.Flags().StringVar(&o.FromFile, "from-file", o.FromFile, "A file to use as the binary input for the build; example a pom.xml or Dockerfile. Will be the only file in the build source.") cmd.Flags().StringVar(&o.FromDir, "from-dir", o.FromDir, "A directory to archive and use as the binary input for a build.") cmd.Flags().StringVar(&o.FromRepo, "from-repo", o.FromRepo, "The path to a local source code repository to use as the binary input for a build.") cmd.Flags().StringVar(&o.Commit, "commit", o.Commit, "Specify the source code commit identifier the build should use; requires a build based on a Git repository") cmd.Flags().StringVar(&o.ListWebhooks, "list-webhooks", o.ListWebhooks, "List the webhooks for the specified build config or build; accepts 'all', 'generic', or 'github'") cmd.Flags().StringVar(&o.FromWebhook, "from-webhook", o.FromWebhook, "Specify a webhook URL for an existing build config to trigger") cmd.Flags().StringVar(&o.GitPostReceive, "git-post-receive", o.GitPostReceive, "The contents of the post-receive hook to trigger a build") cmd.Flags().StringVar(&o.GitRepository, "git-repository", o.GitRepository, "The path to the git repository for post-receive; defaults to the current directory") kcmdutil.AddOutputFlagsForMutation(cmd) return cmd }
func NewCommandEncrypt(commandName string, fullName string, out io.Writer, errout io.Writer) *cobra.Command { options := &EncryptOptions{ CleartextReader: os.Stdin, EncryptedWriter: out, PromptWriter: errout, } cmd := &cobra.Command{ Use: commandName, Short: "Encrypt data with AES-256-CBC encryption", Example: fmt.Sprintf(encryptExample, fullName), Run: func(cmd *cobra.Command, args []string) { kcmdutil.CheckErr(options.Validate(args)) kcmdutil.CheckErr(options.Encrypt()) }, } flags := cmd.Flags() flags.StringVar(&options.CleartextFile, "in", options.CleartextFile, "File containing the data to encrypt. Read from stdin if omitted.") flags.StringVar(&options.EncryptedFile, "out", options.EncryptedFile, "File to write the encrypted data to. Written to stdout if omitted.") flags.StringVar(&options.KeyFile, "key", options.KeyFile, "File containing the encrypting key from in the format written by --genkey.") flags.StringVar(&options.GenKeyFile, "genkey", options.GenKeyFile, "File to write a randomly generated key to.") // autocompletion hints cmd.MarkFlagFilename("in") cmd.MarkFlagFilename("out") cmd.MarkFlagFilename("key") cmd.MarkFlagFilename("genkey") return cmd }
// NewCmdRsync creates a new sync command func NewCmdRsync(name, parent string, f *clientcmd.Factory, out, errOut io.Writer) *cobra.Command { o := RsyncOptions{ Out: out, ErrOut: errOut, } cmd := &cobra.Command{ Use: fmt.Sprintf("%s SOURCE DESTINATION", name), Short: "Copy files between local filesystem and a pod", Long: rsyncLong, Example: fmt.Sprintf(rsyncExample, parent+" "+name), Run: func(c *cobra.Command, args []string) { kcmdutil.CheckErr(o.Complete(f, c, args)) kcmdutil.CheckErr(o.Validate()) kcmdutil.CheckErr(o.RunRsync()) }, } // NOTE: When adding new flags to the command, please update the rshExcludeFlags in copyrsync.go // if those flags should not be passed to the rsh command. cmd.Flags().StringVarP(&o.ContainerName, "container", "c", "", "Container within the pod") cmd.Flags().StringVar(&o.StrategyName, "strategy", "", "Specify which strategy to use for copy: rsync, rsync-daemon, or tar") // Flags for rsync options, Must match rsync flag names cmd.Flags().BoolVarP(&o.Quiet, "quiet", "q", false, "Suppress non-error messages") cmd.Flags().BoolVar(&o.Delete, "delete", false, "Delete files not present in source") cmd.Flags().StringSliceVar(&o.RsyncExclude, "exclude", nil, "rsync - exclude files matching specified pattern") cmd.Flags().StringSliceVar(&o.RsyncInclude, "include", nil, "rsync - include files matching specified pattern") cmd.Flags().BoolVar(&o.RsyncProgress, "progress", false, "rsync - show progress during transfer") cmd.Flags().BoolVar(&o.RsyncNoPerms, "no-perms", false, "rsync - do not transfer permissions") cmd.Flags().BoolVarP(&o.Watch, "watch", "w", false, "Watch directory for changes and resync automatically") return cmd }
// NewCmdAddRoleToUser implements the OpenShift cli add-role-to-user command func NewCmdAddRoleToUser(name, fullName string, f *clientcmd.Factory, out io.Writer) *cobra.Command { options := &RoleModificationOptions{} saNames := []string{} cmd := &cobra.Command{ Use: name + " ROLE (USER | -z SERVICEACCOUNT) [USER ...]", Short: "Add users or serviceaccounts to a role in the current project", Long: `Add users or serviceaccounts to a role in the current project`, Example: fmt.Sprintf(addRoleToUserExample, fullName), Run: func(cmd *cobra.Command, args []string) { if err := options.CompleteUserWithSA(f, args, saNames); err != nil { kcmdutil.CheckErr(kcmdutil.UsageError(cmd, err.Error())) } if err := options.AddRole(); err != nil { kcmdutil.CheckErr(err) } }, } cmd.Flags().StringVar(&options.RoleNamespace, "role-namespace", "", "namespace where the role is located: empty means a role defined in cluster policy") cmd.Flags().StringSliceVarP(&saNames, "serviceaccount", "z", saNames, "service account in the current namespace to use as a user") return cmd }
func NewCommandCreateServerCert(commandName string, fullName string, out io.Writer) *cobra.Command { options := &CreateServerCertOptions{SignerCertOptions: NewDefaultSignerCertOptions(), Output: out} cmd := &cobra.Command{ Use: commandName, Short: "Create a signed server certificate and key", Long: fmt.Sprintf(createServerLong, fullName), Run: func(cmd *cobra.Command, args []string) { if err := options.Validate(args); err != nil { kcmdutil.CheckErr(kcmdutil.UsageError(cmd, err.Error())) } if _, err := options.CreateServerCert(); err != nil { kcmdutil.CheckErr(err) } }, } flags := cmd.Flags() BindSignerCertOptions(options.SignerCertOptions, flags, "") flags.StringVar(&options.CertFile, "cert", "", "The certificate file. Choose a name that indicates what the service is.") flags.StringVar(&options.KeyFile, "key", "", "The key file. Choose a name that indicates what the service is.") flags.Var(&options.Hostnames, "hostnames", "Every hostname or IP you want server certs to be valid for. Comma delimited list") flags.BoolVar(&options.Overwrite, "overwrite", true, "Overwrite existing cert files if found. If false, any existing file will be left as-is.") // autocompletion hints cmd.MarkFlagFilename("cert") cmd.MarkFlagFilename("key") return cmd }
func NewCmdAnnotate(f *cmdutil.Factory, out io.Writer) *cobra.Command { options := &AnnotateOptions{} cmd := &cobra.Command{ Use: "annotate [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--resource-version=version]", Short: "Update the annotations on a resource", Long: annotate_long, Example: annotate_example, Run: func(cmd *cobra.Command, args []string) { if err := options.Complete(f, args); err != nil { cmdutil.CheckErr(err) } if err := options.Validate(args); err != nil { cmdutil.CheckErr(cmdutil.UsageError(cmd, err.Error())) } if err := options.RunAnnotate(); err != nil { cmdutil.CheckErr(err) } }, } cmd.Flags().BoolVar(&options.overwrite, "overwrite", false, "If true, allow annotations to be overwritten, otherwise reject annotation updates that overwrite existing annotations.") cmd.Flags().BoolVar(&options.all, "all", false, "select all resources in the namespace of the specified resource types") cmd.Flags().StringVar(&options.resourceVersion, "resource-version", "", "If non-empty, the annotation update will only succeed if this is the current resource-version for the object. Only valid when specifying a single resource.") usage := "Filename, directory, or URL to a file identifying the resource to update the annotation" kubectl.AddJsonFilenameFlag(cmd, &options.filenames, usage) return cmd }
// NewCmdPruneBuilds implements the OpenShift cli prune builds command. func NewCmdPruneBuilds(f *clientcmd.Factory, parentName, name string, out io.Writer) *cobra.Command { opts := &PruneBuildsOptions{ Confirm: false, Orphans: false, KeepYoungerThan: 60 * time.Minute, KeepComplete: 5, KeepFailed: 1, } cmd := &cobra.Command{ Use: name, Short: "Remove old completed and failed builds", Long: buildsLongDesc, Example: fmt.Sprintf(buildsExample, parentName, name), Run: func(cmd *cobra.Command, args []string) { kcmdutil.CheckErr(opts.Complete(f, cmd, args, out)) kcmdutil.CheckErr(opts.Validate()) kcmdutil.CheckErr(opts.Run()) }, } cmd.Flags().BoolVar(&opts.Confirm, "confirm", opts.Confirm, "Specify that build pruning should proceed. Defaults to false, displaying what would be deleted but not actually deleting anything.") cmd.Flags().BoolVar(&opts.Orphans, "orphans", opts.Orphans, "Prune all builds whose associated BuildConfig no longer exists and whose status is complete, failed, error, or cancelled.") cmd.Flags().DurationVar(&opts.KeepYoungerThan, "keep-younger-than", opts.KeepYoungerThan, "Specify the minimum age of a Build for it to be considered a candidate for pruning.") cmd.Flags().IntVar(&opts.KeepComplete, "keep-complete", opts.KeepComplete, "Per BuildConfig, specify the number of builds whose status is complete that will be preserved.") cmd.Flags().IntVar(&opts.KeepFailed, "keep-failed", opts.KeepFailed, "Per BuildConfig, specify the number of builds whose status is failed, error, or cancelled that will be preserved.") return cmd }
// NewCmdLogout implements the OpenShift cli logout command func NewCmdLogout(name, fullName, ocLoginFullCommand string, f *osclientcmd.Factory, reader io.Reader, out io.Writer) *cobra.Command { options := &LogoutOptions{ Out: out, } cmds := &cobra.Command{ Use: name, Short: "End the current server session", Long: fmt.Sprintf(logoutLong, ocLoginFullCommand), Example: fmt.Sprintf(logoutExample, fullName), Run: func(cmd *cobra.Command, args []string) { if err := options.Complete(f, cmd, args); err != nil { kcmdutil.CheckErr(err) } if err := options.Validate(args); err != nil { kcmdutil.CheckErr(err) } if err := options.RunLogout(); err != nil { kcmdutil.CheckErr(err) } }, } // TODO: support --all which performs the same logic on all users in your config file. return cmds }
func NewCmdLabel(f *cmdutil.Factory, out io.Writer) *cobra.Command { options := &LabelOptions{} // retrieve a list of handled resources from printer as valid args validArgs := []string{} p, err := f.Printer(nil, false, false, false, false, []string{}) cmdutil.CheckErr(err) if p != nil { validArgs = p.HandledResources() } cmd := &cobra.Command{ Use: "label [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--resource-version=version]", Short: "Update the labels on a resource", Long: fmt.Sprintf(label_long, validation.LabelValueMaxLength), Example: label_example, Run: func(cmd *cobra.Command, args []string) { err := RunLabel(f, out, cmd, args, options) cmdutil.CheckErr(err) }, ValidArgs: validArgs, } cmdutil.AddPrinterFlags(cmd) cmd.Flags().Bool("overwrite", false, "If true, allow labels to be overwritten, otherwise reject label updates that overwrite existing labels.") cmd.Flags().StringP("selector", "l", "", "Selector (label query) to filter on") cmd.Flags().Bool("all", false, "select all resources in the namespace of the specified resource types") cmd.Flags().String("resource-version", "", "If non-empty, the labels update will only succeed if this is the current resource-version for the object. Only valid when specifying a single resource.") usage := "Filename, directory, or URL to a file identifying the resource to update the labels" kubectl.AddJsonFilenameFlag(cmd, &options.Filenames, usage) cmd.Flags().Bool("dry-run", false, "If true, only print the object that would be sent, without sending it.") return cmd }
// NewCmdNewProject implements the OpenShift cli new-project command func NewCmdNewProject(name, fullName string, f *clientcmd.Factory, out io.Writer) *cobra.Command { options := &NewProjectOptions{} cmd := &cobra.Command{ Use: name + " NAME [--display-name=DISPLAYNAME] [--description=DESCRIPTION]", Short: "Create a new project", Long: newProjectLong, Run: func(cmd *cobra.Command, args []string) { if err := options.complete(args); err != nil { kcmdutil.CheckErr(kcmdutil.UsageError(cmd, err.Error())) } var err error if options.Client, _, err = f.Clients(); err != nil { kcmdutil.CheckErr(err) } // We can't depend on len(options.NodeSelector) > 0 as node-selector="" is valid // and we want to populate node selector as project annotation only if explicitly set by user useNodeSelector := cmd.Flag("node-selector").Changed if err := options.Run(useNodeSelector); err != nil { kcmdutil.CheckErr(err) } }, } cmd.Flags().StringVar(&options.AdminRole, "admin-role", bootstrappolicy.AdminRoleName, "Project admin role name in the cluster policy") cmd.Flags().StringVar(&options.AdminUser, "admin", "", "Project admin username") cmd.Flags().StringVar(&options.DisplayName, "display-name", "", "Project display name") cmd.Flags().StringVar(&options.Description, "description", "", "Project description") cmd.Flags().StringVar(&options.NodeSelector, "node-selector", "", "Restrict pods onto nodes matching given label selector. Format: '<key1>=<value1>, <key2>=<value2>...'. Specifying \"\" means any node, not default. If unspecified, cluster default node selector will be used.") return cmd }
// NewCmdLog creates a new pod log command func NewCmdLog(f *cmdutil.Factory, out io.Writer) *cobra.Command { o := &LogsOptions{ Out: out, Interactive: true, } cmd := &cobra.Command{ Use: "logs [-f] [-p] POD [-c CONTAINER]", Short: "Print the logs for a container in a pod.", Long: "Print the logs for a container in a pod. If the pod has only one container, the container name is optional.", Example: log_example, Run: func(cmd *cobra.Command, args []string) { if len(os.Args) > 1 && os.Args[1] == "log" { printDeprecationWarning("logs", "log") } cmdutil.CheckErr(o.Complete(f, out, cmd, args)) cmdutil.CheckErr(o.Validate(cmd)) cmdutil.CheckErr(o.RunLog()) }, Aliases: []string{"log"}, } cmd.Flags().BoolVarP(&o.Follow, "follow", "f", o.Follow, "Specify if the logs should be streamed.") cmd.Flags().BoolVar(&o.Interactive, "interactive", o.Interactive, "If true, prompt the user for input when required. Default true.") cmd.Flags().BoolVarP(&o.Previous, "previous", "p", o.Previous, "If true, print the logs for the previous instance of the container in a pod if it exists.") cmd.Flags().StringVarP(&o.ContainerName, "container", "c", o.ContainerName, "Container name") return cmd }
func NewCmdCertificateApprove(f cmdutil.Factory, out io.Writer) *cobra.Command { options := CertificateOptions{} cmd := &cobra.Command{ Use: "approve (-f FILENAME | NAME)", Short: "Approve a certificate signing request", Long: templates.LongDesc(` Approve a certificate signing request. kubectl certificate approve allows a cluster admin to approve a certificate signing request (CSR). This action tells a certificate signing controller to issue a certificate to the requestor with the attributes requested in the CSR. SECURITY NOTICE: Depending on the requested attributes, the issued certificate can potentially grant a requester access to cluster resources or to authenticate as a requested identity. Before approving a CSR, ensure you understand what the signed certificate can do. `), Run: func(cmd *cobra.Command, args []string) { cmdutil.CheckErr(options.Complete(cmd, args)) cmdutil.CheckErr(options.Validate()) cmdutil.CheckErr(options.RunCertificateApprove(f, out)) }, } cmdutil.AddOutputFlagsForMutation(cmd) cmdutil.AddFilenameOptionFlags(cmd, &options.FilenameOptions, "identifying the resource to update") return cmd }
// NewCmdPruneDeployments implements the OpenShift cli prune deployments command. func NewCmdPruneDeployments(f *clientcmd.Factory, parentName, name string, out io.Writer) *cobra.Command { opts := &PruneDeploymentsOptions{ Confirm: false, KeepYoungerThan: 60 * time.Minute, KeepComplete: 5, KeepFailed: 1, } cmd := &cobra.Command{ Use: name, Short: "Remove old completed and failed deployments", Long: deploymentsLongDesc, Example: fmt.Sprintf(deploymentsExample, parentName, name), SuggestFor: []string{"deployment", "deployments"}, Run: func(cmd *cobra.Command, args []string) { kcmdutil.CheckErr(opts.Complete(f, cmd, args, out)) kcmdutil.CheckErr(opts.Validate()) kcmdutil.CheckErr(opts.Run()) }, } cmd.Flags().BoolVar(&opts.Confirm, "confirm", opts.Confirm, "Specify that deployment pruning should proceed. Defaults to false, displaying what would be deleted but not actually deleting anything.") cmd.Flags().BoolVar(&opts.Orphans, "orphans", opts.Orphans, "Prune all deployments where the associated DeploymentConfig no longer exists, the status is complete or failed, and the replica size is 0.") cmd.Flags().DurationVar(&opts.KeepYoungerThan, "keep-younger-than", opts.KeepYoungerThan, "Specify the minimum age of a deployment for it to be considered a candidate for pruning.") cmd.Flags().IntVar(&opts.KeepComplete, "keep-complete", opts.KeepComplete, "Per DeploymentConfig, specify the number of deployments whose status is complete that will be preserved whose replica size is 0.") cmd.Flags().IntVar(&opts.KeepFailed, "keep-failed", opts.KeepFailed, "Per DeploymentConfig, specify the number of deployments whose status is failed that will be preserved whose replica size is 0.") return cmd }
func NewCmdApply(f *cmdutil.Factory, out io.Writer) *cobra.Command { options := &resource.FilenameOptions{} cmd := &cobra.Command{ Use: "apply -f FILENAME", Short: "Apply a configuration to a resource by filename or stdin", Long: apply_long, Example: apply_example, Run: func(cmd *cobra.Command, args []string) { cmdutil.CheckErr(validateArgs(cmd, args)) cmdutil.CheckErr(cmdutil.ValidateOutputArgs(cmd)) cmdutil.CheckErr(RunApply(f, cmd, out, options)) }, } usage := "that contains the configuration to apply" cmdutil.AddFilenameOptionFlags(cmd, options, usage) cmd.MarkFlagRequired("filename") cmd.Flags().Bool("overwrite", true, "Automatically resolve conflicts between the modified and live configuration by using values from the modified configuration") cmdutil.AddValidateFlags(cmd) cmdutil.AddOutputFlagsForMutation(cmd) cmdutil.AddRecordFlag(cmd) cmdutil.AddInclude3rdPartyFlags(cmd) return cmd }
// NewCmdRollback creates a CLI rollback command. func NewCmdRollback(fullName string, f *clientcmd.Factory, out io.Writer) *cobra.Command { opts := &RollbackOptions{} cmd := &cobra.Command{ Use: "rollback (DEPLOYMENTCONFIG | DEPLOYMENT)", Short: "Revert part of an application back to a previous deployment", Long: rollbackLong, Example: fmt.Sprintf(rollbackExample, fullName), Run: func(cmd *cobra.Command, args []string) { if err := opts.Complete(f, args, out); err != nil { kcmdutil.CheckErr(kcmdutil.UsageError(cmd, err.Error())) } if err := opts.Validate(); err != nil { kcmdutil.CheckErr(kcmdutil.UsageError(cmd, err.Error())) } if err := opts.Run(); err != nil { kcmdutil.CheckErr(err) } }, } cmd.Flags().BoolVar(&opts.IncludeTriggers, "change-triggers", false, "Include the previous deployment's triggers in the rollback") cmd.Flags().BoolVar(&opts.IncludeStrategy, "change-strategy", false, "Include the previous deployment's strategy in the rollback") cmd.Flags().BoolVar(&opts.IncludeScalingSettings, "change-scaling-settings", false, "Include the previous deployment's replicationController replica count and selector in the rollback") cmd.Flags().BoolVarP(&opts.DryRun, "dry-run", "d", false, "Instead of performing the rollback, describe what the rollback will look like in human-readable form") cmd.Flags().StringVarP(&opts.Format, "output", "o", "", "Instead of performing the rollback, print the updated deployment configuration in the specified format (json|yaml|name|template|templatefile)") cmd.Flags().StringVarP(&opts.Template, "template", "t", "", "Template string or path to template file to use when -o=template or -o=templatefile.") cmd.MarkFlagFilename("template") cmd.Flags().Int64Var(&opts.DesiredVersion, "to-version", 0, "A config version to rollback to. Specifying version 0 is the same as omitting a version (the version will be auto-detected). This option is ignored when specifying a deployment.") return cmd }
// NewCmdRsync creates a new sync command func NewCmdRsync(name, parent string, f *clientcmd.Factory, out, errOut io.Writer) *cobra.Command { o := RsyncOptions{ Out: out, ErrOut: errOut, } cmd := &cobra.Command{ Use: fmt.Sprintf("%s SOURCE DESTINATION", name), Short: "Copy files between local filesystem and a pod", Long: rsyncLong, Example: fmt.Sprintf(rsyncExample, parent+" "+name), Run: func(c *cobra.Command, args []string) { kcmdutil.CheckErr(o.Complete(f, c, args)) kcmdutil.CheckErr(o.Validate()) kcmdutil.CheckErr(o.RunRsync()) }, } cmd.Flags().StringVarP(&o.ContainerName, "container", "c", "", "Container within the pod") cmd.Flags().StringVar(&o.StrategyName, "strategy", "", "Specify which strategy to use for copy: rsync, rsync-daemon, or tar") // Flags for rsync options, Must match rsync flag names cmd.Flags().BoolVarP(&o.Quiet, "quiet", "q", false, "Suppress non-error messages") cmd.Flags().BoolVar(&o.Delete, "delete", false, "Delete files not present in source") return cmd }
// NewCmdObserve creates the observe command. func NewCmdObserve(fullName string, f *clientcmd.Factory, out, errOut io.Writer) *cobra.Command { options := &ObserveOptions{ baseCommandName: fullName, retryCount: 2, templateType: "jsonpath", maximumErrors: 20, listenAddr: ":11251", } cmd := &cobra.Command{ Use: "observe RESOURCE [-- COMMAND ...]", Short: "Observe changes to resources and react to them (experimental)", Long: fmt.Sprintf(observeLong, fullName), Example: fmt.Sprintf(observeExample, fullName), Run: func(cmd *cobra.Command, args []string) { if err := options.Complete(f, cmd, args, out, errOut); err != nil { cmdutil.CheckErr(err) } if err := options.Validate(args); err != nil { cmdutil.CheckErr(cmdutil.UsageError(cmd, err.Error())) } if err := options.Run(); err != nil { cmdutil.CheckErr(err) } }, } // flags controlling what to select cmd.Flags().BoolVar(&options.allNamespaces, "all-namespaces", false, "If true, list the requested object(s) across all projects. Project in current context is ignored.") // to perform deletion synchronization cmd.Flags().VarP(&options.deleteCommand, "delete", "d", "A command to run when resources are deleted. Specify multiple times to add arguments.") cmd.Flags().Var(&options.nameSyncCommand, "names", "A command that will list all of the currently known names, optional. Specify multiple times to add arguments. Use to get notifications when objects are deleted.") // add additional arguments / info to the server cmd.Flags().StringVar(&options.templateType, "output", options.templateType, "Controls the template type used for the --argument flags. Supported values are gotemplate and jsonpath.") cmd.Flags().BoolVar(&options.strictTemplates, "strict-templates", false, "If true return an error on any field or map key that is not missing in a template.") cmd.Flags().VarP(&options.templates, "argument", "a", "Template for the arguments to be passed to each command in the format defined by --output.") cmd.Flags().StringVar(&options.typeEnvVar, "type-env-var", "", "The name of an env var to set with the type of event received ('Sync', 'Updated', 'Deleted', 'Added') to the reaction command or --delete.") cmd.Flags().StringVar(&options.objectEnvVar, "object-env-var", "", "The name of an env var to serialize the object to when calling the command, optional.") // control retries of individual commands cmd.Flags().IntVar(&options.maximumErrors, "maximum-errors", options.maximumErrors, "Exit after this many errors have been detected with. May be set to -1 for no maximum.") cmd.Flags().IntVar(&options.retryExitStatus, "retry-on-exit-code", 0, "If any command returns this exit code, retry up to --retry-count times.") cmd.Flags().IntVar(&options.retryCount, "retry-count", options.retryCount, "The number of times to retry a failing command before continuing.") // control observe program behavior cmd.Flags().BoolVar(&options.once, "once", false, "If true, exit with a status code 0 after all current objects have been processed.") cmd.Flags().DurationVar(&options.exitAfterPeriod, "exit-after", 0, "Exit with status code 0 after the provided duration, optional.") cmd.Flags().DurationVar(&options.resyncPeriod, "resync-period", 0, "When non-zero, periodically reprocess every item from the server as a Sync event. Use to ensure external systems are kept up to date. Requires --names") cmd.Flags().BoolVar(&options.printMetricsOnExit, "print-metrics-on-exit", false, "If true, on exit write all metrics to stdout.") cmd.Flags().StringVar(&options.listenAddr, "listen-addr", options.listenAddr, "The name of an interface to listen on to expose metrics and health checking.") // additional debug output cmd.Flags().BoolVar(&options.noHeaders, "no-headers", false, "If true, skip printing information about each event prior to executing the command.") return cmd }
// NewCmdLinkSecret creates a command object for linking a secret reference to a service account func NewCmdLinkSecret(name, fullName string, f *kcmdutil.Factory, out io.Writer) *cobra.Command { o := &LinkSecretOptions{SecretOptions{Out: out}, false, false, nil} cmd := &cobra.Command{ Use: fmt.Sprintf("%s serviceaccounts-name secret-name [another-secret-name]...", name), Short: "Link secrets to a ServiceAccount", Long: linkSecretLong, Example: fmt.Sprintf(linkSecretExample, fullName), Run: func(c *cobra.Command, args []string) { if err := o.Complete(f, args); err != nil { kcmdutil.CheckErr(kcmdutil.UsageError(c, err.Error())) } if err := o.Validate(); err != nil { kcmdutil.CheckErr(kcmdutil.UsageError(c, err.Error())) } if err := o.LinkSecrets(); err != nil { kcmdutil.CheckErr(err) } }, } cmd.Flags().StringSliceVar(&o.typeFlags, "for", []string{"mount"}, "type of secret to link: mount or pull") return cmd }
// NewCmdGet creates a command object for the generic "get" action, which // retrieves one or more resources from a server. func NewCmdGet(f *cmdutil.Factory, out io.Writer) *cobra.Command { options := &GetOptions{} // retrieve a list of handled resources from printer as valid args validArgs := []string{} p, err := f.Printer(nil, false, false, false, false, false, false, []string{}) cmdutil.CheckErr(err) if p != nil { validArgs = p.HandledResources() } cmd := &cobra.Command{ Use: "get [(-o|--output=)json|yaml|wide|go-template=...|go-template-file=...|jsonpath=...|jsonpath-file=...] (TYPE [NAME | -l label] | TYPE/NAME ...) [flags]", Short: "Display one or many resources", Long: get_long, Example: get_example, Run: func(cmd *cobra.Command, args []string) { err := RunGet(f, out, cmd, args, options) cmdutil.CheckErr(err) }, ValidArgs: validArgs, } cmdutil.AddPrinterFlags(cmd) cmd.Flags().StringP("selector", "l", "", "Selector (label query) to filter on") cmd.Flags().BoolP("watch", "w", false, "After listing/getting the requested object, watch for changes.") cmd.Flags().Bool("watch-only", false, "Watch for changes to the requested object(s), without listing/getting first.") cmd.Flags().Bool("all-namespaces", false, "If present, list the requested object(s) across all namespaces. Namespace in current context is ignored even if specified with --namespace.") cmd.Flags().StringSliceP("label-columns", "L", []string{}, "Accepts a comma separated list of labels that are going to be presented as columns. Names are case-sensitive. You can also use multiple flag statements like -L label1 -L label2...") cmd.Flags().Bool("export", false, "If true, use 'export' for the resources. Exported resources are stripped of cluster-specific information.") usage := "Filename, directory, or URL to a file identifying the resource to get from a server." kubectl.AddJsonFilenameFlag(cmd, &options.Filenames, usage) return cmd }
func NewCmdStop(f *cmdutil.Factory, out io.Writer) *cobra.Command { options := &StopOptions{} cmd := &cobra.Command{ Use: "stop (-f FILENAME | TYPE (NAME | -l label | --all))", Short: "Deprecated: Gracefully shut down a resource by name or filename.", Long: stop_long, Example: stop_example, Deprecated: fmt.Sprintf("use %q instead.", "delete"), Run: func(cmd *cobra.Command, args []string) { cmdutil.CheckErr(cmdutil.ValidateOutputArgs(cmd)) cmdutil.CheckErr(RunStop(f, cmd, args, out, options)) }, } usage := "Filename, directory, or URL to file of resource(s) to be stopped." kubectl.AddJsonFilenameFlag(cmd, &options.Filenames, usage) cmdutil.AddRecursiveFlag(cmd, &options.Recursive) cmd.Flags().StringP("selector", "l", "", "Selector (label query) to filter on.") cmd.Flags().Bool("all", false, "[-all] to select all the specified resources.") cmd.Flags().Bool("ignore-not-found", false, "Treat \"resource not found\" as a successful stop.") cmd.Flags().Int("grace-period", -1, "Period of time in seconds given to the resource to terminate gracefully. Ignored if negative.") cmd.Flags().Duration("timeout", 0, "The length of time to wait before giving up on a delete, zero means determine a timeout from the size of the object") cmdutil.AddOutputFlagsForMutation(cmd) cmdutil.AddInclude3rdPartyFlags(cmd) return cmd }
func NewCmdImage(f cmdutil.Factory, out, err io.Writer) *cobra.Command { options := &ImageOptions{ Out: out, Err: err, } cmd := &cobra.Command{ Use: "image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1 ... CONTAINER_NAME_N=CONTAINER_IMAGE_N", Short: "Update image of a pod template", Long: image_long, Example: image_example, Run: func(cmd *cobra.Command, args []string) { cmdutil.CheckErr(options.Complete(f, cmd, args)) cmdutil.CheckErr(options.Validate()) cmdutil.CheckErr(options.Run()) }, } cmdutil.AddPrinterFlags(cmd) usage := "identifying the resource to get from a server." cmdutil.AddFilenameOptionFlags(cmd, &options.FilenameOptions, usage) cmd.Flags().BoolVar(&options.All, "all", false, "select all resources in the namespace of the specified resource types") cmd.Flags().StringVarP(&options.Selector, "selector", "l", "", "Selector (label query) to filter on") cmd.Flags().BoolVar(&options.Local, "local", false, "If true, set image will NOT contact api-server but run locally.") cmdutil.AddRecordFlag(cmd) return cmd }
func NewCmdAttach(f *cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer) *cobra.Command { options := &AttachOptions{ In: cmdIn, Out: cmdOut, Err: cmdErr, CommandName: "kubectl attach", Attach: &DefaultRemoteAttach{}, } cmd := &cobra.Command{ Use: "attach POD -c CONTAINER", Short: "Attach to a running container.", Long: "Attach to a process that is already running inside an existing container.", Example: attach_example, Run: func(cmd *cobra.Command, args []string) { cmdutil.CheckErr(options.Complete(f, cmd, args)) cmdutil.CheckErr(options.Validate()) cmdutil.CheckErr(options.Run()) }, } // TODO support UID cmd.Flags().StringVarP(&options.ContainerName, "container", "c", "", "Container name. If omitted, the first container in the pod will be chosen") cmd.Flags().BoolVarP(&options.Stdin, "stdin", "i", false, "Pass stdin to the container") cmd.Flags().BoolVarP(&options.TTY, "tty", "t", false, "Stdin is a TTY") return cmd }
func NewCmdReplace(f *cmdutil.Factory, out io.Writer) *cobra.Command { options := &resource.FilenameOptions{} cmd := &cobra.Command{ Use: "replace -f FILENAME", // update is deprecated. Aliases: []string{"update"}, Short: "Replace a resource by filename or stdin", Long: replace_long, Example: replace_example, Run: func(cmd *cobra.Command, args []string) { cmdutil.CheckErr(cmdutil.ValidateOutputArgs(cmd)) err := RunReplace(f, out, cmd, args, options) cmdutil.CheckErr(err) }, } usage := "to use to replace the resource." cmdutil.AddFilenameOptionFlags(cmd, options, usage) cmd.MarkFlagRequired("filename") cmd.Flags().Bool("force", false, "Delete and re-create the specified resource") cmd.Flags().Bool("cascade", false, "Only relevant during a force replace. If true, cascade the deletion of the resources managed by this resource (e.g. Pods created by a ReplicationController).") cmd.Flags().Int("grace-period", -1, "Only relevant during a force replace. Period of time in seconds given to the old resource to terminate gracefully. Ignored if negative.") cmd.Flags().Duration("timeout", 0, "Only relevant during a force replace. The length of time to wait before giving up on a delete of the old resource, zero means determine a timeout from the size of the object. Any other values should contain a corresponding time unit (e.g. 1s, 2m, 3h).") cmdutil.AddValidateFlags(cmd) cmdutil.AddOutputFlagsForMutation(cmd) cmdutil.AddApplyAnnotationFlags(cmd) cmdutil.AddRecordFlag(cmd) cmdutil.AddInclude3rdPartyFlags(cmd) return cmd }
func NewCmdTaint(f cmdutil.Factory, out io.Writer) *cobra.Command { options := &TaintOptions{} validArgs := []string{"node"} argAliases := kubectl.ResourceAliases(validArgs) cmd := &cobra.Command{ Use: "taint NODE NAME KEY_1=VAL_1:TAINT_EFFECT_1 ... KEY_N=VAL_N:TAINT_EFFECT_N", Short: "Update the taints on one or more nodes", Long: fmt.Sprintf(taint_long, validation.DNS1123SubdomainMaxLength, validation.LabelValueMaxLength), Example: taint_example, Run: func(cmd *cobra.Command, args []string) { if err := options.Complete(f, out, cmd, args); err != nil { cmdutil.CheckErr(err) } if err := options.Validate(args); err != nil { cmdutil.CheckErr(cmdutil.UsageError(cmd, err.Error())) } if err := options.RunTaint(); err != nil { cmdutil.CheckErr(err) } }, ValidArgs: validArgs, ArgAliases: argAliases, } cmdutil.AddValidateFlags(cmd) cmdutil.AddPrinterFlags(cmd) cmdutil.AddInclude3rdPartyFlags(cmd) cmd.Flags().StringVarP(&options.selector, "selector", "l", "", "Selector (label query) to filter on") cmd.Flags().BoolVar(&options.overwrite, "overwrite", false, "If true, allow taints to be overwritten, otherwise reject taint updates that overwrite existing taints.") cmd.Flags().BoolVar(&options.all, "all", false, "select all nodes in the cluster") return cmd }
// NewCmdConvert creates a command object for the generic "convert" action, which // translates the config file into a given version. func NewCmdConvert(f *cmdutil.Factory, out io.Writer) *cobra.Command { options := &ConvertOptions{} cmd := &cobra.Command{ Use: "convert -f FILENAME", Short: "Convert config files between different API versions", Long: convert_long, Example: convert_example, Run: func(cmd *cobra.Command, args []string) { err := options.Complete(f, out, cmd, args) cmdutil.CheckErr(err) err = options.RunConvert() cmdutil.CheckErr(err) }, } usage := "Filename, directory, or URL to file to need to get converted." kubectl.AddJsonFilenameFlag(cmd, &options.filenames, usage) cmd.MarkFlagRequired("filename") cmdutil.AddValidateFlags(cmd) cmdutil.AddPrinterFlags(cmd) cmd.Flags().BoolVar(&options.local, "local", true, "If true, convert will NOT try to contact api-server but run locally.") return cmd }
func NewCommandCreateBootstrapPolicyFile(commandName string, fullName string, out io.Writer) *cobra.Command { options := &CreateBootstrapPolicyFileOptions{} cmd := &cobra.Command{ Use: commandName, Short: "Create the default bootstrap policy", Run: func(cmd *cobra.Command, args []string) { if err := options.Validate(args); err != nil { kcmdutil.CheckErr(kcmdutil.UsageError(cmd, err.Error())) } if err := options.CreateBootstrapPolicyFile(); err != nil { kcmdutil.CheckErr(err) } }, } flags := cmd.Flags() flags.StringVar(&options.File, "filename", DefaultPolicyFile, "The policy template file that will be written with roles and bindings.") flags.StringVar(&options.OpenShiftSharedResourcesNamespace, "openshift-namespace", "openshift", "Namespace for shared resources.") // autocompletion hints cmd.MarkFlagFilename("filename") return cmd }
func NewCmdJoinProjectsNetwork(commandName, fullName string, f *clientcmd.Factory, out io.Writer) *cobra.Command { opts := &ProjectOptions{} joinOp := &JoinOptions{Options: opts} cmd := &cobra.Command{ Use: commandName, Short: "Join project network", Long: fmt.Sprintf(joinProjectsNetworkLong, ovsPluginName), Example: fmt.Sprintf(joinProjectsNetworkExample, fullName), Run: func(c *cobra.Command, args []string) { if err := opts.Complete(f, c, args, out); err != nil { kcmdutil.CheckErr(err) } opts.CheckSelector = c.Flag("selector").Changed if err := joinOp.Validate(); err != nil { kcmdutil.CheckErr(kcmdutil.UsageError(c, err.Error())) } err := joinOp.Run() kcmdutil.CheckErr(err) }, } flags := cmd.Flags() // Supported operations flags.StringVar(&joinOp.joinProjectName, "to", "", "Join network of the given project name") // Common optional params flags.StringVar(&opts.Selector, "selector", "", "Label selector to filter projects. Either pass one/more projects as arguments or use this project selector") return cmd }
func NewCmdExec(f *cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer) *cobra.Command { options := &ExecOptions{ In: cmdIn, Out: cmdOut, Err: cmdErr, Executor: &DefaultRemoteExecutor{}, } cmd := &cobra.Command{ Use: "exec POD [-c CONTAINER] -- COMMAND [args...]", Short: "Execute a command in a container.", Long: "Execute a command in a container.", Example: exec_example, Run: func(cmd *cobra.Command, args []string) { argsLenAtDash := cmd.ArgsLenAtDash() cmdutil.CheckErr(options.Complete(f, cmd, args, argsLenAtDash)) cmdutil.CheckErr(options.Validate()) cmdutil.CheckErr(options.Run()) }, } cmd.Flags().StringVarP(&options.PodName, "pod", "p", "", "Pod name") // TODO support UID cmd.Flags().StringVarP(&options.ContainerName, "container", "c", "", "Container name. If omitted, the first container in the pod will be chosen") cmd.Flags().BoolVarP(&options.Stdin, "stdin", "i", false, "Pass stdin to the container") cmd.Flags().BoolVarP(&options.TTY, "tty", "t", false, "Stdin is a TTY") return cmd }