forked from openshift/origin
-
Notifications
You must be signed in to change notification settings - Fork 1
/
user_identity_mapping.go
143 lines (117 loc) · 3.94 KB
/
user_identity_mapping.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package create
import (
"fmt"
"io"
"github.com/spf13/cobra"
"k8s.io/apimachinery/pkg/api/meta"
"k8s.io/apimachinery/pkg/runtime"
kapi "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
"github.com/openshift/origin/pkg/cmd/util/clientcmd"
userapi "github.com/openshift/origin/pkg/user/apis/user"
userclient "github.com/openshift/origin/pkg/user/generated/internalclientset/typed/user/internalversion"
)
const UserIdentityMappingRecommendedName = "useridentitymapping"
var (
userIdentityMappingLong = templates.LongDesc(`
Typically, identities are automatically mapped to users during login. If automatic
mapping is disabled (by using the "lookup" mapping method), or a mapping needs to
be manually established between an identity and a user, this command can be used
to create a useridentitymapping object.`)
userIdentityMappingExample = templates.Examples(`
# Map the identity "acme_ldap:adamjones" to the user "ajones"
%[1]s acme_ldap:adamjones ajones`)
)
type CreateUserIdentityMappingOptions struct {
User string
Identity string
UserIdentityMappingClient userclient.UserIdentityMappingInterface
DryRun bool
Mapper meta.RESTMapper
OutputFormat string
Out io.Writer
Printer ObjectPrinter
}
// NewCmdCreateUserIdentityMapping is a macro command to create a new identity
func NewCmdCreateUserIdentityMapping(name, fullName string, f *clientcmd.Factory, out io.Writer) *cobra.Command {
o := &CreateUserIdentityMappingOptions{Out: out}
cmd := &cobra.Command{
Use: name + " <IDENTITY_NAME> <USER_NAME>",
Short: "Manually map an identity to a user.",
Long: userIdentityMappingLong,
Example: fmt.Sprintf(userIdentityMappingExample, fullName),
Run: func(cmd *cobra.Command, args []string) {
cmdutil.CheckErr(o.Complete(cmd, f, args))
cmdutil.CheckErr(o.Validate())
cmdutil.CheckErr(o.Run())
},
}
cmdutil.AddPrinterFlags(cmd)
cmdutil.AddDryRunFlag(cmd)
return cmd
}
func (o *CreateUserIdentityMappingOptions) Complete(cmd *cobra.Command, f *clientcmd.Factory, args []string) error {
switch len(args) {
case 0:
return fmt.Errorf("identity is required")
case 1:
return fmt.Errorf("user name is required")
case 2:
o.Identity = args[0]
o.User = args[1]
default:
return fmt.Errorf("exactly two arguments (identity and user name) are supported, not: %v", args)
}
o.DryRun = cmdutil.GetFlagBool(cmd, "dry-run")
client, err := f.OpenshiftInternalUserClient()
if err != nil {
return err
}
o.UserIdentityMappingClient = client.User().UserIdentityMappings()
o.Mapper, _ = f.Object()
o.OutputFormat = cmdutil.GetFlagString(cmd, "output")
o.Printer = func(obj runtime.Object, out io.Writer) error {
return f.PrintObject(cmd, false, o.Mapper, obj, out)
}
return nil
}
func (o *CreateUserIdentityMappingOptions) Validate() error {
if len(o.Identity) == 0 {
return fmt.Errorf("identity is required")
}
if len(o.User) == 0 {
return fmt.Errorf("user is required")
}
if o.UserIdentityMappingClient == nil {
return fmt.Errorf("UserIdentityMappingClient is required")
}
if o.Mapper == nil {
return fmt.Errorf("Mapper is required")
}
if o.Out == nil {
return fmt.Errorf("Out is required")
}
if o.Printer == nil {
return fmt.Errorf("Printer is required")
}
return nil
}
func (o *CreateUserIdentityMappingOptions) Run() error {
mapping := &userapi.UserIdentityMapping{}
mapping.Identity = kapi.ObjectReference{Name: o.Identity}
mapping.User = kapi.ObjectReference{Name: o.User}
actualMapping := mapping
var err error
if !o.DryRun {
actualMapping, err = o.UserIdentityMappingClient.Create(mapping)
if err != nil {
return err
}
}
if useShortOutput := o.OutputFormat == "name"; useShortOutput || len(o.OutputFormat) == 0 {
cmdutil.PrintSuccess(o.Mapper, useShortOutput, o.Out, "useridentitymapping", actualMapping.Name, o.DryRun, "created")
return nil
}
return o.Printer(actualMapping, o.Out)
}