/
uaa.go
120 lines (106 loc) · 3.03 KB
/
uaa.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
package uaa
import (
"fmt"
"github.com/xchapter7x/lo"
uaaclient "github.com/cloudfoundry-community/go-uaa"
)
//go:generate counterfeiter -o fakes/uaa_client.go uaa.go uaa
type uaa interface {
CreateUser(user uaaclient.User) (*uaaclient.User, error)
ListAllUsers(filter string, sortBy string, attributes string, sortOrder uaaclient.SortOrder) ([]uaaclient.User, error)
}
//Manager -
type Manager interface {
//Returns a map keyed and valued by user id. User id is converted to lowercase
ListUsers() (*Users, error)
CreateExternalUser(userName, userEmail, externalID, origin string) (GUID string, err error)
}
//DefaultUAAManager -
type DefaultUAAManager struct {
Peek bool
Client uaa
}
type User struct {
Username string
ExternalID string
Email string
Origin string
GUID string
}
//NewDefaultUAAManager -
func NewDefaultUAAManager(sysDomain, clientID, clientSecret, userAgent string, peek bool) (Manager, error) {
target := fmt.Sprintf("https://uaa.%s", sysDomain)
client, err := uaaclient.New(
target,
uaaclient.WithClientCredentials(clientID, clientSecret, uaaclient.OpaqueToken),
uaaclient.WithUserAgent(userAgent),
uaaclient.WithSkipSSLValidation(true),
)
if err != nil {
return nil, err
}
return &DefaultUAAManager{
Client: client,
Peek: peek,
}, nil
}
//CreateExternalUser -
func (m *DefaultUAAManager) CreateExternalUser(userName, userEmail, externalID, origin string) (string, error) {
if userName == "" || userEmail == "" || externalID == "" {
return "", fmt.Errorf("skipping user as missing name[%s], email[%s] or externalID[%s]", userName, userEmail, externalID)
}
if m.Peek {
lo.G.Infof("[dry-run]: successfully added user [%s]", userName)
return fmt.Sprintf("dry-run-%s-%s-guid", userName, origin), nil
}
createdUser, err := m.Client.CreateUser(uaaclient.User{
Username: userName,
ExternalID: externalID,
Origin: origin,
Emails: []uaaclient.Email{
uaaclient.Email{
Value: userEmail,
},
},
})
if err != nil {
return "", err
}
lo.G.Infof("successfully added user [%s]", userName)
return createdUser.ID, nil
}
//ListUsers - returns uaa.Users
func (m *DefaultUAAManager) ListUsers() (*Users, error) {
users := &Users{}
lo.G.Debug("Getting users from Cloud Foundry")
userList, err := m.Client.ListAllUsers("", "", "userName,id,externalId,emails,origin", "")
if err != nil {
return nil, err
}
lo.G.Debugf("Found %d users in the CF instance", len(userList))
for _, user := range userList {
lo.G.Debugf("Adding to users userID [%s], externalID [%s], origin [%s], email [%s], GUID [%s]", user.Username, user.ExternalID, user.Origin, Email(user), user.ID)
users.Add(User{
Username: user.Username,
ExternalID: user.ExternalID,
Email: Email(user),
Origin: user.Origin,
GUID: user.ID,
})
}
return users, nil
}
func Email(u uaaclient.User) string {
for _, email := range u.Emails {
if email.Primary == nil {
continue
}
if *email.Primary {
return email.Value
}
}
if len(u.Emails) > 0 {
return u.Emails[0].Value
}
return ""
}