func (o LogoutOptions) RunLogout() error { token := o.Config.BearerToken client, err := client.New(o.Config) if err != nil { return err } userInfo, err := whoAmI(client) if err != nil { return err } if err := client.OAuthAccessTokens().Delete(token); err != nil { return err } newConfig := *o.StartingKubeConfig for key, value := range newConfig.AuthInfos { if value.Token == token { value.Token = "" newConfig.AuthInfos[key] = value // don't break, its possible that more than one user stanza has the same token. } } if err := kcmdconfig.ModifyConfig(o.PathOptions, newConfig); err != nil { return err } fmt.Fprintf(o.Out, "Logged %q out on %q\n", userInfo.Name, o.Config.Host) return nil }
// Save all the information present in this helper to a config file. An explicit config // file path can be provided, if not use the established conventions about config // loading rules. Will create a new config file if one can't be found at all. Will only // succeed if all required info is present. func (o *LoginOptions) SaveConfig() (bool, error) { if len(o.Username) == 0 { return false, fmt.Errorf("Insufficient data to merge configuration.") } globalExistedBefore := true if _, err := os.Stat(o.PathOptions.GlobalFile); os.IsNotExist(err) { globalExistedBefore = false } newConfig, err := config.CreateConfig(o.Project, o.Config) if err != nil { return false, err } cwd, err := os.Getwd() if err != nil { return false, err } baseDir, err := cmdutil.MakeAbs(filepath.Dir(o.PathOptions.GetDefaultFilename()), cwd) if err != nil { return false, err } if err := config.RelativizeClientConfigPaths(newConfig, baseDir); err != nil { return false, err } configToWrite, err := config.MergeConfig(*o.StartingKubeConfig, *newConfig) if err != nil { return false, err } if err := kubecmdconfig.ModifyConfig(o.PathOptions, *configToWrite); err != nil { return false, err } created := false if _, err := os.Stat(o.PathOptions.GlobalFile); err == nil { created = created || !globalExistedBefore } return created, nil }
// RunProject contains all the necessary functionality for the OpenShift cli project command func (o ProjectOptions) RunProject() error { config := o.Config clientCfg := o.ClientConfig out := o.Out // No argument provided, we will just print info if len(o.ProjectName) == 0 { currentContext := config.Contexts[config.CurrentContext] currentProject := currentContext.Namespace if len(currentProject) > 0 { if o.DisplayShort { fmt.Fprintln(out, currentProject) return nil } _, err := o.Client.Projects().Get(currentProject) if err != nil { if kapierrors.IsNotFound(err) { return fmt.Errorf("the project %q specified in your config does not exist.", currentProject) } if clientcmd.IsForbidden(err) { return fmt.Errorf("you do not have rights to view project %q.", currentProject) } return err } if config.CurrentContext != currentProject { if len(currentProject) > 0 { fmt.Fprintf(out, "Using project %q from context named %q on server %q.\n", currentProject, config.CurrentContext, clientCfg.Host) } else { fmt.Fprintf(out, "Using context named %q on server %q.\n", config.CurrentContext, clientCfg.Host) } } else { fmt.Fprintf(out, "Using project %q on server %q.\n", currentProject, clientCfg.Host) } } else { if o.DisplayShort { return fmt.Errorf("no project has been set") } fmt.Fprintf(out, "No project has been set. Pass a project name to make that the default.\n") } return nil } // We have an argument that can be either a context or project argument := o.ProjectName contextInUse := "" namespaceInUse := "" contextNameIsGenerated := false // Check if argument is an existing context, if so just set it as the context in use. // If not a context then we will try to handle it as a project. if context, contextExists := config.Contexts[argument]; !o.ProjectOnly && contextExists { contextInUse = argument namespaceInUse = context.Namespace config.CurrentContext = argument } else { project, err := o.Client.Projects().Get(argument) if err != nil { if isNotFound, isForbidden := kapierrors.IsNotFound(err), clientcmd.IsForbidden(err); isNotFound || isForbidden { var msg string if isForbidden { msg = fmt.Sprintf("You are not a member of project %q.", argument) } else { msg = fmt.Sprintf("A project named %q does not exist on %q.", argument, clientCfg.Host) } projects, err := getProjects(o.Client) if err == nil { switch len(projects) { case 0: msg += "\nYou are not a member of any projects. You can request a project to be created with the 'new-project' command." case 1: msg += fmt.Sprintf("\nYou have one project on this server: %s", api.DisplayNameAndNameForProject(&projects[0])) default: msg += "\nYour projects are:" for _, project := range projects { msg += fmt.Sprintf("\n* %s", api.DisplayNameAndNameForProject(&project)) } } } if hasMultipleServers(config) { msg += "\nTo see projects on another server, pass '--server=<server>'." } return errors.New(msg) } return err } kubeconfig, err := cliconfig.CreateConfig(project.Name, o.ClientConfig) if err != nil { return err } merged, err := cliconfig.MergeConfig(config, *kubeconfig) if err != nil { return err } config = *merged namespaceInUse = project.Name contextInUse = merged.CurrentContext contextNameIsGenerated = true } if err := kubecmdconfig.ModifyConfig(o.PathOptions, config, true); err != nil { return err } if o.DisplayShort { fmt.Fprintln(out, namespaceInUse) return nil } if contextInUse != namespaceInUse && !contextNameIsGenerated { if len(namespaceInUse) > 0 { fmt.Fprintf(out, "Now using project %q from context named %q on server %q.\n", namespaceInUse, contextInUse, clientCfg.Host) } else { fmt.Fprintf(out, "Now using context named %q on server %q.\n", contextInUse, clientCfg.Host) } } else { fmt.Fprintf(out, "Now using project %q on server %q.\n", namespaceInUse, clientCfg.Host) } return nil }