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 }