-
Notifications
You must be signed in to change notification settings - Fork 5
/
create_service_key.go
109 lines (95 loc) · 2.82 KB
/
create_service_key.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
package clients
import (
"bytes"
models "cf-html5-apps-repo-cli-plugin/clients/models"
"cf-html5-apps-repo-cli-plugin/log"
"encoding/json"
"fmt"
"io"
"net/http"
"strconv"
"time"
"github.com/cloudfoundry/cli/plugin"
)
// CreateServiceKey create Cloud Foundry service key
func CreateServiceKey(cliConnection plugin.CliConnection, serviceInstanceGUID string, parameters interface{}) (*models.CFServiceKey, error) {
var apiEndpoint string
var accessToken string
var request *http.Request
var response *http.Response
var serviceKey models.CFServiceKey
var serviceKeyCredentials models.CFCredentials
var err error
var url string
var serviceParameters string
var body []byte
var job models.CFJob
var link models.CFLink
var ok bool
t := strconv.FormatInt(time.Now().Unix(), 10)
apiEndpoint, err = cliConnection.ApiEndpoint()
if err != nil {
return nil, err
}
accessToken, err = cliConnection.AccessToken()
if err != nil {
return nil, err
}
url = apiEndpoint + "/v3/service_credential_bindings"
if parameters != nil {
parametersBytes, err := json.Marshal(parameters)
if err != nil {
return nil, err
}
serviceParameters = "\"parameters\":" + string(parametersBytes) + ","
} else {
serviceParameters = ""
}
body = []byte("{" + serviceParameters + "\"type\":\"key\",\"name\":\"" + "html5-key-" + t + "\",\"relationships\":{\"service_instance\":{\"data\":{\"guid\":\"" + serviceInstanceGUID + "\"}}}}")
log.Tracef("Making request to: %s %s\n", url, string(body))
request, err = http.NewRequest("POST", url, bytes.NewBuffer(body))
if err != nil {
return nil, err
}
request.Header.Set("Content-Type", "application/json")
request.Header.Set("Authorization", accessToken)
client, err := GetDefaultClient()
if err != nil {
return nil, err
}
response, err = client.Do(request)
if err != nil {
return nil, err
}
defer response.Body.Close()
body, err = io.ReadAll(response.Body)
log.Trace(log.Response{Head: response, Body: body})
if err != nil {
return nil, err
}
if response.StatusCode != 202 {
return nil, fmt.Errorf("Could not create service key: [%d] %s", response.StatusCode, string(body))
}
// Pool job
job, err = PollJob(cliConnection, response.Header.Get("Location"))
if err != nil {
return nil, err
}
// Get link to service key from job
if link, ok = job.Links["service_credential_binding"]; !ok {
return nil, fmt.Errorf("Malformed job resource. No 'service_credential_binding' link: %+v", job)
}
// Get service key
serviceKey, err = GetServiceKeyByUrl(cliConnection, *link.Href)
if err != nil {
return nil, err
}
// Get service key details
serviceKeyCredentials, err = GetServiceKeyDetails(cliConnection, serviceKey.GUID)
if err != nil {
return nil, err
}
// Enrich service key with credentials from details
serviceKey.Credentials = serviceKeyCredentials
return &serviceKey, nil
}