forked from cloudfoundry/cli
-
Notifications
You must be signed in to change notification settings - Fork 0
/
endpoints.go
139 lines (110 loc) · 3.77 KB
/
endpoints.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
package api
import (
"cf"
"cf/configuration"
"cf/net"
"regexp"
"strings"
)
const (
authEndpointPrefix = "login"
uaaEndpointPrefix = "uaa"
)
type EndpointRepository interface {
UpdateEndpoint(endpoint string) (finalEndpoint string, apiResponse net.ApiResponse)
GetEndpoint(name cf.EndpointType) (endpoint string, apiResponse net.ApiResponse)
}
type RemoteEndpointRepository struct {
config *configuration.Configuration
gateway net.Gateway
configRepo configuration.ConfigurationRepository
}
func NewEndpointRepository(config *configuration.Configuration, gateway net.Gateway, configRepo configuration.ConfigurationRepository) (repo RemoteEndpointRepository) {
repo.config = config
repo.gateway = gateway
repo.configRepo = configRepo
return
}
func (repo RemoteEndpointRepository) UpdateEndpoint(endpoint string) (finalEndpoint string, apiResponse net.ApiResponse) {
endpointMissingScheme := !strings.HasPrefix(endpoint, "https://") && !strings.HasPrefix(endpoint, "http://")
if endpointMissingScheme {
finalEndpoint = "https://" + endpoint
apiResponse = repo.doUpdateEndpoint(finalEndpoint)
if apiResponse.IsNotSuccessful() {
finalEndpoint = "http://" + endpoint
apiResponse = repo.doUpdateEndpoint(finalEndpoint)
}
return
}
finalEndpoint = endpoint
apiResponse = repo.doUpdateEndpoint(finalEndpoint)
return
}
func (repo RemoteEndpointRepository) doUpdateEndpoint(endpoint string) (apiResponse net.ApiResponse) {
request, apiResponse := repo.gateway.NewRequest("GET", endpoint+"/v2/info", "", nil)
if apiResponse.IsNotSuccessful() {
return
}
type infoResponse struct {
ApiVersion string `json:"api_version"`
AuthorizationEndpoint string `json:"authorization_endpoint"`
}
serverResponse := new(infoResponse)
_, apiResponse = repo.gateway.PerformRequestForJSONResponse(request, &serverResponse)
if apiResponse.IsNotSuccessful() {
return
}
if endpoint != repo.config.Target {
repo.configRepo.ClearSession()
}
repo.config.Target = endpoint
repo.config.ApiVersion = serverResponse.ApiVersion
repo.config.AuthorizationEndpoint = serverResponse.AuthorizationEndpoint
err := repo.configRepo.Save()
if err != nil {
apiResponse = net.NewApiResponseWithMessage(err.Error())
}
return
}
func (repo RemoteEndpointRepository) GetEndpoint(name cf.EndpointType) (endpoint string, apiResponse net.ApiResponse) {
switch name {
case cf.CloudControllerEndpointKey:
return repo.cloudControllerEndpoint()
case cf.UaaEndpointKey:
return repo.uaaControllerEndpoint()
case cf.LoggregatorEndpointKey:
return repo.loggregatorEndpoint()
}
apiResponse = net.NewNotFoundApiResponse("Endpoint type %s is unkown", string(name))
return
}
func (repo RemoteEndpointRepository) cloudControllerEndpoint() (endpoint string, apiResponse net.ApiResponse) {
if repo.config.Target == "" {
apiResponse = net.NewApiResponseWithMessage("Endpoint missing from config file")
return
}
endpoint = repo.config.Target
return
}
func (repo RemoteEndpointRepository) uaaControllerEndpoint() (endpoint string, apiResponse net.ApiResponse) {
if repo.config.AuthorizationEndpoint == "" {
apiResponse = net.NewApiResponseWithMessage("Endpoint missing from config file")
return
}
endpoint = strings.Replace(repo.config.AuthorizationEndpoint, authEndpointPrefix, uaaEndpointPrefix, 1)
return
}
func (repo RemoteEndpointRepository) loggregatorEndpoint() (endpoint string, apiResponse net.ApiResponse) {
if repo.config.Target == "" {
apiResponse = net.NewApiResponseWithMessage("Endpoint missing from config file")
return
}
re := regexp.MustCompile(`^http(s?)://[^\.]+\.(.+)\/?`)
endpoint = re.ReplaceAllString(repo.config.Target, "ws${1}://loggregator.${2}")
if endpoint[0:3] == "wss" {
endpoint = endpoint + ":4443"
} else {
endpoint = endpoint + ":80"
}
return
}