/
generate.go
119 lines (97 loc) · 3.65 KB
/
generate.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
package credhub
import (
"encoding/json"
"io"
"io/ioutil"
"net/http"
"code.cloudfoundry.org/credhub-cli/credhub/credentials"
"code.cloudfoundry.org/credhub-cli/credhub/credentials/generate"
)
type GenerateOption func(*GenerateOptions) error
// GeneratePassword generates a password credential based on the provided parameters.
func (ch *CredHub) GeneratePassword(name string, gen generate.Password, overwrite Mode) (credentials.Password, error) {
var cred credentials.Password
err := ch.generateCredential(name, "password", gen, overwrite, &cred)
return cred, err
}
// GenerateUser generates a user credential based on the provided parameters.
func (ch *CredHub) GenerateUser(name string, gen generate.User, overwrite Mode) (credentials.User, error) {
var cred credentials.User
err := ch.generateCredential(name, "user", gen, overwrite, &cred)
return cred, err
}
// GenerateCertificate generates a certificate credential based on the provided parameters.
func (ch *CredHub) GenerateCertificate(name string, gen generate.Certificate, overwrite Mode) (credentials.Certificate, error) {
var cred credentials.Certificate
err := ch.generateCredential(name, "certificate", gen, overwrite, &cred)
return cred, err
}
// GenerateRSA generates an RSA credential based on the provided parameters.
func (ch *CredHub) GenerateRSA(name string, gen generate.RSA, overwrite Mode) (credentials.RSA, error) {
var cred credentials.RSA
err := ch.generateCredential(name, "rsa", gen, overwrite, &cred)
return cred, err
}
// GenerateSSH generates an SSH credential based on the provided parameters.
func (ch *CredHub) GenerateSSH(name string, gen generate.SSH, overwrite Mode) (credentials.SSH, error) {
var cred credentials.SSH
err := ch.generateCredential(name, "ssh", gen, overwrite, &cred)
return cred, err
}
// GenerateCredential generates any credential type based on the credType given provided parameters.
func (ch *CredHub) GenerateCredential(name, credType string, gen interface{}, overwrite Mode, options ...GenerateOption) (credentials.Credential, error) {
var cred credentials.Credential
err := ch.generateCredential(name, credType, gen, overwrite, &cred, options...)
return cred, err
}
type generateRequest struct {
Name string `json:"name"`
Type string `json:"type"`
Value interface{} `json:"value,omitempty"`
Parameters interface{} `json:"parameters"`
Mode string `json:"mode,omitempty"`
Overwrite bool `json:"overwrite"`
GenerateOptions
}
type GenerateOptions struct {
Metadata credentials.Metadata `json:"metadata,omitempty"`
}
func (ch *CredHub) generateCredential(name, credType string, gen interface{}, overwrite Mode, cred interface{}, options ...GenerateOption) error {
isOverwrite := overwrite == Overwrite
request := generateRequest{
Name: name,
Type: credType,
Parameters: gen,
}
if overwrite == Converge {
request.Mode = string(overwrite)
} else {
request.Overwrite = isOverwrite
}
if user, ok := gen.(generate.User); ok {
request.Value = map[string]string{"username": user.Username}
}
for _, option := range options {
if err := option(&request.GenerateOptions); err != nil {
return err
}
}
serverVersion, err := ch.ServerVersion()
if err != nil {
return err
}
if request.Metadata != nil && !supportsMetadata(serverVersion) {
return ServerDoesNotSupportMetadataError
}
resp, err := ch.Request(http.MethodPost, "/api/v1/data", nil, request, true)
if err != nil {
return err
}
defer resp.Body.Close()
defer io.Copy(ioutil.Discard, resp.Body)
dec := json.NewDecoder(resp.Body)
if err := ch.checkForServerError(resp); err != nil {
return err
}
return dec.Decode(&cred)
}