github.com/olli-ai/jx/v2@v2.0.400-0.20210921045218-14731b4dd448/pkg/cmd/deletecmd/delete_user.go (about)

     1  package deletecmd
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"github.com/olli-ai/jx/v2/pkg/cmd/helper"
     8  	survey "gopkg.in/AlecAivazis/survey.v1"
     9  
    10  	v1 "github.com/jenkins-x/jx-api/pkg/apis/jenkins.io/v1"
    11  	"github.com/jenkins-x/jx-api/pkg/client/clientset/versioned"
    12  
    13  	"github.com/olli-ai/jx/v2/pkg/users"
    14  
    15  	"github.com/jenkins-x/jx-logging/pkg/log"
    16  	"github.com/olli-ai/jx/v2/pkg/cmd/opts"
    17  	"github.com/olli-ai/jx/v2/pkg/cmd/templates"
    18  	"github.com/olli-ai/jx/v2/pkg/kube"
    19  	"github.com/olli-ai/jx/v2/pkg/util"
    20  	"github.com/spf13/cobra"
    21  )
    22  
    23  // DeleteUserOptions are the flags for delete commands
    24  type DeleteUserOptions struct {
    25  	*opts.CommonOptions
    26  
    27  	SelectAll    bool
    28  	SelectFilter string
    29  	Confirm      bool
    30  }
    31  
    32  var (
    33  	deleteUserLong = templates.LongDesc(`
    34  		Deletes one or more users 
    35  `)
    36  
    37  	deleteUserExample = templates.Examples(`
    38  		# Delete the user with the login of cheese
    39  		jx delete user cheese 
    40  	`)
    41  )
    42  
    43  // NewCmdDeleteUser creates a command object
    44  // retrieves one or more resources from a server.
    45  func NewCmdDeleteUser(commonOpts *opts.CommonOptions) *cobra.Command {
    46  	options := &DeleteUserOptions{
    47  		CommonOptions: commonOpts,
    48  	}
    49  
    50  	cmd := &cobra.Command{
    51  		Use:     "user",
    52  		Short:   "Deletes one or more users",
    53  		Long:    deleteUserLong,
    54  		Example: deleteUserExample,
    55  		Aliases: []string{"users"},
    56  		Run: func(cmd *cobra.Command, args []string) {
    57  			options.Cmd = cmd
    58  			options.Args = args
    59  			err := options.Run()
    60  			helper.CheckErr(err)
    61  		},
    62  	}
    63  
    64  	cmd.Flags().BoolVarP(&options.SelectAll, "all", "a", false, "Should we default to selecting all the matched users for deletion")
    65  	cmd.Flags().StringVarP(&options.SelectFilter, "filter", "f", "", "Filters the list of users you can pick from")
    66  	cmd.Flags().BoolVarP(&options.Confirm, "yes", "y", false, "Confirms we should uninstall this installation")
    67  	return cmd
    68  }
    69  
    70  // Run implements this command
    71  func (o *DeleteUserOptions) Run() error {
    72  	surveyOpts := survey.WithStdio(o.In, o.Out, o.Err)
    73  	err := o.RegisterUserCRD()
    74  	if err != nil {
    75  		return err
    76  	}
    77  
    78  	jxClient, ns, err := o.JXClientAndAdminNamespace()
    79  	if err != nil {
    80  		return err
    81  	}
    82  
    83  	_, userNames, err := users.GetUsers(jxClient, ns)
    84  	if err != nil {
    85  		return err
    86  	}
    87  
    88  	names := o.Args
    89  	if len(names) == 0 {
    90  		if o.BatchMode {
    91  			return fmt.Errorf("Missing user login name argument")
    92  		}
    93  		names, err = util.SelectNamesWithFilter(userNames, "Which users do you want to delete: ", o.SelectAll, o.SelectFilter, "", o.GetIOFileHandles())
    94  		if err != nil {
    95  			return err
    96  		}
    97  	}
    98  
    99  	if o.BatchMode {
   100  		if !o.Confirm {
   101  			return fmt.Errorf("In batch mode you must specify the '-y' flag to confirm")
   102  		}
   103  	} else {
   104  		log.Logger().Warnf("You are about to delete these users '%s'. This operation CANNOT be undone!",
   105  			strings.Join(names, ","))
   106  
   107  		flag := false
   108  		prompt := &survey.Confirm{
   109  			Message: "Are you sure you want to delete these all these users?",
   110  			Default: false,
   111  		}
   112  		err = survey.AskOne(prompt, &flag, nil, surveyOpts)
   113  		if err != nil {
   114  			return err
   115  		}
   116  		if !flag {
   117  			return nil
   118  		}
   119  	}
   120  
   121  	for _, name := range names {
   122  		err = o.deleteUser(name)
   123  		if err != nil {
   124  			log.Logger().Warnf("Failed to delete user %s: %s", name, err)
   125  		} else {
   126  			log.Logger().Infof("Deleted user %s", util.ColorInfo(name))
   127  		}
   128  		log.Logger().Infof("Attempting to unbind user %s from associated role", util.ColorInfo(name))
   129  		err = o.deleteUserFromRoleBindings(name, ns, jxClient)
   130  		if err != nil {
   131  			log.Logger().Warnf("Problem to unbind user %s from associated role", util.ColorWarning(name))
   132  		}
   133  	}
   134  	return nil
   135  }
   136  
   137  func (o *DeleteUserOptions) deleteUser(name string) error {
   138  	jxClient, devNs, err := o.JXClientAndDevNamespace()
   139  	if err != nil {
   140  		return err
   141  	}
   142  	kubeClient, err := o.KubeClient()
   143  	if err != nil {
   144  		return err
   145  	}
   146  	ns, err := kube.GetAdminNamespace(kubeClient, devNs)
   147  	if err != nil {
   148  		return err
   149  	}
   150  	return users.DeleteUser(jxClient, ns, name)
   151  }
   152  
   153  func (o *DeleteUserOptions) deleteUserFromRoleBindings(name string, ns string, jxClient versioned.Interface) error {
   154  	kubeClient, err := o.KubeClient()
   155  	if err != nil {
   156  		return err
   157  	}
   158  
   159  	roles, roleNames, err := kube.GetTeamRoles(kubeClient, ns)
   160  	if err != nil {
   161  		return err
   162  	}
   163  	if len(roleNames) == 0 {
   164  		return nil
   165  	}
   166  
   167  	return kube.UpdateUserRoles(kubeClient, jxClient, ns, v1.UserTypeLocal, name, nil, roles)
   168  }