// Complete turns a partially defined PruneImagesOptions into a solvent structure // which can be validated and used for pruning images. func (o *PruneImagesOptions) Complete(f *clientcmd.Factory, cmd *cobra.Command, args []string, out io.Writer) error { if len(args) > 0 { return kcmdutil.UsageError(cmd, "no arguments are allowed to this command") } if !cmd.Flags().Lookup("keep-younger-than").Changed { o.KeepYoungerThan = nil } if !cmd.Flags().Lookup("keep-tag-revisions").Changed { o.KeepTagRevisions = nil } if !cmd.Flags().Lookup("prune-over-size-limit").Changed { o.PruneOverSizeLimit = nil } o.Namespace = kapi.NamespaceAll if cmd.Flags().Lookup("namespace").Changed { var err error o.Namespace, _, err = f.DefaultNamespace() if err != nil { return err } } o.Out = out osClient, kClient, registryClient, err := getClients(f, o.CABundle) if err != nil { return err } o.OSClient = osClient o.KClient = kClient o.RegistryClient = registryClient return nil }
func (o *RoleModificationOptions) CompleteUserWithSA(f *clientcmd.Factory, args []string, saNames []string) error { if len(args) < 1 { return errors.New("you must specify a role") } o.RoleName = args[0] if len(args) > 1 { o.Users = append(o.Users, args[1:]...) } if (len(o.Users) == 0) && (len(saNames) == 0) { return errors.New("you must specify at least one user or service account") } osClient, _, err := f.Clients() if err != nil { return err } roleBindingNamespace, _, err := f.DefaultNamespace() if err != nil { return err } o.RoleBindingAccessor = NewLocalRoleBindingAccessor(roleBindingNamespace, osClient) for _, sa := range saNames { o.Subjects = append(o.Subjects, kapi.ObjectReference{Namespace: roleBindingNamespace, Name: sa, Kind: "ServiceAccount"}) } return nil }
// Complete verifies command line arguments and loads data from the command environment func (o *RsyncOptions) Complete(f *clientcmd.Factory, cmd *cobra.Command, args []string) error { switch n := len(args); { case n == 0: cmd.Help() fallthrough case n < 2: return kcmdutil.UsageError(cmd, "SOURCE_DIR and POD:DESTINATION_DIR are required arguments") case n > 2: return kcmdutil.UsageError(cmd, "only SOURCE_DIR and POD:DESTINATION_DIR should be specified as arguments") } // Set main command arguments var err error o.Source, err = parsePathSpec(args[0]) if err != nil { return err } o.Destination, err = parsePathSpec(args[1]) if err != nil { return err } namespace, _, err := f.DefaultNamespace() if err != nil { return err } o.Namespace = namespace o.Strategy, err = o.determineStrategy(f, cmd, o.StrategyName) if err != nil { return err } return nil }
// NewCmdWhoCan implements the OpenShift cli who-can command func NewCmdWhoCan(name, fullName string, f *clientcmd.Factory, out io.Writer) *cobra.Command { options := &whoCanOptions{} cmd := &cobra.Command{ Use: name + " VERB RESOURCE [NAME]", Short: "List who can perform the specified action on a resource", Long: "List who can perform the specified action on a resource", Run: func(cmd *cobra.Command, args []string) { if err := options.complete(f, args); err != nil { kcmdutil.CheckErr(kcmdutil.UsageError(cmd, err.Error())) } var err error options.client, _, err = f.Clients() kcmdutil.CheckErr(err) options.bindingNamespace, _, err = f.DefaultNamespace() kcmdutil.CheckErr(err) err = options.run() kcmdutil.CheckErr(err) }, } cmd.Flags().BoolVar(&options.allNamespaces, "all-namespaces", options.allNamespaces, "If present, list who can perform the specified action in all namespaces.") return cmd }
func (o *AppJSONOptions) Complete(f *clientcmd.Factory, cmd *cobra.Command, args []string) error { version, _ := cmd.Flags().GetString("output-version") for _, v := range strings.Split(version, ",") { gv, err := unversioned.ParseGroupVersion(v) if err != nil { return fmt.Errorf("provided output-version %q is not valid: %v", v, err) } o.OutputVersions = append(o.OutputVersions, gv) } o.OutputVersions = append(o.OutputVersions, registered.EnabledVersions()...) o.Action.Bulk.Mapper = clientcmd.ResourceMapper(f) o.Action.Bulk.Op = configcmd.Create mapper, _ := f.Object(false) o.PrintObject = cmdutil.VersionedPrintObject(f.PrintObject, cmd, mapper, o.Action.Out) o.Generator, _ = cmd.Flags().GetString("generator") ns, _, err := f.DefaultNamespace() if err != nil { return err } o.Namespace = ns o.Client, _, err = f.Clients() return err }
func (o *DeployOptions) Complete(f *clientcmd.Factory, args []string, out io.Writer) error { if len(args) > 1 { return errors.New("only one deployment config name is supported as argument.") } var err error o.osClient, o.kubeClient, err = f.Clients() if err != nil { return err } o.namespace, _, err = f.DefaultNamespace() if err != nil { return err } mapper, typer := f.Object(false) o.builder = resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), kapi.Codecs.UniversalDecoder()) o.out = out if len(args) > 0 { o.deploymentConfigName = args[0] } return nil }
func (o *CreatePolicyBindingOptions) Complete(cmd *cobra.Command, f *clientcmd.Factory, args []string) error { if len(args) != 1 { return fmt.Errorf("exactly one argument (policy namespace) is supported, not: %v", args) } o.PolicyNamespace = args[0] namespace, _, err := f.DefaultNamespace() if err != nil { return err } o.BindingNamespace = namespace client, _, err := f.Clients() if err != nil { return err } o.BindingClient = client o.Mapper, _ = f.Object() o.OutputFormat = cmdutil.GetFlagString(cmd, "output") o.Printer = func(obj runtime.Object, out io.Writer) error { return f.PrintObject(cmd, o.Mapper, obj, out) } return nil }
func setupAppConfig(f *clientcmd.Factory, c *cobra.Command, args []string, config *newcmd.AppConfig) error { namespace, _, err := f.DefaultNamespace() if err != nil { return err } dockerClient, _, err := dockerutil.NewHelper().GetClient() if err == nil { if err = dockerClient.Ping(); err == nil { config.SetDockerClient(dockerClient) } } if err != nil { glog.V(2).Infof("No local Docker daemon detected: %v", err) } osclient, _, err := f.Clients() if err != nil { return err } config.SetOpenShiftClient(osclient, namespace) unknown := config.AddArguments(args) if len(unknown) != 0 { return cmdutil.UsageError(c, "Did not recognize the following arguments: %v", unknown) } return nil }
// RunStatus contains all the necessary functionality for the OpenShift cli status command func RunStatus(f *clientcmd.Factory, out io.Writer) error { client, kclient, err := f.Clients() if err != nil { return err } config, err := f.OpenShiftClientConfig.ClientConfig() if err != nil { return err } namespace, _, err := f.DefaultNamespace() if err != nil { return err } describer := &describe.ProjectStatusDescriber{K: kclient, C: client, Server: config.Host} s, err := describer.Describe(namespace, "") if err != nil { return err } fmt.Fprintf(out, s) return nil }
// Complete turns a partially defined ImportImageOptions into a solvent structure // which can be validated and used for aa import. func (o *ImportImageOptions) Complete(f *clientcmd.Factory, cmd *cobra.Command, args []string, out io.Writer) error { if len(args) > 0 { o.Target = args[0] } if !cmd.Flags().Lookup("insecure").Changed { o.Insecure = nil } namespace, _, err := f.DefaultNamespace() if err != nil { return err } o.Namespace = namespace osClient, _, err := f.Clients() if err != nil { return err } o.osClient = osClient o.isClient = osClient.ImageStreams(namespace) o.out = out return nil }
func setupAppConfig(f *clientcmd.Factory, out io.Writer, c *cobra.Command, args []string, config *newcmd.AppConfig) error { namespace, _, err := f.DefaultNamespace() if err != nil { return err } dockerClient, _, err := dockerutil.NewHelper().GetClient() if err == nil { if err = dockerClient.Ping(); err == nil { config.SetDockerClient(dockerClient) } else { glog.V(4).Infof("Docker client did not respond to a ping: %v", err) } } if err != nil { glog.V(2).Infof("No local Docker daemon detected: %v", err) } osclient, kclient, err := f.Clients() if err != nil { return err } config.KubeClient = kclient config.SetOpenShiftClient(osclient, namespace) // Only output="" should print descriptions of intermediate steps. Everything // else should print only some specific output (json, yaml, go-template, ...) output := cmdutil.GetFlagString(c, "output") if len(output) == 0 { config.Out = out } else { config.Out = ioutil.Discard } config.ErrOut = c.Out() if config.AllowSecretUse { cfg, err := f.OpenShiftClientConfig.ClientConfig() if err != nil { return err } config.SecretAccessor = newConfigSecretRetriever(cfg) } unknown := config.AddArguments(args) if len(unknown) != 0 { return cmdutil.UsageError(c, "Did not recognize the following arguments: %v", unknown) } if config.AllowMissingImages && config.AsSearch { return cmdutil.UsageError(c, "--allow-missing-images and --search are mutually exclusive.") } if len(config.SourceImage) != 0 && len(config.SourceImagePath) == 0 { return cmdutil.UsageError(c, "--source-image-path must be specified when --source-image is specified.") } if len(config.SourceImage) == 0 && len(config.SourceImagePath) != 0 { return cmdutil.UsageError(c, "--source-image must be specified when --source-image-path is specified.") } return nil }
func (o *TriggersOptions) Complete(f *clientcmd.Factory, cmd *cobra.Command, args []string) error { cmdNamespace, explicit, err := f.DefaultNamespace() if err != nil { return err } if !cmd.Flags().Lookup("from-github").Changed { o.FromGitHub = nil } if !cmd.Flags().Lookup("from-webhook").Changed { o.FromWebHook = nil } if !cmd.Flags().Lookup("from-webhook-allow-env").Changed { o.FromWebHookAllowEnv = nil } if len(o.FromImage) > 0 { ref, err := imageapi.ParseDockerImageReference(o.FromImage) if err != nil { return fmt.Errorf("the value of --from-image does not appear to be a valid reference to an image: %v", err) } if len(ref.Registry) > 0 || len(ref.ID) > 0 { return fmt.Errorf("the value of --from-image must point to an image stream tag on this server") } if len(ref.Tag) == 0 { return fmt.Errorf("the value of --from-image must include the tag you wish to pull from") } o.FromImage = ref.NameString() o.FromImageNamespace = defaultNamespace(ref.Namespace, cmdNamespace) } count := o.count() o.Reset = count == 0 && (o.Auto || o.Manual) switch { case count == 0 && !o.Remove && !o.RemoveAll && !o.Auto && !o.Manual: o.PrintTable = true case !o.RemoveAll && !o.Auto && !o.Manual: o.Auto = true } mapper, typer := f.Object(false) o.Builder = resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), kapi.Codecs.UniversalDecoder()). ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). FilenameParam(explicit, false, o.Filenames...). SelectorParam(o.Selector). ResourceTypeOrNameArgs(o.All, args...). Flatten() output := kcmdutil.GetFlagString(cmd, "output") if len(output) != 0 { o.PrintObject = func(obj runtime.Object) error { return f.PrintObject(cmd, mapper, obj, o.Out) } } o.Encoder = f.JSONEncoder() o.ShortOutput = kcmdutil.GetFlagString(cmd, "output") == "name" o.Mapper = mapper return nil }
// RunRsh starts a remote shell session on the server func RunRsh(options *kubecmd.ExecOptions, f *clientcmd.Factory, cmd *cobra.Command, args []string) error { if len(args) != 1 { return cmdutil.UsageError(cmd, "rsh requires a single POD to connect to") } options.PodName = args[0] _, client, err := f.Clients() if err != nil { return err } options.Client = client namespace, _, err := f.DefaultNamespace() if err != nil { return nil } options.Namespace = namespace config, err := f.ClientConfig() if err != nil { return err } options.Config = config if err := options.Validate(); err != nil { return err } return options.Run() }
func (v *VolumeOptions) Complete(f *clientcmd.Factory, cmd *cobra.Command, out io.Writer) error { clientConfig, err := f.ClientConfig() if err != nil { return err } v.OutputVersion = kcmdutil.OutputVersion(cmd, clientConfig.Version) cmdNamespace, explicit, err := f.DefaultNamespace() if err != nil { return err } mapper, typer := f.Object() v.DefaultNamespace = cmdNamespace v.ExplicitNamespace = explicit v.Writer = out v.Mapper = mapper v.Typer = typer v.RESTClientFactory = f.Factory.RESTClient v.UpdatePodSpecForObject = f.UpdatePodSpecForObject // In case of volume source ignore the default volume type if len(v.AddOpts.Source) > 0 { v.AddOpts.Type = "" } return nil }
func setupAppConfig(f *clientcmd.Factory, out io.Writer, c *cobra.Command, args []string, config *newcmd.AppConfig) error { namespace, _, err := f.DefaultNamespace() if err != nil { return err } dockerClient, _, err := dockerutil.NewHelper().GetClient() if err == nil { if err = dockerClient.Ping(); err == nil { config.SetDockerClient(dockerClient) } } if err != nil { glog.V(2).Infof("No local Docker daemon detected: %v", err) } osclient, _, err := f.Clients() if err != nil { return err } config.SetOpenShiftClient(osclient, namespace) config.Out = out config.ErrOut = c.Out() unknown := config.AddArguments(args) if len(unknown) != 0 { return cmdutil.UsageError(c, "Did not recognize the following arguments: %v", unknown) } if config.AllowMissingImages && config.AsSearch { return cmdutil.UsageError(c, "--allow-missing-images and --search are mutually exclusive.") } return nil }
// RunGraph contains all the necessary functionality for the OpenShift cli graph command func RunGraph(f *clientcmd.Factory, out io.Writer) error { client, kclient, err := f.Clients() if err != nil { return err } config, err := f.OpenShiftClientConfig.ClientConfig() if err != nil { return err } namespace, _, err := f.DefaultNamespace() if err != nil { return err } describer := &describe.ProjectStatusDescriber{K: kclient, C: client, Server: config.Host} g, _, err := describer.MakeGraph(namespace) if err != nil { return err } data, err := dot.Marshal(g, namespace, "", " ", false) if err != nil { return err } fmt.Fprintf(out, "%s", string(data)) return nil }
func (o *SCCModificationOptions) CompleteUsers(f *clientcmd.Factory, args []string, saNames []string) error { if (len(args) < 2) && (len(saNames) == 0) { return errors.New("you must specify at least two arguments (<scc> <user> [user]...) or a service account (<scc> -z <service account name>) ") } o.SCCName = args[0] o.Subjects = authorizationapi.BuildSubjects(args[1:], []string{}, uservalidation.ValidateUserName, uservalidation.ValidateGroupName) var err error _, o.SCCInterface, err = f.Clients() if err != nil { return err } o.DefaultSubjectNamespace, _, err = f.DefaultNamespace() if err != nil { return err } for _, sa := range saNames { o.Subjects = append(o.Subjects, kapi.ObjectReference{Namespace: o.DefaultSubjectNamespace, Name: sa, Kind: "ServiceAccount"}) } return nil }
func (o *RetryOptions) Complete(f *clientcmd.Factory, cmd *cobra.Command, out io.Writer, args []string) error { if len(args) == 0 && len(o.Filenames) == 0 { return kcmdutil.UsageError(cmd, cmd.Use) } o.Mapper, o.Typer = f.Object(false) o.Encoder = f.JSONEncoder() o.Out = out cmdNamespace, enforceNamespace, err := f.DefaultNamespace() if err != nil { return err } _, _, o.Clientset, err = f.Clients() if err != nil { return err } r := resource.NewBuilder(o.Mapper, o.Typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). NamespaceParam(cmdNamespace).DefaultNamespace(). FilenameParam(enforceNamespace, o.Recursive, o.Filenames...). ResourceTypeOrNameArgs(true, args...). ContinueOnError(). Latest(). Flatten(). Do() err = r.Err() if err != nil { return err } o.Infos, err = r.Infos() return err }
func (n *NodeOptions) Complete(f *clientcmd.Factory, c *cobra.Command, args []string, out io.Writer) error { defaultNamespace, err := f.DefaultNamespace() if err != nil { return err } _, kc, err := f.Clients() if err != nil { return err } cmdPrinter, output, err := kcmdutil.PrinterForCommand(c) if err != nil { return err } mapper, typer := f.Object() n.DefaultNamespace = defaultNamespace n.Kclient = kc n.Writer = out n.Mapper = mapper n.Typer = typer n.RESTClientFactory = f.Factory.RESTClient n.Printer = f.Printer n.NodeNames = []string{} n.CmdPrinter = cmdPrinter n.CmdPrinterOutput = false if output { n.CmdPrinterOutput = true } if len(args) != 0 { n.NodeNames = append(n.NodeNames, args...) } return nil }
func (o *CreateImageStreamOptions) Complete(cmd *cobra.Command, f *clientcmd.Factory, args []string) error { o.IS = &imageapi.ImageStream{ ObjectMeta: kapi.ObjectMeta{}, Spec: imageapi.ImageStreamSpec{}, } switch len(args) { case 0: return fmt.Errorf("image stream name is required") case 1: o.IS.Name = args[0] default: return fmt.Errorf("exactly one argument (name) is supported, not: %v", args) } var err error o.IS.Namespace, _, err = f.DefaultNamespace() if err != nil { return err } o.Client, _, err = f.Clients() if err != nil { return err } o.Mapper, _ = f.Object(false) o.OutputFormat = cmdutil.GetFlagString(cmd, "output") o.Printer = func(obj runtime.Object, out io.Writer) error { return f.PrintObject(cmd, o.Mapper, obj, out) } return nil }
func (o *RolloutLatestOptions) Complete(f *clientcmd.Factory, cmd *cobra.Command, args []string, out io.Writer) error { if len(args) != 1 { return errors.New("one deployment config name is needed as argument.") } namespace, _, err := f.DefaultNamespace() if err != nil { return err } o.oc, o.kc, err = f.Clients() if err != nil { return err } o.mapper, o.typer = f.Object(false) o.infos, err = resource.NewBuilder(o.mapper, o.typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). ContinueOnError(). NamespaceParam(namespace). ResourceNames("deploymentconfigs", args[0]). SingleResourceType(). Do().Infos() if err != nil { return err } o.out = out o.shortOutput = kcmdutil.GetFlagString(cmd, "output") == "name" o.again = kcmdutil.GetFlagBool(cmd, "again") return nil }
func (o *CreateSecretOptions) Complete(args []string, f *clientcmd.Factory) error { // Fill name from args[0] if len(args) > 0 { o.Name = args[0] } // Add sources from args[1:...] in addition to -f if len(args) > 1 { o.Sources = append(o.Sources, args[1:]...) } if f != nil { _, kubeClient, err := f.Clients() if err != nil { return err } namespace, _, err := f.DefaultNamespace() if err != nil { return err } o.SecretsInterface = kubeClient.Core().Secrets(namespace) } return nil }
func (o *DeployOptions) Complete(f *clientcmd.Factory, args []string, out io.Writer) error { var err error o.osClient, o.kubeClient, err = f.Clients() if err != nil { return err } o.namespace, _, err = f.DefaultNamespace() if err != nil { return err } mapper, typer := f.Object() o.builder = resource.NewBuilder(mapper, typer, f.ClientMapperForCommand()) o.out = out if len(args) > 0 { name := args[0] if strings.Index(name, "/") == -1 { name = fmt.Sprintf("dc/%s", name) } o.deploymentConfigName = name } return nil }
func (o *NewServiceAccountTokenOptions) Complete(args []string, requestedLabels string, f *clientcmd.Factory, cmd *cobra.Command) error { if len(args) != 1 { return cmdutil.UsageError(cmd, fmt.Sprintf("expected one service account name as an argument, got %q", args)) } o.SAName = args[0] if len(requestedLabels) > 0 { labels, err := kubectl.ParseLabels(requestedLabels) if err != nil { return cmdutil.UsageError(cmd, err.Error()) } o.Labels = labels } client, err := f.Client() if err != nil { return err } namespace, _, err := f.DefaultNamespace() if err != nil { return fmt.Errorf("could not retrieve default namespace: %v", err) } o.SAClient = client.ServiceAccounts(namespace) o.SecretsClient = client.Secrets(namespace) return nil }
// Complete turns a partially defined RollbackActions into a solvent structure // which can be validated and used for a rollback. func (o *RollbackOptions) Complete(f *clientcmd.Factory, args []string, out io.Writer) error { // Extract basic flags. if len(args) == 1 { o.TargetName = args[0] } namespace, _, err := f.DefaultNamespace() if err != nil { return err } o.Namespace = namespace // Set up client based support. mapper, typer := f.Object(false) o.getBuilder = func() *resource.Builder { return resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), kapi.Codecs.UniversalDecoder()) } oClient, kClient, err := f.Clients() if err != nil { return err } o.oc = oClient o.kc = kClient o.out = out return nil }
func (v *VolumeOptions) Complete(f *clientcmd.Factory, cmd *cobra.Command, out io.Writer) error { clientConfig, err := f.ClientConfig() if err != nil { return err } v.OutputVersion = kcmdutil.OutputVersion(cmd, clientConfig.Version) cmdNamespace, err := f.DefaultNamespace() if err != nil { return err } mapper, typer := f.Object() v.DefaultNamespace = cmdNamespace v.Writer = out v.Mapper = mapper v.Typer = typer v.RESTClientFactory = f.Factory.RESTClient v.UpdatePodSpecForObject = f.UpdatePodSpecForObject if v.Add && len(v.Name) == 0 { v.Name = kapi.SimpleNameGenerator.GenerateName(volumePrefix) if len(v.Output) == 0 { fmt.Fprintf(v.Writer, "Generated volume name: %s\n", v.Name) } } // In case of volume source ignore the default volume type if len(v.AddOpts.Source) > 0 { v.AddOpts.Type = "" } return nil }
func (o *RoleModificationOptions) Complete(f *clientcmd.Factory, args []string, target *[]string, targetName string, isNamespaced bool) error { if len(args) < 2 { return fmt.Errorf("you must specify at least two arguments: <role> <%s> [%s]...", targetName, targetName) } o.RoleName = args[0] *target = append(*target, args[1:]...) osClient, _, err := f.Clients() if err != nil { return err } if isNamespaced { roleBindingNamespace, _, err := f.DefaultNamespace() if err != nil { return err } o.RoleBindingAccessor = NewLocalRoleBindingAccessor(roleBindingNamespace, osClient) } else { o.RoleBindingAccessor = NewClusterRoleBindingAccessor(osClient) } return nil }
func (o *NewApplicationOptions) Run(f *clientcmd.Factory) error { application := &applicationapi.Application{} namespace, _, err := f.DefaultNamespace() if err != nil { return err } _, err = o.Client.Applications(namespace).Get(o.Name) if err == nil { return errors.New(fmt.Sprintf("application %s already exists", o.Name)) } application.Spec.Items = o.Items application.Annotations = make(map[string]string) application.Labels = map[string]string{} application.Name = o.Name application.GenerateName = o.Name if _, err = o.Client.Applications(namespace).Create(application); err != nil { return err } return nil }
// RunBuildLogs contains all the necessary functionality for the OpenShift cli build-logs command func RunBuildLogs(fullName string, f *clientcmd.Factory, out io.Writer, cmd *cobra.Command, opts api.BuildLogOptions, args []string) error { if len(args) != 1 { cmdNamespace := kcmdutil.GetFlagString(cmd, "namespace") var namespace string if cmdNamespace != "" { namespace = " -n " + cmdNamespace } return kcmdutil.UsageError(cmd, "A build name is required - you can run `%s get builds%s` to list builds", fullName, namespace) } namespace, _, err := f.DefaultNamespace() if err != nil { return err } c, _, _, err := f.Clients() if err != nil { return err } readCloser, err := c.BuildLogs(namespace).Get(args[0], opts).Stream() if err != nil { return err } defer readCloser.Close() _, err = io.Copy(out, readCloser) return err }
// NewCmdWhoCan implements the OpenShift cli who-can command func NewCmdWhoCan(name, fullName string, f *clientcmd.Factory, out io.Writer) *cobra.Command { options := &whoCanOptions{} cmd := &cobra.Command{ Use: "who-can VERB RESOURCE", Short: "List who can perform the specified action on a resource", Long: "List who can perform the specified action on a resource", 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) } if options.bindingNamespace, err = f.DefaultNamespace(); err != nil { kcmdutil.CheckErr(err) } if err := options.run(); err != nil { kcmdutil.CheckErr(err) } }, } return cmd }